From 5079a5fc5c50eccab9b89228eafd24c1d28afaac Mon Sep 17 00:00:00 2001 From: Mika Kuns Date: Tue, 28 Apr 2026 09:29:25 +0200 Subject: [PATCH] feat(ui): show transient prime status in footer Co-Authored-By: Claude Opus 4.7 (1M context) --- .../ViewModels/IslandsShellViewModel.cs | 16 ++++++++++++++++ src/ClaudeDo.Ui/Views/MainWindow.axaml | 9 +++++++++ 2 files changed, 25 insertions(+) diff --git a/src/ClaudeDo.Ui/ViewModels/IslandsShellViewModel.cs b/src/ClaudeDo.Ui/ViewModels/IslandsShellViewModel.cs index 53146e6..d6ec46a 100644 --- a/src/ClaudeDo.Ui/ViewModels/IslandsShellViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/IslandsShellViewModel.cs @@ -61,6 +61,9 @@ public sealed partial class IslandsShellViewModel : ViewModelBase private readonly System.Timers.Timer _clearTimer = new(30_000) { AutoReset = false }; + [ObservableProperty] private string? _primeStatus; + private readonly System.Timers.Timer _primeStatusTimer = new(5_000) { AutoReset = false }; + [RelayCommand] private void FocusSearch() => Lists?.RequestFocusSearch(); @@ -95,6 +98,16 @@ public sealed partial class IslandsShellViewModel : ViewModelBase WorkerLogText = null; } + private void OnPrimeFired(PrimeFiredEvent evt) + { + var when = evt.FiredAt.LocalDateTime.ToString("HH:mm"); + PrimeStatus = evt.Success + ? $"✓ Primed Claude at {when}" + : $"⚠ Prime failed: {evt.Message}"; + _primeStatusTimer.Stop(); + _primeStatusTimer.Start(); + } + private void OnPlanningMergeConflict(string planningTaskId, string subtaskId, IReadOnlyList conflictedFiles) { // Already on UI thread (WorkerClient dispatches via Dispatcher.UIThread.Post). @@ -177,6 +190,7 @@ public sealed partial class IslandsShellViewModel : ViewModelBase }; Worker.WorkerLogReceivedEvent += OnWorkerLogReceived; Worker.PlanningMergeConflictEvent += OnPlanningMergeConflict; + Worker.PrimeFired += OnPrimeFired; _clearTimer.Elapsed += (_, _) => { if (Dispatcher.UIThread.CheckAccess()) @@ -184,6 +198,8 @@ public sealed partial class IslandsShellViewModel : ViewModelBase else Dispatcher.UIThread.Post(ClearWorkerLog); }; + _primeStatusTimer.Elapsed += (_, _) => + Avalonia.Threading.Dispatcher.UIThread.Post(() => PrimeStatus = null); _ = Lists.LoadAsync(); _updateCheck.PropertyChanged += (_, e) => { diff --git a/src/ClaudeDo.Ui/Views/MainWindow.axaml b/src/ClaudeDo.Ui/Views/MainWindow.axaml index 58bde2d..1784682 100644 --- a/src/ClaudeDo.Ui/Views/MainWindow.axaml +++ b/src/ClaudeDo.Ui/Views/MainWindow.axaml @@ -217,6 +217,15 @@ TextTrimming="CharacterEllipsis" VerticalAlignment="Center"/> + + +