Organigramm: Lage je Abteilung in der Teamuebersicht (#688)

- TeamMember: Laeufe und Kosten heute, offene und blockierte Aufgaben je Agent
  (eine Abfrage fuer alle, nicht eine je Agent)
- TeamUnit: dieselben Werte samt Untereinheiten, offene Vorgaenge aus der Einheit,
  heutige Kostenmeldung (#699)
- team.js: Lagezeile auf jeder Karte und in der Seitenleiste, Instanz summiert;
  Spruenge zu Kosten je Einheit und zu den Vorgaengen; i18n en/de
- Tests: TeamOverviewTests (+2)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-01 09:50:17 +02:00
co-authored by Claude Opus 5.5
parent 888369698d
commit f649f2fd7a
10 changed files with 207 additions and 15 deletions
+14 -2
View File
@@ -212,7 +212,14 @@ public sealed record TeamUnitDto(
int Agents,
IReadOnlyDictionary<string, int> States,
int PendingApprovals,
string Worst);
string Worst,
// #688: the department's situation.
int RunsToday = 0,
decimal CostToday = 0,
int OpenTasks = 0,
int BlockedTasks = 0,
int OpenCases = 0,
string? CostAlert = null);
/// <summary>
/// #711: One agent in the team overview. <see cref="State"/> is one of Idle, Working, Stuck,
@@ -230,7 +237,12 @@ public sealed record TeamMemberDto(
string? LastRunResult,
long TypicalRunMs,
string? UnitId,
bool IsLead);
bool IsLead,
// #688: the agent's day.
int RunsToday = 0,
decimal CostToday = 0,
int OpenTasks = 0,
int BlockedTasks = 0);
/// <summary>#711: A run in progress.</summary>
public sealed record ActiveRunDto(string RunId, string AgentId, string Source, string? TaskId, string? CalledBy, DateTime StartedAtUtc);
+3 -2
View File
@@ -95,13 +95,14 @@ internal static class Mapping
m.AgentId, m.DisplayName, m.Model, m.State.ToString(),
m.Runs.Select(ToDto).ToList(),
m.PendingApprovals, m.LastRunStatus, m.LastRunAtUtc, m.LastRunResult, m.TypicalRunMs,
m.UnitId, m.IsLead)).ToList(),
m.UnitId, m.IsLead, m.RunsToday, m.CostToday, m.OpenTasks, m.BlockedTasks)).ToList(),
snapshot.RecentLinks.Select(ToDto).ToList(),
snapshot.AtUtc,
(snapshot.Units ?? []).Select(u => new TeamUnitDto(
u.Id, u.Name, u.ParentId, u.Path, u.LeaderAgentId, u.Goal, u.Agents,
u.States.ToDictionary(s => s.Key.ToString(), s => s.Value),
u.PendingApprovals, u.Worst.ToString())).ToList(),
u.PendingApprovals, u.Worst.ToString(),
u.RunsToday, u.CostToday, u.OpenTasks, u.BlockedTasks, u.OpenCases, u.CostAlert)).ToList(),
(snapshot.ConflictHotspots ?? []).Select(h => new ConflictHotspotDto(
h.Workspace, h.Path, h.Conflicts, h.LastAtUtc, h.Agents)).ToList());