@oxgeneral/orch 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/{App-KDZSTAMR.js → App-KHUT3IV7.js} +169 -71
  2. package/dist/{chunk-VTA74YWX.js → chunk-2KSBOAW3.js} +1 -1
  3. package/dist/{chunk-O5AO5QIR.js → chunk-3TGCIXJA.js} +7 -1
  4. package/dist/{chunk-6GFVB6EK.js → chunk-FRTKB575.js} +24 -38
  5. package/dist/chunk-K6DMQERQ.js +89 -0
  6. package/dist/{chunk-2B32FPEB.js → chunk-QTDKQYZI.js} +3 -3
  7. package/dist/{chunk-2B32FPEB.js.map → chunk-QTDKQYZI.js.map} +1 -1
  8. package/dist/{chunk-ZU6AY2VU.js → chunk-VAAOW526.js} +2 -2
  9. package/dist/chunk-VAAOW526.js.map +1 -0
  10. package/dist/chunk-ZTQ3KWXR.js +13 -0
  11. package/dist/chunk-ZTQ3KWXR.js.map +1 -0
  12. package/dist/cli.js +16 -16
  13. package/dist/{container-JV7TAUP5.js → container-KPH4HVAJ.js} +6 -6
  14. package/dist/{doctor-IO4PV4D6.js → doctor-GHRV5I2S.js} +4 -4
  15. package/dist/doctor-service-QEJCE5FK.js +3 -0
  16. package/dist/doctor-service-QEJCE5FK.js.map +1 -0
  17. package/dist/doctor-service-TPOMFAIG.js +2 -0
  18. package/dist/index.d.ts +20 -4
  19. package/dist/index.js +3 -3
  20. package/dist/index.js.map +1 -1
  21. package/dist/{init-BE5VKWOM.js → init-EQTGQ4G2.js} +18 -2
  22. package/dist/{logs-IAUAS5TX.js → logs-AK255DEJ.js} +1 -1
  23. package/dist/orchestrator-L6QX2LJ7.js +2 -0
  24. package/dist/{orchestrator-TAFBYQQ5.js.map → orchestrator-L6QX2LJ7.js.map} +1 -1
  25. package/dist/{orchestrator-VGYKSOZJ.js → orchestrator-OMU46RCE.js} +47 -19
  26. package/dist/{task-5OJTXW27.js → task-35SDKXFC.js} +1 -1
  27. package/dist/{tui-XDJE3IUA.js → tui-AR6PVMBQ.js} +6 -1
  28. package/dist/{update-72GZMF65.js → update-DCCWVISK.js} +1 -1
  29. package/dist/update-check-4YKLGBFB.js +2 -0
  30. package/dist/workspace-manager-AS4TFA7R.js +3 -0
  31. package/dist/workspace-manager-AS4TFA7R.js.map +1 -0
  32. package/dist/{workspace-manager-47KI7B27.js → workspace-manager-G5EQRS72.js} +38 -2
  33. package/package.json +1 -1
  34. package/dist/chunk-E3TCKHU6.js +0 -13
  35. package/dist/chunk-E3TCKHU6.js.map +0 -1
  36. package/dist/chunk-XI4TU6VU.js +0 -50
  37. package/dist/chunk-ZU6AY2VU.js.map +0 -1
  38. package/dist/doctor-service-A34DHPKI.js +0 -2
  39. package/dist/doctor-service-NTWBWOM2.js +0 -2
  40. package/dist/doctor-service-NTWBWOM2.js.map +0 -1
  41. package/dist/orchestrator-TAFBYQQ5.js +0 -2
  42. package/dist/update-check-4RV7Z6WT.js +0 -2
  43. package/dist/workspace-manager-7M46ESUL.js +0 -2
  44. package/dist/workspace-manager-7M46ESUL.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/domain/transitions.ts","../src/domain/scope.ts","../src/infrastructure/storage/lock.ts","../src/infrastructure/storage/cached-stores.ts","../src/application/review-runner.ts","../src/application/orchestrator.ts"],"names":["VALID_TRANSITIONS","TERMINAL_STATUSES","canTransition","from","to","isTerminal","status","isDispatchable","isBlocked","task","allTasks","depId","dep","t","resolveFailureStatus","resolveCompletionStatus","success","_autoApprove","calculateRetryDelay","attempt","baseDelayMs","maxDelayMs","delay","scopesOverlap","a","b","pa","pb","patternsOverlap","aBase","bBase","aDir","dirname","bDir","acquireLock","lockPath","bakPath","existing","readLockPid","isProcessAlive","fs","fd","err","releaseLock","content","pid","CachedTaskStore","inner","filter","key","result","id","CachedAgentStore","name","agent","CachedGoalStore","goal","CRITERION_COMMANDS","ReviewRunner","options","criteria","results","criterion","r","icon","truncated","cmd","args","resolve","execFile","error","stdout","stderr","output","MAX_EVENT_DATA_LEN","MAX_BUS_DATA_LEN","Orchestrator","deps","fn","release","next","prev","taskId","lockResult","LockConflictError","handler","signal","sig","bound","entry","state","agentId","tasks","running","queued","now","taskData","lastEventAt","stallTimeout","runningAgentIds","e","allAgents","i","retry","autonomousAgents","activeGoals","anyCreated","claimedGoalIds","g","role","title","description","AUTONOMOUS_LABEL","maxConcurrent","currentRunning","availableSlots","candidates","bTime","aTime","blockedIds","inProgressScoped","candidate","approvedPeers","c","compareTo","overlapping","other","TaskAlreadyRunningError","NoAgentsError","workspacePath","worktreeBranch","template","DEFAULT_PROMPT_TEMPLATE","retryContext","failedData","sharedContext","pendingMessages","context","buildPromptContext","prompt","run","agentData","adapter","abortController","handle","agentPid","generator","runId","collectedTokens","resultText","lastAgentMessage","filesChangedSet","event","data","text","p","filePath","eventTimestamp","isValidISOTimestamp","serialized","serializeEventData","runEvent","busData","finalResult","tokens","filesChanged","autoApprove","newStatus","runningEntry","successRuntimeMs","statsUpdate","mergeResult","validationErr","saveErr","agentAfter","agentAfterIdle","runtimeMs","failureStatus","cwd","allPassed","summaryPrefix","idx","value","d","maxLen","str"],"mappings":"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","file":"chunk-E3TCKHU6.js","sourcesContent":["/**\n * Task state machine — pure functions, no side effects.\n *\n * State diagram:\n * todo → in_progress → review → done\n * ↘ retrying → in_progress\n * ↘ failed (max attempts)\n * review → todo (rejected)\n * * → cancelled\n * failed → todo | retrying (manual reactivation)\n * cancelled → todo (manual reactivation)\n *\n * Terminal statuses (done, failed, cancelled) are not auto-dispatched\n * by the orchestrator but may have manual outgoing transitions.\n */\n\nimport type { Task, TaskStatus } from './task.js';\n\nconst VALID_TRANSITIONS: Record<TaskStatus, readonly TaskStatus[]> = {\n todo: ['in_progress', 'cancelled'],\n in_progress: ['review', 'retrying', 'failed', 'cancelled'],\n retrying: ['in_progress', 'failed', 'cancelled'],\n review: ['done', 'todo', 'cancelled'],\n done: [],\n failed: ['todo', 'retrying'],\n cancelled: ['todo'],\n};\n\nconst TERMINAL_STATUSES: ReadonlySet<TaskStatus> = new Set(['done', 'failed', 'cancelled']);\n\n/**\n * Check if a status transition is valid.\n */\nexport function canTransition(from: TaskStatus, to: TaskStatus): boolean {\n return VALID_TRANSITIONS[from].includes(to);\n}\n\n/**\n * Check if a task status is terminal — the orchestrator will not\n * auto-dispatch or retry it. Terminal tasks may still have valid\n * manual transitions (e.g. cancelled → todo, failed → todo).\n */\nexport function isTerminal(status: TaskStatus): boolean {\n return TERMINAL_STATUSES.has(status);\n}\n\n/**\n * Check if a task can be dispatched (ready for execution).\n */\nexport function isDispatchable(status: TaskStatus): boolean {\n return status === 'todo' || status === 'retrying';\n}\n\n/**\n * Check if a task is blocked by unfinished dependencies.\n */\nexport function isBlocked(task: Task, allTasks: Task[]): boolean {\n if (task.depends_on.length === 0) return false;\n\n return task.depends_on.some((depId) => {\n const dep = allTasks.find((t) => t.id === depId);\n return !dep || dep.status !== 'done';\n });\n}\n\n/**\n * Determine the next status after a task failure (run error or shutdown).\n * Returns 'retrying' if attempts remain, 'failed' otherwise.\n */\nexport function resolveFailureStatus(task: Task): TaskStatus {\n if (task.attempts < task.max_attempts) {\n return 'retrying';\n }\n return 'failed';\n}\n\n/**\n * Determine the next status after an agent completes or fails.\n * Always goes through 'review' on success — autoApprove is handled\n * by the orchestrator which transitions review → done immediately.\n */\nexport function resolveCompletionStatus(\n task: Task,\n success: boolean,\n _autoApprove: boolean,\n): TaskStatus {\n if (success) {\n return 'review';\n }\n\n return resolveFailureStatus(task);\n}\n\n/**\n * Calculate retry delay with exponential backoff and cap.\n */\nexport function calculateRetryDelay(\n attempt: number,\n baseDelayMs: number,\n maxDelayMs: number,\n): number {\n const delay = baseDelayMs * Math.pow(2, attempt);\n return Math.min(delay, maxDelayMs);\n}\n","/**\n * Scope overlap detection — pure functions, no side effects.\n *\n * A scope is an array of glob patterns (e.g. ['src/auth/**']).\n * Two tasks overlap if any pattern pair shares a common path prefix.\n */\n\nimport { dirname } from 'node:path';\n\n/**\n * Returns true if two scope arrays have at least one overlapping pattern pair.\n * Tasks with no scope never overlap (they are unconstrained by convention).\n */\nexport function scopesOverlap(a: string[] | undefined, b: string[] | undefined): boolean {\n if (!a?.length || !b?.length) return false;\n\n for (const pa of a) {\n for (const pb of b) {\n if (patternsOverlap(pa, pb)) return true;\n }\n }\n return false;\n}\n\n/**\n * Check if two glob patterns overlap by comparing their base prefixes.\n * Conservative: may produce false positives, but never false negatives.\n */\nfunction patternsOverlap(a: string, b: string): boolean {\n if (a === b) return true;\n\n const aBase = a.split('*')[0]!;\n const bBase = b.split('*')[0]!;\n\n if (aBase.startsWith(bBase) || bBase.startsWith(aBase)) return true;\n\n // Sibling files in the same directory overlap (e.g. src/auth/login.ts & src/auth/logout.ts)\n // Only compare dirname when both bases are file-like (not ending with /)\n if (!aBase.endsWith('/') && !bBase.endsWith('/')) {\n const aDir = dirname(aBase);\n const bDir = dirname(bBase);\n return aDir === bDir && aDir !== '.';\n }\n\n return false;\n}\n","/**\n * PID-based lock file for single-process constraint.\n *\n * Only one `orch run --watch` can run at a time.\n * One-shot commands do not acquire the lock.\n */\n\nimport fs from 'node:fs/promises';\nimport { LockConflictError } from '../../domain/errors.js';\n\nexport interface LockResult {\n acquired: boolean;\n pid?: number;\n}\n\n/**\n * Try to acquire the lock file. Checks for stale locks (dead PIDs).\n */\nexport async function acquireLock(lockPath: string): Promise<LockResult> {\n const bakPath = lockPath + '.bak';\n\n // Check for stale lock first\n const existing = await readLockPid(lockPath);\n if (existing !== null) {\n if (isProcessAlive(existing)) {\n return { acquired: false, pid: existing };\n }\n // Stale lock — atomically rename to .bak instead of unlink to close TOCTOU window.\n // If rename succeeds, we hold the .bak and can safely try open('wx').\n // If rename fails (another process already renamed it), fall through to open('wx').\n try {\n await fs.rename(lockPath, bakPath);\n } catch {\n // Another process already removed/renamed the stale lock — proceed to open('wx')\n }\n }\n\n // Atomic create: 'wx' flag fails if file already exists\n try {\n const fd = await fs.open(lockPath, 'wx');\n await fd.writeFile(String(process.pid), 'utf-8');\n await fd.close();\n // Clean up .bak file (best effort)\n await fs.unlink(bakPath).catch(() => {});\n return { acquired: true, pid: process.pid };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\n // Another process created the lock between our rename and open.\n // Restore .bak so the stale lock isn't lost (best effort).\n await fs.rename(bakPath, lockPath).catch(() => {});\n const pid = await readLockPid(lockPath);\n return { acquired: false, pid: pid ?? undefined };\n }\n throw err;\n }\n}\n\n/**\n * Release the lock file.\n */\nexport async function releaseLock(lockPath: string): Promise<void> {\n await fs.unlink(lockPath).catch(() => {});\n}\n\n/**\n * Check if a lock is held by a live process.\n */\nexport async function checkLock(lockPath: string): Promise<{ locked: boolean; pid?: number }> {\n const pid = await readLockPid(lockPath);\n\n if (pid === null) {\n return { locked: false };\n }\n\n if (isProcessAlive(pid)) {\n return { locked: true, pid };\n }\n\n // Stale lock\n return { locked: false };\n}\n\n/**\n * Acquire lock or throw LockConflictError.\n */\nexport async function requireLock(lockPath: string): Promise<void> {\n const result = await acquireLock(lockPath);\n if (!result.acquired && result.pid) {\n throw new LockConflictError(result.pid);\n }\n}\n\nasync function readLockPid(lockPath: string): Promise<number | null> {\n try {\n const content = await fs.readFile(lockPath, 'utf-8');\n const pid = parseInt(content.trim(), 10);\n return isNaN(pid) ? null : pid;\n } catch {\n return null;\n }\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n // EPERM means process exists but we lack permission to signal it\n if ((err as NodeJS.ErrnoException).code === 'EPERM') return true;\n return false;\n }\n}\n","/**\n * Tick-scoped caching wrappers for TaskStore, AgentStore, and GoalStore.\n *\n * Caches list() results within a single tick cycle.\n * Cache is invalidated on save()/delete() or manually via invalidate().\n */\n\nimport type { Task, TaskStatus } from '../../domain/task.js';\nimport type { Agent } from '../../domain/agent.js';\nimport type { Goal, GoalStatus } from '../../domain/goal.js';\nimport type { ITaskStore, IAgentStore, IGoalStore } from './interfaces.js';\n\nexport class CachedTaskStore implements ITaskStore {\n private cache: Map<string, Task[]> = new Map();\n\n constructor(private readonly inner: ITaskStore) {}\n\n async list(filter?: { status?: TaskStatus }): Promise<Task[]> {\n const key = filter?.status ?? '__all__';\n\n if (this.cache.has(key)) {\n return this.cache.get(key)!;\n }\n\n const result = await this.inner.list(filter);\n this.cache.set(key, result);\n return result;\n }\n\n async get(id: string): Promise<Task | null> {\n return this.inner.get(id);\n }\n\n async save(task: Task): Promise<void> {\n await this.inner.save(task);\n this.cache.clear();\n }\n\n async delete(id: string): Promise<void> {\n await this.inner.delete(id);\n this.cache.clear();\n }\n\n invalidate(): void {\n this.cache.clear();\n }\n}\n\nexport class CachedAgentStore implements IAgentStore {\n private listCache: Agent[] | null = null;\n\n constructor(private readonly inner: IAgentStore) {}\n\n async list(): Promise<Agent[]> {\n if (this.listCache) {\n return this.listCache;\n }\n\n const result = await this.inner.list();\n this.listCache = result;\n return result;\n }\n\n async get(id: string): Promise<Agent | null> {\n return this.inner.get(id);\n }\n\n async getByName(name: string): Promise<Agent | null> {\n return this.inner.getByName(name);\n }\n\n async save(agent: Agent): Promise<void> {\n await this.inner.save(agent);\n this.listCache = null;\n }\n\n async delete(id: string): Promise<void> {\n await this.inner.delete(id);\n this.listCache = null;\n }\n\n invalidate(): void {\n this.listCache = null;\n }\n}\n\nexport class CachedGoalStore implements IGoalStore {\n private cache: Map<string, Goal[]> = new Map();\n\n constructor(private readonly inner: IGoalStore) {}\n\n async list(filter?: { status?: GoalStatus }): Promise<Goal[]> {\n const key = filter?.status ?? '__all__';\n if (this.cache.has(key)) return this.cache.get(key)!;\n const result = await this.inner.list(filter);\n this.cache.set(key, result);\n return result;\n }\n\n async get(id: string): Promise<Goal | null> {\n return this.inner.get(id);\n }\n\n async save(goal: Goal): Promise<void> {\n await this.inner.save(goal);\n this.cache.clear();\n }\n\n async delete(id: string): Promise<void> {\n await this.inner.delete(id);\n this.cache.clear();\n }\n\n invalidate(): void {\n this.cache.clear();\n }\n}\n","/**\n * ReviewRunner — automatic review of completed tasks.\n *\n * Executes review criteria (test_pass, typecheck, lint) as shell commands\n * and returns pass/fail results. Used by the orchestrator to auto-approve\n * tasks that have review_criteria defined.\n */\n\nimport { execFile } from 'node:child_process';\nimport type { ReviewCriterion, ReviewResult } from '../domain/task.js';\n\nconst CRITERION_COMMANDS: Record<ReviewCriterion, { cmd: string; args: string[] }> = {\n test_pass: { cmd: 'npm', args: ['test'] },\n typecheck: { cmd: 'npx', args: ['tsc', '--noEmit'] },\n lint: { cmd: 'npm', args: ['run', 'lint'] },\n};\n\nexport interface ReviewRunnerOptions {\n cwd: string;\n timeout_ms?: number;\n}\n\nexport class ReviewRunner {\n private readonly cwd: string;\n private readonly timeoutMs: number;\n\n constructor(options: ReviewRunnerOptions) {\n this.cwd = options.cwd;\n this.timeoutMs = options.timeout_ms ?? 120_000;\n }\n\n /**\n * Run all criteria and return results.\n * Continues running even if one criterion fails.\n */\n async runAll(criteria: ReviewCriterion[]): Promise<ReviewResult[]> {\n const results: ReviewResult[] = [];\n\n for (const criterion of criteria) {\n const result = await this.runCriterion(criterion);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Check if all results passed.\n */\n static allPassed(results: ReviewResult[]): boolean {\n return results.length > 0 && results.every((r) => r.passed);\n }\n\n /**\n * Format results into a human-readable report.\n */\n static formatReport(results: ReviewResult[]): string {\n const lines = results.map((r) => {\n const icon = r.passed ? '✓' : '✗';\n const truncated = r.output.slice(0, 500);\n return `${icon} ${r.criterion}: ${r.passed ? 'PASSED' : 'FAILED'}\\n ${truncated}`;\n });\n return lines.join('\\n\\n');\n }\n\n private runCriterion(criterion: ReviewCriterion): Promise<ReviewResult> {\n const { cmd, args } = CRITERION_COMMANDS[criterion];\n\n return new Promise((resolve) => {\n execFile(\n cmd,\n args,\n { cwd: this.cwd, timeout: this.timeoutMs, maxBuffer: 1024 * 1024 },\n (error, stdout, stderr) => {\n const output = (stdout + '\\n' + stderr).trim();\n resolve({\n criterion,\n passed: !error,\n output: output.slice(0, 2000),\n });\n },\n );\n });\n }\n}\n","/**\n * Orchestrator — the core state machine.\n *\n * Tick loop: Reconcile → Dispatch → Collect\n *\n * Reconcile: check PID liveness, detect stalls, process retry queue\n * Dispatch: claim tasks, assign to agents, launch adapters\n * Collect: process completed runs, update stats\n */\n\nimport type { OrchestratorConfig } from '../domain/config.js';\nimport type { OrchestratorState, RunningEntry } from '../domain/state.js';\nimport type { Task } from '../domain/task.js';\nimport { AUTONOMOUS_LABEL } from '../domain/task.js';\nimport type { RunEvent } from '../domain/run.js';\nimport {\n isDispatchable,\n isBlocked,\n isTerminal,\n resolveCompletionStatus,\n resolveFailureStatus,\n calculateRetryDelay,\n} from '../domain/transitions.js';\nimport { NoAgentsError, TaskAlreadyRunningError, LockConflictError } from '../domain/errors.js';\nimport { scopesOverlap } from '../domain/scope.js';\nimport { acquireLock, releaseLock } from '../infrastructure/storage/lock.js';\nimport type { ITaskStore, IAgentStore, IRunStore, IStateStore, IContextStore, IGoalStore } from '../infrastructure/storage/interfaces.js';\nimport { CachedTaskStore, CachedAgentStore, CachedGoalStore } from '../infrastructure/storage/cached-stores.js';\nimport type { AdapterRegistry } from '../infrastructure/adapters/registry.js';\nimport type { IWorkspaceManager } from '../infrastructure/workspace/interface.js';\nimport type { ITemplateEngine } from '../infrastructure/template/template-engine.js';\nimport { buildPromptContext, DEFAULT_PROMPT_TEMPLATE, type RetryContext } from '../infrastructure/template/template-engine.js';\nimport type { IProcessManager } from '../infrastructure/process/process-manager.js';\nimport type { AgentEvent } from '../infrastructure/adapters/interface.js';\nimport type { EventBus } from './event-bus.js';\nimport type { TaskService } from './task-service.js';\nimport type { AgentService } from './agent-service.js';\nimport type { RunService } from './run-service.js';\nimport { ReviewRunner } from './review-runner.js';\n\n/** Max serialized event data written to JSONL (8 KB) */\nconst MAX_EVENT_DATA_LEN = 8192;\n/** Max event data sent to TUI via event bus (4 KB) */\nconst MAX_BUS_DATA_LEN = 4096;\n\nexport interface OrchestratorDeps {\n taskStore: ITaskStore;\n agentStore: IAgentStore;\n runStore: IRunStore;\n stateStore: IStateStore;\n adapterRegistry: AdapterRegistry;\n workspaceManager: IWorkspaceManager;\n templateEngine: ITemplateEngine;\n processManager: IProcessManager;\n eventBus: EventBus;\n taskService: TaskService;\n agentService: AgentService;\n runService: RunService;\n contextStore?: IContextStore;\n messageService?: import('./message-service.js').MessageService;\n goalStore?: IGoalStore;\n config: OrchestratorConfig;\n projectRoot: string;\n lockPath: string;\n}\n\nexport class Orchestrator {\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private shuttingDown = false;\n private state: OrchestratorState | null = null;\n private abortControllers = new Map<string, AbortController>();\n private readonly cachedTaskStore: CachedTaskStore;\n private readonly cachedAgentStore: CachedAgentStore;\n private readonly cachedGoalStore: CachedGoalStore | null;\n private saveStateTimer: ReturnType<typeof setTimeout> | null = null;\n private saveStateDirty = false;\n private lockAcquired = false;\n private consecutiveTickFailures = 0;\n private readonly maxConsecutiveTickFailures = 5;\n private readonly maxRetryQueueSize = 100;\n private signalHandlers: Array<[NodeJS.Signals, () => void]> = [];\n private immediateDispatchTimer: ReturnType<typeof setTimeout> | null = null;\n private taskCreatedUnsub: (() => void) | null = null;\n private tickInProgress = false;\n\n /** Promise-chain mutex to serialize critical state mutations. */\n private stateMutex: Promise<void> = Promise.resolve();\n\n constructor(private readonly deps: OrchestratorDeps) {\n this.cachedTaskStore = new CachedTaskStore(deps.taskStore);\n this.cachedAgentStore = new CachedAgentStore(deps.agentStore);\n this.cachedGoalStore = deps.goalStore ? new CachedGoalStore(deps.goalStore) : null;\n }\n\n /**\n * Check if this instance owns the lock (can mutate state).\n */\n get isOwner(): boolean {\n return this.lockAcquired;\n }\n\n /**\n * Serialize access to state mutations via a Promise-chain mutex.\n * Prevents concurrent tick/stop/reconcile from reading stale state.\n */\n private withStateLock<T>(fn: () => Promise<T>): Promise<T> {\n let release: () => void;\n const next = new Promise<void>((resolve) => { release = resolve; });\n const prev = this.stateMutex;\n this.stateMutex = next;\n return prev.then(async () => {\n try {\n return await fn();\n } finally {\n release!();\n }\n });\n }\n\n /**\n * Run a single task by ID. Acquires lock for the duration of the run.\n */\n async runTask(taskId: string): Promise<void> {\n await this.withTemporaryLock(async () => {\n await this.loadState();\n await this.dispatchTask(taskId);\n });\n }\n\n /**\n * Run all dispatchable tasks. Acquires lock for the duration of the run.\n */\n async runAll(): Promise<void> {\n await this.withTemporaryLock(async () => {\n await this.loadState();\n await this.dispatchAll();\n });\n }\n\n /**\n * Acquire lock, run fn, then release lock.\n * Used by single-shot commands (runTask, runAll) that don't go through startWatch.\n */\n private async withTemporaryLock(fn: () => Promise<void>): Promise<void> {\n const lockResult = await acquireLock(this.deps.lockPath);\n if (!lockResult.acquired) {\n throw new LockConflictError(lockResult.pid!);\n }\n this.lockAcquired = true;\n try {\n await fn();\n } finally {\n this.lockAcquired = false;\n await releaseLock(this.deps.lockPath);\n }\n }\n\n /**\n * Start watch mode — continuous tick loop.\n * Acquires a PID lock to prevent multiple orchestrators.\n */\n async startWatch(): Promise<void> {\n // Acquire lock — only one orchestrator per project\n const lockResult = await acquireLock(this.deps.lockPath);\n if (!lockResult.acquired) {\n throw new LockConflictError(lockResult.pid!);\n }\n this.lockAcquired = true;\n\n await this.loadState();\n\n this.state!.pid = process.pid;\n this.state!.started_at = new Date().toISOString();\n await this.saveState();\n\n // Register signal handlers for graceful shutdown\n this.registerSignalHandlers();\n\n // Subscribe to task:created for reactive dispatch\n this.taskCreatedUnsub = this.deps.eventBus.on('task:created', () => {\n this.scheduleImmediateDispatch();\n });\n\n // Initial tick\n await this.tick();\n\n // Start polling\n this.intervalId = setInterval(\n () => this.tick().then(\n () => { this.consecutiveTickFailures = 0; },\n (err) => {\n this.consecutiveTickFailures++;\n const error = err instanceof Error ? err.message : String(err);\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error,\n context: 'tick',\n fatal: this.consecutiveTickFailures >= this.maxConsecutiveTickFailures,\n });\n if (this.consecutiveTickFailures >= this.maxConsecutiveTickFailures) {\n this.deps.eventBus.emit({\n type: 'orchestrator:shutdown',\n reason: `${this.consecutiveTickFailures} consecutive tick failures`,\n });\n this.stop().catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: 'stop after consecutive tick failures', fatal: false });\n });\n }\n },\n ),\n this.deps.config.scheduling.poll_interval_ms,\n );\n }\n\n /**\n * Register SIGINT/SIGTERM handlers for graceful shutdown.\n */\n private registerSignalHandlers(): void {\n const handler = (signal: string) => {\n this.deps.eventBus.emit({\n type: 'orchestrator:shutdown',\n reason: `Received ${signal}`,\n });\n this.stop().catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `stop after ${signal} signal`, fatal: false });\n });\n };\n\n for (const sig of ['SIGINT', 'SIGTERM'] as const) {\n const bound = () => handler(sig);\n this.signalHandlers.push([sig, bound]);\n process.on(sig, bound);\n }\n }\n\n /**\n * Remove signal handlers to avoid listener leaks.\n */\n private removeSignalHandlers(): void {\n for (const [sig, handler] of this.signalHandlers) {\n process.removeListener(sig, handler);\n }\n this.signalHandlers = [];\n }\n\n /**\n * Stop the watch loop and clean up.\n */\n async stop(): Promise<void> {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n\n // Stop polling\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n // Unsubscribe from task:created and clear debounce timer\n if (this.taskCreatedUnsub) {\n this.taskCreatedUnsub();\n this.taskCreatedUnsub = null;\n }\n if (this.immediateDispatchTimer) {\n clearTimeout(this.immediateDispatchTimer);\n this.immediateDispatchTimer = null;\n }\n\n // Flush any pending debounced writes before shutdown\n await this.flushStateLazy();\n\n // Graceful shutdown of running agents — serialized via mutex\n await this.withStateLock(async () => {\n if (this.state) {\n for (const [taskId, entry] of Object.entries(this.state.running)) {\n this.abortControllers.get(taskId)?.abort();\n this.abortControllers.delete(taskId);\n await this.deps.processManager.killWithGrace(entry.pid);\n\n // Mark run as cancelled\n await this.deps.runService.finish(entry.run_id, 'cancelled');\n\n // Mark task for retry if possible\n const task = await this.deps.taskStore.get(taskId);\n if (task) {\n await this.deps.taskService.updateStatus(taskId, resolveFailureStatus(task));\n }\n\n // Release agent\n await this.deps.agentService.setStatus(entry.agent_id, 'idle');\n }\n\n this.state.running = {};\n this.state.claimed = [];\n this.state.pid = undefined;\n this.state.started_at = undefined;\n await this.saveState();\n }\n });\n\n // Release lock\n if (this.lockAcquired) {\n await releaseLock(this.deps.lockPath);\n this.lockAcquired = false;\n }\n\n // Remove signal handlers\n this.removeSignalHandlers();\n }\n\n /**\n * Cancel a running task: kill agent process, clean state, mark cancelled.\n * Acquires lock if not already owned (standalone CLI invocation).\n */\n async cancelTask(taskId: string): Promise<void> {\n if (!this.lockAcquired) {\n return this.withTemporaryLock(() => this.cancelTask(taskId));\n }\n\n await this.withStateLock(async () => {\n await this.loadState();\n const state = this.state!;\n const entry = state.running[taskId];\n\n if (entry) {\n this.abortControllers.get(taskId)?.abort();\n this.abortControllers.delete(taskId);\n await this.deps.processManager.killWithGrace(entry.pid, 3_000).catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `cancelTask kill process ${entry.pid} for task ${taskId}`, fatal: false });\n });\n await this.deps.runService.finish(entry.run_id, 'cancelled').catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `cancelTask finish run ${entry.run_id}`, fatal: false });\n });\n await this.deps.agentService.setStatus(entry.agent_id, 'idle').catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `cancelTask setStatus idle for agent ${entry.agent_id}`, fatal: false });\n });\n\n delete state.running[taskId];\n await this.saveState();\n }\n\n state.retry_queue = state.retry_queue.filter((r) => r.task_id !== taskId);\n\n try {\n await this.deps.taskService.cancel(taskId);\n } catch {\n try {\n await this.deps.taskService.updateStatus(taskId, 'cancelled');\n } catch {\n // Already terminal — ignore\n }\n }\n\n await this.saveState();\n });\n }\n\n /**\n * Force-stop a specific agent: kill process, clean state, release agent.\n * Acquires lock if not already owned (standalone CLI invocation).\n */\n async forceStopAgent(agentId: string): Promise<void> {\n if (!this.lockAcquired) {\n return this.withTemporaryLock(() => this.forceStopAgent(agentId));\n }\n\n await this.withStateLock(async () => {\n await this.loadState();\n const state = this.state!;\n\n for (const [taskId, entry] of Object.entries(state.running)) {\n if (entry.agent_id === agentId) {\n this.abortControllers.get(taskId)?.abort();\n this.abortControllers.delete(taskId);\n await this.deps.processManager.killWithGrace(entry.pid, 3_000);\n await this.deps.runService.finish(entry.run_id, 'cancelled');\n\n try {\n await this.deps.taskService.updateStatus(taskId, 'failed');\n } catch {\n // Transition may not be valid — ignore\n }\n\n delete state.running[taskId];\n }\n }\n\n await this.deps.agentService.setStatus(agentId, 'idle');\n await this.saveState();\n });\n }\n\n /**\n * Single tick: Reconcile → Dispatch → Collect\n * Serialized via mutex to prevent concurrent ticks from racing on state.\n */\n private async tick(): Promise<void> {\n if (this.shuttingDown) return;\n\n this.tickInProgress = true;\n try {\n await this.withStateLock(async () => {\n if (this.shuttingDown) return;\n\n this.cachedTaskStore.invalidate();\n this.cachedAgentStore.invalidate();\n this.cachedGoalStore?.invalidate();\n\n await this.loadState();\n await this.reconcile();\n await this.seedAutonomousTasks();\n await this.dispatchAll();\n\n const tasks = await this.cachedTaskStore.list();\n const running = Object.keys(this.state!.running).length;\n const queued = tasks.filter((t) => isDispatchable(t.status)).length;\n\n this.deps.eventBus.emit({\n type: 'orchestrator:tick',\n running,\n queued,\n });\n });\n } finally {\n this.tickInProgress = false;\n }\n }\n\n /**\n * Schedule an immediate dispatch with 500ms debounce.\n * Called on task:created to avoid waiting for the next 30s tick.\n */\n private scheduleImmediateDispatch(): void {\n if (this.shuttingDown) return;\n if (this.immediateDispatchTimer) return; // already scheduled\n\n this.immediateDispatchTimer = setTimeout(() => {\n this.immediateDispatchTimer = null;\n if (this.shuttingDown || this.tickInProgress) return;\n this.immediateDispatch().catch((err) => {\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: err instanceof Error ? err.message : String(err),\n context: 'immediate dispatch on task:created',\n fatal: false,\n });\n });\n }, 500);\n }\n\n /**\n * Mini-tick: invalidate caches → loadState → dispatchAll → saveState.\n * Skips reconcile/collect — only dispatches new tasks immediately.\n */\n private async immediateDispatch(): Promise<void> {\n if (this.shuttingDown) return;\n\n await this.withStateLock(async () => {\n if (this.shuttingDown) return;\n\n this.cachedTaskStore.invalidate();\n this.cachedAgentStore.invalidate();\n\n await this.loadState();\n await this.dispatchAll();\n await this.saveState();\n });\n }\n\n /**\n * Reconcile: check PID liveness, detect stalls, process retry queue.\n */\n private async reconcile(): Promise<void> {\n const state = this.state!;\n const now = Date.now();\n\n // Check running processes\n for (const [taskId, entry] of Object.entries(state.running)) {\n // If task is already terminal (done/failed/cancelled), just clean up the stale entry\n const taskData = await this.deps.taskStore.get(taskId);\n if (!taskData || isTerminal(taskData.status)) {\n this.abortControllers.delete(taskId);\n delete state.running[taskId];\n await this.deps.agentService.setStatus(entry.agent_id, 'idle').catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `reconcile setStatus idle for stale agent ${entry.agent_id} (task ${taskId})`, fatal: false });\n });\n continue;\n }\n\n // PID check\n if (!this.deps.processManager.isAlive(entry.pid)) {\n // Process crashed — wrap in try/catch to ensure running entry is always cleaned\n try {\n await this._handleRunFailure(taskId, entry, 'Process crashed unexpectedly');\n } catch {\n // Cleanup even if _handleRunFailure fails (e.g. invalid transition)\n delete state.running[taskId];\n await this.deps.agentService.setStatus(entry.agent_id, 'idle').catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `reconcile crash fallback setStatus idle for agent ${entry.agent_id} (task ${taskId})`, fatal: false });\n });\n }\n continue;\n }\n\n // Stall detection\n const lastEventAt = new Date(entry.last_event_at).getTime();\n const stallTimeout = this.deps.config.defaults.agent.stall_timeout_ms;\n\n if (now - lastEventAt > stallTimeout) {\n this.deps.eventBus.emit({\n type: 'orchestrator:stall_detected',\n runId: entry.run_id,\n });\n\n this.abortControllers.get(taskId)?.abort();\n await this.deps.processManager.killWithGrace(entry.pid, 5_000);\n try {\n await this._handleRunFailure(taskId, entry, 'Agent stalled (no events)');\n } catch {\n delete state.running[taskId];\n await this.deps.agentService.setStatus(entry.agent_id, 'idle').catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `reconcile stall fallback setStatus idle for agent ${entry.agent_id} (task ${taskId})`, fatal: false });\n });\n }\n }\n }\n\n // Fix stale agent statuses — agents stuck in 'running' with no running entry\n const runningAgentIds = new Set(Object.values(state.running).map((e) => e.agent_id));\n const allAgents = await this.cachedAgentStore.list();\n for (const agent of allAgents) {\n if (agent.status === 'running' && !runningAgentIds.has(agent.id)) {\n await this.deps.agentService.setStatus(agent.id, 'idle');\n }\n }\n\n // Fix orphaned tasks — stuck in 'in_progress' with no running entry\n const allTasks = await this.cachedTaskStore.list();\n for (const task of allTasks) {\n if (task.status === 'in_progress' && !state.running[task.id]) {\n try {\n await this.deps.taskService.updateStatus(task.id, 'failed');\n } catch {\n // If 'failed' transition is invalid, force-write via store\n task.status = 'failed';\n task.updated_at = new Date().toISOString();\n await this.deps.taskStore.save(task).catch((err) => {\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: err instanceof Error ? err.message : String(err),\n context: `force-write orphaned task ${task.id}`,\n fatal: false,\n });\n });\n }\n this.deps.eventBus.emit({\n type: 'task:orphaned',\n taskId: task.id,\n });\n }\n }\n\n // Process retry queue — dispatchTask handles the status transition\n for (let i = state.retry_queue.length - 1; i >= 0; i--) {\n const retry = state.retry_queue[i]!;\n if (now >= new Date(retry.due_at).getTime()) {\n state.retry_queue.splice(i, 1);\n await this.dispatchTask(retry.task_id);\n }\n }\n\n await this.saveState();\n }\n\n /**\n * Create tasks for autonomous agents that have no active work.\n *\n * Priority: active Goals assigned to the agent come first.\n * If no goals, falls back to role-based autonomous work.\n */\n private async seedAutonomousTasks(): Promise<void> {\n const agents = await this.cachedAgentStore.list();\n const autonomousAgents = agents.filter(\n (a) => a.autonomous && a.status === 'idle',\n );\n if (autonomousAgents.length === 0) return;\n\n const allTasks = await this.cachedTaskStore.list();\n const activeGoals = this.cachedGoalStore\n ? await this.cachedGoalStore.list({ status: 'active' })\n : [];\n\n let anyCreated = false;\n const claimedGoalIds = new Set<string>();\n for (const agent of autonomousAgents) {\n // Skip if agent already has a non-terminal task assigned\n const hasActiveTask = allTasks.some(\n (t) => t.assignee === agent.id && !isTerminal(t.status),\n );\n if (hasActiveTask) continue;\n\n // Find goal: prefer assigned to this agent, then unassigned (not yet claimed)\n const goal = activeGoals.find(\n (g) => g.assignee === agent.id && !claimedGoalIds.has(g.id),\n ) ?? activeGoals.find(\n (g) => !g.assignee && !claimedGoalIds.has(g.id),\n );\n if (goal) claimedGoalIds.add(goal.id);\n const role = agent.role ?? 'general assistant';\n\n const title = goal\n ? `[auto] ${agent.name}: ${goal.title.slice(0, 60)}`\n : `[auto] ${agent.name}: ${role.slice(0, 60)}`;\n const description = goal\n ? `## GOAL (highest priority)\\n\\n${goal.description || goal.title}\\n\\n---\\nAgent role: ${role}`\n : `Autonomous work cycle. Agent role: ${role}`;\n\n try {\n await this.deps.taskService.create({\n title,\n description,\n assignee: agent.id,\n labels: [AUTONOMOUS_LABEL],\n priority: 3,\n });\n anyCreated = true;\n } catch (err) {\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: err instanceof Error ? err.message : String(err),\n context: `autonomous task for agent ${agent.id}`,\n fatal: false,\n });\n }\n }\n if (anyCreated) this.cachedTaskStore.invalidate();\n }\n\n /**\n * Dispatch all dispatchable tasks up to max_concurrent_agents.\n */\n private async dispatchAll(): Promise<void> {\n const state = this.state!;\n const maxConcurrent = this.deps.config.scheduling.max_concurrent_agents;\n const currentRunning = Object.keys(state.running).length;\n const availableSlots = maxConcurrent - currentRunning;\n\n if (availableSlots <= 0) return;\n\n const allTasks = await this.cachedTaskStore.list();\n const candidates = allTasks\n .filter(\n (t) =>\n isDispatchable(t.status) &&\n !isBlocked(t, allTasks) &&\n !state.running[t.id] &&\n !state.claimed.includes(t.id),\n )\n .sort((a, b) => {\n const bTime = b.updated_at ?? '';\n const aTime = a.updated_at ?? '';\n return bTime < aTime ? -1 : bTime > aTime ? 1 : 0;\n })\n .slice(0, availableSlots);\n\n // Scope overlap check — block dispatch if candidate overlaps with running or earlier candidate\n const blockedIds = new Set<string>();\n const inProgressScoped = allTasks.filter((t) => t.status === 'in_progress' && t.scope?.length);\n for (let i = 0; i < candidates.length; i++) {\n const candidate = candidates[i]!;\n if (!candidate.scope?.length) continue;\n const approvedPeers = candidates.slice(0, i).filter((c) => !blockedIds.has(c.id));\n const compareTo = [...inProgressScoped, ...approvedPeers];\n let overlapping = false;\n for (const other of compareTo) {\n if (scopesOverlap(candidate.scope, other.scope)) {\n this.deps.eventBus.emit({\n type: 'task:scope_overlap',\n taskId: candidate.id,\n overlappingTaskId: other.id,\n patterns: candidate.scope!,\n });\n overlapping = true;\n break;\n }\n }\n if (overlapping) blockedIds.add(candidate.id);\n }\n\n for (const task of candidates) {\n if (blockedIds.has(task.id)) continue;\n try {\n await this.dispatchTask(task.id);\n } catch (err) {\n // Log but don't stop dispatching other tasks\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: err instanceof Error ? err.message : String(err),\n context: `dispatch task ${task.id}`,\n fatal: false,\n });\n }\n }\n }\n\n /**\n * Dispatch a single task: claim → assign → execute.\n */\n private async dispatchTask(taskId: string): Promise<void> {\n const state = this.state!;\n\n // Validate\n if (state.running[taskId]) {\n const entry = state.running[taskId]!;\n throw new TaskAlreadyRunningError(taskId, entry.run_id, entry.agent_id);\n }\n\n const task = await this.deps.taskService.get(taskId);\n\n // Claim (persist before spawning)\n state.claimed.push(taskId);\n await this.saveState();\n\n try {\n // Find agent\n const agent = await this.deps.agentService.findBestAgent(task);\n if (!agent) {\n const allAgents = await this.cachedAgentStore.list();\n if (allAgents.length === 0) {\n throw new NoAgentsError();\n }\n // No idle agents — unclaim and return\n this.unclaim(taskId);\n await this.saveState();\n return;\n }\n\n // Prepare workspace\n const { path: workspacePath, branch: worktreeBranch } = await this.deps.workspaceManager.prepare(\n task,\n agent,\n this.deps.config,\n );\n\n // Build prompt (with retry context if this is a retry attempt)\n const template =\n this.deps.config.prompt?.template ?? DEFAULT_PROMPT_TEMPLATE;\n const allAgents = await this.cachedAgentStore.list();\n const attempt = task.attempts + 1;\n\n let retryContext: RetryContext | undefined;\n if (attempt > 1) {\n const failedData = await this.deps.runService.getLastFailedRunContext(task.id);\n if (failedData) {\n retryContext = {\n previous_error: failedData.error,\n previous_output: failedData.output,\n };\n }\n }\n\n const sharedContext = this.deps.contextStore\n ? await this.deps.contextStore.getAll()\n : undefined;\n\n // Drain pending messages for this agent\n const pendingMessages = this.deps.messageService\n ? await this.deps.messageService.drainMailbox(agent.id, task.id)\n : [];\n\n const context = buildPromptContext(\n task,\n agent,\n attempt,\n workspacePath,\n this.deps.config,\n { allAgents, retryContext, sharedContext, feedback: task.feedback, messages: pendingMessages.length ? pendingMessages : undefined },\n );\n const prompt = await this.deps.templateEngine.render(template, context);\n\n // Create run\n const run = await this.deps.runService.create({\n taskId: task.id,\n agentId: agent.id,\n attempt,\n prompt,\n workspacePath,\n });\n\n // Reset terminal states before transitioning to in_progress\n if (task.status === 'failed' || task.status === 'cancelled') {\n await this.deps.taskService.retry(taskId);\n task.status = 'todo';\n task.attempts = 0;\n }\n // Update task status\n await this.deps.taskService.updateStatus(taskId, 'in_progress');\n await this.deps.taskService.assign(taskId, agent.id);\n await this.deps.taskService.incrementAttempts(taskId);\n\n // Save worktree branch on proof immediately (survives any later failure)\n if (worktreeBranch) {\n task.proof = { ...(task.proof ?? { files_changed: [] }), branch: worktreeBranch };\n task.workspace = workspacePath;\n await this.deps.taskStore.save(task);\n }\n\n // Update agent status\n await this.deps.agentService.setStatus(agent.id, 'running');\n const agentData = await this.deps.agentService.get(agent.id);\n agentData.current_task = taskId;\n await this.deps.agentStore.save(agentData);\n\n // Get adapter and execute\n const adapter = this.deps.adapterRegistry.require(agent.adapter);\n const abortController = new AbortController();\n this.abortControllers.set(taskId, abortController);\n\n const handle = adapter.execute({\n prompt,\n workspace: workspacePath,\n env: {\n ...agent.config.env,\n ORCH_AGENT_ID: agent.id,\n ORCH_AGENT_NAME: agent.name,\n ORCH_TASK_ID: task.id,\n },\n config: agentData.config,\n signal: abortController.signal,\n });\n\n const agentPid = handle.pid;\n const now = new Date().toISOString();\n await this.deps.runService.start(run.id, agentPid);\n\n // Move from claimed to running\n this.unclaim(taskId);\n state.running[taskId] = {\n run_id: run.id,\n agent_id: agent.id,\n task_id: taskId,\n pid: agentPid,\n started_at: now,\n last_event_at: now,\n };\n await this.saveState();\n\n // Collect events in background\n this.collectEvents(\n handle.events,\n run.id,\n taskId,\n agent.id,\n ).catch((err) => {\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: err instanceof Error ? err.message : String(err),\n context: `adapter execution for ${taskId}`,\n fatal: false,\n });\n });\n } catch (err) {\n // Rollback claim\n this.unclaim(taskId);\n await this.saveState();\n throw err;\n }\n }\n\n /**\n * Collect events from an adapter's async generator.\n */\n private async collectEvents(\n generator: AsyncGenerator<import('../infrastructure/adapters/interface.js').AgentEvent>,\n runId: string,\n taskId: string,\n agentId: string,\n ): Promise<void> {\n let collectedTokens: import('../domain/run.js').TokenUsage | undefined;\n let resultText: string | undefined;\n let lastAgentMessage: string | undefined;\n const filesChangedSet = new Set<string>();\n\n try {\n for await (const event of generator) {\n if (this.shuttingDown) break;\n\n // Capture token usage and result text from done events\n if (event.type === 'done') {\n if (event.tokens) collectedTokens = event.tokens;\n const data = event.data as Record<string, unknown> | undefined;\n // Claude: { type: 'result', result: '...' }\n // Codex: { type: 'turn.completed', result: '...' }\n if (data && typeof data.result === 'string') {\n resultText = data.result;\n }\n }\n\n // Collect last agent message text as fallback for result\n // (Codex agent_message items, Claude assistant messages, etc.)\n if (event.type === 'output') {\n const data = event.data as Record<string, unknown> | undefined;\n if (data) {\n const text = typeof data.text === 'string' ? data.text :\n typeof data.message === 'string' ? data.message : undefined;\n if (text?.trim()) lastAgentMessage = text;\n }\n }\n\n // Track file changes\n if (event.type === 'file_change') {\n const data = event.data as Record<string, unknown> | undefined;\n // Codex sends { paths: string[], raw: ... }\n if (data && Array.isArray(data.paths)) {\n for (const p of data.paths) {\n if (typeof p === 'string') filesChangedSet.add(p);\n }\n } else {\n const filePath = data && typeof data.path === 'string' ? data.path :\n typeof event.data === 'string' ? event.data : String(event.data);\n filesChangedSet.add(filePath);\n }\n }\n\n // Validate and normalize event timestamp\n const eventTimestamp = isValidISOTimestamp(event.timestamp)\n ? event.timestamp\n : new Date().toISOString();\n\n // Serialize + truncate once — reused for JSONL write and event bus\n const serialized = serializeEventData(event.data, MAX_EVENT_DATA_LEN);\n // Release the original (potentially large) parsed object for GC\n (event as unknown as Record<string, unknown>).data = undefined;\n\n // Record event (pre-serialized string keeps JSONL lines manageable)\n const runEvent: RunEvent = {\n timestamp: eventTimestamp,\n type: event.type === 'output' ? 'agent_output' :\n event.type === 'file_change' ? 'file_changed' :\n event.type === 'command' ? 'command_run' :\n event.type === 'tool_call' ? 'tool_call' :\n event.type === 'error' ? 'error' : 'done',\n data: serialized,\n };\n await this.deps.runService.appendEvent(runId, runEvent);\n\n // Update last_event_at for stall detection (debounced write — non-critical)\n if (this.state?.running[taskId]) {\n this.state.running[taskId]!.last_event_at = eventTimestamp;\n this.saveStateLazy();\n }\n\n // Emit to event bus — further cap for TUI consumption\n const busData = serializeEventData(serialized, MAX_BUS_DATA_LEN);\n if (event.type === 'output' || event.type === 'tool_call') {\n this.deps.eventBus.emit({\n type: 'agent:output',\n runId,\n agentId,\n data: busData,\n });\n } else if (event.type === 'file_change') {\n this.deps.eventBus.emit({\n type: 'agent:file_changed',\n runId,\n agentId,\n path: typeof event.data === 'string' ? event.data : String(event.data),\n });\n } else if (event.type === 'error') {\n this.deps.eventBus.emit({\n type: 'agent:error',\n runId,\n agentId,\n error: busData,\n });\n }\n }\n\n // Adapter finished successfully — runService.finish emits agent:completed\n // Use resultText from done event, or fall back to last agent message\n const finalResult = resultText ?? lastAgentMessage;\n await this.handleRunSuccess(taskId, runId, agentId, collectedTokens, finalResult, [...filesChangedSet]);\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n const entry = this.state?.running[taskId];\n if (entry) {\n // runService.finish emits agent:completed\n await this.handleRunFailure(taskId, entry, error);\n }\n }\n }\n\n private async handleRunSuccess(\n taskId: string,\n runId: string,\n agentId: string,\n tokens?: import('../domain/run.js').TokenUsage,\n resultText?: string,\n filesChanged?: string[],\n ): Promise<void> {\n return this.withStateLock(() => this._handleRunSuccess(taskId, runId, agentId, tokens, resultText, filesChanged));\n }\n\n private async _handleRunSuccess(\n taskId: string,\n runId: string,\n agentId: string,\n tokens?: import('../domain/run.js').TokenUsage,\n resultText?: string,\n filesChanged?: string[],\n ): Promise<void> {\n await this.flushStateLazy();\n this.abortControllers.delete(taskId);\n const state = this.state!;\n\n // If task was already cancelled/removed from running, skip\n if (!state.running[taskId]) return;\n\n const task = await this.deps.taskStore.get(taskId);\n if (!task) return;\n\n // Save proof of work (agent summary + files changed); clear stale feedback\n task.proof = {\n ...task.proof,\n agent_summary: resultText?.slice(0, 2000) ?? task.proof?.agent_summary,\n files_changed: filesChanged?.length ? filesChanged : (task.proof?.files_changed ?? []),\n };\n delete task.feedback;\n await this.deps.taskStore.save(task);\n\n const agent = await this.deps.agentStore.get(agentId);\n const isAutonomousTask = task.labels?.includes(AUTONOMOUS_LABEL);\n const autoApprove = isAutonomousTask || agent?.config.approval_policy === 'auto';\n\n const newStatus = resolveCompletionStatus(task, true, autoApprove);\n\n // Finish run first (emits agent:completed)\n await this.deps.runService.finish(runId, 'succeeded', tokens);\n\n // Track runtime before cleaning up\n const runningEntry = state.running[taskId];\n const successRuntimeMs = runningEntry\n ? Date.now() - new Date(runningEntry.started_at).getTime()\n : 0;\n if (runningEntry) {\n state.stats.total_runtime_ms += successRuntimeMs;\n }\n\n // Clean up running entry early — prevents handleRunFailure from being called on catch\n delete state.running[taskId];\n\n // Update agent stats (always — agent completed its work regardless of merge outcome)\n const statsUpdate: Partial<import('../domain/agent.js').AgentStats> = {\n tasks_completed: (agent?.stats.tasks_completed ?? 0) + 1,\n total_runs: (agent?.stats.total_runs ?? 0) + 1,\n total_runtime_ms: (agent?.stats.total_runtime_ms ?? 0) + successRuntimeMs,\n };\n if (tokens) {\n statsUpdate.tokens_used = (agent?.stats.tokens_used ?? 0) + tokens.total;\n }\n await this.deps.agentService.updateStats(agentId, statsUpdate).catch((err) => {\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: err instanceof Error ? err.message : String(err),\n context: `agent stats update for ${agentId}`,\n fatal: false,\n });\n });\n\n // Update global stats\n state.stats.total_tasks_completed++;\n state.stats.total_runs++;\n if (tokens) {\n state.stats.total_tokens.input += tokens.input;\n state.stats.total_tokens.output += tokens.output;\n state.stats.total_tokens.total = state.stats.total_tokens.input + state.stats.total_tokens.output;\n }\n\n // Auto merge-back: if task used a worktree branch, merge into current branch\n if (task.proof?.branch) {\n try {\n const mergeResult = await this.deps.workspaceManager.mergeBack(task.proof.branch);\n if (mergeResult.success) {\n this.deps.eventBus.emit({\n type: 'workspace:merge_succeeded',\n taskId,\n branch: task.proof.branch,\n });\n // Clean up worktree after successful merge\n await this.deps.workspaceManager.cleanup(taskId).catch((err) => {\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: err instanceof Error ? err.message : String(err),\n context: `workspace cleanup for ${taskId}`,\n fatal: false,\n });\n });\n } else {\n // Merge conflict: force task to review regardless of auto-approve\n this.deps.eventBus.emit({\n type: 'workspace:merge_conflict',\n taskId,\n branch: task.proof.branch,\n conflictInfo: mergeResult.conflictInfo,\n });\n await this.forceTaskToReview(task, agentId, `MERGE CONFLICT: ${mergeResult.conflictInfo}`);\n return;\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : String(err);\n await this.forceTaskToReview(task, agentId, `MERGE ERROR: ${error}`);\n return;\n }\n }\n\n // Update task status — force-write via store if service validation fails\n try {\n await this.deps.taskService.updateStatus(taskId, newStatus);\n } catch (validationErr) {\n // Bypass state machine validation and force-write directly\n const error = validationErr instanceof Error ? validationErr.message : String(validationErr);\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error,\n context: `state machine validation failed for task ${taskId} -> ${newStatus}, force-writing`,\n fatal: false,\n });\n task.status = newStatus;\n task.updated_at = new Date().toISOString();\n await this.deps.taskStore.save(task).catch((saveErr) => {\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: saveErr instanceof Error ? saveErr.message : String(saveErr),\n context: `force-write task ${taskId} to store failed`,\n fatal: false,\n });\n });\n }\n await this.deps.agentService.setStatus(agentId, 'idle').catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `_handleRunSuccess setStatus idle for agent ${agentId}`, fatal: false });\n });\n\n // Clear current_task — agent is now idle\n const agentAfter = await this.deps.agentStore.get(agentId);\n if (agentAfter) {\n agentAfter.current_task = undefined;\n await this.deps.agentStore.save(agentAfter);\n }\n\n // Auto-review: if task landed in 'review' and has review_criteria, run them\n if (newStatus === 'review' && task.review_criteria?.length) {\n await this.runAutoReview(taskId, task.review_criteria, task.workspace ?? this.deps.projectRoot);\n } else if (newStatus === 'review' && autoApprove) {\n // Auto-approve: skip review and transition review → done immediately\n await this.deps.taskService.updateStatus(taskId, 'done');\n }\n\n await this.saveState();\n\n // Reactive dispatch — agent is idle, try to assign next task immediately\n this.scheduleImmediateDispatch();\n }\n\n private async handleRunFailure(\n taskId: string,\n entry: RunningEntry,\n error: string,\n ): Promise<void> {\n return this.withStateLock(() => this._handleRunFailure(taskId, entry, error));\n }\n\n private async _handleRunFailure(\n taskId: string,\n entry: RunningEntry,\n error: string,\n ): Promise<void> {\n await this.flushStateLazy();\n this.abortControllers.delete(taskId);\n const state = this.state!;\n const task = await this.deps.taskStore.get(taskId);\n if (!task) return;\n\n await this.deps.runService.finish(entry.run_id, 'failed', undefined, error);\n await this.deps.agentService.setStatus(entry.agent_id, 'idle');\n\n // Clear current_task — agent is now idle\n const agentAfterIdle = await this.deps.agentStore.get(entry.agent_id);\n if (agentAfterIdle) {\n agentAfterIdle.current_task = undefined;\n await this.deps.agentStore.save(agentAfterIdle);\n }\n\n // Compute runtime once — used for both agent stats and global stats\n const agent = await this.deps.agentStore.get(entry.agent_id);\n const runtimeMs = Date.now() - new Date(entry.started_at).getTime();\n await this.deps.agentService.updateStats(entry.agent_id, {\n tasks_failed: (agent?.stats.tasks_failed ?? 0) + 1,\n total_runs: (agent?.stats.total_runs ?? 0) + 1,\n total_runtime_ms: (agent?.stats.total_runtime_ms ?? 0) + runtimeMs,\n });\n\n // Determine retry or fail via domain function\n const failureStatus = resolveFailureStatus(task);\n await this.deps.taskService.updateStatus(taskId, failureStatus);\n\n if (failureStatus === 'retrying') {\n const delay = calculateRetryDelay(\n task.attempts - 1,\n this.deps.config.scheduling.retry_base_delay_ms,\n this.deps.config.scheduling.retry_max_delay_ms,\n );\n\n // Dedup: don't add if task_id already in retry queue\n const alreadyQueued = state.retry_queue.some((r) => r.task_id === taskId);\n if (!alreadyQueued) {\n // Bounds: drop oldest entry if queue is at capacity\n if (state.retry_queue.length >= this.maxRetryQueueSize) {\n state.retry_queue.shift();\n }\n state.retry_queue.push({\n task_id: taskId,\n attempt: task.attempts + 1,\n due_at: new Date(Date.now() + delay).toISOString(),\n error,\n });\n }\n\n this.deps.eventBus.emit({\n type: 'run:retry',\n runId: entry.run_id,\n attempt: task.attempts + 1,\n delay_ms: delay,\n });\n } else {\n state.stats.total_tasks_failed++;\n }\n\n // Track runtime (reuse runtimeMs computed above)\n state.stats.total_runtime_ms += runtimeMs;\n\n // Clean up running entry\n delete state.running[taskId];\n state.stats.total_runs++;\n await this.saveState();\n\n // Reactive dispatch — agent is idle, try to assign next task immediately\n this.scheduleImmediateDispatch();\n }\n\n /**\n * Run automatic review criteria on a task in 'review' status.\n * If all criteria pass, transition review → done.\n * If any fail, stay in review with results attached.\n */\n private async runAutoReview(\n taskId: string,\n criteria: import('../domain/task.js').ReviewCriterion[],\n cwd: string,\n ): Promise<void> {\n const runner = new ReviewRunner({ cwd });\n const results = await runner.runAll(criteria);\n const allPassed = ReviewRunner.allPassed(results);\n\n // Save review results on task\n const task = await this.deps.taskStore.get(taskId);\n if (!task) return;\n\n task.review_results = results;\n task.proof = {\n ...task.proof,\n test_results: ReviewRunner.formatReport(results),\n files_changed: task.proof?.files_changed ?? [],\n };\n await this.deps.taskStore.save(task);\n\n // Emit auto-review event\n this.deps.eventBus.emit({\n type: 'task:auto_reviewed',\n taskId,\n passed: allPassed,\n results,\n });\n\n // If all passed, auto-approve: review → done\n if (allPassed) {\n try {\n await this.deps.taskService.updateStatus(taskId, 'done');\n } catch (validationErr) {\n const error = validationErr instanceof Error ? validationErr.message : String(validationErr);\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error,\n context: `auto-review transition failed for task ${taskId} -> done, force-writing`,\n fatal: false,\n });\n task.status = 'done';\n task.updated_at = new Date().toISOString();\n await this.deps.taskStore.save(task).catch((saveErr) => {\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: saveErr instanceof Error ? saveErr.message : String(saveErr),\n context: `force-write task ${taskId} to store failed (auto-review)`,\n fatal: false,\n });\n });\n }\n }\n }\n\n /**\n * Force a task to 'review' status with a summary prefix.\n * Used when merge-back fails (conflict or infrastructure error).\n */\n private async forceTaskToReview(\n task: import('../domain/task.js').Task,\n agentId: string,\n summaryPrefix: string,\n ): Promise<void> {\n task.proof = {\n ...task.proof,\n agent_summary: `${summaryPrefix}\\n\\n${task.proof?.agent_summary ?? ''}`.slice(0, 2000),\n files_changed: task.proof?.files_changed ?? [],\n };\n task.status = 'review';\n task.updated_at = new Date().toISOString();\n await this.deps.taskStore.save(task);\n await this.deps.agentService.setStatus(agentId, 'idle').catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `forceTaskToReview setStatus idle for agent ${agentId}`, fatal: false });\n });\n\n // Clear current_task — agent is now idle\n const agentAfter = await this.deps.agentStore.get(agentId);\n if (agentAfter) {\n agentAfter.current_task = undefined;\n await this.deps.agentStore.save(agentAfter);\n }\n\n await this.saveState();\n }\n\n private unclaim(taskId: string): void {\n const idx = this.state!.claimed.indexOf(taskId);\n if (idx !== -1) this.state!.claimed.splice(idx, 1);\n }\n\n /**\n * Throw if this instance doesn't own the lock (read-only session).\n */\n private requireOwnership(): void {\n if (!this.lockAcquired) {\n throw new LockConflictError(0);\n }\n }\n\n private async loadState(): Promise<void> {\n this.state = await this.deps.stateStore.read();\n }\n\n private async saveState(): Promise<void> {\n if (this.state) {\n await this.deps.stateStore.write(this.state);\n }\n }\n\n /**\n * Debounced saveState — batches rapid writes within 500ms window.\n * Used for non-critical updates like last_event_at in collectEvents.\n */\n private saveStateLazy(): void {\n this.saveStateDirty = true;\n if (this.saveStateTimer) return; // already scheduled\n this.saveStateTimer = setTimeout(() => {\n this.saveStateTimer = null;\n if (this.saveStateDirty) {\n this.saveStateDirty = false;\n this.saveState().catch((err) => {\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: err instanceof Error ? err.message : String(err),\n context: 'debounced state save',\n fatal: false,\n });\n });\n }\n }, 500);\n }\n\n /**\n * Flush any pending debounced saveState immediately.\n * Call before critical transitions to ensure state is persisted.\n */\n private async flushStateLazy(): Promise<void> {\n if (this.saveStateTimer) {\n clearTimeout(this.saveStateTimer);\n this.saveStateTimer = null;\n }\n if (this.saveStateDirty) {\n this.saveStateDirty = false;\n await this.saveState();\n }\n }\n}\n\n/** Check if a string is a valid ISO 8601 timestamp. */\nfunction isValidISOTimestamp(value: unknown): value is string {\n if (typeof value !== 'string') return false;\n const d = new Date(value);\n return !isNaN(d.getTime()) && d.toISOString() === value;\n}\n\n/**\n * Serialize event data to a string, truncating if it exceeds maxLen.\n * Always returns a string — avoids double-stringify by callers (appendJsonl, event bus).\n */\nfunction serializeEventData(data: unknown, maxLen: number): string {\n const str = typeof data === 'string' ? data : JSON.stringify(data);\n return str.length > maxLen ? str.slice(0, maxLen) + '…' : str;\n}\n"]}
@@ -1,50 +0,0 @@
1
- #!/usr/bin/env node
2
- import { execFile } from 'child_process';
3
- import { promisify } from 'util';
4
-
5
- var execFileAsync = promisify(execFile);
6
- var DoctorService = class {
7
- constructor(adapterRegistry, processManager) {
8
- this.adapterRegistry = adapterRegistry;
9
- this.processManager = processManager;
10
- }
11
- async runAll() {
12
- const checks = [];
13
- const adapters = this.adapterRegistry.list();
14
- let adaptersReady = 0;
15
- for (const adapter of adapters) {
16
- const result = await adapter.test();
17
- if (result.ok) {
18
- adaptersReady++;
19
- checks.push({
20
- name: adapter.kind,
21
- status: "ok",
22
- detail: result.version
23
- });
24
- } else {
25
- checks.push({
26
- name: adapter.kind,
27
- status: "fail",
28
- detail: result.error
29
- });
30
- }
31
- }
32
- checks.push(await this.checkCommand("git", ["--version"], "git"));
33
- checks.push(await this.checkCommand("node", ["--version"], "node"));
34
- return {
35
- checks,
36
- adaptersReady,
37
- adaptersTotal: adapters.length
38
- };
39
- }
40
- async checkCommand(command, args, name) {
41
- try {
42
- const { stdout } = await execFileAsync(command, args);
43
- return { name, status: "ok", detail: stdout.trim() };
44
- } catch {
45
- return { name, status: "fail", detail: `${command}: command not found` };
46
- }
47
- }
48
- };
49
-
50
- export { DoctorService };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/domain/errors.ts"],"names":["OrchestryError","message","exitCode","hint","NotInitializedError","InvalidArgumentsError","LockConflictError","pid","NoAgentsError","TaskNotFoundError","taskId","AgentNotFoundError","agentId","TaskAlreadyRunningError","runId","agentName","InvalidTransitionError","from","to","GoalNotFoundError","goalId","TeamNotFoundError","teamId"],"mappings":"AAeO,IAAMA,CAAAA,CAAN,cAA6B,KAAM,CACxC,YACEC,CAAAA,CACgBC,CAAAA,CACAC,CAAAA,CAChB,CACA,KAAA,CAAMF,CAAO,EAHG,IAAA,CAAA,QAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CAGhB,IAAA,CAAK,KAAO,iBACd,CACF,CAAA,CAEaC,CAAAA,CAAN,cAAkCJ,CAAe,CACtD,WAAA,EAAc,CACZ,MAAM,iBAAA,CAAmB,CAAA,CAAG,gBAAgB,CAAA,CAC5C,IAAA,CAAK,IAAA,CAAO,sBACd,CACF,CAAA,CAEaK,EAAN,cAAoCL,CAAe,CACxD,WAAA,CAAYC,CAAAA,CAAiB,CAC3B,MAAMA,CAAAA,CAAS,CAAC,CAAA,CAChB,IAAA,CAAK,IAAA,CAAO,wBACd,CACF,CAAA,CAEaK,CAAAA,CAAN,cAAgCN,CAAe,CACpD,YAAYO,CAAAA,CAAa,CACvB,KAAA,CAAM,CAAA,mCAAA,EAAsCA,CAAG,CAAA,CAAA,CAAA,CAAK,EAAG,kBAAkB,CAAA,CACzE,IAAA,CAAK,IAAA,CAAO,oBACd,CACF,EASO,IAAMC,CAAAA,CAAN,cAA4BR,CAAe,CAChD,WAAA,EAAc,CACZ,KAAA,CAAM,sBAAA,CAAwB,EAAG,6CAA6C,CAAA,CAC9E,KAAK,IAAA,CAAO,gBACd,CACF,CAAA,CAEaS,CAAAA,CAAN,cAAgCT,CAAe,CACpD,WAAA,CAAYU,CAAAA,CAAgB,CAC1B,KAAA,CAAM,CAAA,gBAAA,EAAmBA,CAAM,CAAA,CAAA,CAAI,CAAC,CAAA,CACpC,IAAA,CAAK,IAAA,CAAO,oBACd,CACF,CAAA,CAEaC,CAAAA,CAAN,cAAiCX,CAAe,CACrD,YAAYY,CAAAA,CAAiB,CAC3B,KAAA,CAAM,CAAA,iBAAA,EAAoBA,CAAO,CAAA,CAAA,CAAI,CAAC,CAAA,CACtC,IAAA,CAAK,KAAO,qBACd,CACF,EAEaC,CAAAA,CAAN,cAAsCb,CAAe,CAC1D,WAAA,CAAYU,CAAAA,CAAgBI,EAAeC,CAAAA,CAAmB,CAC5D,MACE,CAAA,KAAA,EAAQL,CAAM,6BAA6BI,CAAK,CAAA,SAAA,EAAYC,CAAS,CAAA,CAAA,CAAA,CACrE,CAAA,CACA,CAAA,sBAAA,EAAyBL,CAAM,CAAA,SAAA,CACjC,CAAA,CACA,IAAA,CAAK,IAAA,CAAO,0BACd,CACF,EAEaM,CAAAA,CAAN,cAAqChB,CAAe,CACzD,WAAA,CAAYU,CAAAA,CAAgBO,EAAcC,CAAAA,CAAY,CACpD,MAAM,CAAA,uBAAA,EAA0BR,CAAM,KAAKO,CAAI,CAAA,QAAA,EAAMC,CAAE,CAAA,CAAA,CAAI,CAAC,CAAA,CAC5D,KAAK,IAAA,CAAO,yBACd,CACF,CAAA,CAEaC,CAAAA,CAAN,cAAgCnB,CAAe,CACpD,WAAA,CAAYoB,CAAAA,CAAgB,CAC1B,KAAA,CAAM,CAAA,gBAAA,EAAmBA,CAAM,CAAA,CAAA,CAAI,CAAC,EACpC,IAAA,CAAK,IAAA,CAAO,oBACd,CACF,CAAA,CAEaC,CAAAA,CAAN,cAAgCrB,CAAe,CACpD,YAAYsB,CAAAA,CAAgB,CAC1B,KAAA,CAAM,CAAA,gBAAA,EAAmBA,CAAM,CAAA,CAAA,CAAI,CAAC,CAAA,CACpC,IAAA,CAAK,IAAA,CAAO,oBACd,CACF","file":"chunk-ZU6AY2VU.js","sourcesContent":["/**\n * Typed error hierarchy for the orchestrator.\n *\n * Every error carries an exit code (matching CLI_UI_DESIGN.md §11)\n * and an optional hint for the user.\n *\n * Exit codes:\n * 0 - Success\n * 1 - General error\n * 2 - Invalid arguments\n * 3 - Not initialized (.orchestry/ not found)\n * 4 - Lock conflict (orchestrator already running)\n * 5 - Agent error (adapter test failed)\n */\n\nexport class OrchestryError extends Error {\n constructor(\n message: string,\n public readonly exitCode: number,\n public readonly hint?: string,\n ) {\n super(message);\n this.name = 'OrchestryError';\n }\n}\n\nexport class NotInitializedError extends OrchestryError {\n constructor() {\n super('Not initialized', 3, 'Run: orch init');\n this.name = 'NotInitializedError';\n }\n}\n\nexport class InvalidArgumentsError extends OrchestryError {\n constructor(message: string) {\n super(message, 2);\n this.name = 'InvalidArgumentsError';\n }\n}\n\nexport class LockConflictError extends OrchestryError {\n constructor(pid: number) {\n super(`Orchestrator already running (PID: ${pid})`, 4, 'Use: orch status');\n this.name = 'LockConflictError';\n }\n}\n\nexport class AgentAdapterError extends OrchestryError {\n constructor(adapter: string, detail: string) {\n super(`Agent adapter \"${adapter}\" not available`, 5, detail);\n this.name = 'AgentAdapterError';\n }\n}\n\nexport class NoAgentsError extends OrchestryError {\n constructor() {\n super('No agents configured', 1, 'Run: orch agent add <name> --adapter claude');\n this.name = 'NoAgentsError';\n }\n}\n\nexport class TaskNotFoundError extends OrchestryError {\n constructor(taskId: string) {\n super(`Task not found: ${taskId}`, 1);\n this.name = 'TaskNotFoundError';\n }\n}\n\nexport class AgentNotFoundError extends OrchestryError {\n constructor(agentId: string) {\n super(`Agent not found: ${agentId}`, 1);\n this.name = 'AgentNotFoundError';\n }\n}\n\nexport class TaskAlreadyRunningError extends OrchestryError {\n constructor(taskId: string, runId: string, agentName: string) {\n super(\n `Task ${taskId} is already running (run: ${runId}, agent: ${agentName})`,\n 1,\n `Use: orch logs --task ${taskId} --follow`,\n );\n this.name = 'TaskAlreadyRunningError';\n }\n}\n\nexport class InvalidTransitionError extends OrchestryError {\n constructor(taskId: string, from: string, to: string) {\n super(`Invalid transition for ${taskId}: ${from} → ${to}`, 1);\n this.name = 'InvalidTransitionError';\n }\n}\n\nexport class GoalNotFoundError extends OrchestryError {\n constructor(goalId: string) {\n super(`Goal not found: ${goalId}`, 1);\n this.name = 'GoalNotFoundError';\n }\n}\n\nexport class TeamNotFoundError extends OrchestryError {\n constructor(teamId: string) {\n super(`Team not found: ${teamId}`, 1);\n this.name = 'TeamNotFoundError';\n }\n}\n\nexport class MessageNotFoundError extends OrchestryError {\n constructor(messageId: string) {\n super(`Message not found: ${messageId}`, 1);\n this.name = 'MessageNotFoundError';\n }\n}\n"]}
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export { DoctorService } from './chunk-XI4TU6VU.js';
@@ -1,2 +0,0 @@
1
- import {execFile}from'child_process';import {promisify}from'util';var c=promisify(execFile),o=class{constructor(t,r){this.adapterRegistry=t;this.processManager=r;}async runAll(){let t=[],r=this.adapterRegistry.list(),e=0;for(let s of r){let a=await s.test();a.ok?(e++,t.push({name:s.kind,status:"ok",detail:a.version})):t.push({name:s.kind,status:"fail",detail:a.error});}return t.push(await this.checkCommand("git",["--version"],"git")),t.push(await this.checkCommand("node",["--version"],"node")),{checks:t,adaptersReady:e,adaptersTotal:r.length}}async checkCommand(t,r,e){try{let{stdout:s}=await c(t,r);return {name:e,status:"ok",detail:s.trim()}}catch{return {name:e,status:"fail",detail:`${t}: command not found`}}}};export{o as DoctorService};//# sourceMappingURL=doctor-service-NTWBWOM2.js.map
2
- //# sourceMappingURL=doctor-service-NTWBWOM2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/application/doctor-service.ts"],"names":["execFileAsync","promisify","execFile","DoctorService","adapterRegistry","processManager","checks","adapters","adaptersReady","adapter","result","command","args","name","stdout"],"mappings":"kEAWA,IAAMA,CAAAA,CAAgBC,SAAAA,CAAUC,QAAQ,CAAA,CAc3BC,CAAAA,CAAN,KAAoB,CACzB,YACmBC,CAAAA,CACAC,CAAAA,CACjB,CAFiB,IAAA,CAAA,eAAA,CAAAD,EACA,IAAA,CAAA,cAAA,CAAAC,EAChB,CAEH,MAAM,QAAgC,CACpC,IAAMC,CAAAA,CAAwB,GAGxBC,CAAAA,CAAW,IAAA,CAAK,eAAA,CAAgB,IAAA,GAClCC,CAAAA,CAAgB,CAAA,CAEpB,IAAA,IAAWC,CAAAA,IAAWF,EAAU,CAC9B,IAAMG,CAAAA,CAAS,MAAMD,EAAQ,IAAA,EAAK,CAC9BC,CAAAA,CAAO,EAAA,EACTF,IACAF,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAMG,EAAQ,IAAA,CACd,MAAA,CAAQ,IAAA,CACR,MAAA,CAAQC,EAAO,OACjB,CAAC,CAAA,EAEDJ,CAAAA,CAAO,KAAK,CACV,IAAA,CAAMG,CAAAA,CAAQ,IAAA,CACd,OAAQ,MAAA,CACR,MAAA,CAAQC,CAAAA,CAAO,KACjB,CAAC,EAEL,CAGA,OAAAJ,CAAAA,CAAO,KAAK,MAAM,IAAA,CAAK,YAAA,CAAa,KAAA,CAAO,CAAC,WAAW,CAAA,CAAG,KAAK,CAAC,EAGhEA,CAAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,aAAa,MAAA,CAAQ,CAAC,WAAW,CAAA,CAAG,MAAM,CAAC,CAAA,CAE3D,CACL,MAAA,CAAAA,EACA,aAAA,CAAAE,CAAAA,CACA,aAAA,CAAeD,CAAAA,CAAS,MAC1B,CACF,CAEA,MAAc,YAAA,CACZI,EACAC,CAAAA,CACAC,CAAAA,CACsB,CACtB,GAAI,CACF,GAAM,CAAE,MAAA,CAAAC,CAAO,EAAI,MAAMd,CAAAA,CAAcW,CAAAA,CAASC,CAAI,EACpD,OAAO,CAAE,IAAA,CAAAC,CAAAA,CAAM,OAAQ,IAAA,CAAM,MAAA,CAAQC,CAAAA,CAAO,IAAA,EAAO,CACrD,CAAA,KAAQ,CACN,OAAO,CAAE,IAAA,CAAAD,CAAAA,CAAM,MAAA,CAAQ,MAAA,CAAQ,OAAQ,CAAA,EAAGF,CAAO,CAAA,mBAAA,CAAsB,CACzE,CACF,CACF","file":"doctor-service-NTWBWOM2.js","sourcesContent":["/**\n * Doctor service — diagnostics and health checks.\n *\n * Checks adapter availability, system dependencies, project state.\n */\n\nimport type { AdapterRegistry } from '../infrastructure/adapters/registry.js';\nimport type { IProcessManager } from '../infrastructure/process/process-manager.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface DoctorCheck {\n name: string;\n status: 'ok' | 'fail' | 'skip';\n detail?: string;\n}\n\nexport interface DoctorReport {\n checks: DoctorCheck[];\n adaptersReady: number;\n adaptersTotal: number;\n}\n\nexport class DoctorService {\n constructor(\n private readonly adapterRegistry: AdapterRegistry,\n private readonly processManager: IProcessManager,\n ) {}\n\n async runAll(): Promise<DoctorReport> {\n const checks: DoctorCheck[] = [];\n\n // Check adapters\n const adapters = this.adapterRegistry.list();\n let adaptersReady = 0;\n\n for (const adapter of adapters) {\n const result = await adapter.test();\n if (result.ok) {\n adaptersReady++;\n checks.push({\n name: adapter.kind,\n status: 'ok',\n detail: result.version,\n });\n } else {\n checks.push({\n name: adapter.kind,\n status: 'fail',\n detail: result.error,\n });\n }\n }\n\n // Check git\n checks.push(await this.checkCommand('git', ['--version'], 'git'));\n\n // Check node\n checks.push(await this.checkCommand('node', ['--version'], 'node'));\n\n return {\n checks,\n adaptersReady,\n adaptersTotal: adapters.length,\n };\n }\n\n private async checkCommand(\n command: string,\n args: string[],\n name: string,\n ): Promise<DoctorCheck> {\n try {\n const { stdout } = await execFileAsync(command, args);\n return { name, status: 'ok', detail: stdout.trim() };\n } catch {\n return { name, status: 'fail', detail: `${command}: command not found` };\n }\n }\n}\n"]}
@@ -1,2 +0,0 @@
1
- export{f as Orchestrator}from'./chunk-E3TCKHU6.js';import'./chunk-ZU6AY2VU.js';import'./chunk-AELEEEV3.js';//# sourceMappingURL=orchestrator-TAFBYQQ5.js.map
2
- //# sourceMappingURL=orchestrator-TAFBYQQ5.js.map
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export { checkForUpdate, checkForUpdateCached, checkForUpdateNow, printUpdateNotification } from './chunk-6GFVB6EK.js';
@@ -1,2 +0,0 @@
1
- import {l as l$1,m,h as h$1}from'./chunk-2B32FPEB.js';import'./chunk-ZU6AY2VU.js';import p from'path';import h from'fs/promises';var l=class{constructor(r,e){this.projectRoot=r;this.processManager=e;}async mergeBack(r){return new Promise(e=>{let{process:t}=this.processManager.spawn("git",["merge","--no-ff",r,"-m",`Merge ${r}`],{cwd:this.projectRoot}),o="",c=2e3,i=a=>{o.length<c&&(o+=a.toString());};t.stdout?.on("data",i),t.stderr?.on("data",i),t.on("close",a=>{if(a===0){e({success:true});return}let s=o.slice(0,1e3);if(!(s.includes("CONFLICT")||s.includes("Merge conflict"))){e({success:false,conflictInfo:s});return}try{let{process:m}=this.processManager.spawn("git",["merge","--abort"],{cwd:this.projectRoot});m.on("close",()=>{e({success:!1,conflictInfo:s});}),m.on("error",()=>{e({success:!1,conflictInfo:s});});}catch{e({success:false,conflictInfo:s});}}),t.on("error",a=>{e({success:false,conflictInfo:a.message});});})}};var u=class{constructor(r,e,t){this.projectRoot=r;this.orchestryDir=e;this.processManager=t;this.mergeStrategy=new l(r,t);}mergeStrategy;async prepare(r,e,t){switch(this.resolveMode(r,e,t)){case "shared":return {path:this.projectRoot};case "worktree":return this.prepareWorktree(r);case "isolated":return {path:await this.prepareIsolated(r)};default:return {path:this.projectRoot}}}async mergeBack(r){return this.mergeStrategy.mergeBack(r)}async cleanup(r){let e=p.join(this.orchestryDir,"workspaces",l$1(r));try{let{process:t}=this.processManager.spawn("git",["worktree","remove","--force",e],{cwd:this.projectRoot});await new Promise(o=>{t.on("close",()=>o()),t.on("error",()=>o());});}catch{}try{await h.rm(e,{recursive:!0,force:!0});}catch{}}validate(r,e){m(r,e);}resolveMode(r,e,t){return r.workspace_mode??e.config.workspace_mode??t.defaults.agent.workspace_mode??"worktree"}async prepareWorktree(r){let e=p.join(this.orchestryDir,"workspaces",l$1(r.id));await h$1(p.dirname(e));let t=w(r.title)||l$1(r.id),o=`orchestry/${l$1(r.id)}/${t}`,{process:c}=this.processManager.spawn("git",["worktree","add",e,"-b",o],{cwd:this.projectRoot});return await new Promise((i,a)=>{c.on("close",s=>{s===0?i():a(new Error(`git worktree add failed with code ${s}`));}),c.on("error",a);}),{path:e,branch:o}}async prepareIsolated(r){let e=p.join(this.orchestryDir,"workspaces",l$1(r.id));await h$1(p.dirname(e));try{let{process:t}=this.processManager.spawn("git",["clone","--local","--no-hardlinks",".",e],{cwd:this.projectRoot});await new Promise((o,c)=>{t.on("close",i=>{i===0?o():c(new Error("git clone failed"));}),t.on("error",c);});}catch{let o=["-a",`--exclude-from=${p.join(this.orchestryDir,"workspace-exclude")}`,"./",`${e}/`],{process:c}=this.processManager.spawn("rsync",o,{cwd:this.projectRoot});await new Promise((i,a)=>{c.on("close",s=>{s===0?i():a(new Error(`rsync failed with code ${s}`));}),c.on("error",a);});}return e}};function w(g){return g.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}export{u as WorkspaceManager};//# sourceMappingURL=workspace-manager-7M46ESUL.js.map
2
- //# sourceMappingURL=workspace-manager-7M46ESUL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/infrastructure/workspace/merge-strategy.ts","../src/infrastructure/workspace/workspace-manager.ts"],"names":["MergeStrategy","projectRoot","processManager","branch","resolve","proc","output","maxOutputLen","appendOutput","chunk","code","trimmedOutput","abortProc","err","WorkspaceManager","orchestryDir","task","agent","config","taskId","workspacePath","path","sanitizeId","fs","validateWorkspacePath","ensureDir","titleSlug","sanitizeTitle","branchName","reject","args","title"],"mappings":"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","file":"workspace-manager-7M46ESUL.js","sourcesContent":["/**\n * Git merge strategy for worktree branches.\n *\n * Encapsulates `git merge --no-ff` execution and conflict handling.\n */\n\nimport type { IProcessManager } from '../process/process-manager.js';\n\nexport type MergeResult =\n | { success: true }\n | { success: false; conflictInfo: string };\n\nexport class MergeStrategy {\n constructor(\n private readonly projectRoot: string,\n private readonly processManager: IProcessManager,\n ) {}\n\n /**\n * Merge a branch into the current branch with --no-ff.\n * On conflict, aborts the merge and returns conflict info.\n */\n async mergeBack(branch: string): Promise<MergeResult> {\n return new Promise((resolve) => {\n const { process: proc } = this.processManager.spawn(\n 'git',\n ['merge', '--no-ff', branch, '-m', `Merge ${branch}`],\n { cwd: this.projectRoot },\n );\n\n let output = '';\n const maxOutputLen = 2000;\n const appendOutput = (chunk: Buffer) => {\n if (output.length < maxOutputLen) output += chunk.toString();\n };\n proc.stdout?.on('data', appendOutput);\n proc.stderr?.on('data', appendOutput);\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve({ success: true });\n return;\n }\n\n const trimmedOutput = output.slice(0, 1000);\n const isConflict = trimmedOutput.includes('CONFLICT') || trimmedOutput.includes('Merge conflict');\n\n if (!isConflict) {\n // Non-conflict failure (branch not found, hook failure, etc.) — no merge to abort\n resolve({ success: false, conflictInfo: trimmedOutput });\n return;\n }\n\n // Abort the failed merge to restore clean state\n try {\n const { process: abortProc } = this.processManager.spawn(\n 'git',\n ['merge', '--abort'],\n { cwd: this.projectRoot },\n );\n abortProc.on('close', () => {\n resolve({ success: false, conflictInfo: trimmedOutput });\n });\n abortProc.on('error', () => {\n resolve({ success: false, conflictInfo: trimmedOutput });\n });\n } catch {\n resolve({ success: false, conflictInfo: trimmedOutput });\n }\n });\n\n proc.on('error', (err) => {\n resolve({ success: false, conflictInfo: err.message });\n });\n });\n }\n}\n","/**\n * Workspace manager implementation.\n *\n * Resolves workspace path based on mode priority chain:\n * task.workspace_mode → agent.config.workspace_mode → defaults.agent.workspace_mode → 'worktree'\n */\n\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport type { Agent } from '../../domain/agent.js';\nimport type { OrchestratorConfig } from '../../domain/config.js';\nimport type { Task, WorkspaceMode } from '../../domain/task.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { validateWorkspacePath, sanitizeId } from '../storage/paths.js';\nimport { ensureDir } from '../storage/fs-utils.js';\nimport type { IWorkspaceManager, PrepareResult } from './interface.js';\nimport { MergeStrategy, type MergeResult } from './merge-strategy.js';\n\nexport class WorkspaceManager implements IWorkspaceManager {\n private readonly mergeStrategy: MergeStrategy;\n\n constructor(\n private readonly projectRoot: string,\n private readonly orchestryDir: string,\n private readonly processManager: IProcessManager,\n ) {\n this.mergeStrategy = new MergeStrategy(projectRoot, processManager);\n }\n\n async prepare(task: Task, agent: Agent, config: OrchestratorConfig): Promise<PrepareResult> {\n const mode = this.resolveMode(task, agent, config);\n\n switch (mode) {\n case 'shared':\n return { path: this.projectRoot };\n\n case 'worktree':\n return this.prepareWorktree(task);\n\n case 'isolated':\n return { path: await this.prepareIsolated(task) };\n\n default:\n return { path: this.projectRoot };\n }\n }\n\n async mergeBack(branch: string): Promise<MergeResult> {\n return this.mergeStrategy.mergeBack(branch);\n }\n\n async cleanup(taskId: string): Promise<void> {\n const workspacePath = path.join(this.orchestryDir, 'workspaces', sanitizeId(taskId));\n\n // Try git worktree remove first (cleans up .git/worktrees/ metadata)\n try {\n const { process: proc } = this.processManager.spawn(\n 'git',\n ['worktree', 'remove', '--force', workspacePath],\n { cwd: this.projectRoot },\n );\n await new Promise<void>((resolve) => {\n proc.on('close', () => resolve());\n proc.on('error', () => resolve());\n });\n } catch {\n // Not a worktree or git not available — fall through to rm\n }\n\n // Remove directory regardless (handles isolated mode and worktree cleanup failures)\n try {\n await fs.rm(workspacePath, { recursive: true, force: true });\n } catch {\n // Workspace may not exist\n }\n }\n\n validate(workspacePath: string, projectRoot: string): void {\n validateWorkspacePath(workspacePath, projectRoot);\n }\n\n private resolveMode(task: Task, agent: Agent, config: OrchestratorConfig): WorkspaceMode {\n return (\n task.workspace_mode ??\n agent.config.workspace_mode ??\n config.defaults.agent.workspace_mode ??\n 'worktree'\n );\n }\n\n private async prepareWorktree(task: Task): Promise<PrepareResult> {\n const workspacePath = path.join(\n this.orchestryDir,\n 'workspaces',\n sanitizeId(task.id),\n );\n await ensureDir(path.dirname(workspacePath));\n\n const titleSlug = sanitizeTitle(task.title) || sanitizeId(task.id);\n const branchName = `orchestry/${sanitizeId(task.id)}/${titleSlug}`;\n\n const { process: proc } = this.processManager.spawn(\n 'git',\n ['worktree', 'add', workspacePath, '-b', branchName],\n { cwd: this.projectRoot },\n );\n\n await new Promise<void>((resolve, reject) => {\n proc.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`git worktree add failed with code ${code}`));\n });\n proc.on('error', reject);\n });\n\n return { path: workspacePath, branch: branchName };\n }\n\n private async prepareIsolated(task: Task): Promise<string> {\n const workspacePath = path.join(\n this.orchestryDir,\n 'workspaces',\n sanitizeId(task.id),\n );\n await ensureDir(path.dirname(workspacePath));\n\n // Try git clone first, fall back to rsync\n try {\n const { process: proc } = this.processManager.spawn(\n 'git',\n ['clone', '--local', '--no-hardlinks', '.', workspacePath],\n { cwd: this.projectRoot },\n );\n\n await new Promise<void>((resolve, reject) => {\n proc.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error('git clone failed'));\n });\n proc.on('error', reject);\n });\n } catch {\n // Fallback: rsync\n const excludeFile = path.join(this.orchestryDir, 'workspace-exclude');\n const args = ['-a', `--exclude-from=${excludeFile}`, './', `${workspacePath}/`];\n\n const { process: proc } = this.processManager.spawn('rsync', args, {\n cwd: this.projectRoot,\n });\n\n await new Promise<void>((resolve, reject) => {\n proc.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`rsync failed with code ${code}`));\n });\n proc.on('error', reject);\n });\n }\n\n return workspacePath;\n }\n}\n\nfunction sanitizeTitle(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 40);\n}\n"]}