@oxgeneral/orch 1.0.5 → 1.0.6
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.
- package/dist/App-LEVUTWQN.js +22 -0
- package/dist/{chunk-UTDC3OB3.js → chunk-4TDXD3LA.js} +53 -6
- package/dist/chunk-4TDXD3LA.js.map +1 -0
- package/dist/{chunk-BSJVYRI3.js → chunk-EH3HRQP4.js} +59 -8
- package/dist/chunk-EH3HRQP4.js.map +1 -0
- package/dist/chunk-FQ5YUP4J.js +4 -0
- package/dist/{chunk-TPTHLFOB.js → chunk-HYPSQAQX.js} +1 -1
- package/dist/{chunk-LXNRCJ22.js → chunk-KR7VDF23.js} +1 -1
- package/dist/{chunk-KFQTWMZI.js → chunk-LOJ26OVK.js} +1 -1
- package/dist/{chunk-PJ5DKXGR.js → chunk-N4OXN2HW.js} +1 -1
- package/dist/{chunk-MOWC2CHX.js → chunk-TWEMIPRN.js} +12 -8
- package/dist/chunk-TWEMIPRN.js.map +1 -0
- package/dist/chunk-WVJTXBPL.js +11 -0
- package/dist/claude-ADMRIWTR.js +2 -0
- package/dist/{claude-4R6L6BWY.js → claude-OTQ2NSJR.js} +3 -3
- package/dist/{claude-4R6L6BWY.js.map → claude-OTQ2NSJR.js.map} +1 -1
- package/dist/cli.js +1 -1
- package/dist/{codex-YRSODLH4.js → codex-AZD52UPS.js} +1 -1
- package/dist/{codex-IMOW5ZUZ.js → codex-WQ3LU3MM.js} +3 -3
- package/dist/{codex-IMOW5ZUZ.js.map → codex-WQ3LU3MM.js.map} +1 -1
- package/dist/container-FXUUV6PP.js +4 -0
- package/dist/{cursor-2HILMNM3.js → cursor-M3EJ432K.js} +1 -1
- package/dist/{cursor-NHV7X3WG.js → cursor-TKV5FFCN.js} +3 -3
- package/dist/{cursor-NHV7X3WG.js.map → cursor-TKV5FFCN.js.map} +1 -1
- package/dist/doctor-P2J6VAUX.js +2 -0
- package/dist/index.d.ts +13 -1
- package/dist/index.js +14 -11
- package/dist/index.js.map +1 -1
- package/dist/{init-56QC5QVX.js → init-PTAYCSMO.js} +4 -4
- package/dist/{once-runner-UCMXCY6C.js → once-runner-AMKCFW22.js} +1 -1
- package/dist/{opencode-3S4VDXRG.js → opencode-4G7VAZGY.js} +1 -1
- package/dist/{opencode-ULT6DYCT.js → opencode-YWT3M4NX.js} +3 -3
- package/dist/{opencode-ULT6DYCT.js.map → opencode-YWT3M4NX.js.map} +1 -1
- package/dist/orchestrator-JOTMB5XT.js +13 -0
- package/dist/orchestrator-XPEMMBOO.js +6 -0
- package/dist/{orchestrator-64BHTD42.js.map → orchestrator-XPEMMBOO.js.map} +1 -1
- package/dist/{serve-3DV74ZSO.js → serve-5OAANN6J.js} +1 -1
- package/dist/shell-JC2WDWBR.js +2 -0
- package/dist/{shell-UXEJRK3D.js → shell-PMLIRG3N.js} +3 -3
- package/dist/{shell-UXEJRK3D.js.map → shell-PMLIRG3N.js.map} +1 -1
- package/dist/{task-M2JGNUYW.js → task-QFLIIRKZ.js} +1 -1
- package/dist/{tui-4VRDSRVB.js → tui-BJHZBCIR.js} +1 -1
- package/dist/{workspace-manager-ABXFBL2A.js → workspace-manager-5EYCMAEO.js} +25 -9
- package/dist/workspace-manager-5EYCMAEO.js.map +1 -0
- package/dist/workspace-manager-XKOZ5WM6.js +3 -0
- package/package.json +16 -7
- package/readme.md +100 -2
- package/scripts/demo.sh +202 -0
- package/scripts/postinstall.js +2 -0
- package/dist/App-SSYYVFGW.js +0 -22
- package/dist/chunk-BSJVYRI3.js.map +0 -1
- package/dist/chunk-MOWC2CHX.js.map +0 -1
- package/dist/chunk-QNZ6D63E.js +0 -4
- package/dist/chunk-UTDC3OB3.js.map +0 -1
- package/dist/chunk-X54D5JZG.js +0 -11
- package/dist/claude-ZLVOLRUG.js +0 -2
- package/dist/container-FUHRQOV4.js +0 -4
- package/dist/doctor-GKTV4YYD.js +0 -2
- package/dist/orchestrator-64BHTD42.js +0 -6
- package/dist/orchestrator-KEH7RQAV.js +0 -13
- package/dist/shell-OBHIVC2H.js +0 -2
- package/dist/workspace-manager-ABXFBL2A.js.map +0 -1
- package/dist/workspace-manager-Q6WWXSTR.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
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":["err","filePath"],"mappings":"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","file":"chunk-4TDXD3LA.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 * Accepts either a Task[] (O(d×n) lookup) or a Map<string, Task> (O(d×1) lookup).\n *\n * Missing dependencies (deleted from store) are treated as resolved —\n * a deleted task should not permanently block dependents.\n * Dependencies are validated at creation time (task-service), so a missing\n * dep at runtime means it was deleted after the dependent was created.\n */\nexport function isBlocked(task: Task, allTasks: Task[] | Map<string, Task>): boolean {\n if (task.depends_on.length === 0) return false;\n\n if (allTasks instanceof Map) {\n return task.depends_on.some((depId) => {\n const dep = allTasks.get(depId);\n // Missing dep → treat as resolved (deleted = done)\n if (!dep) return false;\n return dep.status !== 'done';\n });\n }\n\n return task.depends_on.some((depId) => {\n const dep = allTasks.find((t) => t.id === depId);\n // Missing dep → treat as resolved (deleted = done)\n if (!dep) return false;\n return 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 * Pre-computed pattern info for O(1) base/dir lookups during overlap checks.\n */\ninterface PatternInfo {\n raw: string;\n base: string;\n isFile: boolean;\n dir: string;\n}\n\nfunction computePatternInfo(pattern: string): PatternInfo {\n const base = pattern.split('*')[0]!;\n const isFile = !base.endsWith('/');\n const dir = isFile ? dirname(base) : '';\n return { raw: pattern, base, isFile, dir };\n}\n\n/**\n * Pre-computed scope index for batch overlap checking.\n * Computes base prefixes and dirnames once, then checks overlap in O(1) per pair.\n */\nexport class ScopeIndex {\n private readonly entries: PatternInfo[];\n\n constructor(scopes: Array<string[] | undefined>) {\n this.entries = [];\n for (const scope of scopes) {\n if (scope?.length) {\n for (const p of scope) {\n this.entries.push(computePatternInfo(p));\n }\n }\n }\n }\n\n /** Returns true if the given scope overlaps with any pattern in the index. */\n overlapsAny(scope: string[] | undefined): boolean {\n if (!scope?.length || this.entries.length === 0) return false;\n for (const raw of scope) {\n const info = computePatternInfo(raw);\n for (const entry of this.entries) {\n if (patternsOverlapInfo(info, entry)) return true;\n }\n }\n return false;\n }\n\n /** Add patterns to the index (e.g. from an approved candidate). */\n add(scope: string[] | undefined): void {\n if (!scope?.length) return;\n for (const p of scope) {\n this.entries.push(computePatternInfo(p));\n }\n }\n\n get size(): number {\n return this.entries.length;\n }\n}\n\n/** Check overlap using pre-computed PatternInfo (no re-splitting). */\nfunction patternsOverlapInfo(a: PatternInfo, b: PatternInfo): boolean {\n if (a.raw === b.raw) return true;\n if (a.base.startsWith(b.base) || b.base.startsWith(a.base)) return true;\n if (a.isFile && b.isFile) {\n return a.dir === b.dir && a.dir !== '.';\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// In-process mutex: serializes acquireLock calls to prevent\n// concurrent async calls from racing on the same lock file.\nlet acquireMutex = Promise.resolve();\n\n/** Reset the in-process mutex — for tests only. */\nexport function _resetAcquireMutex(): void { acquireMutex = Promise.resolve(); }\n\n/**\n * Try to acquire the lock file. Checks for stale locks (dead PIDs).\n * Serialized within the process to prevent intra-process races.\n */\nexport async function acquireLock(lockPath: string): Promise<LockResult> {\n let release!: () => void;\n const gate = new Promise<void>((r) => { release = r; });\n const prev = acquireMutex;\n acquireMutex = gate;\n await prev;\n try {\n return await doAcquire(lockPath);\n } finally {\n release();\n }\n}\n\n/** Lock is stale if mtime is older than this. Set high enough to survive slow ticks (worktree ops + adapter spawns). */\nconst LOCK_STALE_MS = 60_000;\n\nasync function doAcquire(lockPath: string): Promise<LockResult> {\n // Check for existing lock\n const existing = await readLockPid(lockPath);\n if (existing !== null) {\n if (isProcessAlive(existing)) {\n // Guard against PID recycling: if the lock file hasn't been touched\n // recently (via touchLock), the original holder is likely dead and\n // the OS recycled its PID for an unrelated process.\n const stale = await isLockStaleByAge(lockPath);\n if (!stale) {\n return { acquired: false, pid: existing };\n }\n }\n // Stale lock (dead PID or untouched mtime) — remove it\n await fs.unlink(lockPath).catch(() => {});\n }\n\n // Atomic create: O_CREAT|O_EXCL 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 return { acquired: true, pid: process.pid };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\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 * Touch the lock file (update mtime) to prove the holder is still alive.\n * Call this periodically (e.g. every tick) so stale-lock detection works.\n */\nexport async function touchLock(lockPath: string): Promise<void> {\n const now = Date.now() / 1000;\n await fs.utimes(lockPath, now, now).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\nasync function isLockStaleByAge(lockPath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(lockPath);\n return Date.now() - stat.mtimeMs > LOCK_STALE_MS;\n } catch {\n return true;\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; goalId?: string }): Promise<Task[]> {\n const key = filter\n ? `${filter.status ?? ''}:${filter.goalId ?? ''}`\n : '__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 private nameCache: Map<string, Agent | null> = new Map();\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 if (this.nameCache.has(name)) {\n return this.nameCache.get(name) ?? null;\n }\n\n const result = await this.inner.getByName(name);\n this.nameCache.set(name, result);\n return result;\n }\n\n async save(agent: Agent): Promise<void> {\n await this.inner.save(agent);\n this.listCache = null;\n this.nameCache.clear();\n }\n\n async delete(id: string): Promise<void> {\n await this.inner.delete(id);\n this.listCache = null;\n this.nameCache.clear();\n }\n\n invalidate(): void {\n this.listCache = null;\n this.nameCache.clear();\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, createTokenUsage } 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, WorkspaceError, classifyAdapterError } from '../domain/errors.js';\nimport { scopesOverlap, ScopeIndex } from '../domain/scope.js';\nimport { acquireLock, releaseLock, touchLock } 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_SYSTEM_TEMPLATE, DEFAULT_USER_TEMPLATE, type RetryContext, type GoalContext } 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 private stoppedResolvers: Array<() => void> = [];\n\n /** When true, `tick()` skips `seedAutonomousTasks()`. Set via `startWatch()` options. */\n private skipAutonomousSeeding = 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.\n * If watch mode is active (lock already held), dispatches inline via stateMutex.\n * Otherwise acquires a temporary lock for the duration of the run.\n */\n async runTask(taskId: string): Promise<void> {\n if (this.lockAcquired) {\n await this.freshDispatch(() => this.dispatchTask(taskId));\n return;\n }\n await this.withTemporaryLock(() => this.freshDispatch(() => this.dispatchTask(taskId)));\n }\n\n /**\n * Run all dispatchable tasks.\n * If watch mode is active (lock already held), dispatches inline via stateMutex.\n * Otherwise acquires a temporary lock for the duration of the run.\n */\n async runAll(): Promise<void> {\n if (this.lockAcquired) {\n await this.freshDispatch(() => this.dispatchAll());\n return;\n }\n await this.withTemporaryLock(() => this.freshDispatch(() => this.dispatchAll()));\n }\n\n /**\n * Invalidate caches → loadState → run dispatch fn → saveState.\n * Shared by runTask, runAll, and immediateDispatch.\n */\n private async freshDispatch(fn: () => Promise<void>): Promise<void> {\n await this.withStateLock(async () => {\n this.cachedTaskStore.invalidate();\n this.cachedAgentStore.invalidate();\n await this.loadState();\n await fn();\n await this.saveState();\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(opts?: { skipAutonomousSeeding?: boolean }): Promise<void> {\n this.skipAutonomousSeeding = opts?.skipAutonomousSeeding ?? false;\n\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 // Clean up stale running entries from a previous process (crash/restart).\n // Tasks that were in_progress are NOT retried — they go to 'cancelled' so\n // agents don't redo already-committed work after a restart.\n await this.cleanupStaleRunningEntries();\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 * Returns a promise that resolves when stop() completes.\n * Use in long-running modes (serve, run --watch) to keep the process alive.\n */\n waitForStop(): Promise<void> {\n if (this.shuttingDown) return Promise.resolve();\n return new Promise<void>((resolve) => {\n this.stoppedResolvers.push(resolve);\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 = new Set<string>();\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 // Resolve all stopped promises so waitForStop() callers unblock\n for (const resolve of this.stoppedResolvers) resolve();\n this.stoppedResolvers = [];\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 if (!this.skipAutonomousSeeding) {\n await this.seedAutonomousTasks();\n }\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 // Touch lock file to prove we're alive (prevents stale-lock false positives from PID recycling)\n await touchLock(this.deps.lockPath);\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 * Retries up to 10 times (5s) if a tick is in progress.\n */\n private scheduleImmediateDispatch(retries = 0): 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) return;\n if (this.tickInProgress) {\n if (retries < 10) this.scheduleImmediateDispatch(retries + 1);\n return;\n }\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 await this.freshDispatch(() => this.shuttingDown ? Promise.resolve() : this.dispatchAll());\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 // Pre-fetch all running task data in parallel\n const runningEntries = Object.entries(state.running);\n const runningTaskData = await Promise.all(\n runningEntries.map(([taskId]) => this.deps.taskStore.get(taskId)),\n );\n\n // Check running processes\n for (let i = 0; i < runningEntries.length; i++) {\n const [taskId, entry] = runningEntries[i]!;\n // If task is already terminal (done/failed/cancelled), just clean up the stale entry\n const taskData = runningTaskData[i];\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 // Fetch agents and tasks in parallel for stale/orphan detection\n const runningAgentIds = new Set(Object.values(state.running).map((e) => e.agent_id));\n const [allAgents, allTasks] = await Promise.all([\n this.cachedAgentStore.list(),\n this.cachedTaskStore.list(),\n ]);\n\n // Fix stale agent statuses — agents stuck in 'running' with no running entry (parallel)\n const staleAgents = allAgents.filter(\n (a) => a.status === 'running' && !runningAgentIds.has(a.id),\n );\n if (staleAgents.length > 0) {\n await Promise.all(\n staleAgents.map((agent) => this.deps.agentService.setStatus(agent.id, 'idle')),\n );\n }\n\n // Fix orphaned tasks — stuck in 'in_progress' with no running entry (parallel)\n const orphanedTasks = allTasks.filter(\n (t) => t.status === 'in_progress' && !state.running[t.id],\n );\n if (orphanedTasks.length > 0) {\n await Promise.all(\n orphanedTasks.map(async (task) => {\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\n // Process retry queue — filter builds new array instead of mutating with splice\n const dueRetries: string[] = [];\n state.retry_queue = state.retry_queue.filter((retry) => {\n if (now >= new Date(retry.due_at).getTime()) {\n dueRetries.push(retry.task_id);\n return false;\n }\n return true;\n });\n for (const taskId of dueRetries) {\n await this.dispatchTask(taskId);\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 goalId: goal?.id,\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 taskMap = new Map(allTasks.map((t) => [t.id, t]));\n const candidates = allTasks\n .filter(\n (t) =>\n isDispatchable(t.status) &&\n !isBlocked(t, taskMap) &&\n !state.running[t.id] &&\n !state.claimed.has(t.id),\n )\n .sort((a, b) => {\n // 1. Priority: lower number = higher urgency (P1 before P4)\n const priDiff = (a.priority ?? 3) - (b.priority ?? 3);\n if (priDiff !== 0) return priDiff;\n // 2. Goal-linked tasks first (goalId present beats absent)\n const goalDiff = (a.goalId ? 0 : 1) - (b.goalId ? 0 : 1);\n if (goalDiff !== 0) return goalDiff;\n // 3. Recency tiebreaker: most recently updated first\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 — pre-compute index of in-progress scopes, then check candidates\n const blockedIds = new Set<string>();\n const inProgressScoped = allTasks.filter((t) => t.status === 'in_progress' && t.scope?.length);\n const scopeIndex = new ScopeIndex(inProgressScoped.map((t) => t.scope));\n for (const candidate of candidates) {\n if (!candidate.scope?.length) continue;\n if (scopeIndex.overlapsAny(candidate.scope)) {\n // Find first overlapping task for the event (check in-progress first, then peers)\n const overlapper = inProgressScoped.find((t) => scopesOverlap(candidate.scope, t.scope));\n this.deps.eventBus.emit({\n type: 'task:scope_overlap',\n taskId: candidate.id,\n overlappingTaskId: overlapper?.id ?? candidate.id,\n patterns: candidate.scope,\n });\n blockedIds.add(candidate.id);\n } else {\n // Approved — add to index so later candidates check against it\n scopeIndex.add(candidate.scope);\n }\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 // Workspace errors are permanent — force-fail the task to prevent infinite retry loop.\n // Cannot use taskService.updateStatus because todo → failed is not a valid transition.\n if (err instanceof WorkspaceError) {\n try {\n const t = await this.deps.taskStore.get(task.id);\n if (t && !isTerminal(t.status)) {\n t.status = 'failed';\n t.updated_at = new Date().toISOString();\n await this.deps.taskStore.save(t);\n }\n } catch {\n // Task may already be in a terminal state\n }\n }\n\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.add(taskId);\n await this.saveState();\n\n try {\n // Find agent\n const allAgents = await this.cachedAgentStore.list();\n const agent = await this.deps.agentService.findBestAgent(task);\n if (!agent) {\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 — split into system (cached) and user (dynamic) parts\n const systemTemplate = this.deps.config.prompt?.system_template ?? DEFAULT_SYSTEM_TEMPLATE;\n const userTemplate = this.deps.config.prompt?.user_template ?? DEFAULT_USER_TEMPLATE;\n // Legacy: if user set a single template, use it as combined (no split)\n const legacyTemplate = this.deps.config.prompt?.template;\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 // Fetch shared context, messages, and goal context in parallel\n const goalId = task.goalId;\n const [sharedContext, pendingMessages, goalRaw] = await Promise.all([\n this.deps.contextStore?.getAll(),\n this.deps.messageService\n ? this.deps.messageService.drainMailbox(agent.id, task.id)\n : [] as import('../domain/message.js').Message[],\n goalId && this.cachedGoalStore\n ? this.cachedGoalStore.get(goalId).catch(() => null)\n : null,\n ]);\n\n let goalContext: GoalContext | undefined;\n if (goalRaw) {\n // Cache hit — allTasks was already loaded this tick by dispatchAll/reconcile\n const allTasks = await this.cachedTaskStore.list();\n const goalTasks = allTasks.filter((t) => t.goalId === goalId);\n const progressEntry = await this.deps.contextStore?.get(`${goalId}-progress`);\n const taskNames = goalTasks.map((t) => `[${t.status}] ${t.title}`);\n goalContext = {\n id: goalRaw.id,\n title: goalRaw.title,\n description: goalRaw.description,\n status: goalRaw.status,\n task_names: taskNames,\n progress: progressEntry?.value,\n };\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, goal: goalContext },\n );\n\n // Render prompt(s) — split mode for caching, legacy mode for backward compat\n let prompt: string;\n let systemPrompt: string | undefined;\n if (legacyTemplate) {\n // Legacy: single combined template\n prompt = await this.deps.templateEngine.render(legacyTemplate, context);\n } else {\n // Split mode: system prompt (cacheable) + user prompt (dynamic)\n systemPrompt = await this.deps.templateEngine.render(systemTemplate, context);\n prompt = await this.deps.templateEngine.render(userTemplate, context);\n }\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 // Re-read from store to avoid overwriting in_progress status set above\n if (worktreeBranch) {\n const freshTask = await this.deps.taskStore.get(taskId);\n if (freshTask) {\n freshTask.proof = { ...(freshTask.proof ?? { files_changed: [] }), branch: worktreeBranch };\n freshTask.workspace = workspacePath;\n await this.deps.taskStore.save(freshTask);\n }\n }\n\n // Update agent status and clear last_error on successful dispatch\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 agentData.last_error = undefined;\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 systemPrompt,\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 and clean up abort controller (process never launched)\n this.abortControllers.delete(taskId);\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 let lastErrorKind: import('../domain/errors.js').AdapterErrorKind | 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) {\n const { input, output, reasoning, cache_read, cache_write } = event.tokens;\n collectedTokens = createTokenUsage(input, output, { reasoning, cache_read, cache_write });\n }\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 // Capture file path before GC release (event.data is nulled below)\n const filePath = event.type === 'file_change'\n ? (() => {\n const d = event.data as Record<string, unknown> | undefined;\n return d && typeof d.path === 'string' ? d.path :\n typeof event.data === 'string' ? event.data : String(event.data);\n })()\n : null;\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: filePath!,\n });\n } else if (event.type === 'error') {\n if (event.errorKind) lastErrorKind = event.errorKind;\n this.deps.eventBus.emit({\n type: 'agent:error',\n runId,\n agentId,\n error: busData,\n ...(event.errorKind ? { errorKind: event.errorKind } : {}),\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 // Prefer errorKind from last error event; fall back to thrown error's errorKind (from utils.ts)\n const errorKind = lastErrorKind\n ?? (err instanceof Error ? (err as Error & { errorKind?: import('../domain/errors.js').AdapterErrorKind }).errorKind : undefined);\n const entry = this.state?.running[taskId];\n if (entry) {\n // runService.finish emits agent:completed\n await this.handleRunFailure(taskId, entry, error, errorKind);\n }\n } finally {\n // Release the cached JSONL append handle FD for this run\n this.deps.runStore.closeRunEvents(runId);\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.reasoning += tokens.reasoning;\n state.stats.total_tokens.cache_read += tokens.cache_read;\n state.stats.total_tokens.cache_write += tokens.cache_write;\n state.stats.total_tokens.total =\n state.stats.total_tokens.input + state.stats.total_tokens.output + state.stats.total_tokens.reasoning;\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 and branch after successful merge\n await this.deps.workspaceManager.cleanup(taskId, task.proof.branch).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, autoApprove);\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 errorKind?: import('../domain/errors.js').AdapterErrorKind,\n ): Promise<void> {\n return this.withStateLock(() => this._handleRunFailure(taskId, entry, error, errorKind));\n }\n\n private async _handleRunFailure(\n taskId: string,\n entry: RunningEntry,\n error: string,\n errorKind?: import('../domain/errors.js').AdapterErrorKind,\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 and persist last_error — agent is now idle\n const agentAfterIdle = await this.deps.agentStore.get(entry.agent_id);\n if (agentAfterIdle) {\n agentAfterIdle.current_task = undefined;\n agentAfterIdle.last_error = {\n message: error.slice(0, 500),\n kind: errorKind ?? classifyAdapterError(error),\n timestamp: new Date().toISOString(),\n };\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 worktree and branch if one was created for this task\n if (task.proof?.branch) {\n await this.deps.workspaceManager.cleanup(taskId, task.proof.branch).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 }\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 autoApprove = false,\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 criteria failed but autoApprove is set, still transition to done (with warning)\n if (allPassed || autoApprove) {\n if (!allPassed) {\n this.deps.eventBus.emit({\n type: 'orchestrator:error',\n error: `Review criteria failed for task ${taskId} but autoApprove is set — force-approving`,\n context: 'auto-review-with-auto-approve',\n fatal: false,\n });\n }\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 this.state!.claimed.delete(taskId);\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 /**\n * On startup, clean up stale running entries left by a crashed/restarted process.\n *\n * Instead of marking orphaned tasks as 'failed' (which triggers retry → agents\n * redo already-committed work), we cancel them. Users can manually reactivate\n * specific tasks if needed.\n */\n private async cleanupStaleRunningEntries(): Promise<void> {\n const state = this.state!;\n\n // Phase 1: Clean up stale running entries with dead PIDs (parallel)\n const deadEntries = Object.entries(state.running).filter(\n ([, entry]) => !this.deps.processManager.isAlive(entry.pid),\n );\n const cleanedTaskIds = new Set<string>();\n\n if (deadEntries.length > 0) {\n for (const [taskId] of deadEntries) {\n delete state.running[taskId];\n cleanedTaskIds.add(taskId);\n }\n\n await Promise.all(\n deadEntries.map(async ([taskId, entry]) => {\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: `startup cleanup: setStatus idle for agent ${entry.agent_id}`, fatal: false });\n });\n await this.forceTaskCancelled(taskId);\n await this.deps.runService.finish(entry.run_id, 'cancelled', undefined, 'Orchestrator restarted').catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `startup cleanup: finish run ${entry.run_id}`, fatal: false });\n });\n }),\n );\n }\n\n // Always clear claimed — any claim that survived a restart is guaranteed stale\n // (the process that set it is dead). This fixes tasks stuck in \"claimed\" after crash.\n state.claimed = new Set<string>();\n\n // Phase 2: Cancel orphaned in_progress tasks — only when we detected a restart\n // (dead PIDs found). Without dead PIDs, orphans are handled by normal reconcile.\n if (cleanedTaskIds.size > 0) {\n const allTasks = await this.cachedTaskStore.list();\n const orphaned = allTasks.filter(\n (t) => t.status === 'in_progress' && !state.running[t.id],\n );\n if (orphaned.length > 0) {\n await Promise.all(orphaned.map((t) => this.forceTaskCancelled(t.id)));\n }\n\n const cancelledIds = new Set([...cleanedTaskIds, ...orphaned.map((t) => t.id)]);\n state.retry_queue = state.retry_queue.filter((r) => !cancelledIds.has(r.task_id));\n await this.saveState();\n }\n }\n\n /** Cancel a task, falling back to direct store write if transition is invalid. */\n private async forceTaskCancelled(taskId: string): Promise<void> {\n try {\n await this.deps.taskService.updateStatus(taskId, 'cancelled');\n } catch {\n const task = await this.deps.taskStore.get(taskId);\n if (task && !isTerminal(task.status)) {\n task.status = 'cancelled';\n task.updated_at = new Date().toISOString();\n await this.deps.taskStore.save(task).catch((err) => {\n this.deps.eventBus.emit({ type: 'orchestrator:error', error: err instanceof Error ? err.message : String(err), context: `startup cleanup: force-cancel task ${taskId}`, fatal: false });\n });\n }\n }\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"]}
|
|
@@ -67,13 +67,64 @@ async function appendJsonl(filePath, record) {
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
70
|
+
const handle = await getOrCreateHandle(filePath);
|
|
71
|
+
await handle.write(line, null, "utf-8");
|
|
72
|
+
}
|
|
73
|
+
var HANDLE_IDLE_MS = 1e4;
|
|
74
|
+
var appendHandles = /* @__PURE__ */ new Map();
|
|
75
|
+
var inFlightOpens = /* @__PURE__ */ new Map();
|
|
76
|
+
async function getOrCreateHandle(filePath) {
|
|
77
|
+
const existing = appendHandles.get(filePath);
|
|
78
|
+
if (existing) {
|
|
79
|
+
const now = Date.now();
|
|
80
|
+
if (now - existing.timerSetAt > HANDLE_IDLE_MS / 2) {
|
|
81
|
+
clearTimeout(existing.idleTimer);
|
|
82
|
+
existing.idleTimer = setTimeout(() => evictHandle(filePath), HANDLE_IDLE_MS);
|
|
83
|
+
existing.timerSetAt = now;
|
|
84
|
+
}
|
|
85
|
+
return existing.handle;
|
|
86
|
+
}
|
|
87
|
+
let opening = inFlightOpens.get(filePath);
|
|
88
|
+
if (!opening) {
|
|
89
|
+
opening = fs.open(filePath, "a").then((handle) => {
|
|
90
|
+
inFlightOpens.delete(filePath);
|
|
91
|
+
if (appendHandles.has(filePath)) {
|
|
92
|
+
handle.close().catch(() => {
|
|
93
|
+
});
|
|
94
|
+
return appendHandles.get(filePath).handle;
|
|
95
|
+
}
|
|
96
|
+
const entry = {
|
|
97
|
+
handle,
|
|
98
|
+
idleTimer: setTimeout(() => evictHandle(filePath), HANDLE_IDLE_MS),
|
|
99
|
+
timerSetAt: Date.now()
|
|
100
|
+
};
|
|
101
|
+
appendHandles.set(filePath, entry);
|
|
102
|
+
return handle;
|
|
103
|
+
}).catch((err) => {
|
|
104
|
+
inFlightOpens.delete(filePath);
|
|
105
|
+
throw err;
|
|
106
|
+
});
|
|
107
|
+
inFlightOpens.set(filePath, opening);
|
|
108
|
+
}
|
|
109
|
+
return opening;
|
|
110
|
+
}
|
|
111
|
+
function evictHandle(filePath) {
|
|
112
|
+
const entry = appendHandles.get(filePath);
|
|
113
|
+
if (!entry) return;
|
|
114
|
+
appendHandles.delete(filePath);
|
|
115
|
+
clearTimeout(entry.idleTimer);
|
|
116
|
+
entry.handle.close().catch(() => {
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function closeAppendHandle(filePath) {
|
|
120
|
+
evictHandle(filePath);
|
|
121
|
+
}
|
|
122
|
+
function closeAllAppendHandles() {
|
|
123
|
+
for (const filePath of [...appendHandles.keys()]) {
|
|
124
|
+
evictHandle(filePath);
|
|
75
125
|
}
|
|
76
126
|
}
|
|
127
|
+
process.once("exit", closeAllAppendHandles);
|
|
77
128
|
var MAX_JSONL_READ_SIZE = 50 * 1024 * 1024;
|
|
78
129
|
async function readJsonl(filePath) {
|
|
79
130
|
try {
|
|
@@ -283,6 +334,6 @@ function validateWorkspacePath(workspacePath, projectRoot) {
|
|
|
283
334
|
}
|
|
284
335
|
}
|
|
285
336
|
|
|
286
|
-
export { Paths, appendJsonl, ensureDir, listFiles, pathExists, readJson, readJsonl, readJsonlTail, readYaml, sanitizeId, validateWorkspacePath, writeJson, writeYaml };
|
|
287
|
-
//# sourceMappingURL=chunk-
|
|
288
|
-
//# sourceMappingURL=chunk-
|
|
337
|
+
export { Paths, appendJsonl, closeAppendHandle, ensureDir, listFiles, pathExists, readJson, readJsonl, readJsonlTail, readYaml, sanitizeId, validateWorkspacePath, writeJson, writeYaml };
|
|
338
|
+
//# sourceMappingURL=chunk-EH3HRQP4.js.map
|
|
339
|
+
//# sourceMappingURL=chunk-EH3HRQP4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/storage/fs-utils.ts","../src/infrastructure/storage/paths.ts"],"names":["path","lines"],"mappings":";;;;;;;AAiBA,eAAsB,WAAA,CAAY,UAAkB,OAAA,EAAgC;AAClF,EAAA,MAAM,GAAA,GAAMA,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACjC,EAAA,MAAM,UAAU,GAAG,CAAA;AAEnB,EAAA,MAAM,UAAUA,KAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAIA,MAAK,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA,EAAI,YAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,IAAA,CAAM,CAAA;AAElG,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,SAAA,CAAU,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA;AAC5C,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,OAAA,EAAS,QAAQ,CAAA;AAAA,EACnC,SAAS,GAAA,EAAK;AAEZ,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,OAAO,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACvC,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAKA,eAAsB,SAAY,QAAA,EAAqC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EAC1B,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAC1B,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAKA,eAAsB,SAAA,CAAa,UAAkB,IAAA,EAAwB;AAC3E,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM;AAAA,IAC9B,MAAA,EAAQ,CAAA;AAAA,IACR,SAAA,EAAW,GAAA;AAAA,IACX,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,MAAM,WAAA,CAAY,UAAU,OAAO,CAAA;AACrC;AAKA,eAAsB,SAAY,QAAA,EAAqC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAC1B,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAKA,eAAsB,SAAA,CAAa,UAAkB,IAAA,EAAwB;AAC3E,EAAA,MAAM,UAAU,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA;AAChD,EAAA,MAAM,WAAA,CAAY,UAAU,OAAO,CAAA;AACrC;AAMA,IAAM,QAAA,GAAW,IAAA;AAcjB,eAAsB,WAAA,CAAY,UAAkB,MAAA,EAAgC;AAClF,EAAA,MAAM,GAAA,GAAMA,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACjC,EAAA,MAAM,UAAU,GAAG,CAAA;AACnB,EAAA,IAAI,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,GAAI,IAAA;AAGpC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AAC/C,EAAA,IAAI,UAAU,QAAA,IAAY,MAAA,KAAW,IAAA,IAAQ,OAAO,WAAW,QAAA,EAAU;AACvE,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,YAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AAEvD,MAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,CAAU,EAAE,GAAG,GAAA,EAAK,IAAA,EAAM,EAAA,EAAI,CAAA,GAAI,IAAA;AACrD,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,KAAA,EAAO,OAAO,CAAA;AACjD,MAAA,MAAM,MAAA,GAAS,WAAW,QAAA,GAAW,CAAA;AACrC,MAAA,IAAI,SAAS,CAAA,EAAG;AAId,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,GAAG,MAAM,CAAA;AAC1C,QAAA,IAAA,GAAO,IAAA,CAAK,UAAU,EAAE,GAAG,KAAK,IAAA,EAAM,SAAA,GAAY,QAAA,EAAK,CAAA,GAAI,IAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,QAAQ,CAAA;AAC/C,EAAA,MAAM,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AACxC;AAcA,IAAM,cAAA,GAAiB,GAAA;AAGvB,IAAM,aAAA,uBAAoB,GAAA,EAAyB;AAEnD,IAAM,aAAA,uBAAoB,GAAA,EAAiC;AAE3D,eAAe,kBAAkB,QAAA,EAAuC;AACtE,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAC3C,EAAA,IAAI,QAAA,EAAU;AAGZ,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,QAAA,CAAS,UAAA,GAAa,cAAA,GAAiB,CAAA,EAAG;AAClD,MAAA,YAAA,CAAa,SAAS,SAAS,CAAA;AAC/B,MAAA,QAAA,CAAS,YAAY,UAAA,CAAW,MAAM,WAAA,CAAY,QAAQ,GAAG,cAAc,CAAA;AAC3E,MAAA,QAAA,CAAS,UAAA,GAAa,GAAA;AAAA,IACxB;AACA,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAEA,EAAA,IAAI,OAAA,GAAU,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,GAAG,IAAA,CAAK,QAAA,EAAU,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAChD,MAAA,aAAA,CAAc,OAAO,QAAQ,CAAA;AAE7B,MAAA,IAAI,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/B,QAAA,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAC7B,QAAA,OAAO,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,CAAG,MAAA;AAAA,MACtC;AACA,MAAA,MAAM,KAAA,GAAqB;AAAA,QACzB,MAAA;AAAA,QACA,WAAW,UAAA,CAAW,MAAM,WAAA,CAAY,QAAQ,GAAG,cAAc,CAAA;AAAA,QACjE,UAAA,EAAY,KAAK,GAAA;AAAI,OACvB;AACA,MAAA,aAAA,CAAc,GAAA,CAAI,UAAU,KAAK,CAAA;AACjC,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAChB,MAAA,aAAA,CAAc,OAAO,QAAQ,CAAA;AAC7B,MAAA,MAAM,GAAA;AAAA,IACR,CAAC,CAAA;AACD,IAAA,aAAA,CAAc,GAAA,CAAI,UAAU,OAAO,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,YAAY,QAAA,EAAwB;AAC3C,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,aAAA,CAAc,OAAO,QAAQ,CAAA;AAC7B,EAAA,YAAA,CAAa,MAAM,SAAS,CAAA;AAC5B,EAAA,KAAA,CAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AACrC;AAMO,SAAS,kBAAkB,QAAA,EAAwB;AACxD,EAAA,WAAA,CAAY,QAAQ,CAAA;AACtB;AAMO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,KAAA,MAAW,YAAY,CAAC,GAAG,aAAA,CAAc,IAAA,EAAM,CAAA,EAAG;AAChD,IAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,EACtB;AACF;AAGA,OAAA,CAAQ,IAAA,CAAK,QAAQ,qBAAqB,CAAA;AAG1C,IAAM,mBAAA,GAAsB,KAAK,IAAA,GAAO,IAAA;AAMxC,eAAsB,UAAa,QAAA,EAAgC;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AACnC,IAAA,IAAI,IAAA,CAAK,OAAO,mBAAA,EAAqB;AACnC,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,4BAAA,EAAA,CAAgC,KAAK,IAAA,GAAO,IAAA,GAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,yBAAA,EAA4B,QAAQ;AAAA;AAAA,OACzG;AACA,MAAA,OAAO,aAAA,CAAiB,UAAU,GAAG,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,kBAAqB,QAAQ,CAAA;AAAA,EACtC,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAC;AAC3B,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAQA,eAAsB,aAAA,CAAiB,UAAkB,KAAA,EAA6B;AACpF,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AAEnC,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,MAAM,iBAAA,CAAqB,QAAQ,CAAA,EAAG,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,IAC5D;AAIA,IAAA,MAAM,EAAA,GAAK,MAAM,EAAA,CAAG,IAAA,CAAK,UAAU,GAAG,CAAA;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,GAAO,OAAA,GAAY,MAAA,GAAS,KAAK,CAAA;AAC5E,MAAA,IAAI,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAS,CAAA;AAChD,MAAA,IAAI,oBAAA,GAAuB,QAAA;AAC3B,MAAA,IAAI,IAAA,GAAO,EAAA;AAGX,MAAA,KAAA,IAAS,UAAU,CAAA,EAAG,OAAA,GAAU,CAAA,IAAK,QAAA,IAAY,GAAG,OAAA,EAAA,EAAW;AAC7D,QAAA,oBAAA,GAAuB,QAAA;AACvB,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,OAAO,QAAQ,CAAA;AACzD,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AACjC,QAAA,MAAM,EAAA,CAAG,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,UAAU,QAAQ,CAAA;AACxC,QAAA,IAAA,GAAO,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,GAAI,IAAA;AAE/B,QAAA,MAAMC,MAAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAChE,QAAA,IAAIA,MAAAA,CAAM,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AAE7B,UAAA,OAAO,eAAA,CAAmBA,MAAAA,CAAM,KAAA,CAAM,CAAC,KAAK,CAAC,CAAA;AAAA,QAC/C;AACA,QAAA,IAAI,aAAa,CAAA,EAAG;AACpB,QAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,SAAS,CAAA;AAAA,MAC7C;AAGA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAEhE,MAAA,MAAM,YAAY,oBAAA,GAAuB,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AAC9D,MAAA,OAAO,eAAA,CAAmB,SAAA,CAAU,KAAA,CAAM,CAAC,KAAK,CAAC,CAAA;AAAA,IACnD,CAAA,SAAE;AACA,MAAA,MAAM,GAAG,KAAA,EAAM;AAAA,IACjB;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAC;AAC3B,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAGA,eAAe,kBAAqB,QAAA,EAAgC;AAClE,EAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AACnE,EAAA,OAAO,gBAAmB,KAAK,CAAA;AACjC;AAKA,SAAS,gBAAmB,KAAA,EAAsB;AAChD,EAAA,MAAM,UAAe,EAAC;AACtB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAM,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,mCAAA,EAAsC,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC;AAAA,CAAI,CAAA;AAAA,IACnF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAMA,IAAM,WAAA,uBAAkB,GAAA,EAAY;AAMpC,eAAsB,UAAU,OAAA,EAAgC;AAC9D,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9B,EAAA,MAAM,GAAG,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAC3C,EAAA,WAAA,CAAY,IAAI,OAAO,CAAA;AACzB;AAYA,eAAsB,WAAW,QAAA,EAAoC;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,eAAsB,SAAA,CAAU,SAAiB,GAAA,EAAiC;AAChF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,OAAA,CAAQ,OAAO,CAAA;AACxC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,OAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAC;AAC3B,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,SAAS,SAAS,GAAA,EAAuB;AACvC,EAAA,OAAO,GAAA,YAAe,KAAA,IAAS,MAAA,IAAU,GAAA,IAAQ,IAA8B,IAAA,KAAS,QAAA;AAC1F;ACnWO,IAAM,aAAA,GAAgB,YAAA;AAC7B,IAAM,UAAA,GAAa,mBAAA;AAEZ,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,WAAA,EAAqB;AAArB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAAsB;AAAA;AAAA,EAGnD,IAAI,IAAA,GAAe;AACjB,IAAA,OAAOD,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AAAA,EAClD;AAAA,EAEA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAAA,EAC1C;AAAA,EAEA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAAA,EAC1C;AAAA,EAEA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,gBAAgB,CAAA;AAAA,EAC9C;AAAA,EAEA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA;AAAA,EACtC;AAAA,EAEA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,IAAI,YAAA,GAAuB;AACzB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAAA,EACzC;AAAA,EAEA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AAAA,EACvC;AAAA,EAEA,YAAY,GAAA,EAAqB;AAC/B,IAAA,OAAOA,KAAAA,CAAK,KAAK,IAAA,CAAK,UAAA,EAAY,GAAG,UAAA,CAAW,GAAG,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,EAC7D;AAAA,EAEA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA;AAAA,EACxC;AAAA,EAEA,YAAY,EAAA,EAAoB;AAC9B,IAAA,OAAOA,KAAAA,CAAK,KAAK,IAAA,CAAK,WAAA,EAAa,GAAG,UAAA,CAAW,EAAE,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,EAC7D;AAAA,EAEA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,SAAS,EAAA,EAAoB;AAC3B,IAAA,OAAOA,KAAAA,CAAK,KAAK,IAAA,CAAK,QAAA,EAAU,GAAG,UAAA,CAAW,EAAE,CAAC,CAAA,IAAA,CAAM,CAAA;AAAA,EACzD;AAAA,EAEA,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,IAAI,cAAA,GAAyB;AAC3B,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,aAAa,CAAA;AAAA,EAC3C;AAAA,EAEA,mBAAmB,MAAA,EAAwB;AACzC,IAAA,OAAOA,MAAK,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,SAAS,EAAA,EAAoB;AAC3B,IAAA,OAAOA,KAAAA,CAAK,KAAK,IAAA,CAAK,QAAA,EAAU,GAAG,UAAA,CAAW,EAAE,CAAC,CAAA,IAAA,CAAM,CAAA;AAAA,EACzD;AAAA,EAEA,IAAI,aAAA,GAAwB;AAC1B,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAAA,EAC1C;AAAA,EAEA,IAAI,oBAAA,GAA+B;AACjC,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,mBAAmB,CAAA;AAAA,EACjD;AAAA,EAEA,SAAS,EAAA,EAAoB;AAC3B,IAAA,OAAOA,KAAAA,CAAK,KAAK,IAAA,CAAK,QAAA,EAAU,GAAG,UAAA,CAAW,EAAE,CAAC,CAAA,IAAA,CAAM,CAAA;AAAA,EACzD;AAAA,EAEA,UAAU,EAAA,EAAoB;AAC5B,IAAA,OAAOA,KAAAA,CAAK,KAAK,IAAA,CAAK,SAAA,EAAW,GAAG,UAAA,CAAW,EAAE,CAAC,CAAA,IAAA,CAAM,CAAA;AAAA,EAC1D;AAAA,EAEA,QAAQ,EAAA,EAAoB;AAC1B,IAAA,OAAOA,KAAAA,CAAK,KAAK,IAAA,CAAK,OAAA,EAAS,GAAG,UAAA,CAAW,EAAE,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,EACzD;AAAA,EAEA,cAAc,EAAA,EAAoB;AAChC,IAAA,OAAOA,KAAAA,CAAK,KAAK,IAAA,CAAK,OAAA,EAAS,GAAG,UAAA,CAAW,EAAE,CAAC,CAAA,MAAA,CAAQ,CAAA;AAAA,EAC1D;AAAA,EAEA,mBAAA,GAA8B;AAC5B,IAAA,OAAOA,KAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,YAAY,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,aAAA,GAAkC;AACtC,IAAA,OAAO,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,aAAA,EAAc,EAAI;AACjC,MAAA,MAAM,IAAI,mBAAA,EAAoB;AAAA,IAChC;AAAA,EACF;AACF;AAQO,SAAS,WAAW,EAAA,EAAoB;AAC7C,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,EAAA;AACT;AAMO,SAAS,qBAAA,CAAsB,eAAuB,WAAA,EAA2B;AACtF,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,OAAA,CAAQ,aAAa,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAErC,EAAA,IAAI,CAAC,SAAS,UAAA,CAAW,IAAA,GAAOA,MAAK,GAAG,CAAA,IAAK,aAAa,IAAA,EAAM;AAC9D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,aAAa,CAAA,yBAAA,CAA2B,CAAA;AAAA,EAC7E;AACF","file":"chunk-EH3HRQP4.js","sourcesContent":["/**\n * Low-level filesystem utilities.\n *\n * All file persistence goes through these functions.\n * atomicWrite guarantees no partial reads via temp → rename.\n */\n\nimport { randomBytes } from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport type { FileHandle } from 'node:fs/promises';\nimport path from 'node:path';\nimport yaml from 'js-yaml';\n\n/**\n * Write file atomically: write to temp file, then rename.\n * Prevents corrupted reads on concurrent access.\n */\nexport async function atomicWrite(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n\n const tmpPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(4).toString('hex')}.tmp`);\n\n try {\n await fs.writeFile(tmpPath, content, 'utf-8');\n await fs.rename(tmpPath, filePath);\n } catch (err) {\n // Clean up temp file on failure\n await fs.unlink(tmpPath).catch(() => {});\n throw err;\n }\n}\n\n/**\n * Read and parse a YAML file. Returns null if file does not exist.\n */\nexport async function readYaml<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return yaml.load(content) as T;\n } catch (err) {\n if (isENOENT(err)) return null;\n throw err;\n }\n}\n\n/**\n * Write data as YAML atomically.\n */\nexport async function writeYaml<T>(filePath: string, data: T): Promise<void> {\n const content = yaml.dump(data, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n sortKeys: false,\n });\n await atomicWrite(filePath, content);\n}\n\n/**\n * Read and parse a JSON file. Returns null if file does not exist.\n */\nexport async function readJson<T>(filePath: string): Promise<T | null> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch (err) {\n if (isENOENT(err)) return null;\n throw err;\n }\n}\n\n/**\n * Write data as JSON atomically.\n */\nexport async function writeJson<T>(filePath: string, data: T): Promise<void> {\n const content = JSON.stringify(data, null, 2) + '\\n';\n await atomicWrite(filePath, content);\n}\n\n/**\n * POSIX PIPE_BUF — writes up to this size are guaranteed atomic with O_APPEND.\n * 4096 on Linux/macOS. We leave some room for encoding overhead.\n */\nconst PIPE_BUF = 4096;\n\n/**\n * Append a JSON record to a .jsonl file (newline-delimited JSON).\n *\n * Uses a file handle opened with 'a' (O_APPEND) to ensure atomic writes.\n * On POSIX, O_APPEND guarantees that each write() call appends atomically\n * when the data fits within PIPE_BUF (typically 4096 bytes), preventing\n * interleaving from concurrent writers.\n *\n * If the serialized line exceeds PIPE_BUF, the record's `data` field is\n * truncated so the entire line fits within the atomic-write limit.\n * This prevents interleaving corruption from concurrent writers.\n */\nexport async function appendJsonl(filePath: string, record: unknown): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n let line = JSON.stringify(record) + '\\n';\n\n // If the line exceeds PIPE_BUF, truncate the `data` field to fit\n const byteLen = Buffer.byteLength(line, 'utf-8');\n if (byteLen > PIPE_BUF && record !== null && typeof record === 'object') {\n const obj = record as Record<string, unknown>;\n if (typeof obj.data === 'string' && obj.data.length > 0) {\n // Measure overhead without data to know how much room data gets\n const shell = JSON.stringify({ ...obj, data: '' }) + '\\n';\n const overhead = Buffer.byteLength(shell, 'utf-8');\n const budget = PIPE_BUF - overhead - 3; // 3 bytes for the '…' suffix (UTF-8 ellipsis)\n if (budget > 0) {\n // Slice to budget chars — for ASCII (most event data) this equals bytes.\n // For multi-byte chars the result may be slightly over PIPE_BUF,\n // which is acceptable on local filesystems (ext4/APFS hold inode lock).\n const truncated = obj.data.slice(0, budget);\n line = JSON.stringify({ ...obj, data: truncated + '…' }) + '\\n';\n }\n }\n }\n\n const handle = await getOrCreateHandle(filePath);\n await handle.write(line, null, 'utf-8');\n}\n\n// ── Append file handle cache ─────────────────────────────────────────\n// Keeps one FileHandle (O_APPEND) per file path to avoid open/close per event.\n// Idle handles are auto-closed after HANDLE_IDLE_MS.\n\ninterface HandleEntry {\n handle: FileHandle;\n idleTimer: ReturnType<typeof setTimeout>;\n /** Timestamp when the idle timer was last set — avoids redundant timer resets on hot paths. */\n timerSetAt: number;\n}\n\n/** Idle time before a cached file handle is auto-closed (milliseconds). */\nconst HANDLE_IDLE_MS = 10_000;\n\n/** Module-level cache of open append handles, keyed by absolute file path. */\nconst appendHandles = new Map<string, HandleEntry>();\n/** In-flight open() promises — prevents duplicate FDs for the same path under concurrent calls. */\nconst inFlightOpens = new Map<string, Promise<FileHandle>>();\n\nasync function getOrCreateHandle(filePath: string): Promise<FileHandle> {\n const existing = appendHandles.get(filePath);\n if (existing) {\n // Only reset the idle timer when past the midpoint — avoids timer churn on hot paths\n // (hundreds of writes/sec during Claude streaming, each would otherwise clearTimeout/setTimeout)\n const now = Date.now();\n if (now - existing.timerSetAt > HANDLE_IDLE_MS / 2) {\n clearTimeout(existing.idleTimer);\n existing.idleTimer = setTimeout(() => evictHandle(filePath), HANDLE_IDLE_MS);\n existing.timerSetAt = now;\n }\n return existing.handle;\n }\n // Deduplicate concurrent opens for the same path\n let opening = inFlightOpens.get(filePath);\n if (!opening) {\n opening = fs.open(filePath, 'a').then((handle) => {\n inFlightOpens.delete(filePath);\n // If another call already populated the cache (race lost), close the duplicate\n if (appendHandles.has(filePath)) {\n handle.close().catch(() => {});\n return appendHandles.get(filePath)!.handle;\n }\n const entry: HandleEntry = {\n handle,\n idleTimer: setTimeout(() => evictHandle(filePath), HANDLE_IDLE_MS),\n timerSetAt: Date.now(),\n };\n appendHandles.set(filePath, entry);\n return handle;\n }).catch((err) => {\n inFlightOpens.delete(filePath);\n throw err;\n });\n inFlightOpens.set(filePath, opening);\n }\n return opening;\n}\n\nfunction evictHandle(filePath: string): void {\n const entry = appendHandles.get(filePath);\n if (!entry) return;\n appendHandles.delete(filePath);\n clearTimeout(entry.idleTimer);\n entry.handle.close().catch(() => {});\n}\n\n/**\n * Explicitly close the append handle for a file path.\n * Call this when a run completes to reclaim the FD immediately.\n */\nexport function closeAppendHandle(filePath: string): void {\n evictHandle(filePath);\n}\n\n/**\n * Close all cached append handles.\n * Call on process exit and in test teardown.\n */\nexport function closeAllAppendHandles(): void {\n for (const filePath of [...appendHandles.keys()]) {\n evictHandle(filePath);\n }\n}\n\n// Auto-cleanup on process exit\nprocess.once('exit', closeAllAppendHandles);\n\n/** Max file size for full readJsonl (50 MB). Larger files use tail read. */\nconst MAX_JSONL_READ_SIZE = 50 * 1024 * 1024;\n\n/**\n * Read all records from a .jsonl file.\n * Falls back to reading only the last 200 records if the file exceeds MAX_JSONL_READ_SIZE.\n */\nexport async function readJsonl<T>(filePath: string): Promise<T[]> {\n try {\n const stat = await fs.stat(filePath);\n if (stat.size > MAX_JSONL_READ_SIZE) {\n process.stderr.write(\n `[readJsonl] file too large (${(stat.size / 1024 / 1024).toFixed(1)} MB), reading tail only: ${filePath}\\n`,\n );\n return readJsonlTail<T>(filePath, 200);\n }\n return readAndParseJsonl<T>(filePath);\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\n/**\n * Read the last N records from a .jsonl file.\n *\n * Reads the file in reverse chunks to avoid loading multi-MB files into memory.\n * Falls back to full read for small files (< 32KB).\n */\nexport async function readJsonlTail<T>(filePath: string, count: number): Promise<T[]> {\n try {\n const stat = await fs.stat(filePath);\n // For small files, read directly and slice (avoid mutual recursion with readJsonl)\n if (stat.size < 32768) {\n return (await readAndParseJsonl<T>(filePath)).slice(-count);\n }\n\n // Read from end in chunks to find enough lines\n // Use larger chunks for bigger files (tool_result events can be 8KB+ per line)\n const fd = await fs.open(filePath, 'r');\n try {\n const chunkSize = Math.min(stat.size, stat.size > 1_048_576 ? 131072 : 65536);\n let position = Math.max(0, stat.size - chunkSize);\n let earliestReadPosition = position;\n let tail = '';\n\n // Read up to 4 chunks from the end\n for (let attempt = 0; attempt < 4 && position >= 0; attempt++) {\n earliestReadPosition = position;\n const readSize = Math.min(chunkSize, stat.size - position);\n const buf = Buffer.alloc(readSize);\n await fd.read(buf, 0, readSize, position);\n tail = buf.toString('utf-8') + tail;\n\n const lines = tail.split('\\n').filter((l) => l.trim().length > 0);\n if (lines.length >= count + 1) {\n // +1 because first line might be partial\n return parseJsonlLines<T>(lines.slice(-count));\n }\n if (position === 0) break;\n position = Math.max(0, position - chunkSize);\n }\n\n // Parse whatever we got\n const lines = tail.split('\\n').filter((l) => l.trim().length > 0);\n // Skip first line if we didn't read from start (could be partial)\n const safeLines = earliestReadPosition > 0 ? lines.slice(1) : lines;\n return parseJsonlLines<T>(safeLines.slice(-count));\n } finally {\n await fd.close();\n }\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\n/** Read a file and parse all JSONL records. */\nasync function readAndParseJsonl<T>(filePath: string): Promise<T[]> {\n const content = await fs.readFile(filePath, 'utf-8');\n const lines = content.split('\\n').filter((l) => l.trim().length > 0);\n return parseJsonlLines<T>(lines);\n}\n\n/**\n * Parse JSONL lines with error tolerance — corrupt lines are logged and skipped.\n */\nfunction parseJsonlLines<T>(lines: string[]): T[] {\n const results: T[] = [];\n for (const raw of lines) {\n const line = raw.trim();\n if (!line) continue;\n try {\n results.push(JSON.parse(line) as T);\n } catch {\n process.stderr.write(`[readJsonl] skipping corrupt line: ${line.slice(0, 200)}\\n`);\n }\n }\n return results;\n}\n\n/**\n * Module-level cache of directories already ensured during this process lifetime.\n * Eliminates redundant fs.mkdir syscalls (~50 per tick loop).\n */\nconst ensuredDirs = new Set<string>();\n\n/**\n * Ensure a directory exists, creating it recursively if needed.\n * Uses an in-memory cache to skip redundant mkdir syscalls.\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n if (ensuredDirs.has(dirPath)) return;\n await fs.mkdir(dirPath, { recursive: true });\n ensuredDirs.add(dirPath);\n}\n\n/**\n * Clear the ensureDir cache. Intended for tests only.\n */\nexport function clearEnsuredDirs(): void {\n ensuredDirs.clear();\n}\n\n/**\n * Check if a path exists.\n */\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * List files in a directory matching an optional extension filter.\n */\nexport async function listFiles(dirPath: string, ext?: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(dirPath);\n if (ext) {\n return entries.filter((e) => e.endsWith(ext));\n }\n return entries;\n } catch (err) {\n if (isENOENT(err)) return [];\n throw err;\n }\n}\n\nfunction isENOENT(err: unknown): boolean {\n return err instanceof Error && 'code' in err && (err as NodeJS.ErrnoException).code === 'ENOENT';\n}\n","/**\n * Path resolution for .orchestry/ directory.\n *\n * All path construction goes through this module.\n * Validates initialization state and sanitizes identifiers.\n */\n\nimport path from 'node:path';\nimport { accessSync } from 'node:fs';\nimport { NotInitializedError } from '../../domain/errors.js';\nimport { pathExists } from './fs-utils.js';\n\nexport const ORCHESTRY_DIR = '.orchestry';\nconst ID_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport class Paths {\n constructor(private readonly projectRoot: string) {}\n\n /** Root .orchestry/ directory */\n get root(): string {\n return path.join(this.projectRoot, ORCHESTRY_DIR);\n }\n\n get configPath(): string {\n return path.join(this.root, 'config.yml');\n }\n\n get statePath(): string {\n return path.join(this.root, 'state.json');\n }\n\n get lockPath(): string {\n return path.join(this.root, 'orchestry.lock');\n }\n\n get tasksDir(): string {\n return path.join(this.root, 'tasks');\n }\n\n get agentsDir(): string {\n return path.join(this.root, 'agents');\n }\n\n get runsDir(): string {\n return path.join(this.root, 'runs');\n }\n\n get templatesDir(): string {\n return path.join(this.root, 'templates');\n }\n\n get logsDir(): string {\n return path.join(this.root, 'logs');\n }\n\n get contextDir(): string {\n return path.join(this.root, 'context');\n }\n\n contextPath(key: string): string {\n return path.join(this.contextDir, `${sanitizeId(key)}.json`);\n }\n\n get messagesDir(): string {\n return path.join(this.root, 'messages');\n }\n\n messagePath(id: string): string {\n return path.join(this.messagesDir, `${sanitizeId(id)}.json`);\n }\n\n get goalsDir(): string {\n return path.join(this.root, 'goals');\n }\n\n goalPath(id: string): string {\n return path.join(this.goalsDir, `${sanitizeId(id)}.yml`);\n }\n\n get teamsDir(): string {\n return path.join(this.root, 'teams');\n }\n\n get attachmentsDir(): string {\n return path.join(this.root, 'attachments');\n }\n\n taskAttachmentsDir(taskId: string): string {\n return path.join(this.attachmentsDir, sanitizeId(taskId));\n }\n\n teamPath(id: string): string {\n return path.join(this.teamsDir, `${sanitizeId(id)}.yml`);\n }\n\n get gitignorePath(): string {\n return path.join(this.root, '.gitignore');\n }\n\n get workspaceExcludePath(): string {\n return path.join(this.root, 'workspace-exclude');\n }\n\n taskPath(id: string): string {\n return path.join(this.tasksDir, `${sanitizeId(id)}.yml`);\n }\n\n agentPath(id: string): string {\n return path.join(this.agentsDir, `${sanitizeId(id)}.yml`);\n }\n\n runPath(id: string): string {\n return path.join(this.runsDir, `${sanitizeId(id)}.json`);\n }\n\n runEventsPath(id: string): string {\n return path.join(this.runsDir, `${sanitizeId(id)}.jsonl`);\n }\n\n defaultTemplatePath(): string {\n return path.join(this.templatesDir, 'default.md');\n }\n\n async isInitialized(): Promise<boolean> {\n return pathExists(this.root);\n }\n\n async requireInit(): Promise<void> {\n if (!(await this.isInitialized())) {\n throw new NotInitializedError();\n }\n }\n}\n\n/**\n * Validate an identifier for use in file paths.\n * Only allows [A-Za-z0-9._-] characters.\n * Rejects identifiers containing forbidden characters (path separators, etc.)\n * to prevent path traversal attacks.\n */\nexport function sanitizeId(id: string): string {\n if (!ID_PATTERN.test(id)) {\n throw new Error(`Invalid identifier: \"${id}\"`);\n }\n return id;\n}\n\n/**\n * Validate that a workspace path is within the project root.\n * Prevents path traversal attacks.\n */\nexport function validateWorkspacePath(workspacePath: string, projectRoot: string): void {\n const resolved = path.resolve(workspacePath);\n const root = path.resolve(projectRoot);\n\n if (!resolved.startsWith(root + path.sep) && resolved !== root) {\n throw new Error(`Workspace path \"${workspacePath}\" is outside project root`);\n }\n}\n\n/**\n * Module-level cache for findProjectRoot().\n * Key: resolved startDir, Value: found project root.\n * Avoids repeated accessSync() traversals on every CLI invocation.\n */\nconst projectRootCache = new Map<string, string>();\n\n/**\n * Resolve project root by walking up from cwd looking for .orchestry/.\n * Returns cwd if not found (for init command).\n *\n * Results are cached per startDir to avoid redundant filesystem traversals.\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string {\n const resolvedStart = path.resolve(startDir);\n const cached = projectRootCache.get(resolvedStart);\n if (cached !== undefined) return cached;\n\n let dir = resolvedStart;\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n try {\n accessSync(path.join(dir, '.orchestry'));\n projectRootCache.set(resolvedStart, dir);\n return dir;\n } catch {\n // Not found, go up\n }\n dir = path.dirname(dir);\n }\n\n // Not found — return resolved dir (for init command)\n projectRootCache.set(resolvedStart, resolvedStart);\n return resolvedStart;\n}\n\n/**\n * Clear the findProjectRoot cache.\n * Useful in tests or after `orch init` changes the project structure.\n */\nexport function clearProjectRootCache(): void {\n projectRootCache.clear();\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a}from'./chunk-P4JTJBWO.js';import {n}from'./chunk-IKNBPOQL.js';import {b as b$1}from'./chunk-6MJ7V6VY.js';function b(n,s){return n?n+`
|
|
3
|
+
|
|
4
|
+
`+s:s}function y(n,s){let e=n.usage;if(!e&&s?.statsFallback&&(e=n.stats?.usage),e&&typeof e.input_tokens=="number"){let i=e.input_tokens,u=typeof e.output_tokens=="number"?e.output_tokens:0,a$1=typeof e.reasoning_tokens=="number"?e.reasoning_tokens:0,o=typeof e.cache_read_input_tokens=="number"?e.cache_read_input_tokens:0,c=typeof e.cache_creation_input_tokens=="number"?e.cache_creation_input_tokens:0;return a(i,u,{reasoning:a$1,cache_read:o,cache_write:c})}}function w(n$1,s,e,i){async function*u(){let a=false,o=null,c=null,g=new Promise(r=>{n$1.on("close",t=>{o=t,r();}),n$1.on("error",t=>{c=t,r();});});if(n$1.stdout)try{for await(let r of b$1(n$1.stdout)){if(i?.aborted)break;let t=s(r);t&&(t.type==="done"&&(a=!0),yield t);}}finally{n$1.stdout.destroy();}if(await g,c&&!i?.aborted&&!a){let r=c,t=n(r.message,o??void 0);throw Object.assign(new Error(r.message),{errorKind:t})}if(o!==0&&o!==null&&!i?.aborted&&!a){let r=`${e} process exited with code ${o}`,t=n(r,o);throw Object.assign(new Error(r),{errorKind:t})}}return u()}export{b as a,y as b,w as c};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {c,b}from'./chunk-
|
|
2
|
+
import {c,b}from'./chunk-FQ5YUP4J.js';import {n}from'./chunk-IKNBPOQL.js';import {execFile}from'child_process';import {promisify}from'util';var m=promisify(execFile),i=class{constructor(e){this.processManager=e;}kind="claude";async test(){try{let{stdout:e}=await m("claude",["--version"]);return {ok:!0,version:e.trim()}}catch(e){let t=e instanceof Error?e.message:String(e);return {ok:false,error:"Claude Code CLI not found. Install: npm i -g @anthropic-ai/claude-code",errorKind:n(t)}}}execute(e){let t=["--print","--output-format","stream-json","--max-turns",String(e.config.max_turns??50),"--verbose","--dangerously-skip-permissions"];e.config.model&&t.push("--model",e.config.model);let r=e.systemPrompt??e.config.system_prompt;r&&t.push("--system-prompt",r),t.push(e.prompt);let{process:n,pid:u}=this.processManager.spawn("claude",t,{cwd:e.workspace,env:{...process.env,...e.env},signal:e.signal}),p=c(n,g,"Claude",e.signal);return {pid:u,events:p}}async stop(e){await this.processManager.killWithGrace(e);}};function g(s){if(!s.trim())return null;try{let e=JSON.parse(s),t=new Date().toISOString();switch(e.type){case "assistant":return {type:"output",timestamp:t,data:e.message??e};case "tool_use":return {type:"tool_call",timestamp:t,data:e};case "tool_result":return {type:"output",timestamp:t,data:e};case "error":{let r=e.error??e,n$1=typeof r=="string"?r:JSON.stringify(r);return {type:"error",timestamp:t,data:r,errorKind:n(n$1)}}case "result":{let r=b(e,{statsFallback:!0});return {type:"done",timestamp:t,data:e,tokens:r}}default:return {type:"output",timestamp:t,data:e}}}catch{return {type:"output",timestamp:new Date().toISOString(),data:s}}}export{i as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var a={todo:["in_progress","cancelled"],in_progress:["review","retrying","failed","cancelled"],retrying:["in_progress","failed","cancelled"],review:["done","todo","cancelled"],done:[],failed:["todo","retrying"],cancelled:["todo"]},s=new Set(["done","failed","cancelled"]);function u(e,t){return a[e].includes(t)}function d(e){return s.has(e)}function l(e){return e==="todo"||e==="retrying"}function c(e,t){return e.depends_on.length===0?false:t instanceof Map?e.depends_on.some(
|
|
2
|
+
var a={todo:["in_progress","cancelled"],in_progress:["review","retrying","failed","cancelled"],retrying:["in_progress","failed","cancelled"],review:["done","todo","cancelled"],done:[],failed:["todo","retrying"],cancelled:["todo"]},s=new Set(["done","failed","cancelled"]);function u(e,t){return a[e].includes(t)}function d(e){return s.has(e)}function l(e){return e==="todo"||e==="retrying"}function c(e,t){return e.depends_on.length===0?false:t instanceof Map?e.depends_on.some(r=>{let n=t.get(r);return n?n.status!=="done":false}):e.depends_on.some(r=>{let n=t.find(o=>o.id===r);return n?n.status!=="done":false})}function i(e){return e.attempts<e.max_attempts?"retrying":"failed"}function p(e,t,r){return t?"review":i(e)}function f(e,t,r){let n=t*Math.pow(2,e);return Math.min(n,r)}export{u as a,d as b,l as c,c as d,i as e,p as f,f as g};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a}from'./chunk-
|
|
2
|
+
import {a}from'./chunk-FQ5YUP4J.js';import {n}from'./chunk-IKNBPOQL.js';import {b}from'./chunk-6MJ7V6VY.js';import {execFile}from'child_process';import {promisify}from'util';function m(){let n;return {promise:new Promise(t=>{n=t;}),resolve:n}}var o=class{buf;head=0;tail=0;count=0;capacity;dataReady=null;spaceReady=null;closed=false;constructor(e=1024){this.capacity=e,this.buf=new Array(e);}get size(){return this.count}get isFull(){return this.count>=this.capacity}async push(e){for(;this.isFull&&!this.closed;)this.spaceReady||(this.spaceReady=m()),await this.spaceReady.promise;if(!this.closed&&(this.buf[this.tail]=e,this.tail=(this.tail+1)%this.capacity,this.count++,this.dataReady)){let t=this.dataReady;this.dataReady=null,t.resolve();}}async take(){for(;this.count===0;){if(this.closed)return;this.dataReady||(this.dataReady=m()),await this.dataReady.promise;}let e=this.buf[this.head];if(this.buf[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.count--,this.spaceReady){let t=this.spaceReady;this.spaceReady=null,t.resolve();}return e}close(){if(this.closed=true,this.dataReady){let e=this.dataReady;this.dataReady=null,e.resolve();}if(this.spaceReady){let e=this.spaceReady;this.spaceReady=null,e.resolve();}}get isClosed(){return this.closed}async*[Symbol.asyncIterator](){for(;;){let e=await this.take();if(e===void 0)return;yield e;}}};var E=promisify(execFile),y=class{constructor(e){this.processManager=e;}kind="shell";async test(){try{let{stdout:e}=await E("bash",["--version"]);return {ok:!0,version:e.split(`
|
|
3
3
|
`)[0]?.trim()??"unknown"}}catch{return {ok:false,error:"bash not found",errorKind:n("bash not found")}}}execute(e){let t=e.config.command;if(!t){async function*i(){yield {type:"error",timestamp:new Date().toISOString(),data:"Shell adapter requires a command in agent config",errorKind:"spawn_failed"};}return {pid:0,events:i()}}let{process:s,pid:u}=this.processManager.spawn("bash",["-lc",t],{cwd:e.workspace,env:{...process.env,...e.env,ORCHESTRY_TASK_PROMPT:a(e.systemPrompt,e.prompt)},signal:e.signal}),r=e.signal,v=this.processManager;async function*g(){let i=new o,d=()=>{v.killWithGrace(u,5e3).catch(()=>{});};r&&(r.aborted?d():r.addEventListener("abort",d,{once:true}));let A=(async()=>{if(s.stdout)for await(let a of b(s.stdout)){if(r?.aborted)break;await i.push({type:"output",timestamp:new Date().toISOString(),data:a});}})(),b$1=(async()=>{if(s.stderr)for await(let a of b(s.stderr)){if(r?.aborted)break;await i.push({type:"error",timestamp:new Date().toISOString(),data:a,errorKind:n(a)});}})();Promise.all([A,b$1]).then(()=>i.close(),()=>i.close()),yield*i,r&&!r.aborted&&r.removeEventListener("abort",d),await new Promise((a,p)=>{if(s.exitCode!==null||s.killed){a();return}s.on("close",h=>{h===0||r?.aborted?a():p(new Error(`Shell command exited with code ${h}`));}),s.on("error",p);});}return {pid:u,events:g()}}async stop(e){await this.processManager.killWithGrace(e);}};export{y as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var e={project:{name:"my-project"},defaults:{agent:{adapter:"claude",approval_policy:"auto",max_turns:50,timeout_ms:36e5,stall_timeout_ms:
|
|
2
|
+
var e={project:{name:"my-project"},defaults:{agent:{adapter:"claude",approval_policy:"auto",max_turns:50,timeout_ms:36e5,stall_timeout_ms:6e5,workspace_mode:"worktree"},task:{max_attempts:3,priority:3}},scheduling:{poll_interval_ms:1e4,max_concurrent_agents:6,retry_base_delay_ms:1e4,retry_max_delay_ms:3e5}};export{e as a};
|
|
@@ -38,13 +38,17 @@ function createStreamingEvents(proc, parseEvent, adapterName, signal) {
|
|
|
38
38
|
});
|
|
39
39
|
});
|
|
40
40
|
if (proc.stdout) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (event
|
|
46
|
-
|
|
41
|
+
try {
|
|
42
|
+
for await (const line of readLines(proc.stdout)) {
|
|
43
|
+
if (signal?.aborted) break;
|
|
44
|
+
const event = parseEvent(line);
|
|
45
|
+
if (event) {
|
|
46
|
+
if (event.type === "done") gotDoneEvent = true;
|
|
47
|
+
yield event;
|
|
48
|
+
}
|
|
47
49
|
}
|
|
50
|
+
} finally {
|
|
51
|
+
proc.stdout.destroy();
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
await exitPromise;
|
|
@@ -65,5 +69,5 @@ function createStreamingEvents(proc, parseEvent, adapterName, signal) {
|
|
|
65
69
|
}
|
|
66
70
|
|
|
67
71
|
export { buildFullPrompt, createStreamingEvents, extractTokens };
|
|
68
|
-
//# sourceMappingURL=chunk-
|
|
69
|
-
//# sourceMappingURL=chunk-
|
|
72
|
+
//# sourceMappingURL=chunk-TWEMIPRN.js.map
|
|
73
|
+
//# sourceMappingURL=chunk-TWEMIPRN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/adapters/utils.ts"],"names":[],"mappings":"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","file":"chunk-TWEMIPRN.js","sourcesContent":["/**\n * Shared utilities for agent adapters.\n *\n * Deduplicates extractTokens and streaming event generation logic\n * common to claude, codex, and cursor adapters.\n */\n\nimport type { ChildProcess } from 'node:child_process';\nimport type { AgentEvent } from './interface.js';\nimport { readLines } from '../process/process-manager.js';\nimport { type TokenUsage, createTokenUsage } from '../../domain/run.js';\nimport { classifyAdapterError } from '../../domain/errors.js';\n\n/** Combine system and user prompts. Adapters without native system prompt support use this. */\nexport function buildFullPrompt(systemPrompt: string | undefined, userPrompt: string): string {\n return systemPrompt ? systemPrompt + '\\n\\n' + userPrompt : userPrompt;\n}\n\n/**\n * Extract token usage from a parsed JSON event.\n *\n * @param parsed - The parsed JSON object from an adapter event line.\n * @param opts.statsFallback - If true, also checks `parsed.stats?.usage` (Claude-specific).\n */\nexport function extractTokens(\n parsed: Record<string, unknown>,\n opts?: { statsFallback?: boolean },\n): TokenUsage | undefined {\n let usage = parsed.usage as Record<string, unknown> | undefined;\n\n if (!usage && opts?.statsFallback) {\n const stats = parsed.stats as Record<string, unknown> | undefined;\n usage = stats?.usage as Record<string, unknown> | undefined;\n }\n\n if (usage && typeof usage.input_tokens === 'number') {\n const input = usage.input_tokens;\n const output = typeof usage.output_tokens === 'number' ? usage.output_tokens : 0;\n const reasoning = typeof usage.reasoning_tokens === 'number' ? usage.reasoning_tokens : 0;\n const cache_read = typeof usage.cache_read_input_tokens === 'number' ? usage.cache_read_input_tokens : 0;\n const cache_write = typeof usage.cache_creation_input_tokens === 'number' ? usage.cache_creation_input_tokens : 0;\n return createTokenUsage(input, output, { reasoning, cache_read, cache_write });\n }\n return undefined;\n}\n\n/**\n * Create an async generator that streams AgentEvents from a child process.\n *\n * Handles: exit promise setup, line-by-line reading, abort signal, exit code checking.\n *\n * @param proc - The spawned child process.\n * @param parseEvent - Adapter-specific function to parse a line into an AgentEvent.\n * @param adapterName - Name used in error messages (e.g. \"Claude\", \"Codex\").\n * @param signal - Optional abort signal.\n */\nexport function createStreamingEvents(\n proc: ChildProcess,\n parseEvent: (line: string) => AgentEvent | null,\n adapterName: string,\n signal?: AbortSignal,\n): AsyncGenerator<AgentEvent> {\n async function* generate(): AsyncGenerator<AgentEvent> {\n let gotDoneEvent = false;\n\n let exitCode: number | null = null;\n let exitError: Error | null = null;\n const exitPromise = new Promise<void>((resolve) => {\n proc.on('close', (code) => { exitCode = code; resolve(); });\n proc.on('error', (err) => { exitError = err; resolve(); });\n });\n\n if (proc.stdout) {\n try {\n for await (const line of readLines(proc.stdout)) {\n if (signal?.aborted) break;\n const event = parseEvent(line);\n if (event) {\n if (event.type === 'done') gotDoneEvent = true;\n yield event;\n }\n }\n } finally {\n // Destroy the stream to release the FD immediately rather than waiting\n // for the process to die — critical for rapid abort/restart cycles.\n // destroy() is idempotent: safe on an already-ended stream.\n proc.stdout.destroy();\n }\n }\n\n await exitPromise;\n\n if (exitError && !signal?.aborted && !gotDoneEvent) {\n const spawnErr = exitError as Error;\n const classified = classifyAdapterError(spawnErr.message, exitCode ?? undefined);\n const err = Object.assign(new Error(spawnErr.message), { errorKind: classified });\n throw err;\n }\n if (exitCode !== 0 && exitCode !== null && !signal?.aborted && !gotDoneEvent) {\n const msg = `${adapterName} process exited with code ${exitCode}`;\n const classified = classifyAdapterError(msg, exitCode);\n const err = Object.assign(new Error(msg), { errorKind: classified });\n throw err;\n }\n }\n\n return generate();\n}\n"]}
|