feat(ui): surface WaitingForChildren status (chip, color, agent-strip, labels)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-06-04 16:19:31 +02:00
parent f60becaf06
commit 5363570fb4
8 changed files with 35 additions and 14 deletions

View File

@@ -385,8 +385,8 @@
"vm": { "vm": {
"connection": { "online": "Online", "connecting": "Verbinden…", "offline": "Offline" }, "connection": { "online": "Online", "connecting": "Verbinden…", "offline": "Offline" },
"shell": { "restartingWorker": "Worker wird neu gestartet…" }, "shell": { "restartingWorker": "Worker wird neu gestartet…" },
"agentStatus": { "idle": "Leerlauf", "queued": "In Warteschlange", "running": "Läuft", "review": "Prüfung", "done": "Fertig", "failed": "Fehlgeschlagen", "cancelled": "Abgebrochen" }, "agentStatus": { "idle": "Leerlauf", "queued": "In Warteschlange", "running": "Läuft", "review": "Prüfung", "children": "Wartet auf Verbesserungen", "done": "Fertig", "failed": "Fehlgeschlagen", "cancelled": "Abgebrochen" },
"taskStatus": { "idle": "Leerlauf", "queued": "In Warteschlange", "running": "Läuft", "waitingForReview": "Wartet auf Prüfung", "done": "Fertig", "failed": "Fehlgeschlagen", "cancelled": "Abgebrochen" }, "taskStatus": { "idle": "Leerlauf", "queued": "In Warteschlange", "running": "Läuft", "waitingForReview": "Wartet auf Prüfung", "waitingForChildren": "Wartet auf Verbesserungen", "done": "Fertig", "failed": "Fehlgeschlagen", "cancelled": "Abgebrochen" },
"planningBadge": { "active": "PLANUNG", "finalized": "GEPLANT" }, "planningBadge": { "active": "PLANUNG", "finalized": "GEPLANT" },
"taskRow": { "createdPrefix": "Erstellt {0}", "stepsText": "{0}/{1} Schritte" }, "taskRow": { "createdPrefix": "Erstellt {0}", "stepsText": "{0}/{1} Schritte" },
"tasksIsland": { "completedHeader": "ABGESCHLOSSEN", "completedHeaderCount": "ABGESCHLOSSEN · {0}" }, "tasksIsland": { "completedHeader": "ABGESCHLOSSEN", "completedHeaderCount": "ABGESCHLOSSEN · {0}" },

View File

@@ -385,8 +385,8 @@
"vm": { "vm": {
"connection": { "online": "Online", "connecting": "Connecting…", "offline": "Offline" }, "connection": { "online": "Online", "connecting": "Connecting…", "offline": "Offline" },
"shell": { "restartingWorker": "Restarting worker…" }, "shell": { "restartingWorker": "Restarting worker…" },
"agentStatus": { "idle": "Idle", "queued": "Queued", "running": "Running", "review": "Review", "done": "Done", "failed": "Failed", "cancelled": "Cancelled" }, "agentStatus": { "idle": "Idle", "queued": "Queued", "running": "Running", "review": "Review", "children": "Waiting for Improvements", "done": "Done", "failed": "Failed", "cancelled": "Cancelled" },
"taskStatus": { "idle": "Idle", "queued": "Queued", "running": "Running", "waitingForReview": "Waiting for Review", "done": "Done", "failed": "Failed", "cancelled": "Cancelled" }, "taskStatus": { "idle": "Idle", "queued": "Queued", "running": "Running", "waitingForReview": "Waiting for Review", "waitingForChildren": "Waiting for Improvements", "done": "Done", "failed": "Failed", "cancelled": "Cancelled" },
"planningBadge": { "active": "PLANNING", "finalized": "PLANNED" }, "planningBadge": { "active": "PLANNING", "finalized": "PLANNED" },
"taskRow": { "createdPrefix": "Created {0}", "stepsText": "{0}/{1} steps" }, "taskRow": { "createdPrefix": "Created {0}", "stepsText": "{0}/{1} steps" },
"tasksIsland": { "completedHeader": "COMPLETED", "completedHeaderCount": "COMPLETED · {0}" }, "tasksIsland": { "completedHeader": "COMPLETED", "completedHeaderCount": "COMPLETED · {0}" },

View File

@@ -17,6 +17,7 @@ public class StatusColorConverter : IValueConverter
"running" => Brushes.Orange, "running" => Brushes.Orange,
"waitingforreview" => Brushes.MediumPurple, "waitingforreview" => Brushes.MediumPurple,
"waiting_for_review" => Brushes.MediumPurple, "waiting_for_review" => Brushes.MediumPurple,
"waitingforchildren" => Brushes.DarkOrange,
"done" => Brushes.Green, "done" => Brushes.Green,
"failed" => Brushes.Red, "failed" => Brushes.Red,
"manual" => Brushes.Gray, "manual" => Brushes.Gray,

View File

@@ -174,6 +174,14 @@
<Setter Property="Foreground" Value="{StaticResource StatusReviewBrush}" /> <Setter Property="Foreground" Value="{StaticResource StatusReviewBrush}" />
</Style> </Style>
<Style Selector="Border.chip.children">
<Setter Property="Background" Value="#332A1A" />
<Setter Property="BorderBrush" Value="#4D3A1A" />
</Style>
<Style Selector="Border.chip.children > TextBlock">
<Setter Property="Foreground" Value="#E0A030" />
</Style>
<Style Selector="Border.chip.error"> <Style Selector="Border.chip.error">
<Setter Property="Background" Value="{StaticResource ErrorTintBrush}" /> <Setter Property="Background" Value="{StaticResource ErrorTintBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource ErrorTintBorderBrush}" /> <Setter Property="BorderBrush" Value="{StaticResource ErrorTintBorderBrush}" />
@@ -388,6 +396,10 @@
<Setter Property="Background" Value="{StaticResource ReviewTintBrush}" /> <Setter Property="Background" Value="{StaticResource ReviewTintBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource ReviewTintBorderBrush}" /> <Setter Property="BorderBrush" Value="{StaticResource ReviewTintBorderBrush}" />
</Style> </Style>
<Style Selector="Border.agent-strip.children">
<Setter Property="Background" Value="#332A1A" />
<Setter Property="BorderBrush" Value="#4D3A1A" />
</Style>
<Style Selector="Border.agent-strip.error"> <Style Selector="Border.agent-strip.error">
<Setter Property="Background" Value="{StaticResource ErrorTintBrush}" /> <Setter Property="Background" Value="{StaticResource ErrorTintBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource ErrorTintBorderBrush}" /> <Setter Property="BorderBrush" Value="{StaticResource ErrorTintBorderBrush}" />

View File

@@ -110,11 +110,12 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase
[NotifyCanExecuteChangedFor(nameof(ContinueCommand))] [NotifyCanExecuteChangedFor(nameof(ContinueCommand))]
private string _agentState = "idle"; private string _agentState = "idle";
public string AgentStatusLabel => Loc.T($"vm.agentStatus.{AgentState}"); public string AgentStatusLabel => Loc.T($"vm.agentStatus.{AgentState}");
public bool IsIdle => AgentState == "idle"; public bool IsIdle => AgentState == "idle";
public bool IsQueued => AgentState == "queued"; public bool IsQueued => AgentState == "queued";
public bool IsRunning => AgentState == "running"; public bool IsRunning => AgentState == "running";
public bool IsWaitingForReview => AgentState == "review"; public bool IsWaitingForReview => AgentState == "review";
public bool IsDone => AgentState == "done"; public bool IsWaitingForChildren => AgentState == "children";
public bool IsDone => AgentState == "done";
public bool IsFailed => AgentState == "failed"; public bool IsFailed => AgentState == "failed";
public bool IsCancelled => AgentState == "cancelled"; public bool IsCancelled => AgentState == "cancelled";
@@ -134,6 +135,7 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase
OnPropertyChanged(nameof(IsQueued)); OnPropertyChanged(nameof(IsQueued));
OnPropertyChanged(nameof(IsRunning)); OnPropertyChanged(nameof(IsRunning));
OnPropertyChanged(nameof(IsWaitingForReview)); OnPropertyChanged(nameof(IsWaitingForReview));
OnPropertyChanged(nameof(IsWaitingForChildren));
OnPropertyChanged(nameof(IsDone)); OnPropertyChanged(nameof(IsDone));
OnPropertyChanged(nameof(IsFailed)); OnPropertyChanged(nameof(IsFailed));
OnPropertyChanged(nameof(IsCancelled)); OnPropertyChanged(nameof(IsCancelled));
@@ -281,7 +283,8 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase
{ {
ClaudeDo.Data.Models.TaskStatus.Queued => "queued", ClaudeDo.Data.Models.TaskStatus.Queued => "queued",
ClaudeDo.Data.Models.TaskStatus.Running => "running", ClaudeDo.Data.Models.TaskStatus.Running => "running",
ClaudeDo.Data.Models.TaskStatus.WaitingForReview => "review", ClaudeDo.Data.Models.TaskStatus.WaitingForReview => "review",
ClaudeDo.Data.Models.TaskStatus.WaitingForChildren => "children",
ClaudeDo.Data.Models.TaskStatus.Done => "done", ClaudeDo.Data.Models.TaskStatus.Done => "done",
ClaudeDo.Data.Models.TaskStatus.Failed => "failed", ClaudeDo.Data.Models.TaskStatus.Failed => "failed",
ClaudeDo.Data.Models.TaskStatus.Cancelled => "cancelled", ClaudeDo.Data.Models.TaskStatus.Cancelled => "cancelled",
@@ -293,7 +296,8 @@ public sealed partial class DetailsIslandViewModel : ViewModelBase
"done" => "done", "done" => "done",
"failed" => "failed", "failed" => "failed",
"cancelled" => "cancelled", "cancelled" => "cancelled",
"waiting_for_review" => "review", "waiting_for_review" => "review",
"waiting_for_children" => "children",
_ => status.ToLowerInvariant(), _ => status.ToLowerInvariant(),
}; };

View File

@@ -90,7 +90,8 @@ public sealed partial class TaskRowViewModel : ViewModelBase
TaskStatus.Idle => Loc.T("vm.taskStatus.idle"), TaskStatus.Idle => Loc.T("vm.taskStatus.idle"),
TaskStatus.Queued => Loc.T("vm.taskStatus.queued"), TaskStatus.Queued => Loc.T("vm.taskStatus.queued"),
TaskStatus.Running => Loc.T("vm.taskStatus.running"), TaskStatus.Running => Loc.T("vm.taskStatus.running"),
TaskStatus.WaitingForReview => Loc.T("vm.taskStatus.waitingForReview"), TaskStatus.WaitingForReview => Loc.T("vm.taskStatus.waitingForReview"),
TaskStatus.WaitingForChildren => Loc.T("vm.taskStatus.waitingForChildren"),
TaskStatus.Done => Loc.T("vm.taskStatus.done"), TaskStatus.Done => Loc.T("vm.taskStatus.done"),
TaskStatus.Failed => Loc.T("vm.taskStatus.failed"), TaskStatus.Failed => Loc.T("vm.taskStatus.failed"),
TaskStatus.Cancelled => Loc.T("vm.taskStatus.cancelled"), TaskStatus.Cancelled => Loc.T("vm.taskStatus.cancelled"),
@@ -99,8 +100,9 @@ public sealed partial class TaskRowViewModel : ViewModelBase
public string StatusChipClass => (Status, IsBlocked: !string.IsNullOrEmpty(BlockedByTaskId)) switch public string StatusChipClass => (Status, IsBlocked: !string.IsNullOrEmpty(BlockedByTaskId)) switch
{ {
(TaskStatus.Running, _) => "running", (TaskStatus.Running, _) => "running",
(TaskStatus.WaitingForReview, _) => "review", (TaskStatus.WaitingForReview, _) => "review",
(TaskStatus.WaitingForChildren, _) => "children",
(TaskStatus.Failed, _) => "error", (TaskStatus.Failed, _) => "error",
(TaskStatus.Done, _) => "done", (TaskStatus.Done, _) => "done",
(TaskStatus.Queued, true) => "waiting", (TaskStatus.Queued, true) => "waiting",

View File

@@ -6,6 +6,7 @@
x:DataType="vm:DetailsIslandViewModel"> x:DataType="vm:DetailsIslandViewModel">
<Border Classes="agent-strip" <Border Classes="agent-strip"
Classes.running="{Binding IsRunning}" Classes.running="{Binding IsRunning}"
Classes.children="{Binding IsWaitingForChildren}"
Margin="18,8,18,0"> Margin="18,8,18,0">
<StackPanel Margin="12,10" Spacing="6"> <StackPanel Margin="12,10" Spacing="6">

View File

@@ -140,6 +140,7 @@
<Border Classes="chip" <Border Classes="chip"
Classes.running="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=Running}" Classes.running="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=Running}"
Classes.review="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=WaitingForReview}" Classes.review="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=WaitingForReview}"
Classes.children="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=WaitingForChildren}"
Classes.done="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=Done}" Classes.done="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=Done}"
Classes.error="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=Failed}" Classes.error="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=Failed}"
Classes.queued="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=Queued}"> Classes.queued="{Binding Status, Converter={StaticResource EqStatus}, ConverterParameter=Queued}">