/** * State Coordinator for Hari Seldon * * Provides unified state management across tasks and worktrees. * Tracks task-worktree associations and lifecycle state. */ import { EventEmitter } from 'events'; import type { ConflictState, ConflictResolutionStrategy } from '../types.js'; export interface TaskState { taskId: string; role: string; status: 'pending' | 'running' | 'completed' | 'failed'; worktreeId?: string; startedAt?: number; completedAt?: number; error?: string; } export interface DeleteTaskOptions { /** Delete associated worktree if exists */ deleteWorktree?: boolean; /** Reason for deletion */ reason?: string; /** Force deletion even if task is running */ force?: boolean; } export interface StateEvents { 'task:created': (task: TaskState) => void; 'task:started': (task: TaskState) => void; 'task:completed': (task: TaskState) => void; 'task:failed': (task: TaskState, error: string) => void; 'task:deleted': (task: TaskState, reason?: string) => void; 'worktree:linked': (taskId: string, worktreeId: string) => void; 'worktree:unlinked': (taskId: string, worktreeId: string) => void; 'conflict:detected': (taskId: string, state: ConflictState) => void; 'conflict:resolved': (taskId: string, state: ConflictState) => void; } export declare class StateCoordinator extends EventEmitter { private readonly logger; private tasks; private taskToWorktree; private worktreeToTask; private conflictStates; constructor(); createTask(taskId: string, role: string): TaskState; startTask(taskId: string): TaskState; completeTask(taskId: string): TaskState; failTask(taskId: string, error: string): TaskState; getTask(taskId: string): TaskState | undefined; listTasks(): TaskState[]; listTasksByStatus(status: TaskState['status']): TaskState[]; /** * Delete a task and clean up associated resources. * Emits 'task:deleted' event. * * @param taskId - Task to delete * @param options - Deletion options * @returns true if task was deleted, false if not found * @throws Error if task is running and force is not set */ deleteTask(taskId: string, options?: DeleteTaskOptions): boolean; linkTaskToWorktree(taskId: string, worktreeId: string): void; unlinkTaskFromWorktree(taskId: string): string | undefined; getWorktreeForTask(taskId: string): string | undefined; getTaskForWorktree(worktreeId: string): string | undefined; hasActiveWorktree(taskId: string): boolean; getStats(): { totalTasks: number; runningTasks: number; linkedWorktrees: number; unresolvedConflicts: number; }; /** * Set conflict state for a task. */ setConflictState(taskId: string, state: ConflictState): void; /** * Get conflict state for a task. */ getConflictState(taskId: string): ConflictState | undefined; /** * Clear conflict state for a task (after resolution). */ clearConflictState(taskId: string): void; /** * Mark conflict as resolved. */ markConflictResolved(taskId: string, strategy: ConflictResolutionStrategy): void; /** * Check if a task has unresolved conflicts. */ hasUnresolvedConflicts(taskId: string): boolean; /** * Get all tasks with unresolved conflicts. */ getTasksWithConflicts(): string[]; cleanup(maxAgeMs: number): number; } //# sourceMappingURL=state-coordinator.d.ts.map