using System.ComponentModel; using ClaudeDo.Data.Models; using ClaudeDo.Data.Repositories; using TaskStatus = ClaudeDo.Data.Models.TaskStatus; namespace ClaudeDo.Ui.Services; public interface IWorkerClient : INotifyPropertyChanged { bool IsConnected { get; } bool IsReconnecting { get; } event Action? TaskStartedEvent; event Action? TaskFinishedEvent; event Action? TaskUpdatedEvent; /// Raised once when the SignalR connection is first established, and again on every reconnect. event Action? ConnectionRestoredEvent; event Action? WorktreeUpdatedEvent; event Action? ListUpdatedEvent; event Action? TaskMessageEvent; event Action? WorkerLogReceivedEvent; event Action? PrepStartedEvent; event Action? PrepLineEvent; event Action? PrepFinishedEvent; event Action? PlanningMergeStartedEvent; event Action? PlanningSubtaskMergedEvent; event Action>? PlanningMergeConflictEvent; event Action? PlanningMergeAbortedEvent; event Action? PlanningCompletedEvent; event Action? PrimeFired; string? LastApproveTarget { get; } Task WakeQueueAsync(); Task RunNowAsync(string taskId); Task ContinueTaskAsync(string taskId, string followUpPrompt); Task ResetTaskAsync(string taskId); Task CancelTaskAsync(string taskId); Task> GetAgentsAsync(); Task RefreshAgentsAsync(); Task RestoreDefaultAgentsAsync(); Task GetListConfigAsync(string listId); Task UpdateTaskAgentSettingsAsync(UpdateTaskAgentSettingsDto dto); Task SetTaskStatusAsync(string taskId, TaskStatus status); Task ApproveReviewAsync(string taskId, string targetBranch); Task PreviewMergeAsync(string taskId, string targetBranch); Task MergeTaskAsync(string taskId, string targetBranch, bool removeWorktree, string commitMessage); Task RejectReviewToQueueAsync(string taskId, string feedback); Task RejectReviewToIdleAsync(string taskId); Task CancelReviewAsync(string taskId); // ── Conflict resolution (worker hub side implemented by Layer C) ── Task StartConflictMergeAsync(string taskId, string targetBranch); Task GetMergeConflictsAsync(string taskId); Task WriteConflictResolutionAsync(string taskId, string path, string resolvedContent); Task ContinueConflictMergeAsync(string taskId); Task AbortConflictMergeAsync(string taskId); Task StartPlanningSessionAsync(string taskId, CancellationToken ct = default); Task OpenInteractiveTerminalAsync(string taskId, CancellationToken ct = default); Task ResumePlanningSessionAsync(string taskId, CancellationToken ct = default); Task DiscardPlanningSessionAsync(string taskId, bool dequeueQueuedChildren = false, CancellationToken ct = default); Task FinalizePlanningSessionAsync(string taskId, bool queueAgentTasks = true, CancellationToken ct = default); Task GetPendingDraftCountAsync(string taskId, CancellationToken ct = default); Task GetMergeTargetsAsync(string taskId); Task> GetPlanningAggregateAsync(string planningTaskId); Task BuildPlanningIntegrationBranchAsync(string planningTaskId, string targetBranch); Task ContinuePlanningMergeAsync(string planningTaskId); Task AbortPlanningMergeAsync(string planningTaskId); Task QueuePlanningSubtasksAsync(string parentTaskId, CancellationToken ct = default); Task GetWeekReportAsync(DateOnly start, DateOnly end); Task GenerateWeekReportAsync(DateOnly start, DateOnly end); Task RunDailyPrepNowAsync(); Task RefineTaskAsync(string taskId); event Action? RefineStartedEvent; event Action? RefineFinishedEvent; Task ClearMyDayAsync(); Task GetAppSettingsAsync(); Task UpdateAppSettingsAsync(AppSettingsDto dto); Task> GetDailyNotesAsync(DateOnly day); Task AddDailyNoteAsync(DateOnly day, string text); Task UpdateDailyNoteAsync(string id, string text); Task DeleteDailyNoteAsync(string id); Task GetLastPrepLogAsync(); Task> GetPrimeSchedulesAsync(); Task UpsertPrimeScheduleAsync(PrimeScheduleDto dto); Task DeletePrimeScheduleAsync(Guid id); Task UpdateListAsync(UpdateListDto dto); Task UpdateListConfigAsync(UpdateListConfigDto dto); Task CleanupFinishedWorktreesAsync(string? listId = null); Task ResetAllWorktreesAsync(); Task> GetWorktreesOverviewAsync(string? listId); Task<(bool Ok, string? Error)> SetWorktreeStateAsync(string taskId, WorktreeState newState); Task ForceRemoveWorktreeAsync(string taskId); }