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; /// A running task raised a question via AskUser: (taskId, questionId, question). event Action? TaskQuestionAskedEvent; /// A pending question was answered, timed out, or the run ended: (taskId, questionId). event Action? TaskQuestionResolvedEvent; 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; } IReadOnlyList GetActiveTasks(); Task WakeQueueAsync(); Task RunNowAsync(string taskId); Task ContinueTaskAsync(string taskId, string followUpPrompt); /// Answer a question a running task raised via AskUser. Task AnswerTaskQuestionAsync(string taskId, string questionId, string answer); /// The question a running task is currently blocked on, if any (for re-attach). Task GetPendingQuestionAsync(string taskId); Task ResetTaskAsync(string taskId); Task CancelTaskAsync(string taskId); Task> GetAgentsAsync(); Task RefreshAgentsAsync(); Task RestoreDefaultAgentsAsync(); Task GetListConfigAsync(string listId); Task UpdateTaskAgentSettingsAsync(UpdateTaskAgentSettingsDto dto); Task> GetSessionSkillsAsync(); Task> InstallSessionSkillAsync(string url); Task UpdateSessionSkillAsync(string sourceUrl); Task RemoveSessionSkillAsync(string sourceUrl); 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 GetMergeConflictDocumentsAsync(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); // Picks up a task's Claude session in a real terminal window (--resume). Task ResumeTaskInTerminalAsync(string taskId, CancellationToken ct = default); /// Commits an interactively-worked task's worktree and moves it to WaitingForReview /// (the only path that flips a hand-driven ConPTY session into the review/merge pipeline). Task SubmitTaskForReviewAsync(string taskId, CancellationToken ct = default); /// Launch spec for an embedded ConPTY terminal to open an interactive session /// in a task's worktree (same worktree prep as an autonomous run). Task GetInteractiveLaunchSpecAsync(string taskId, CancellationToken ct = default); /// Launch spec for an ad-hoc interactive session in an arbitrary directory -- /// no task, no worktree. Task GetAdHocLaunchSpecAsync(string directory, CancellationToken ct = default); /// Launch spec for an embedded ConPTY "merge helper" session that drives the given /// tasks to a merged/Done state. listId scopes the session (and cwd) to that list. Task GetMergeHelperLaunchSpecAsync(IReadOnlyList taskIds, string listId, CancellationToken ct = default); /// Starts a planning session and returns the launch spec for an embedded ConPTY /// planning terminal (replaces StartPlanningSessionAsync's external wt window). Task GetPlanningStartLaunchSpecAsync(string taskId, CancellationToken ct = default); /// Resumes a planning session and returns its embedded-ConPTY launch spec. Task GetPlanningResumeLaunchSpecAsync(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> GetRecentLogsAsync(); 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); Task GetOnlineInboxStateAsync(); Task SetOnlineInboxConfigAsync(OnlineInboxConfigInputDto input); Task SetOnlineInboxAuthAsync(string refreshToken); Task ClearOnlineInboxAuthAsync(); }