diff --git a/src/ClaudeDo.Ui/Services/Interfaces/IWorkerClient.cs b/src/ClaudeDo.Ui/Services/Interfaces/IWorkerClient.cs index c15abd5..37bfdd4 100644 --- a/src/ClaudeDo.Ui/Services/Interfaces/IWorkerClient.cs +++ b/src/ClaudeDo.Ui/Services/Interfaces/IWorkerClient.cs @@ -18,6 +18,10 @@ public interface IWorkerClient : INotifyPropertyChanged event Action? ListUpdatedEvent; event Action? TaskMessageEvent; + event Action? PrepStartedEvent; + event Action? PrepLineEvent; + event Action? PrepFinishedEvent; + event Action? PlanningMergeStartedEvent; event Action? PlanningSubtaskMergedEvent; event Action>? PlanningMergeConflictEvent; @@ -53,6 +57,7 @@ public interface IWorkerClient : INotifyPropertyChanged Task GetWeekReportAsync(DateOnly start, DateOnly end); Task GenerateWeekReportAsync(DateOnly start, DateOnly end); Task RunDailyPrepNowAsync(); + Task ClearMyDayAsync(); Task GetAppSettingsAsync(); Task> GetDailyNotesAsync(DateOnly day); Task AddDailyNoteAsync(DateOnly day, string text); diff --git a/src/ClaudeDo.Ui/Services/WorkerClient.cs b/src/ClaudeDo.Ui/Services/WorkerClient.cs index 21ee5b1..2f68131 100644 --- a/src/ClaudeDo.Ui/Services/WorkerClient.cs +++ b/src/ClaudeDo.Ui/Services/WorkerClient.cs @@ -51,6 +51,10 @@ public partial class WorkerClient : ObservableObject, IAsyncDisposable, IWorkerC public event Action? ListUpdatedEvent; public event Action? WorkerLogReceivedEvent; + public event Action? PrepStartedEvent; + public event Action? PrepLineEvent; + public event Action? PrepFinishedEvent; + public event Action? PlanningMergeStartedEvent; public event Action? PlanningSubtaskMergedEvent; public event Action>? PlanningMergeConflictEvent; @@ -171,6 +175,10 @@ public partial class WorkerClient : ObservableObject, IAsyncDisposable, IWorkerC { Dispatcher.UIThread.Post(() => PrimeFired?.Invoke(new PrimeFiredEvent(id, ok, msg, when))); }); + + _hub.On("PrepStarted", () => Dispatcher.UIThread.Post(() => PrepStartedEvent?.Invoke())); + _hub.On("PrepLine", line => Dispatcher.UIThread.Post(() => PrepLineEvent?.Invoke(line))); + _hub.On("PrepFinished", ok => Dispatcher.UIThread.Post(() => PrepFinishedEvent?.Invoke(ok))); } public Task StartAsync() @@ -337,6 +345,9 @@ public partial class WorkerClient : ObservableObject, IAsyncDisposable, IWorkerC public Task RunDailyPrepNowAsync() => _hub.InvokeAsync("RunDailyPrepNow"); + public Task ClearMyDayAsync() + => _hub.InvokeAsync("ClearMyDay"); + public async Task> GetDailyNotesAsync(DateOnly day) => await TryInvokeAsync>("GetDailyNotes", IsoDay(day)) ?? new List(); diff --git a/tests/ClaudeDo.Ui.Tests/StubWorkerClient.cs b/tests/ClaudeDo.Ui.Tests/StubWorkerClient.cs index 1a612b9..c3793f9 100644 --- a/tests/ClaudeDo.Ui.Tests/StubWorkerClient.cs +++ b/tests/ClaudeDo.Ui.Tests/StubWorkerClient.cs @@ -22,6 +22,9 @@ public abstract class StubWorkerClient : IWorkerClient public event Action? WorktreeUpdatedEvent; public event Action? ListUpdatedEvent; public event Action? TaskMessageEvent; + public event Action? PrepStartedEvent; + public event Action? PrepLineEvent; + public event Action? PrepFinishedEvent; public event Action? PlanningMergeStartedEvent; public event Action? PlanningSubtaskMergedEvent; public event Action>? PlanningMergeConflictEvent; @@ -29,6 +32,12 @@ public abstract class StubWorkerClient : IWorkerClient public event Action? PlanningCompletedEvent; #pragma warning restore CS0067 + public int ClearMyDayCalls { get; private set; } + + public void RaisePrepStarted() => PrepStartedEvent?.Invoke(); + public void RaisePrepLine(string line) => PrepLineEvent?.Invoke(line); + public void RaisePrepFinished(bool ok) => PrepFinishedEvent?.Invoke(ok); + public virtual bool IsConnected => false; public virtual Task WakeQueueAsync() => Task.CompletedTask; @@ -63,6 +72,7 @@ public abstract class StubWorkerClient : IWorkerClient public virtual Task GetWeekReportAsync(DateOnly start, DateOnly end) => Task.FromResult(null); public virtual Task GenerateWeekReportAsync(DateOnly start, DateOnly end) => Task.FromResult(""); public virtual Task RunDailyPrepNowAsync() => Task.FromResult(false); + public virtual Task ClearMyDayAsync() { ClearMyDayCalls++; return Task.CompletedTask; } public virtual Task GetAppSettingsAsync() => Task.FromResult(null); public virtual Task> GetDailyNotesAsync(DateOnly day) => Task.FromResult(new List()); public virtual Task AddDailyNoteAsync(DateOnly day, string text) => Task.FromResult(null); diff --git a/tests/ClaudeDo.Worker.Tests/UiVm/TasksIslandViewModelPlanningTests.cs b/tests/ClaudeDo.Worker.Tests/UiVm/TasksIslandViewModelPlanningTests.cs index d69019a..b87d3cf 100644 --- a/tests/ClaudeDo.Worker.Tests/UiVm/TasksIslandViewModelPlanningTests.cs +++ b/tests/ClaudeDo.Worker.Tests/UiVm/TasksIslandViewModelPlanningTests.cs @@ -59,6 +59,9 @@ sealed class FakeWorkerClient : IWorkerClient public Task FinalizePlanningSessionAsync(string taskId, bool queueAgentTasks = true, CancellationToken ct = default) { FinalizePlanningCalls++; return Task.CompletedTask; } public Task GetPendingDraftCountAsync(string taskId, CancellationToken ct = default) => Task.FromResult(0); + public event Action? PrepStartedEvent; + public event Action? PrepLineEvent; + public event Action? PrepFinishedEvent; public event Action? PlanningMergeStartedEvent; public event Action? PlanningSubtaskMergedEvent; public event Action>? PlanningMergeConflictEvent; @@ -77,6 +80,7 @@ sealed class FakeWorkerClient : IWorkerClient public Task GetWeekReportAsync(DateOnly start, DateOnly end) => Task.FromResult(null); public Task GenerateWeekReportAsync(DateOnly start, DateOnly end) => Task.FromResult(""); public Task RunDailyPrepNowAsync() => Task.FromResult(false); + public Task ClearMyDayAsync() => Task.CompletedTask; public Task> GetDailyNotesAsync(DateOnly day) => Task.FromResult(new List()); public Task AddDailyNoteAsync(DateOnly day, string text) => Task.FromResult(null); public Task UpdateDailyNoteAsync(string id, string text) => Task.CompletedTask;