@wrongstack/core 0.5.7 → 0.6.1
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/{agent-bridge-BKNiE1VH.d.ts → agent-bridge-DaCvA_uK.d.ts} +1 -1
- package/dist/coordination/index.d.ts +5 -5
- package/dist/coordination/index.js +218 -78
- package/dist/coordination/index.js.map +1 -1
- package/dist/defaults/index.d.ts +10 -9
- package/dist/defaults/index.js +1127 -180
- package/dist/defaults/index.js.map +1 -1
- package/dist/{events-DPQKFX7W.d.ts → events-CzkeaVVl.d.ts} +8 -2
- package/dist/execution/index.d.ts +281 -5
- package/dist/execution/index.js +785 -3
- package/dist/execution/index.js.map +1 -1
- package/dist/extension/index.d.ts +2 -2
- package/dist/extension/index.js +2 -1
- package/dist/extension/index.js.map +1 -1
- package/dist/goal-store-DVCfj7Ff.d.ts +95 -0
- package/dist/{index-j2WyAyML.d.ts → index-BkKLQjea.d.ts} +34 -2
- package/dist/{index-Bf9Bpkdc.d.ts → index-i9rPR53g.d.ts} +11 -4
- package/dist/index.d.ts +51 -16
- package/dist/index.js +1506 -247
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +2 -2
- package/dist/kernel/index.d.ts +2 -2
- package/dist/kernel/index.js.map +1 -1
- package/dist/models/index.js +2 -3
- package/dist/models/index.js.map +1 -1
- package/dist/{multi-agent-Cpp7FXUl.d.ts → multi-agent-MfI6dmv-.d.ts} +30 -5
- package/dist/observability/index.d.ts +1 -1
- package/dist/{path-resolver--g_hKJ7V.d.ts → path-resolver-CWINz5XR.d.ts} +1 -1
- package/dist/{plan-templates-Bveo2W8n.d.ts → plan-templates-Bne1pB4d.d.ts} +6 -5
- package/dist/{provider-runner-hl4Il3xS.d.ts → provider-runner-CZYIzeBp.d.ts} +1 -1
- package/dist/sdd/index.d.ts +5 -3
- package/dist/sdd/index.js +102 -68
- package/dist/sdd/index.js.map +1 -1
- package/dist/security/index.js +82 -82
- package/dist/security/index.js.map +1 -1
- package/dist/skills/index.js +102 -38
- package/dist/skills/index.js.map +1 -1
- package/dist/storage/index.d.ts +3 -2
- package/dist/storage/index.js +134 -22
- package/dist/storage/index.js.map +1 -1
- package/dist/{tool-executor-DbAFkHdP.d.ts → tool-executor-40Q6shR-.d.ts} +1 -1
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.js +116 -103
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/atomic-write.ts","../../src/storage/director-state.ts","../../src/coordination/in-memory-transport.ts","../../src/coordination/agent-bridge.ts","../../src/coordination/director-prompts.ts","../../src/coordination/fleet-bus.ts","../../src/types/errors.ts","../../src/types/provider.ts","../../src/coordination/subagent-budget.ts","../../src/coordination/fleet.ts","../../src/coordination/multi-agent-coordinator.ts","../../src/coordination/director-tools.ts","../../src/coordination/director.ts","../../src/coordination/delegate-tool.ts","../../src/coordination/agent-subagent-runner.ts","../../src/utils/message-invariants.ts","../../src/storage/session-store.ts","../../src/coordination/director-session.ts","../../src/coordination/null-fleet-bus.ts","../../src/coordination/fleet-manager.ts"],"names":["path","fs","stat","fsp","lock","handlers","randomUUID","baseMessage","fsp2","path2","instantiateRosterConfig","partial","path3","fsp3","randomBytes","path5","fsp5","path6"],"mappings":"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","file":"index.js","sourcesContent":["import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import * as fsp from 'node:fs/promises';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * Director state checkpoint — written incrementally throughout a fleet\n * run so a crashed director can be inspected (and eventually resumed)\n * instead of leaving only a final `fleet.json` manifest after `shutdown()`.\n *\n * Schema is JSON-friendly and deliberately denormalized. Each mutation\n * triggers an atomic-write of the whole file — small payloads (typically\n * < 10 KB even with dozens of subagents) make this cheap.\n */\nexport interface DirectorSubagentState {\n id: string;\n name?: string;\n role?: string;\n provider?: string;\n model?: string;\n spawnedAt: string;\n}\n\nexport interface DirectorTaskState {\n taskId: string;\n subagentId?: string;\n description?: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'stopped' | 'timeout';\n assignedAt?: string;\n completedAt?: string;\n iterations?: number;\n toolCalls?: number;\n durationMs?: number;\n error?: string;\n}\n\nexport interface DirectorStateSnapshot {\n version: 1;\n directorRunId: string;\n updatedAt: string;\n spawnCount: number;\n maxSpawns?: number;\n spawnDepth: number;\n maxSpawnDepth: number;\n directorBudget?: {\n maxCostUsd?: number;\n };\n subagents: DirectorSubagentState[];\n tasks: DirectorTaskState[];\n /** Aggregated usage snapshot. Optional — populated by the Director on save when available. */\n usage?: unknown;\n}\n\nexport async function loadDirectorState(filePath: string): Promise<DirectorStateSnapshot | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as DirectorStateSnapshot;\n if (parsed?.version !== 1) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\n/**\n * Lock file entry written when a director starts. Prevents two directors\n * from resuming the same run — the second one sees the lock and refuses\n * rather than corrupting the checkpoint by writing concurrently.\n */\nexport interface DirectorStateLock {\n pid: number;\n hostname: string;\n startedAt: string;\n}\n\n/**\n * Write a lock file to claim this checkpoint. Returns false if the lock\n * is already held by a live process; returns true if the lock was acquired\n * (either the file didn't exist, or the previous holder is dead).\n */\nexport async function acquireDirectorStateLock(\n lockPath: string,\n processId = process.pid,\n): Promise<boolean> {\n let existing: string | undefined;\n try {\n existing = await fsp.readFile(lockPath, 'utf8');\n } catch {\n // No lock file — we're safe to claim\n }\n\n if (existing) {\n try {\n const lock = JSON.parse(existing) as DirectorStateLock;\n // Check if the process is still alive\n try {\n process.kill(lock.pid, 0);\n // Signal success means the process is alive — another director\n // owns this checkpoint. Refuse.\n return false;\n } catch {\n // ESRCH means the process is dead — stale lock. We'll overwrite.\n }\n } catch {\n // Malformed lock — treat as stale.\n }\n }\n\n const lock: DirectorStateLock = {\n pid: processId,\n hostname: require('node:os').hostname(),\n startedAt: new Date().toISOString(),\n };\n await atomicWrite(lockPath, JSON.stringify(lock), { mode: 0o600 });\n return true;\n}\n\n/**\n * Remove the lock file. Call this on graceful Director.shutdown() so the\n * next director run can claim the checkpoint without stale-lock checks.\n */\nexport async function releaseDirectorStateLock(lockPath: string): Promise<void> {\n try {\n await fsp.unlink(lockPath);\n } catch {\n // ignore\n }\n}\n\n/**\n * In-memory accumulator with atomic-write checkpoint. The Director keeps\n * an instance, mutates it on every spawn/assign/complete/fail event, and\n * the instance debounces writes so a burst of activity collapses into a\n * single disk hit.\n *\n * Supports crash recovery: use `loadDirectorState()` to read an existing\n * checkpoint, then call `DirectorStateCheckpoint.resume(snapshot)` to\n * re-attach to a fleet mid-flight. The lock mechanism ensures no two\n * directors can claim the same checkpoint.\n */\nexport class DirectorStateCheckpoint {\n private snapshot: DirectorStateSnapshot;\n private readonly filePath: string;\n private readonly lockPath: string;\n private timer: NodeJS.Timeout | null = null;\n private readonly debounceMs: number;\n private writing = false;\n private rewriteRequested = false;\n\n constructor(\n filePath: string,\n init: {\n directorRunId: string;\n maxSpawns?: number;\n spawnDepth: number;\n maxSpawnDepth: number;\n directorBudget?: {\n maxCostUsd?: number;\n };\n },\n debounceMs = 250,\n ) {\n this.filePath = filePath;\n // Lock file lives alongside the checkpoint — `<path>.lock`\n this.lockPath = `${filePath}.lock`;\n this.debounceMs = debounceMs;\n this.snapshot = {\n version: 1,\n directorRunId: init.directorRunId,\n updatedAt: new Date().toISOString(),\n spawnCount: 0,\n maxSpawns: init.maxSpawns,\n spawnDepth: init.spawnDepth,\n maxSpawnDepth: init.maxSpawnDepth,\n directorBudget: init.directorBudget,\n subagents: [],\n tasks: [],\n };\n }\n\n /**\n * Attempt to acquire the lock for this checkpoint. Call this before\n * resuming a crashed director run. If it returns false, another\n * director process is still running this fleet — do not resume.\n */\n async acquireLock(): Promise<boolean> {\n return acquireDirectorStateLock(this.lockPath);\n }\n\n /**\n * Release the lock on graceful shutdown. Call `flush()` first to ensure\n * the final checkpoint state is on disk before removing the lock.\n * Without this, the next resume will see a stale-lock and refuse.\n */\n async releaseLock(): Promise<void> {\n return releaseDirectorStateLock(this.lockPath);\n }\n\n /**\n * Resume from a snapshot previously loaded via `loadDirectorState()`.\n * Use this when `--resume <runId>` is triggered — the snapshot has\n * the full fleet state (subagents, tasks) from before the crash; the\n * checkpoint continues from there.\n */\n resume(snapshot: DirectorStateSnapshot): void {\n this.snapshot = snapshot;\n }\n\n current(): DirectorStateSnapshot {\n return this.snapshot;\n }\n\n recordSpawn(sub: DirectorSubagentState, spawnCount: number): void {\n this.snapshot = {\n ...this.snapshot,\n spawnCount,\n subagents: [...this.snapshot.subagents.filter((s) => s.id !== sub.id), sub],\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n recordTaskAssigned(task: DirectorTaskState): void {\n const exists = this.snapshot.tasks.some((t) => t.taskId === task.taskId);\n this.snapshot = {\n ...this.snapshot,\n tasks: exists\n ? this.snapshot.tasks.map((t) => (t.taskId === task.taskId ? { ...t, ...task } : t))\n : [...this.snapshot.tasks, task],\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n recordTaskStatus(\n taskId: string,\n patch: Partial<DirectorTaskState> & { status: DirectorTaskState['status'] },\n ): void {\n this.snapshot = {\n ...this.snapshot,\n tasks: this.snapshot.tasks.map((t) =>\n t.taskId === taskId ? { ...t, ...patch } : t,\n ),\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n setUsage(usage: unknown): void {\n this.snapshot = { ...this.snapshot, usage };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n /** Force a synchronous flush — used by Director.shutdown(). */\n async flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n await this.persist();\n // If a rewrite was requested while we waited, persist() scheduled\n // a follow-up write. Wait for it so shutdown doesn't return before\n // the most recent state lands on disk.\n if (this.rewriteRequested) {\n this.rewriteRequested = false;\n await this.persist();\n }\n }\n\n private bumpUpdatedAt(): void {\n this.snapshot = { ...this.snapshot, updatedAt: new Date().toISOString() };\n }\n\n private schedule(): void {\n if (this.timer) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.persist();\n }, this.debounceMs);\n }\n\n private async persist(): Promise<void> {\n if (this.writing) {\n // A write is already in flight — defer to a follow-up flush so the\n // most recent state still lands. Without this guard, simultaneous\n // burst mutations can drop the latest snapshot if rename races.\n this.rewriteRequested = true;\n return;\n }\n this.writing = true;\n try {\n await atomicWrite(this.filePath, JSON.stringify(this.snapshot, null, 2), {\n mode: 0o600,\n });\n } catch (err) {\n console.warn(\n '[director-state] checkpoint write failed:',\n err instanceof Error ? err.message : String(err),\n );\n } finally {\n this.writing = false;\n if (this.rewriteRequested) {\n this.rewriteRequested = false;\n this.schedule();\n }\n }\n }\n}\n","import type { BridgeMessage, BridgeTransport } from '../types/agent-bridge.js';\n\n/**\n * In-memory pub/sub transport for agent-to-agent messaging.\n * Subscribers register by agentId and receive messages via callback.\n */\nexport class InMemoryBridgeTransport implements BridgeTransport {\n private readonly subs = new Map<string, Set<(msg: BridgeMessage) => void>>();\n\n send(msg: BridgeMessage, to: string): Promise<void> {\n // Broadcast: deliver to every subscriber except the sender.\n if (to === '*') {\n for (const [id, handlers] of this.subs) {\n if (id === msg.from) continue;\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n const handlers = this.subs.get(to);\n if (handlers) {\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n\n subscribe(agentId: string, handler: (msg: BridgeMessage) => void): () => void {\n if (!this.subs.has(agentId)) this.subs.set(agentId, new Set());\n this.subs.get(agentId)!.add(handler);\n return () => this.subs.get(agentId)?.delete(handler);\n }\n\n close(agentId: string): Promise<void> {\n this.subs.delete(agentId);\n return Promise.resolve();\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type {\n AgentBridge,\n AgentBridgeConfig,\n BridgeMessage,\n BridgeTransport,\n} from '../types/agent-bridge.js';\nimport { InMemoryBridgeTransport } from './in-memory-transport.js';\n\n// Re-export for backwards compatibility\nexport { InMemoryBridgeTransport };\n\nexport class InMemoryAgentBridge implements AgentBridge {\n readonly agentId: string;\n readonly coordinatorId: string;\n private readonly transport: BridgeTransport;\n private readonly subscriptions: Set<(msg: BridgeMessage) => void> = new Set();\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (msg: BridgeMessage) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n private stopped = false;\n private timeoutMs: number;\n /** Guards request() so concurrent calls on the same id can't silently overwrite. */\n private readonly inflightGuards = new Set<string>();\n\n constructor(config: AgentBridgeConfig, transport: BridgeTransport) {\n this.agentId = config.agentId;\n this.coordinatorId = config.coordinatorId;\n this.transport = transport;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n\n this.transport.subscribe(this.agentId, (msg) => {\n if (msg.type === 'heartbeat') return;\n\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id);\n this.inflightGuards.delete(msg.id);\n pending.resolve(msg);\n return;\n }\n\n for (const h of this.subscriptions) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n });\n }\n\n async send(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n await this.transport.send(msg, msg.to ?? this.coordinatorId);\n }\n\n async broadcast(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n msg.to = '*';\n await this.transport.send(msg, '*');\n }\n\n subscribe(handler: (msg: BridgeMessage) => void | Promise<void>): () => void {\n this.subscriptions.add(handler as (msg: BridgeMessage) => void);\n return () => this.subscriptions.delete(handler as (msg: BridgeMessage) => void);\n }\n\n async request<T>(msg: BridgeMessage, timeoutMs?: number): Promise<BridgeMessage<T>> {\n if (this.stopped) throw new Error('Bridge is stopped');\n const timeout = timeoutMs ?? this.timeoutMs;\n const correlationId = msg.id;\n\n // Guard against concurrent calls reusing the same id. Without this check,\n // a second .set() would silently overwrite the first record — the original\n // caller's timer fires, deletes the entry, and resolves its promise, but\n // the second caller now has no entry to resolve when its timer fires.\n // Throwing here surfaces the caller bug rather than letting it hang.\n if (this.inflightGuards.has(correlationId)) {\n throw new Error(\n `Bridge request id \"${correlationId}\" collides with an in-flight request — caller is reusing message ids`,\n );\n }\n this.inflightGuards.add(correlationId);\n\n return new Promise((resolve, reject) => {\n // Declare timer first so we can reference it in the stopped-check below.\n const timer = setTimeout(() => {\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(new Error(`Request ${correlationId} timed out after ${timeout}ms`));\n }, timeout);\n\n // Double-check stopped after setting up the pending entry, so stop()\n // can't miss a request that was enqueued before it acquired the lock.\n if (this.stopped) {\n clearTimeout(timer);\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(new Error('Bridge stopped'));\n return;\n }\n\n this.pendingRequests.set(correlationId, {\n resolve: resolve as (msg: BridgeMessage) => void,\n reject,\n timer,\n });\n\n msg.timestamp = Date.now();\n this.transport.send(msg, msg.to ?? this.coordinatorId).catch((e) => {\n clearTimeout(timer);\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(e);\n });\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n for (const [, p] of this.pendingRequests) {\n clearTimeout(p.timer);\n p.reject(new Error('Bridge stopped'));\n }\n this.pendingRequests.clear();\n this.inflightGuards.clear();\n this.subscriptions.clear();\n await this.transport.close(this.agentId);\n }\n}\n\nexport function createMessage<T = unknown>(\n type: BridgeMessage['type'],\n from: string,\n payload: T,\n to?: string,\n): BridgeMessage<T> {\n return {\n id: randomUUID(),\n type,\n from,\n to,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n}\n","/**\n * System-prompt composition helpers for the Director ecosystem.\n *\n * Two callers need composed prompts:\n *\n * 1. The **leader** (the director's own Agent) — needs a preamble that\n * explains the fleet protocol: when to spawn, when to await, how to\n * roll up, and the eight orchestration tools it owns.\n *\n * 2. Each **subagent** — needs a baseline that explains it has a parent\n * it can call via the bridge, a role-specific block, the task brief,\n * and finally any per-spawn `systemPromptOverride` from `SubagentConfig`.\n *\n * Both composers are pure functions: feed them parts, they return a string.\n * No I/O, no side effects, no implicit defaults beyond the ones exported\n * here. Callers (CLI multi-agent factory, Director itself) decide which\n * parts to fill in — that keeps the composition seam visible and testable.\n */\n\n/**\n * Default fleet-protocol preamble injected at the **front** of the\n * director-agent's system prompt. Kept deliberately short — long preambles\n * crowd out the user's leader prompt and the LLM stops attending. The tool\n * descriptions live on the tool definitions themselves; this preamble only\n * teaches *when* to reach for them.\n */\nexport const DEFAULT_DIRECTOR_PREAMBLE = `\\\nYou are the Director of a multi-agent fleet. You orchestrate worker\nsubagents by spawning them, assigning tasks, awaiting completions, and\nrolling up their outputs into your next decision.\n\nCore fleet tools available to you:\n - spawn_subagent — create a worker with a chosen provider / model / role\n - assign_task — hand a piece of work to a specific subagent\n - await_tasks — block until named task ids complete (parallel-safe)\n - ask_subagent — synchronously query a running subagent via the bridge\n - roll_up — aggregate finished tasks into a markdown/json summary\n - terminate_subagent — abort a stuck worker (use sparingly)\n - fleet_status — snapshot of all subagents and pending tasks\n - fleet_usage — token + cost breakdown per subagent and total\n\nWorking rules:\n 1. Decompose first. Before spawning, decide which sub-tasks are\n independent and can run in parallel. Sequential work doesn't need a\n subagent — do it yourself.\n 2. Match worker to job. Cheap/fast model for triage, capable model for\n synthesis. Different providers per sibling is allowed and encouraged.\n 3. Always pair an assign with an await. Don't fire-and-forget; you owe\n the user a single coherent answer at the end.\n 4. Roll up before deciding. After await_tasks resolves, call roll_up so\n the results are folded back into your context in a compact form.\n 5. Budget is real. Check fleet_usage periodically. If a subagent is\n thrashing, terminate it rather than letting cost climb silently.\n 6. Never claim a subagent's work as your own without verifying it. If a\n result looks wrong, ask_subagent for clarification before passing it\n to the user.\\\n`;\n\n/**\n * Default baseline prepended to every subagent's system prompt. Tells the\n * subagent its place in the hierarchy and the bridge contract — without\n * this, a subagent has no way to know it *can* ask the parent for\n * clarification, and it will hallucinate answers when context is missing.\n *\n * Bridge contract: subagents may `send` progress and `request` answers, but\n * MAY NOT exfiltrate the parent's full system prompt or tools list. The\n * baseline reinforces this in plain text — the actual enforcement is at\n * the bridge transport layer.\n */\nexport const DEFAULT_SUBAGENT_BASELINE = `\\\nYou are a subagent operating under a Director. You were spawned to handle\na specific slice of a larger plan — do that slice well and report back.\n\nBridge contract:\n - You have a parent (the Director). You may call \\`request\\` on the\n parent bridge to ask a clarifying question. Use this sparingly; the\n parent is also working.\n - You MAY NOT request the parent's system prompt, tool list, or other\n subagents' context. Those are not yours to read.\n - Your final task output is what the Director sees. Be concise,\n structured, and self-contained — assume the Director will paste your\n output into its own context.\\\n`;\n\n/** Parts the leader-prompt composer accepts. All optional. */\nexport interface DirectorPromptParts {\n /** The user's existing leader system prompt — typically what was passed\n * via `MultiAgentConfig.leaderSystemPrompt`. */\n basePrompt?: string;\n /** Override the built-in fleet preamble. Pass empty string to suppress. */\n directorPreamble?: string;\n /** Optional roster summary block — a short list of pre-configured roles\n * the director can spawn (e.g. \"researcher, coder, reviewer\"). Helps\n * small models discover the available shapes without scanning tools. */\n rosterSummary?: string;\n}\n\n/**\n * Compose the leader/director's system prompt. Order:\n * 1. Director preamble (fleet protocol)\n * 2. Roster summary (optional, when provided)\n * 3. User base prompt (the per-project leader prompt)\n *\n * Sections are separated by a blank line. Empty parts are skipped so the\n * output never contains stray blank-line runs.\n */\nexport function composeDirectorPrompt(parts: DirectorPromptParts = {}): string {\n const sections: string[] = [];\n const preamble = parts.directorPreamble ?? DEFAULT_DIRECTOR_PREAMBLE;\n if (preamble && preamble.trim().length > 0) sections.push(preamble.trim());\n if (parts.rosterSummary && parts.rosterSummary.trim().length > 0) {\n sections.push(`Available roles you can spawn:\\n${parts.rosterSummary.trim()}`);\n }\n if (parts.basePrompt && parts.basePrompt.trim().length > 0) {\n sections.push(parts.basePrompt.trim());\n }\n return sections.join('\\n\\n');\n}\n\n/** Parts the subagent-prompt composer accepts. Layered from generic to\n * specific; later layers override earlier ones when they conflict. */\nexport interface SubagentPromptParts {\n /** Base persona/identity for *every* subagent. Defaults to the bridge\n * contract baseline. Pass empty string to suppress. */\n baseline?: string;\n /** Role-specific block, e.g. \"You are a code reviewer. Focus on…\". */\n role?: string;\n /** Task brief — usually the same string the runner passes as user input,\n * but exposed here in case the factory wants it duplicated in the\n * system prompt for reinforcement. */\n task?: string;\n /**\n * Absolute path to a shared scratchpad directory the whole fleet can\n * read/write. When set, the composer adds a \"Shared notes\" block that\n * tells the subagent where to drop findings and where to look for\n * sibling output. This is the cheap fleet-coordination channel —\n * agents don't need each other's transcripts, just each other's\n * conclusions. Falls between `task` and `override` so the override\n * can still narrow or replace it.\n */\n sharedScratchpad?: string;\n /** Final per-spawn override from `SubagentConfig.systemPromptOverride`.\n * Added last so it wins on conflict — that's by design: the spawn site\n * knows the most about what this specific subagent should do. */\n override?: string;\n}\n\n/**\n * Compose a subagent's system prompt. Order:\n * 1. Baseline (bridge contract)\n * 2. Role\n * 3. Task brief\n * 4. Per-spawn override\n *\n * Same blank-line-separated joining as the director composer.\n *\n * Layering rationale: the baseline never needs to change between\n * subagents; the role is the \"what kind of worker is this\"; the task is\n * the \"what should you do *now*\"; the override is the spawn-site escape\n * hatch (\"…and respond only in JSON\"). Putting override last means it\n * never gets squashed by something earlier in the chain.\n */\nexport function composeSubagentPrompt(parts: SubagentPromptParts = {}): string {\n const sections: string[] = [];\n const baseline = parts.baseline ?? DEFAULT_SUBAGENT_BASELINE;\n if (baseline && baseline.trim().length > 0) sections.push(baseline.trim());\n if (parts.role && parts.role.trim().length > 0) {\n sections.push(`Role:\\n${parts.role.trim()}`);\n }\n if (parts.task && parts.task.trim().length > 0) {\n sections.push(`Task:\\n${parts.task.trim()}`);\n }\n if (parts.sharedScratchpad && parts.sharedScratchpad.trim().length > 0) {\n sections.push(\n `Shared notes:\\n` +\n `A scratchpad shared with the rest of the fleet is mounted at \\`${parts.sharedScratchpad.trim()}\\`.\\n` +\n `- Write your final findings as markdown files there (e.g. \\`findings.md\\`, \\`security.md\\`).\\n` +\n `- Before starting, list the directory and read any sibling files relevant to your task — ` +\n `they may already contain context you can build on.\\n` +\n `- Use stable filenames (one file per concern); overwrite instead of appending so the ` +\n `Director sees the latest state.`,\n );\n }\n if (parts.override && parts.override.trim().length > 0) {\n sections.push(parts.override.trim());\n }\n return sections.join('\\n\\n');\n}\n\n/**\n * Render a short bullet list summarising a roster — useful for stuffing\n * into `composeDirectorPrompt({ rosterSummary })` so the director model\n * can see available roles without scanning tool descriptions.\n *\n * Each entry: `- <role-id>: <name>[ (provider/model)] — <prompt-headline>`\n * The prompt headline is the first non-empty line of `config.prompt`,\n * truncated to 80 chars. Skipped entirely when the role has no prompt.\n */\nexport function rosterSummaryFromConfigs(\n roster: Record<\n string,\n { name: string; provider?: string; model?: string; prompt?: string; role?: string }\n >,\n): string {\n const lines: string[] = [];\n for (const [roleId, cfg] of Object.entries(roster)) {\n const tag = cfg.provider && cfg.model ? ` (${cfg.provider}/${cfg.model})` : '';\n const headline = cfg.prompt\n ? (cfg.prompt.split('\\n').find((l) => l.trim().length > 0) ?? '').trim().slice(0, 80)\n : '';\n const tail = headline ? ` — ${headline}` : '';\n lines.push(`- ${roleId}: ${cfg.name}${tag}${tail}`);\n }\n return lines.join('\\n');\n}\n","import type { EventBus } from '../kernel/events.js';\r\n\r\n/**\r\n * Single fleet-wide event with subagent attribution. Whatever a child\r\n * agent emits on its own EventBus gets re-published here, prefixed with\r\n * `subagentId` so a single subscriber can multiplex across the fleet.\r\n *\r\n * The director uses `FleetBus.filter('tool.executed', …)` to see every\r\n * tool call across the fleet; the TUI uses\r\n * `FleetBus.subscribe(id, handler)` to render a per-subagent panel.\r\n */\r\nexport interface FleetEvent {\r\n subagentId: string;\r\n taskId?: string;\r\n ts: number;\r\n type: string;\r\n payload: unknown;\r\n}\r\n\r\nexport type FleetHandler = (event: FleetEvent) => void;\r\n\r\n/**\r\n * Fan-in for per-subagent EventBuses. Each subagent's bus is plugged in\r\n * via `attach()`; the FleetBus re-emits every event with subagent\r\n * attribution. Detachment is automatic via the returned disposer — call\r\n * it when a subagent terminates so we don't leak listeners.\r\n *\r\n * The bus exposes two subscription modes: by `subagentId` (everything\r\n * from one child) and by `type` (one event-type across the fleet). They\r\n * compose — if you need a per-subagent + per-type slice, subscribe by\r\n * type and filter on `event.subagentId` in your handler.\r\n */\r\nexport class FleetBus {\r\n private readonly byId = new Map<string, Set<FleetHandler>>();\r\n private readonly byType = new Map<string, Set<FleetHandler>>();\r\n private readonly any = new Set<FleetHandler>();\r\n\r\n /**\r\n * Hook a subagent's EventBus into the fleet. EventBus is strongly\r\n * typed and doesn't expose an `onAny` hook, so we subscribe to the\r\n * canonical set of event types a subagent emits during a run. New\r\n * event types added to the kernel must be added here too — but the\r\n * cost is a tiny single line per type, and the explicit list keeps\r\n * the wire format clear.\r\n *\r\n * Returns a disposer that detaches every subscription; call on\r\n * subagent teardown so the listeners don't outlive the run.\r\n */\r\n attach(subagentId: string, bus: EventBus, taskId?: string): () => void {\r\n const FORWARDED_TYPES = [\r\n 'tool.started',\r\n 'tool.executed',\r\n 'tool.progress',\r\n 'tool.confirm_needed',\r\n 'iteration.started',\r\n 'iteration.completed',\r\n 'provider.text_delta',\r\n // Subagent extended-thinking output. Forwarded so the FleetPanel /\r\n // /fleet log can surface \"the planner is thinking…\" instead of a\r\n // silent gap between iteration.started and the first text_delta.\r\n 'provider.thinking_delta',\r\n 'provider.response',\r\n 'provider.retry',\r\n 'provider.error',\r\n 'session.started',\r\n 'session.ended',\r\n 'session.damaged',\r\n 'compaction.fired',\r\n 'compaction.failed',\r\n 'token.threshold',\r\n // Subagent hit a soft budget limit — coordinator can extend or stop.\r\n 'budget.threshold_reached',\r\n ] as const;\r\n const offs: Array<() => void> = [];\r\n for (const t of FORWARDED_TYPES) {\r\n offs.push(\r\n bus.on(t, (payload: unknown) => {\r\n this.emit({ subagentId, taskId, ts: Date.now(), type: t, payload });\r\n }),\r\n );\r\n }\r\n return () => {\r\n for (const off of offs) off();\r\n };\r\n }\r\n\r\n /** Subscribe to every event from one subagent. */\r\n subscribe(subagentId: string, handler: FleetHandler): () => void {\r\n let set = this.byId.get(subagentId);\r\n if (!set) {\r\n set = new Set();\r\n this.byId.set(subagentId, set);\r\n }\r\n set.add(handler);\r\n return () => {\r\n set!.delete(handler);\r\n };\r\n }\r\n\r\n /** Subscribe to one event type across all subagents. */\r\n filter(type: string, handler: FleetHandler): () => void {\r\n let set = this.byType.get(type);\r\n if (!set) {\r\n set = new Set();\r\n this.byType.set(type, set);\r\n }\r\n set.add(handler);\r\n return () => {\r\n set!.delete(handler);\r\n };\r\n }\r\n\r\n /** Subscribe to literally everything. The fleet roll-up uses this. */\r\n onAny(handler: FleetHandler): () => void {\r\n this.any.add(handler);\r\n return () => {\r\n this.any.delete(handler);\r\n };\r\n }\r\n\r\n emit(event: FleetEvent): void {\r\n // Each fan-out is best-effort — a misbehaving handler must not\r\n // bring down the bus or other handlers. Errors are swallowed\r\n // (matching the rest of the project's listener-error policy).\r\n const byId = this.byId.get(event.subagentId);\r\n if (byId)\r\n for (const h of byId) {\r\n try {\r\n h(event);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n const byType = this.byType.get(event.type);\r\n if (byType)\r\n for (const h of byType) {\r\n try {\r\n h(event);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n for (const h of this.any) {\r\n try {\r\n h(event);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Roll-up of token usage + cost across an entire director run. The\r\n * director's `fleet_status` tool returns this so the model can reason\r\n * about budget in its next turn (\"the researcher already burned $0.40,\r\n * lean on summaries for the next task\").\r\n */\r\nexport interface FleetUsage {\r\n total: {\r\n input: number;\r\n output: number;\r\n cacheRead: number;\r\n cacheWrite: number;\r\n cost: number;\r\n };\r\n perSubagent: Record<string, SubagentUsageSnapshot>;\r\n}\r\n\r\nexport interface SubagentUsageSnapshot {\r\n subagentId: string;\r\n provider?: string;\r\n model?: string;\r\n input: number;\r\n output: number;\r\n cacheRead: number;\r\n cacheWrite: number;\r\n cost: number;\r\n toolCalls: number;\r\n iterations: number;\r\n startedAt: number;\r\n lastEventAt: number;\r\n}\r\n\r\n/**\r\n * Aggregates provider.response + tool.executed events from the FleetBus\r\n * into a live `FleetUsage` snapshot. Costs are computed by the caller\r\n * via a `priceLookup(subagentId)` so we don't bake provider-pricing\r\n * coupling into core; the CLI/tests supply a function that resolves\r\n * each subagent's per-token rates from the models registry.\r\n */\r\nexport class FleetUsageAggregator {\r\n private readonly perSubagent = new Map<string, SubagentUsageSnapshot>();\r\n private readonly total = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 };\r\n\r\n constructor(\r\n private readonly bus: FleetBus,\r\n private readonly priceLookup?: (\r\n subagentId: string,\r\n ) => { input?: number; output?: number; cacheRead?: number; cacheWrite?: number } | undefined,\r\n private readonly metaLookup?: (\r\n subagentId: string,\r\n ) => { provider?: string; model?: string } | undefined,\r\n ) {\r\n bus.filter('provider.response', (e) => this.onProviderResponse(e));\r\n bus.filter('tool.executed', (e) => this.onToolExecuted(e));\r\n bus.filter('iteration.started', (e) => this.onIterationStarted(e));\r\n }\r\n\r\n /** Live snapshot — safe to call from a tool's execute() body. */\r\n snapshot(): FleetUsage {\r\n return {\r\n total: { ...this.total },\r\n perSubagent: Object.fromEntries(\r\n Array.from(this.perSubagent.entries()).map(([k, v]) => [k, { ...v }]),\r\n ),\r\n };\r\n }\r\n\r\n private ensure(subagentId: string): SubagentUsageSnapshot {\r\n let snap = this.perSubagent.get(subagentId);\r\n if (!snap) {\r\n const meta = this.metaLookup?.(subagentId);\r\n snap = {\r\n subagentId,\r\n provider: meta?.provider,\r\n model: meta?.model,\r\n input: 0,\r\n output: 0,\r\n cacheRead: 0,\r\n cacheWrite: 0,\r\n cost: 0,\r\n toolCalls: 0,\r\n iterations: 0,\r\n startedAt: Date.now(),\r\n lastEventAt: Date.now(),\r\n };\r\n this.perSubagent.set(subagentId, snap);\r\n }\r\n return snap;\r\n }\r\n\r\n private onProviderResponse(e: FleetEvent): void {\r\n const snap = this.ensure(e.subagentId);\r\n const p = e.payload as {\r\n usage?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number };\r\n };\r\n const usage = p?.usage;\r\n if (!usage) return;\r\n snap.input += usage.input ?? 0;\r\n snap.output += usage.output ?? 0;\r\n snap.cacheRead += usage.cacheRead ?? 0;\r\n snap.cacheWrite += usage.cacheWrite ?? 0;\r\n this.total.input += usage.input ?? 0;\r\n this.total.output += usage.output ?? 0;\r\n this.total.cacheRead += usage.cacheRead ?? 0;\r\n this.total.cacheWrite += usage.cacheWrite ?? 0;\r\n const price = this.priceLookup?.(e.subagentId);\r\n if (price) {\r\n const delta =\r\n ((usage.input ?? 0) / 1_000_000) * (price.input ?? 0) +\r\n ((usage.output ?? 0) / 1_000_000) * (price.output ?? 0) +\r\n ((usage.cacheRead ?? 0) / 1_000_000) * (price.cacheRead ?? 0) +\r\n ((usage.cacheWrite ?? 0) / 1_000_000) * (price.cacheWrite ?? 0);\r\n snap.cost += delta;\r\n this.total.cost += delta;\r\n }\r\n snap.lastEventAt = e.ts;\r\n }\r\n\r\n private onToolExecuted(e: FleetEvent): void {\r\n const snap = this.ensure(e.subagentId);\r\n snap.toolCalls += 1;\r\n snap.lastEventAt = e.ts;\r\n }\r\n\r\n private onIterationStarted(e: FleetEvent): void {\r\n const snap = this.ensure(e.subagentId);\r\n snap.iterations += 1;\r\n snap.lastEventAt = e.ts;\r\n }\r\n}\r\n","/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\nexport type ErrorCode =\n // Provider\n | 'PROVIDER_RATE_LIMITED'\n | 'PROVIDER_AUTH_FAILED'\n | 'PROVIDER_OVERLOADED'\n | 'PROVIDER_INVALID_REQUEST'\n | 'PROVIDER_SERVER_ERROR'\n | 'PROVIDER_NETWORK_ERROR'\n | 'PROVIDER_CONTEXT_OVERFLOW'\n // Tool\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n // Config\n | 'CONFIG_INVALID'\n | 'CONFIG_NOT_FOUND'\n | 'CONFIG_PARSE_FAILED'\n | 'CONFIG_MIGRATION_NEEDED'\n // Plugin\n | 'PLUGIN_LOAD_FAILED'\n | 'PLUGIN_API_MISMATCH'\n | 'PLUGIN_MISSING_DEPENDENCY'\n // Agent\n | 'AGENT_ITERATION_LIMIT'\n | 'AGENT_CONTEXT_OVERFLOW'\n | 'AGENT_ABORTED'\n | 'AGENT_RUN_FAILED'\n // Session\n | 'SESSION_NOT_FOUND'\n | 'SESSION_CORRUPTED'\n | 'SESSION_WRITE_FAILED'\n // Container / Registry\n | 'CONTAINER_TOKEN_ALREADY_BOUND'\n | 'CONTAINER_TOKEN_NOT_BOUND'\n | 'REGISTRY_DUPLICATE'\n | 'REGISTRY_NOT_FOUND'\n // General\n | 'UNKNOWN';\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// ── Specific error classes ───────────────────────────────────────────\n\n/**\n * Tool execution errors — thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === 'PLUGIN_MISSING_DEPENDENCY',\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === 'AGENT_ABORTED' ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === 'AGENT_ITERATION_LIMIT',\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = 'AGENT_RUN_FAILED',\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? 'AGENT_RUN_FAILED' : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === 'SESSION_WRITE_FAILED' ? 'error' : 'warning',\n recoverable: opts.code !== 'SESSION_CORRUPTED',\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.js';\n\n/**\n * Token usage for a single provider call, normalized across providers.\n *\n * Disjoint semantics: the four fields never overlap. `input` is the count\n * of FRESH input tokens (billed at the full input rate); `cacheRead` and\n * `cacheWrite` are separate cached subsets each priced at their own rate.\n * The total context the model loaded for this turn is\n * `input + (cacheRead ?? 0) + (cacheWrite ?? 0)`.\n *\n * Provider quirks normalized at the adapter layer:\n * - Anthropic: returns `input_tokens` already disjoint from cache fields.\n * - OpenAI / OpenAI-compatible: `prompt_tokens` is the TOTAL including\n * cached portion; the adapter subtracts `cached_tokens` to stay disjoint.\n * - Google: `promptTokenCount` likewise includes cache; adapter subtracts\n * `cachedContentTokenCount`.\n *\n * Cost math and the context-fullness chip both depend on the disjoint\n * invariant — a TOTAL `input` plus a separate `cacheRead` count would bill\n * cached tokens twice and skew cache-hit-ratio reporting.\n */\nexport interface Usage {\n input: number;\n output: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\nexport interface Capabilities {\n tools: boolean;\n parallelTools: boolean;\n vision: boolean;\n streaming: boolean;\n promptCache: boolean;\n systemPrompt: boolean;\n jsonMode: boolean;\n maxContext: number;\n cacheControl: 'native' | 'auto' | 'none';\n}\n\nexport interface Request {\n model: string;\n system?: TextBlock[];\n messages: Message[];\n tools?: Tool[];\n maxTokens: number;\n temperature?: number;\n topP?: number;\n stopSequences?: string[];\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool'; name: string };\n}\n\nexport type StopReason = 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence' | 'refusal';\n\nexport interface Response {\n content: ContentBlock[];\n stopReason: StopReason;\n usage: Usage;\n model: string;\n}\n\nexport type StreamEvent =\n | { type: 'message_start'; model: string }\n | {\n type: 'content_block_start';\n kind: 'text' | 'tool_use' | 'thinking';\n id?: string;\n name?: string;\n }\n | { type: 'content_block_stop'; index: number }\n | { type: 'text_delta'; text: string }\n | { type: 'tool_use_start'; id: string; name: string }\n | { type: 'tool_use_input_delta'; id: string; partial: string }\n | { type: 'tool_use_stop'; id: string; input: unknown; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_start'; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_delta'; text: string }\n | { type: 'thinking_signature'; signature: string }\n | { type: 'thinking_stop' }\n | { type: 'message_stop'; stopReason: StopReason; usage: Usage };\n\nexport interface Provider {\n readonly id: string;\n readonly capabilities: Capabilities;\n /** Canonical streaming entry point. `complete()` defaults to a wrapper that\n * aggregates this stream — providers may override for non-streaming wires. */\n stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent>;\n complete(req: Request, opts: { signal: AbortSignal }): Promise<Response>;\n}\n\n/**\n * Structured body parsed from a provider's HTTP error response. Populated\n * best-effort: providers return JSON shaped differently (Anthropic uses\n * `{error: {type, message}}`, OpenAI uses `{error: {message, code}}`,\n * Google uses `{error: {status, message}}`), so the fields here are the\n * intersection that's usable for rendering and routing.\n */\nexport interface ProviderErrorBody {\n /** Provider-specific kind, e.g. \"overloaded_error\", \"rate_limit_error\", \"invalid_request_error\". */\n type?: string;\n /** Human-readable explanation from the provider. */\n message?: string;\n /** Provider request id, when present in the body or headers. */\n requestId?: string;\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\n retryAfterMs?: number;\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\n raw?: string;\n /** True when `raw` was truncated; check `rawLength` for the original size. */\n truncated?: boolean;\n /** Original length of the response body in bytes, when `truncated` is true. */\n rawLength?: number;\n}\n\nexport class ProviderError extends WrongStackError {\n public readonly status: number;\n public readonly retryable: boolean;\n public readonly providerId: string;\n public readonly body?: ProviderErrorBody;\n\n constructor(\n message: string,\n status: number,\n retryable: boolean,\n providerId: string,\n opts: { body?: ProviderErrorBody; cause?: unknown } = {},\n ) {\n super({\n message,\n code: providerStatusToCode(status, opts.body?.type),\n subsystem: 'provider',\n severity: status >= 500 ? 'error' : 'warning',\n recoverable: retryable,\n context: { providerId, status },\n cause: opts.cause,\n });\n this.name = 'ProviderError';\n this.status = status;\n this.retryable = retryable;\n this.providerId = providerId;\n this.body = opts.body;\n }\n\n /**\n * Render a one-line, user-facing description. Designed for the CLI/TUI\n * status line and the agent's retry warning. Avoids dumping raw JSON\n * (which is what users see today when a 529 lands and the log message\n * includes the full `{\"type\":\"error\",...}` body).\n *\n * Examples:\n * \"minimax-coding-plan overloaded (529): High traffic detected. Upgrade for highspeed model. [req 06534785201de9c0…]\"\n * \"openai rate limited (429): Retry after 12s\"\n * \"anthropic invalid request (400): messages.0.role must be one of 'user'|'assistant'\"\n * \"groq HTTP 500 (server error)\"\n */\n override describe(): string {\n const kind = describeStatus(this.status, this.body?.type);\n const head = `${this.providerId} ${kind}`;\n const detail = this.body?.message?.trim();\n const reqId = this.body?.requestId\n ? ` [req ${this.body.requestId.slice(0, 16)}${this.body.requestId.length > 16 ? '…' : ''}]`\n : '';\n if (detail && detail.length > 0) {\n return `${head}: ${truncate(detail, 240)}${reqId}`;\n }\n return `${head}${reqId}`;\n }\n}\n\nfunction describeStatus(status: number, type?: string): string {\n if (status === 0) return 'network error';\n if (type === 'overloaded_error' || status === 529) return `overloaded (${status})`;\n if (type === 'rate_limit_error' || status === 429) return `rate limited (${status})`;\n if (type === 'authentication_error' || status === 401) return `auth failed (${status})`;\n if (type === 'permission_error' || status === 403) return `forbidden (${status})`;\n if (type === 'not_found_error' || status === 404) return `not found (${status})`;\n if (type === 'invalid_request_error' || status === 400) return `invalid request (${status})`;\n if (status === 408) return `timeout (${status})`;\n if (status >= 500 && status < 600) return `HTTP ${status} (server error)`;\n if (type) return `${type} (${status})`;\n return `HTTP ${status}`;\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\n}\n\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\n if (status === 0) return 'PROVIDER_NETWORK_ERROR';\n if (type === 'rate_limit_error' || status === 429) return 'PROVIDER_RATE_LIMITED';\n if (type === 'authentication_error' || status === 401) return 'PROVIDER_AUTH_FAILED';\n if (type === 'overloaded_error' || status === 529) return 'PROVIDER_OVERLOADED';\n if (type === 'invalid_request_error' || status === 400) return 'PROVIDER_INVALID_REQUEST';\n if (status === 408) return 'PROVIDER_NETWORK_ERROR';\n if (status >= 500) return 'PROVIDER_SERVER_ERROR';\n return 'PROVIDER_INVALID_REQUEST';\n}\n","import type { Usage } from '../types/provider.js';\nimport type { EventBus } from '../kernel/events.js';\n\nexport type BudgetKind = 'tool_calls' | 'iterations' | 'tokens' | 'timeout' | 'cost';\n\nexport class BudgetExceededError extends Error {\n readonly kind: BudgetKind;\n readonly limit: number;\n readonly observed: number;\n\n constructor(kind: BudgetKind, limit: number, observed: number) {\n super(`Budget exceeded: ${kind} (limit=${limit}, observed=${observed})`);\n this.name = 'BudgetExceededError';\n this.kind = kind;\n this.limit = limit;\n this.observed = observed;\n }\n}\n\nexport interface BudgetLimits {\n maxIterations?: number;\n maxToolCalls?: number;\n maxTokens?: number;\n /** Estimated USD cost ceiling. */\n maxCostUsd?: number;\n /** Wall-clock timeout from start() to checkTimeout(). */\n timeoutMs?: number;\n}\n\nexport interface BudgetUsage {\n iterations: number;\n toolCalls: number;\n tokens: { input: number; output: number; total: number };\n costUsd: number;\n elapsedMs: number;\n}\n\n/**\n * Thrown by `SubagentBudget.record*` when a soft limit is hit and\n * an `onThreshold` handler is configured that wants to ask the\n * coordinator (via `budget.threshold_reached` event). The runner\n * catches this and awaits the embedded `decision` promise to get\n * the coordinator's extend/stop decision.\n *\n * Distinct from `BudgetExceededError` which is a hard stop.\n */\nexport class BudgetThresholdSignal extends Error {\n readonly kind: BudgetKind;\n readonly limit: number;\n readonly used: number;\n /** Resolves to 'extend' (with optional new limits) or 'stop' */\n readonly decision: Promise<BudgetThresholdDecision>;\n\n constructor(\n kind: BudgetKind,\n limit: number,\n used: number,\n decision: Promise<BudgetThresholdDecision>,\n ) {\n super(`Budget soft limit: ${kind} (limit=${limit}, used=${used})`);\n this.name = 'BudgetThresholdSignal';\n this.kind = kind;\n this.limit = limit;\n this.used = used;\n this.decision = decision;\n }\n}\n\nexport type BudgetThresholdDecision =\n | 'stop'\n | { extend: Partial<BudgetLimits> };\n\n/**\n * Callback invoked when a budget limit is about to be exceeded.\n * Return 'throw' for hard stop (default — throws BudgetExceededError).\n * Return 'continue' to allow one more unit and re-check next time.\n * Return a Promise to ask the coordinator via `budget.threshold_reached`\n * event (uses the same grant/deny pattern as `iteration.limit_reached`).\n */\nexport type BudgetThresholdHandler = (info: {\n kind: BudgetKind;\n used: number;\n limit: number;\n requestDecision: () => Promise<BudgetThresholdDecision>;\n}) => 'throw' | 'continue' | Promise<BudgetThresholdDecision>;\n\n/**\n * Per-subagent budget enforcement. Each subagent gets its own instance so a\n * runaway agent can't drain the cost ceiling of its siblings. All record/check\n * methods are O(1) and safe to call from hot paths.\n *\n * Behavior: `record*` methods check the limit and throw synchronously when\n * no `onThreshold` handler is configured. When a handler IS configured,\n * `checkLimit` delegates to it and any async work (coordinator decision)\n * is fire-and-forget via `void` — the thrown error is always synchronous\n * so event handlers in tests (which use `expect(...).toThrow`) work correctly.\n */\nexport class SubagentBudget {\n readonly limits: Readonly<BudgetLimits>;\n private iterations = 0;\n private toolCalls = 0;\n private tokenInput = 0;\n private tokenOutput = 0;\n private costUsd = 0;\n private startTime: number | null = null;\n private _onThreshold: BudgetThresholdHandler | undefined;\n /**\n * Injected by the runner when wiring the budget to its EventBus.\n * Used by `checkLimitAsync` to emit `budget.threshold_reached` events.\n */\n _events?: EventBus;\n\n /**\n * Optional callback for soft-limit handling. When set, the budget will\n * call this instead of throwing when a limit is first reached. The\n * handler decides whether to throw, continue, or ask the coordinator.\n */\n get onThreshold(): BudgetThresholdHandler | undefined {\n return this._onThreshold;\n }\n set onThreshold(fn: BudgetThresholdHandler | undefined) {\n this._onThreshold = fn;\n }\n\n constructor(limits: BudgetLimits = {}) {\n this.limits = Object.freeze({ ...limits });\n }\n\n start(): void {\n this.startTime = Date.now();\n }\n\n /** Returns true if we're within 10% of any limit — useful for pre-flight checks. */\n isNearLimit(): boolean {\n const { maxIterations, maxToolCalls, maxTokens, maxCostUsd } = this.limits;\n if (maxIterations && this.iterations >= maxIterations * 0.9) return true;\n if (maxToolCalls && this.toolCalls >= maxToolCalls * 0.9) return true;\n if (maxTokens && this.tokenInput + this.tokenOutput >= maxTokens * 0.9) return true;\n if (maxCostUsd && this.costUsd >= maxCostUsd * 0.9) return true;\n return false;\n }\n\n /**\n * Synchronous budget check — always throws synchronously so callers\n * (especially test event handlers using `expect().toThrow()`) get an\n * unhandled rejection when the budget is exceeded without a handler.\n * When `onThreshold` IS configured, the actual async threshold-handling\n * is dispatched as a fire-and-forget promise.\n */\n private checkLimit(kind: BudgetKind, used: number, limit: number): void {\n // No threshold handler → hard stop, throw synchronously.\n if (kind === 'timeout' || !this._onThreshold) {\n throw new BudgetExceededError(kind, limit, used);\n }\n // Handler configured → kick off async decision flow without blocking.\n void this.checkLimitAsync(kind, used, limit);\n }\n\n /**\n * Async threshold negotiation with the coordinator. Fire-and-forget —\n * any error thrown here becomes an unhandled rejection in the test environment\n * because the runner's catch only handles the synchronous throw from `checkLimit`.\n */\n private async checkLimitAsync(kind: BudgetKind, used: number, limit: number): Promise<void> {\n const result = this._onThreshold!({\n kind,\n used,\n limit,\n // Inject a requestDecision helper the handler can call to emit the\n // budget.threshold_reached event and wait for the coordinator's verdict.\n // The runner wires this by injecting its EventBus into ctx.budget._events.\n requestDecision: (): Promise<BudgetThresholdDecision> => {\n return new Promise<BudgetThresholdDecision>((resolve) => {\n this._events?.emit('budget.threshold_reached', {\n kind: kind as 'iterations' | 'tool_calls' | 'tokens' | 'cost',\n used,\n limit,\n timeoutMs: 30_000,\n extend: (extra: Partial<BudgetLimits>) => resolve({ extend: extra }),\n deny: () => resolve('stop'),\n });\n });\n },\n });\n\n if (result === 'throw') {\n throw new BudgetExceededError(kind, limit, used);\n }\n if (result === 'continue') {\n // Allow one more unit — don't bump the counter yet, next call will re-check\n return;\n }\n // Async path: coordinator decision via requestDecision()\n const decision = await result;\n if (decision === 'stop') {\n throw new BudgetExceededError(kind, limit, used);\n }\n // 'extend' — bump the limit and continue\n const ext = decision.extend;\n if (ext.maxIterations !== undefined) {\n (this.limits as Record<string, unknown>).maxIterations = ext.maxIterations;\n }\n if (ext.maxToolCalls !== undefined) {\n (this.limits as Record<string, unknown>).maxToolCalls = ext.maxToolCalls;\n }\n if (ext.maxTokens !== undefined) {\n (this.limits as Record<string, unknown>).maxTokens = ext.maxTokens;\n }\n if (ext.maxCostUsd !== undefined) {\n (this.limits as Record<string, unknown>).maxCostUsd = ext.maxCostUsd;\n }\n }\n\n recordIteration(): void {\n this.iterations++;\n if (this.limits.maxIterations !== undefined && this.iterations > this.limits.maxIterations) {\n void this.checkLimit('iterations', this.iterations, this.limits.maxIterations);\n }\n }\n\n recordToolCall(): void {\n this.toolCalls++;\n if (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\n void this.checkLimit('tool_calls', this.toolCalls, this.limits.maxToolCalls);\n }\n }\n\n recordUsage(usage: Usage, costUsd = 0): void {\n this.tokenInput += usage.input;\n this.tokenOutput += usage.output;\n this.costUsd += costUsd;\n\n const totalTokens = this.tokenInput + this.tokenOutput;\n if (this.limits.maxTokens !== undefined && totalTokens > this.limits.maxTokens) {\n void this.checkLimit('tokens', totalTokens, this.limits.maxTokens);\n }\n if (this.limits.maxCostUsd !== undefined && this.costUsd > this.limits.maxCostUsd) {\n void this.checkLimit('cost', this.costUsd, this.limits.maxCostUsd);\n }\n }\n\n /**\n * Throws if the wall-clock budget is exhausted. Call this from the iteration\n * loop so a hung tool can't keep a subagent running past its deadline.\n */\n checkTimeout(): void {\n if (this.startTime === null || this.limits.timeoutMs === undefined) return;\n const elapsed = Date.now() - this.startTime;\n if (elapsed > this.limits.timeoutMs) {\n throw new BudgetExceededError('timeout', this.limits.timeoutMs, elapsed);\n }\n }\n\n /** Returns true if a timeout has occurred without throwing. Useful for races. */\n isTimedOut(): boolean {\n if (this.startTime === null || this.limits.timeoutMs === undefined) return false;\n return Date.now() - this.startTime > this.limits.timeoutMs;\n }\n\n usage(): BudgetUsage {\n return {\n iterations: this.iterations,\n toolCalls: this.toolCalls,\n tokens: {\n input: this.tokenInput,\n output: this.tokenOutput,\n total: this.tokenInput + this.tokenOutput,\n },\n costUsd: this.costUsd,\n elapsedMs: this.startTime === null ? 0 : Date.now() - this.startTime,\n };\n }\n}","/**\r\n * Pre-built subagent role configurations for the WrongStack fleet.\r\n * These can be passed to `MultiAgentHost.spawn()` or used as templates\r\n * for the director's roster.\r\n */\r\nimport type { SubagentConfig } from '../types/multi-agent.js';\r\n\r\n/**\r\n * Audit Log Agent — analyzes session logs, event streams, and traces.\r\n * Use for: post-mortems, trend analysis, operational insights.\r\n */\r\nexport const AUDIT_LOG_AGENT: SubagentConfig = {\r\n id: 'audit-log',\r\n name: 'Audit Log',\r\n role: 'audit-log',\r\n prompt: `You are the Audit Log agent. Your job is to analyze structured JSONL\r\nsession logs and produce actionable markdown reports.\r\n\r\nScope:\r\n- Parse session logs (iteration counts, tool calls, errors, usage)\r\n- Detect repeated failure patterns across multiple runs\r\n- Identify tool usage anomalies (over-use, failures, unexpected chains)\r\n- Track token consumption trends\r\n- Generate structured audit reports with severity ratings\r\n\r\nInput format you accept:\r\n{ \"task\": \"analyze | report | trends\", \"sessionPath\": \"<path>\", \"focus\": \"errors | tools | usage | all\" }\r\n\r\nOutput: Markdown audit report with sections:\r\n- ## Summary (totals, error rate)\r\n- ## Top Errors (count + context)\r\n- ## Tool Usage (table with calls, failures, avg duration)\r\n- ## Anomalies (pattern → severity)\r\n\r\nWorking rules:\r\n- Never fabricate numbers — read the actual logs first\r\n- Always include file:line references for errors\r\n- If sessionPath is missing, ask the director to provide it\r\n- Report confidence level: high (>90% accuracy), medium, low`,\r\n\r\n // No hardcoded budgets — the orchestrator (delegate tool or\r\n // spawn_subagent) decides per-task how much room a subagent gets.\r\n // A monorepo audit needs hours; a single-file lint check needs\r\n // seconds. Pinning a number here forces the orchestrator to fight\r\n // the role's default instead of just asking for what it needs.\r\n};\r\n\r\n/**\r\n * Bug Hunter Agent — systematic bug and code smell detection.\r\n * Use for: pre-refactoring health checks, code review, regression prevention.\r\n */\r\nexport const BUG_HUNTER_AGENT: SubagentConfig = {\r\n id: 'bug-hunter',\r\n name: 'Bug Hunter',\r\n role: 'bug-hunter',\r\n prompt: `You are the Bug Hunter agent. Your job is to systematically scan\r\nsource code for bugs, anti-patterns, and code smells using pattern matching\r\nand heuristics. Output a prioritized hit list with file:line references.\r\n\r\nScope:\r\n- Detect common bug patterns (uncaught errors, resource leaks, race conditions)\r\n- Identify anti-patterns (callback hell, God objects, circular deps)\r\n- Find TypeScript-specific issues (unsafe any, missing null checks, branded types)\r\n- Flag security-sensitive constructs (eval, innerHTML, hardcoded secrets)\r\n- Rank findings: critical > high > medium > low\r\n\r\nInput format you accept:\r\n{ \"task\": \"scan | hunt | check\", \"paths\": [\"src/**/*.ts\"], \"focus\": \"bugs | patterns | security | all\", \"severityThreshold\": \"medium\" }\r\n\r\nOutput: Markdown bug hunt report:\r\n- ## Critical (must fix first)\r\n- ## High (should fix)\r\n- ## Medium\r\n- ## Low (consider)\r\nEach entry: **[TYPE]** \\`file:line\\` — description + suggested fix\r\n\r\nBug pattern reference you know:\r\n| Pattern | Regex hint | Severity |\r\n|---------|------------|----------|\r\n| Uncaught promise | /\\.then\\\\(.*\\\\)/ without catch | high |\r\n| Event leak | on\\\\( without off/removeListener | high |\r\n| Hardcoded secret | [a-zA-Z0-9/_-]{20,} in config files | critical |\r\n| unsafe any | : any\\\\b or <any> | medium |\r\n| innerHTML | innerHTML\\\\s*= | high |\r\n\r\nWorking rules:\r\n- Never scan node_modules — it's noise\r\n- Always include file:line for every finding\r\n- If >30% of findings are false positives, note the confidence level\r\n- Ask director for clarification if paths are ambiguous`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * Refactor Planner Agent — structured refactoring planning.\r\n * Use for: large rewrites, technical debt reduction, architecture improvements.\r\n */\r\nexport const REFACTOR_PLANNER_AGENT: SubagentConfig = {\r\n id: 'refactor-planner',\r\n name: 'Refactor Planner',\r\n role: 'refactor-planner',\r\n prompt: `You are the Refactor Planner agent. Your job is to analyze code\r\nstructure and produce a concrete, phased refactoring plan with risk\r\nassessment, dependency ordering, and rollback strategy.\r\n\r\nScope:\r\n- Map module-level dependencies (import graph)\r\n- Identify coupling hotspots (high fan-in/out modules)\r\n- Assess refactoring risk by complexity and test coverage\r\n- Generate phased plans with checkpoint milestones\r\n- Produce diff-friendly task lists (one task = one concern)\r\n\r\nInput format you accept:\r\n{ \"task\": \"plan | assess | roadmap\", \"target\": \"src/core\", \"constraint\": \"no-breaking-changes | minimal-downtime | full-rewrite\", \"focus\": \"architecture | performance | maintainability\" }\r\n\r\nOutput: Markdown refactor plan:\r\n- ## Phase 1: Low Risk / High Payoff (do first)\r\n Table: | # | Task | Module | Risk | Est. Time |\r\n- ## Phase 2: Medium Risk\r\n- ## Phase 3: High Risk (requires full regression)\r\n- ## Dependency Graph (abbreviated ASCII)\r\n- ## Rollback Strategy\r\n- ## Exit Criteria (checkbox list)\r\n\r\nRisk scoring criteria:\r\n| Factor | Low | Medium | High |\r\n|--------|-----|--------|------|\r\n| Cyclomatic complexity | <10 | 10-20 | >20 |\r\n| Test coverage | >80% | 50-80% | <50% |\r\n| Fan-out (imports) | <5 | 5-15 | >15 |\r\n\r\nWorking rules:\r\n- Always include rollback strategy — every refactor can fail\r\n- Merge tasks that take <1h into a single phase\r\n- Respect team constraints (reviewer availability, parallelization)\r\n- Never plan without analyzing the actual code first`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * Security Scanner Agent — vulnerability and secret detection.\r\n * Use for: CI checks, pre-release audits, dependency vulnerability scanning.\r\n */\r\nexport const SECURITY_SCANNER_AGENT: SubagentConfig = {\r\n id: 'security-scanner',\r\n name: 'Security Scanner',\r\n role: 'security-scanner',\r\n prompt: `You are the Security Scanner agent. Your job is to scan code,\r\nconfigs, and dependencies for security issues from hardcoded secrets to\r\nsupply chain risks.\r\n\r\nScope:\r\n- Detect hardcoded secrets: API keys, tokens, passwords, private keys\r\n- Find injection vectors: eval, innerHTML, SQL concat, shell injection\r\n- Identify insecure patterns: weak crypto, hardcoded IVs, disabled TLS\r\n- Scan dependencies for known CVEs (via npm/pnpm audit)\r\n- Flag supply chain risks: postinstall hooks, unverified scripts, .npmrc\r\n\r\nInput format you accept:\r\n{ \"task\": \"scan | audit | secrets | dependencies\", \"paths\": [\"src\", \"config\"], \"depth\": \"quick | normal | deep\" }\r\n\r\nOutput: Markdown security report:\r\n- ## CRITICAL: Secrets Found (with code snippets)\r\n- ## HIGH: Injection Vectors\r\n- ## MEDIUM: Insecure Patterns\r\n- ## Dependency Issues (CVE list)\r\n- ## Summary table (severity → count)\r\n- ## Remediation Checklist (with checkboxes)\r\n\r\nSecret patterns you detect:\r\n| Pattern | Example | Severity |\r\n|---------|---------|----------|\r\n| AWS Access Key | AKIAIOSFODNN7EXAMPLE | critical |\r\n| AWS Secret Key | [a-zA-Z0-9/+=]{40} base64 | critical |\r\n| GitHub Token | ghp_[a-zA-Z0-9]{36} | critical |\r\n| Private Key PEM | -----BEGIN.*PRIVATE KEY----- | critical |\r\n| JWT | eyJ[a-zA-Z0-9_-]+ | high |\r\n\r\nInjection patterns:\r\n| Construct | Safe alternative |\r\n|-----------|-----------------|\r\n| eval(str) | new Function() or parse |\r\n| innerHTML = x | textContent or sanitize |\r\n| exec(\\`cmd \\${x}\\`) | execFile with args array |\r\n\r\nWorking rules:\r\n- Never scan node_modules — use npm audit instead\r\n- Always provide remediation steps, not just findings\r\n- Verify regex-based secrets before flagging (false positive risk)\r\n- When in doubt, flag as medium rather than ignoring potential issues`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/** All pre-built agents in a map for easy lookup by role. */\r\nexport const FLEET_ROSTER: Record<string, SubagentConfig> = {\r\n 'audit-log': AUDIT_LOG_AGENT,\r\n 'bug-hunter': BUG_HUNTER_AGENT,\r\n 'refactor-planner': REFACTOR_PLANNER_AGENT,\r\n 'security-scanner': SECURITY_SCANNER_AGENT,\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Default per-role budgets.\r\n// These are the budgets subagents get when the orchestrator doesn't pass\r\n// explicit overrides. They reflect realistic scope expectations for each role:\r\n// audit-log: moderate scan of session logs, ~5 min, 80 iterations\r\n// bug-hunter: targeted file scan, ~10 min, 120 iterations\r\n// refactor-planner: architecture analysis, ~8 min, 100 iterations\r\n// security-scanner: config + source scan, ~10 min, 120 iterations\r\n// ---------------------------------------------------------------------------\r\nexport interface FleetRosterBudget {\r\n timeoutMs?: number;\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n maxTokens?: number;\r\n maxCostUsd?: number;\r\n}\r\n\r\nexport const FLEET_ROSTER_BUDGETS: Record<string, FleetRosterBudget> = {\r\n 'audit-log': { timeoutMs: 5 * 60 * 1000, maxIterations: 80, maxToolCalls: 300 },\r\n 'bug-hunter': { timeoutMs: 10 * 60 * 1000, maxIterations: 120, maxToolCalls: 400 },\r\n 'refactor-planner': { timeoutMs: 8 * 60 * 1000, maxIterations: 100, maxToolCalls: 350 },\r\n 'security-scanner': { timeoutMs: 10 * 60 * 1000, maxIterations: 120, maxToolCalls: 400 },\r\n};\r\n\r\n/**\r\n * Apply roster budget to a config (only when the config has no explicit\r\n * budget fields set). This is called by the coordinator before dispatch.\r\n */\r\nexport function applyRosterBudget(cfg: SubagentConfig): SubagentConfig {\r\n const defaultBudget = FLEET_ROSTER_BUDGETS[cfg.role ?? ''];\r\n if (!defaultBudget) return cfg;\r\n return {\r\n ...cfg,\r\n timeoutMs: cfg.timeoutMs ?? defaultBudget.timeoutMs,\r\n maxIterations: cfg.maxIterations ?? defaultBudget.maxIterations,\r\n maxToolCalls: cfg.maxToolCalls ?? defaultBudget.maxToolCalls,\r\n maxTokens: cfg.maxTokens ?? defaultBudget.maxTokens,\r\n maxCostUsd: cfg.maxCostUsd ?? defaultBudget.maxCostUsd,\r\n };\r\n}\r\n\r\n/** Quick-access list for spawning all at once. */\r\nexport const ALL_FLEET_AGENTS = Object.values(FLEET_ROSTER);\r\n","import { randomUUID } from 'node:crypto';\r\nimport { EventEmitter } from 'node:events';\r\nimport type { AgentBridge, BridgeMessage } from '../types/agent-bridge.js';\r\nimport type {\r\n CoordinatorStatus,\r\n MultiAgentConfig,\r\n MultiAgentCoordinator,\r\n SpawnResult,\r\n SubagentConfig,\r\n SubagentContext,\r\n SubagentError,\r\n SubagentErrorKind,\r\n SubagentRunContext,\r\n SubagentRunner,\r\n TaskResult,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport { ProviderError } from '../types/provider.js';\r\nimport { BudgetExceededError, SubagentBudget } from './subagent-budget.js';\r\nimport { applyRosterBudget } from './fleet.js';\r\n\r\ntype SubagentStatus = 'running' | 'idle' | 'stopped' | 'error';\r\n\r\ninterface SubagentEntry {\r\n config: SubagentConfig;\r\n context: SubagentContext;\r\n status: SubagentStatus;\r\n currentTask?: string;\r\n abortController: AbortController;\r\n /** Lazily created on first dispatch — budget is per-task, not per-subagent. */\r\n activeBudget?: SubagentBudget;\r\n}\r\n\r\nexport interface MultiAgentCoordinatorOptions {\r\n /**\r\n * Callback that executes a task on behalf of a subagent. Required for\r\n * `assign()` to actually run anything — without it, tasks queue forever.\r\n * The coordinator provides per-subagent isolation (own budget, own signal,\r\n * own bridge) and enforces timeout + concurrency.\r\n */\r\n runner?: SubagentRunner;\r\n}\r\n\r\nexport class DefaultMultiAgentCoordinator extends EventEmitter implements MultiAgentCoordinator {\r\n readonly coordinatorId: string;\r\n readonly config: MultiAgentConfig;\r\n private runner?: SubagentRunner;\r\n\r\n private readonly subagents = new Map<string, SubagentEntry>();\r\n\r\n private pendingTasks: TaskSpec[] = [];\r\n private completedResults: TaskResult[] = [];\r\n private totalIterations = 0;\r\n private inFlight = 0;\r\n /**\r\n * Subagents currently being stopped. Set on entry to `stop()`, cleared\r\n * once `recordCompletion` lands the terminal TaskResult. Used by\r\n * `runDispatched` and `findIdleSubagent` to refuse mid-flight dispatch\r\n * to a subagent the caller has already asked to terminate — closes the\r\n * assign+terminate race where a fresh task could land on a worker that\r\n * was about to be killed.\r\n */\r\n private readonly terminating = new Set<string>();\r\n\r\n constructor(config: MultiAgentConfig, options: MultiAgentCoordinatorOptions = {}) {\r\n super();\r\n this.coordinatorId = config.coordinatorId;\r\n this.config = config;\r\n this.runner = options.runner;\r\n }\r\n\r\n /**\r\n * Replace the runner after construction. Used when the runner depends\r\n * on infrastructure (e.g. FleetBus) that isn't available until after\r\n * the coordinator's owning Director is built.\r\n */\r\n setRunner(runner: SubagentRunner): void {\r\n this.runner = runner;\r\n }\r\n\r\n async spawn(subagent: SubagentConfig): Promise<SpawnResult> {\r\n const id = subagent.id || randomUUID();\r\n // Duplicate-id guard. Previously a second spawn({id}) with the\r\n // same id silently overwrote the existing entry — orphaning the\r\n // first subagent's AbortController, Context, and any in-flight\r\n // task referencing it. Two spawns with the same id are almost\r\n // always a bug at the caller; refuse and let them surface it.\r\n if (this.subagents.has(id)) {\r\n throw new Error(`Subagent id \"${id}\" already exists — refusing to overwrite`);\r\n }\r\n const context: SubagentContext = {\r\n subagentId: id,\r\n tasks: [],\r\n // Wired later by the caller via setSubagentBridge() once the\r\n // bidirectional bridge is created. Readers must null-check / use\r\n // hasParentBridge() — the type now reflects this.\r\n parentBridge: null,\r\n doneCondition: this.config.doneCondition,\r\n maxConcurrent: this.config.maxConcurrent ?? 4,\r\n };\r\n\r\n this.subagents.set(id, {\r\n config: { ...subagent, id },\r\n context,\r\n status: 'idle',\r\n abortController: new AbortController(),\r\n });\r\n\r\n this.emit('subagent.started', { subagent: { ...subagent, id } });\r\n\r\n return { subagentId: id, agentId: id };\r\n }\r\n\r\n async assign(task: TaskSpec): Promise<void> {\r\n this.pendingTasks.push(task);\r\n this.tryDispatchNext();\r\n }\r\n\r\n async delegate(to: string, msg: BridgeMessage): Promise<void> {\r\n const subagent = this.subagents.get(to);\r\n if (!subagent) throw new Error(`Subagent \"${to}\" not found`);\r\n if (!subagent.context.parentBridge) {\r\n throw new Error(`Subagent \"${to}\" has no parentBridge — call setSubagentBridge() first`);\r\n }\r\n await subagent.context.parentBridge.send(msg);\r\n }\r\n\r\n /**\r\n * Wire up the communication bridge for a subagent. Call after spawn() once\r\n * the caller has created the bidirectional connection.\r\n */\r\n setSubagentBridge(subagentId: string, bridge: AgentBridge): void {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) throw new Error(`Subagent \"${subagentId}\" not found`);\r\n subagent.context.parentBridge = bridge;\r\n }\r\n\r\n async stop(subagentId: string): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n\r\n // Mark terminating BEFORE the abort so a synchronous tryDispatchNext\r\n // observation in another callback path sees the intent and skips\r\n // this subagent. Cleared by recordCompletion once the runner's\r\n // catch block lands the terminal TaskResult.\r\n this.terminating.add(subagentId);\r\n\r\n // Abort any in-flight run, then sever the bridge so further messages fail\r\n // fast instead of silently queueing on a dead subagent.\r\n subagent.abortController.abort();\r\n subagent.status = 'stopped';\r\n subagent.currentTask = undefined;\r\n subagent.context.parentBridge = null;\r\n\r\n this.emit('subagent.stopped', { subagentId, reason: 'stopped by coordinator' });\r\n }\r\n\r\n async stopAll(): Promise<void> {\r\n // Clear the queue FIRST so no new tasks land on subagents while\r\n // we're tearing them down. Each dropped task gets a synthetic\r\n // `aborted_by_parent` completion so any caller awaiting it (e.g.\r\n // delegate tool's awaitTasks) resolves instead of hanging.\r\n //\r\n // Pending tasks never reached `inFlight`, so we cannot route them\r\n // through `recordCompletion` — its underflow guard would short-\r\n // circuit on the second pending task and emit a warning instead\r\n // of the completion event. The shared helper inline-emits.\r\n this.drainPendingAsAborted('Coordinator stopAll() drained the pending queue');\r\n // allSettled so one failure doesn't leave other subagents un-stopped.\r\n await Promise.allSettled([...this.subagents.keys()].map((id) => this.stop(id)));\r\n }\r\n\r\n getStatus(): CoordinatorStatus {\r\n return {\r\n coordinatorId: this.coordinatorId,\r\n subagents: Array.from(this.subagents.entries()).map(([id, s]) => ({\r\n id,\r\n name: s.config.name,\r\n status: s.status,\r\n currentTask: s.currentTask,\r\n })),\r\n pendingTasks: this.pendingTasks.length,\r\n completedTasks: this.completedResults.length,\r\n totalIterations: this.totalIterations,\r\n done: this.isDone(),\r\n };\r\n }\r\n\r\n /** Expose snapshot of completed results — useful for callers awaiting all done. */\r\n results(): readonly TaskResult[] {\r\n return this.completedResults;\r\n }\r\n\r\n /**\r\n * Manual completion — for callers that drive subagents without a runner\r\n * (e.g. external orchestrators). When a runner is configured the coordinator\r\n * calls this itself.\r\n */\r\n completeTask(result: TaskResult): void {\r\n this.recordCompletion(result);\r\n }\r\n\r\n // --- internal dispatching ---------------------------------------------\r\n\r\n private tryDispatchNext(): void {\r\n while (this.canDispatch()) {\r\n const dispatchable = this.takeNextDispatchableTask();\r\n if (!dispatchable) {\r\n // No idle worker right now. If every spawned subagent is\r\n // stopped or mid-termination, the pending queue is dead —\r\n // a pending task can never start, so synthetic-complete it\r\n // as `aborted_by_parent`. Without this, an `assign()` after\r\n // `stop()` would hang forever waiting for `task.completed`.\r\n // We DO NOT drain when subagents are busy (status='running'):\r\n // those will free up and accept the work normally.\r\n if (this.pendingTasks.length > 0 && !this.hasLiveSubagent()) {\r\n this.drainPendingAsAborted(\r\n 'No live subagent available — all stopped or mid-termination',\r\n );\r\n }\r\n return;\r\n }\r\n const { subagentId, task } = dispatchable;\r\n // Attach a catch so a synchronous throw inside runDispatched (rare —\r\n // e.g. provider misconfiguration before the first await) becomes a\r\n // visible failed task instead of an unhandled rejection that leaves\r\n // `inFlight` permanently elevated.\r\n this.runDispatched(subagentId, task).catch((err) => {\r\n this.recordCompletion({\r\n subagentId,\r\n taskId: task.id,\r\n status: 'failed',\r\n error: classifySubagentError(err),\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n });\r\n });\r\n }\r\n }\r\n\r\n private canDispatch(): boolean {\r\n const max = this.config.maxConcurrent ?? 4;\r\n return this.inFlight < max && this.pendingTasks.length > 0;\r\n }\r\n\r\n private takeNextDispatchableTask(): { subagentId: string; task: TaskSpec } | null {\r\n for (let i = 0; i < this.pendingTasks.length; i++) {\r\n const task = this.pendingTasks[i]!;\r\n const subagentId = task.subagentId\r\n ? this.isIdleSubagent(task.subagentId)\r\n ? task.subagentId\r\n : null\r\n : this.findIdleSubagent();\r\n if (!subagentId) continue;\r\n this.pendingTasks.splice(i, 1);\r\n return { subagentId, task };\r\n }\r\n return null;\r\n }\r\n\r\n private findIdleSubagent(): string | null {\r\n for (const [id, s] of this.subagents) {\r\n // Skip subagents that are mid-termination — `stop()` set the\r\n // `terminating` flag and aborted the controller, but the\r\n // status mutation happens synchronously after; checking both\r\n // is belt-and-suspenders against any race where status is\r\n // transiently still 'idle' while termination is in flight.\r\n if (s.status === 'idle' && !this.terminating.has(id)) return id;\r\n }\r\n return null;\r\n }\r\n\r\n private isIdleSubagent(id: string): boolean {\r\n const subagent = this.subagents.get(id);\r\n return !!subagent && subagent.status === 'idle' && !this.terminating.has(id);\r\n }\r\n\r\n /**\r\n * Returns true iff at least one spawned subagent could still\r\n * process a task. A \"live\" subagent is one that is not stopped\r\n * AND not mid-termination — `running` workers count because they\r\n * will eventually finish and become idle.\r\n *\r\n * When no subagent has ever been spawned, returns `true` so a\r\n * pre-spawn `assign()` simply queues (legacy behaviour). The\r\n * dead-end detection only fires after `stop()` has retired every\r\n * spawned worker.\r\n *\r\n * Used by `tryDispatchNext` to detect a dead-end pending queue.\r\n */\r\n private hasLiveSubagent(): boolean {\r\n if (this.subagents.size === 0) return true;\r\n for (const [id, s] of this.subagents) {\r\n if (s.status !== 'stopped' && !this.terminating.has(id)) return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Drain every pending task with a synthetic `aborted_by_parent`\r\n * completion event. Same shape as the `stopAll()` drain — we go\r\n * around `recordCompletion` because pending tasks were never\r\n * counted in `inFlight` and routing them through would trip the\r\n * underflow guard on every task after the first.\r\n */\r\n private drainPendingAsAborted(message: string): void {\r\n const dropped = this.pendingTasks.splice(0, this.pendingTasks.length);\r\n for (const t of dropped) {\r\n const synthetic: TaskResult = {\r\n subagentId: t.subagentId ?? 'unassigned',\r\n taskId: t.id,\r\n status: 'stopped',\r\n error: {\r\n kind: 'aborted_by_parent',\r\n message,\r\n retryable: false,\r\n },\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n };\r\n this.completedResults.push(synthetic);\r\n this.emit('task.completed', { task: t, result: synthetic });\r\n }\r\n }\r\n\r\n private async runDispatched(subagentId: string, task: TaskSpec): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n // Final race guard: if `stop(subagentId)` ran between dispatch\r\n // and us arriving here, refuse to start the task and surface it\r\n // as `aborted_by_parent` so any caller awaiting the task id\r\n // unblocks. Without this, the task would be marked 'running',\r\n // collide with the just-completed 'stopped' state, and leak\r\n // inFlight by 1 because no recordCompletion path covers it.\r\n if (this.terminating.has(subagentId) || subagent.status === 'stopped') {\r\n this.recordCompletion({\r\n subagentId,\r\n taskId: task.id,\r\n status: 'stopped',\r\n error: {\r\n kind: 'aborted_by_parent',\r\n message: 'Subagent was terminated before task could start',\r\n retryable: false,\r\n },\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n });\r\n return;\r\n }\r\n\r\n subagent.status = 'running';\r\n subagent.currentTask = task.id;\r\n task.subagentId = subagentId;\r\n subagent.context.tasks.push(task);\r\n\r\n this.emit('task.assigned', { task, subagentId });\r\n\r\n // Budget combines coordinator defaults with per-subagent and per-task overrides.\r\n // Precedence: task > subagent > roster default > coordinator default.\r\n const configWithRosterDefaults = applyRosterBudget(subagent.config);\r\n const budget = new SubagentBudget({\r\n maxIterations:\r\n configWithRosterDefaults.maxIterations ?? this.config.defaultBudget?.maxIterations,\r\n maxToolCalls:\r\n task.maxToolCalls ??\r\n configWithRosterDefaults.maxToolCalls ??\r\n this.config.defaultBudget?.maxToolCalls,\r\n maxTokens:\r\n configWithRosterDefaults.maxTokens ?? this.config.defaultBudget?.maxTokens,\r\n maxCostUsd:\r\n configWithRosterDefaults.maxCostUsd ?? this.config.defaultBudget?.maxCostUsd,\r\n timeoutMs:\r\n task.timeoutMs ?? configWithRosterDefaults.timeoutMs ?? this.config.defaultBudget?.timeoutMs,\r\n });\r\n subagent.activeBudget = budget;\r\n\r\n if (!this.runner) {\r\n // No runner wired — caller drives execution via completeTask(). Status\r\n // reverts when the caller reports. We intentionally don't bump\r\n // `inFlight` here: `completeTask` → `recordCompletion` would then\r\n // decrement an inFlight that runDispatched never incremented, masking\r\n // the \"no runner\" state. With this guard, `isDone()`'s all_tasks_done\r\n // check still settles correctly once the caller reports.\r\n return;\r\n }\r\n\r\n // Only count inFlight when we actually own the execution lifecycle.\r\n this.inFlight++;\r\n\r\n const startTime = Date.now();\r\n const runCtx: SubagentRunContext = {\r\n subagentId,\r\n config: subagent.config,\r\n budget,\r\n signal: subagent.abortController.signal,\r\n bridge: subagent.context.parentBridge || null,\r\n };\r\n\r\n let result: TaskResult;\r\n\r\n budget.start();\r\n try {\r\n const outcome = await this.executeWithTimeout(this.runner, task, runCtx, budget);\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status: 'success',\r\n result: outcome.result,\r\n iterations: outcome.iterations,\r\n toolCalls: outcome.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n } catch (err) {\r\n // Order matters: a timeout calls abort() to signal cooperative runners,\r\n // which also flips `signal.aborted=true`. Inspect the error first so we\r\n // surface 'timeout' rather than masking it as 'stopped'.\r\n const status: TaskResult['status'] =\r\n err instanceof BudgetExceededError && err.kind === 'timeout'\r\n ? 'timeout'\r\n : subagent.abortController.signal.aborted\r\n ? 'stopped'\r\n : 'failed';\r\n const usage = budget.usage();\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status,\r\n error: classifySubagentError(err, {\r\n parentAborted: subagent.abortController.signal.aborted,\r\n }),\r\n iterations: usage.iterations,\r\n toolCalls: usage.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n }\r\n\r\n this.recordCompletion(result);\r\n }\r\n\r\n private async executeWithTimeout(\r\n runner: SubagentRunner,\r\n task: TaskSpec,\r\n ctx: SubagentRunContext,\r\n budget: SubagentBudget,\r\n ) {\r\n const timeoutMs = budget.limits.timeoutMs;\r\n if (timeoutMs === undefined) return runner(task, ctx);\r\n\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n timer = setTimeout(() => {\r\n // Abort the subagent's signal so cooperative runners can clean up.\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('timeout', timeoutMs, Date.now()));\r\n }, timeoutMs);\r\n });\r\n\r\n try {\r\n return await Promise.race([runner(task, ctx), timeoutPromise]);\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n }\r\n\r\n private recordCompletion(result: TaskResult): void {\r\n this.completedResults.push(result);\r\n this.totalIterations += result.iterations;\r\n if (this.inFlight > 0) {\r\n this.inFlight--;\r\n } else if (this.runner) {\r\n // Runner-driven path completed without an outstanding inFlight slot —\r\n // shouldn't happen unless completeTask was called externally.\r\n this.emit('warning', {\r\n type: 'inFlight_underflow',\r\n taskId: result.taskId,\r\n subagentId: result.subagentId,\r\n });\r\n return;\r\n }\r\n\r\n const subagent = this.subagents.get(result.subagentId);\r\n if (subagent && subagent.status !== 'stopped') {\r\n const failed = result.status === 'failed' || result.status === 'timeout';\r\n // Synchronously reset the worker to idle after either a clean\r\n // finish or a transient failure. The previous code parked the\r\n // subagent in 'error' and used a `queueMicrotask` to flip it\r\n // back to 'idle' — that opened a window where `assign()` +\r\n // `tryDispatchNext` could race the microtask, leaving the\r\n // worker stuck in 'running' state while actually idle. By\r\n // resetting now, no async gap can leak the state machine.\r\n subagent.status = 'idle';\r\n void failed; // kept for future telemetry hooks\r\n subagent.currentTask = undefined;\r\n // If the run aborted (timeout or explicit stop), the subagent's\r\n // signal is now permanently aborted — recycling the controller lets\r\n // the next dispatched task start with a fresh cancellation scope.\r\n if (subagent.abortController.signal.aborted) {\r\n subagent.abortController = new AbortController();\r\n }\r\n }\r\n // Clear the terminating flag now that the worker has a terminal\r\n // TaskResult on record. Subsequent stop() calls re-add it; new\r\n // assign() calls can flow normally.\r\n this.terminating.delete(result.subagentId);\r\n\r\n this.emit('task.completed', {\r\n task: subagent?.context.tasks.find((t) => t.id === result.taskId) ?? { id: result.taskId },\r\n result,\r\n });\r\n\r\n this.tryDispatchNext();\r\n\r\n if (this.isDone()) {\r\n this.emit('done', {\r\n results: this.completedResults,\r\n totalIterations: this.totalIterations,\r\n });\r\n }\r\n }\r\n\r\n private isDone(): boolean {\r\n if (this.config.doneCondition.type === 'all_tasks_done') {\r\n return this.pendingTasks.length === 0 && this.inFlight === 0;\r\n }\r\n if (\r\n this.config.doneCondition.maxIterations !== undefined &&\r\n this.totalIterations >= this.config.doneCondition.maxIterations\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Map any raw exception thrown out of a subagent's runner into a\r\n * structured `SubagentError`. This is the single point where the\r\n * coordinator decides \"what kind of failure was that\" — so callers\r\n * (delegate tool output, /agents UI, retry policies) branch on\r\n * `kind` instead of substring-matching `error.message`.\r\n *\r\n * The classification order matters:\r\n * 1. Provider errors first (their `status` + `retryable` are\r\n * already structured, just translate to our enum).\r\n * 2. Budget errors next (BudgetExceededError carries a discrete\r\n * `kind` we can lift directly).\r\n * 3. Parent-abort if the subagent's signal was aborted and we\r\n * didn't recognize the error otherwise — distinguishes user\r\n * Ctrl+C from a tool throwing.\r\n * 4. Substring sniffing for stable error markers (\"agent\r\n * aborted\" from agent-subagent-runner, \"Bridge transport\"\r\n * from agent-bridge).\r\n * 5. Fallback to `unknown` so callers know we couldn't classify.\r\n *\r\n * The `cause` field is always populated when `err` is an Error so\r\n * diagnostics survive even when `kind === 'unknown'` — no info is\r\n * dropped, the classifier just refused to commit.\r\n *\r\n * Exported because tests and CLI surfaces want to assert on the\r\n * classification without instantiating a coordinator.\r\n */\r\nexport function classifySubagentError(\r\n err: unknown,\r\n hints: { parentAborted?: boolean } = {},\r\n): SubagentError {\r\n const cause = err instanceof Error\r\n ? { name: err.name, message: err.message, stack: err.stack }\r\n : undefined;\r\n\r\n if (err instanceof ProviderError) {\r\n const baseMessage = err.describe();\r\n return providerErrorToSubagentError(err, baseMessage, cause);\r\n }\r\n\r\n const baseMessage = err instanceof Error ? err.message : String(err);\r\n\r\n if (err instanceof BudgetExceededError) {\r\n const map: Record<BudgetExceededError['kind'], SubagentErrorKind> = {\r\n iterations: 'budget_iterations',\r\n tool_calls: 'budget_tool_calls',\r\n tokens: 'budget_tokens',\r\n cost: 'budget_cost',\r\n timeout: 'budget_timeout',\r\n };\r\n return {\r\n kind: map[err.kind],\r\n message: baseMessage,\r\n // Budgets are user-configured ceilings, not transient failures —\r\n // retrying with the same budget will hit the same ceiling. The\r\n // orchestrator must raise the budget or narrow the task first.\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n\r\n // Distinguish parent-aborted from real failures BEFORE substring\r\n // sniffing — if the parent signal is aborted, the most common\r\n // exception is \"agent aborted\" thrown by agent-subagent-runner.\r\n if (hints.parentAborted) {\r\n return {\r\n kind: 'aborted_by_parent',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n\r\n // Stable markers — these strings live in our own code and are\r\n // checked here intentionally so callers can react without\r\n // exception-type imports.\r\n const lower = baseMessage.toLowerCase();\r\n if (/agent aborted$/i.test(baseMessage)) {\r\n return {\r\n kind: 'aborted_by_parent',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n if (/agent exhausted iteration limit$/i.test(baseMessage)) {\r\n return { kind: 'budget_iterations', message: baseMessage, retryable: false, cause };\r\n }\r\n if (/empty response$/i.test(baseMessage)) {\r\n return { kind: 'empty_response', message: baseMessage, retryable: false, cause };\r\n }\r\n // The runner throws `Error('tool failed: <name>')` when an executed tool\r\n // returned `ok:false` and the agent ultimately ended without recovering\r\n // (or aborted). Surface as `tool_failed` so callers don't conflate a\r\n // failed tool with a thrown tool — both are useful but mean different\r\n // things at the LLM layer.\r\n if (/^tool failed: /i.test(baseMessage)) {\r\n return { kind: 'tool_failed', message: baseMessage, retryable: false, cause };\r\n }\r\n if (lower.includes('bridge transport') || /bridge.*(closed|disconnect)/i.test(baseMessage)) {\r\n return { kind: 'bridge_failed', message: baseMessage, retryable: false, cause };\r\n }\r\n if (/context length|max.*tokens?.*exceeded|prompt is too long/i.test(baseMessage)) {\r\n return { kind: 'context_overflow', message: baseMessage, retryable: false, cause };\r\n }\r\n\r\n // Final fallback — preserve cause so diagnostics aren't lost.\r\n return {\r\n kind: 'unknown',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n}\r\n\r\nfunction providerErrorToSubagentError(\r\n err: ProviderError,\r\n message: string,\r\n cause: SubagentError['cause'],\r\n): SubagentError {\r\n const status = err.status;\r\n // Read suggested retry-after from the provider body when present so\r\n // the orchestrator doesn't have to invent a backoff. Most providers\r\n // include retry-after as a header / body field which our provider\r\n // layer normalises into `body.message` — we cannot trust a numeric\r\n // field exists, so we leave backoffMs unset when unknown.\r\n if (status === 429 || err.body?.type === 'rate_limit_error') {\r\n return {\r\n kind: 'provider_rate_limit',\r\n message,\r\n retryable: true,\r\n // Conservative default: 5s. Provider-specific code can override\r\n // by emitting an error whose body carries an explicit hint.\r\n backoffMs: 5_000,\r\n cause,\r\n };\r\n }\r\n if (status === 401 || status === 403 || err.body?.type === 'authentication_error') {\r\n return { kind: 'provider_auth', message, retryable: false, cause };\r\n }\r\n if (status === 408 || status === 0) {\r\n return { kind: 'provider_timeout', message, retryable: true, cause };\r\n }\r\n if (status >= 500 && status < 600) {\r\n return {\r\n kind: 'provider_5xx',\r\n message,\r\n retryable: true,\r\n backoffMs: 3_000,\r\n cause,\r\n };\r\n }\r\n // Other provider errors (400 invalid request, 404 not found, etc.)\r\n // are not retryable as-is and don't have a dedicated kind — surface\r\n // as 'unknown' so the orchestrator treats them as terminal.\r\n return { kind: 'unknown', message, retryable: err.retryable, cause };\r\n}\r\n","import { randomUUID } from 'node:crypto';\r\nimport type { SubagentConfig, TaskSpec } from '../types/multi-agent.js';\r\nimport type { JSONSchema, Tool } from '../types/tool.js';\r\nimport { type Director, FleetSpawnBudgetError, FleetCostCapError } from './director.js';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Director-facing tool factories.\r\n//\r\n// Each tool's input schema is intentionally minimal — the director model\r\n// reads the descriptions and gets clean structured shapes. We avoid deep\r\n// nested schemas because they confuse smaller models.\r\n\r\nexport function makeSpawnTool(director: Director, roster?: Record<string, SubagentConfig>): Tool {\r\n const inputSchema: JSONSchema = {\r\n type: 'object',\r\n properties: {\r\n role: { type: 'string', description: 'Roster role id (preferred). When set, the spawn uses the matching config from the roster and ignores other fields.' },\r\n name: { type: 'string', description: 'Display name for the subagent. Required when not using roster.' },\r\n provider: { type: 'string', description: 'Provider id (e.g. \"anthropic\", \"openai\"). Defaults to the leader provider when omitted.' },\r\n model: { type: 'string', description: 'Model id within the provider. Defaults to the leader model when omitted.' },\r\n systemPromptOverride: { type: 'string', description: 'Extra prompt text appended after the role-base prompt.' },\r\n maxIterations: { type: 'number' },\r\n maxToolCalls: { type: 'number' },\r\n maxCostUsd: { type: 'number' },\r\n },\r\n required: [],\r\n };\r\n return {\r\n name: 'spawn_subagent',\r\n description: 'Create a new subagent under this director. Returns the subagent id.',\r\n usageHint: 'Either pass `role` (matches the roster) OR pass `name` + optional `provider`/`model`. Returns `{ subagentId }`.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema,\r\n async execute(input: unknown) {\r\n const i = (input ?? {}) as Record<string, unknown>;\r\n const role = typeof i.role === 'string' ? i.role : undefined;\r\n const base: SubagentConfig | undefined = role && roster ? roster[role] : undefined;\r\n if (role && !base) {\r\n return { error: `unknown role \"${role}\". roster has: ${roster ? Object.keys(roster).join(', ') : '(empty)'}` };\r\n }\r\n const cfg: SubagentConfig = base\r\n ? instantiateRosterConfig(role!, base)\r\n : { name: (i.name as string) ?? 'subagent' };\r\n if (typeof i.name === 'string') cfg.name = i.name;\r\n if (typeof i.provider === 'string') cfg.provider = i.provider;\r\n if (typeof i.model === 'string') cfg.model = i.model;\r\n if (typeof i.systemPromptOverride === 'string') cfg.systemPromptOverride = i.systemPromptOverride;\r\n if (typeof i.maxIterations === 'number') cfg.maxIterations = i.maxIterations;\r\n if (typeof i.maxToolCalls === 'number') cfg.maxToolCalls = i.maxToolCalls;\r\n if (typeof i.maxCostUsd === 'number') cfg.maxCostUsd = i.maxCostUsd;\r\n try {\r\n const subagentId = await director.spawn(cfg);\r\n return { subagentId, provider: cfg.provider, model: cfg.model, name: cfg.name };\r\n } catch (err) {\r\n if (err instanceof FleetSpawnBudgetError) {\r\n return { error: err.message, kind: err.kind, limit: err.limit, observed: err.observed };\r\n }\r\n if (err instanceof FleetCostCapError) {\r\n return { error: err.message, kind: err.kind, limit: err.limit, observed: err.observed };\r\n }\r\n return { error: err instanceof Error ? err.message : String(err) };\r\n }\r\n },\r\n };\r\n}\r\n\r\nfunction instantiateRosterConfig(role: string, base: SubagentConfig): SubagentConfig {\r\n return {\r\n ...base,\r\n // Roster entries are templates. A director may spawn several\r\n // workers with the same role, so never reuse the template id.\r\n id: `${role}-${randomUUID().slice(0, 8)}`,\r\n };\r\n}\r\n\r\nexport function makeAssignTool(director: Director): Tool {\r\n const inputSchema: JSONSchema = {\r\n type: 'object',\r\n properties: {\r\n subagentId: { type: 'string', description: 'Target subagent id. Required.' },\r\n description: { type: 'string', description: 'The task in natural language — what you want this subagent to do.' },\r\n maxToolCalls: { type: 'number', description: 'Optional per-task tool-call budget override.' },\r\n timeoutMs: { type: 'number', description: 'Optional per-task timeout in ms.' },\r\n },\r\n required: ['subagentId', 'description'],\r\n };\r\n return {\r\n name: 'assign_task',\r\n description: 'Hand a task to a previously spawned subagent. Returns the task id.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema,\r\n async execute(input: unknown) {\r\n const i = input as { subagentId: string; description: string; maxToolCalls?: number; timeoutMs?: number };\r\n const task: TaskSpec = { id: randomUUID(), description: i.description, subagentId: i.subagentId, maxToolCalls: i.maxToolCalls, timeoutMs: i.timeoutMs };\r\n const taskId = await director.assign(task);\r\n return { taskId, subagentId: i.subagentId };\r\n },\r\n };\r\n}\r\n\r\nexport function makeAwaitTasksTool(director: Director): Tool {\r\n return {\r\n name: 'await_tasks',\r\n description: 'Block until every named task completes. Returns the array of TaskResult.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: { type: 'object', properties: { taskIds: { type: 'array', items: { type: 'string' }, description: 'One or more task ids returned by `assign_task`.' } }, required: ['taskIds'] },\r\n async execute(input: unknown) {\r\n const i = input as { taskIds: string[] };\r\n const results = await director.awaitTasks(i.taskIds);\r\n return { results };\r\n },\r\n };\r\n}\r\n\r\nexport function makeAskTool(director: Director): Tool {\r\n return {\r\n name: 'ask_subagent',\r\n description: 'Synchronously ask a subagent a question. Blocks until the subagent replies via the bridge.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n subagentId: { type: 'string', description: 'Subagent to ask. Must be a previously spawned id.' },\r\n question: { type: 'string', description: 'The question or instruction.' },\r\n timeoutMs: { type: 'number', description: 'Optional timeout in ms (default 30s).' },\r\n },\r\n required: ['subagentId', 'question'],\r\n },\r\n async execute(input: unknown) {\r\n const i = input as { subagentId: string; question: string; timeoutMs?: number };\r\n try {\r\n const answer = await director.ask(i.subagentId, { question: i.question }, i.timeoutMs);\r\n return { ok: true, answer };\r\n } catch (err) {\r\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\r\n }\r\n },\r\n };\r\n}\r\n\r\nexport function makeRollUpTool(director: Director): Tool {\r\n return {\r\n name: 'roll_up',\r\n description: \"Aggregate completed task results into a single formatted summary.\",\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n taskIds: { type: 'array', items: { type: 'string' }, description: 'Completed task ids to aggregate.' },\r\n style: { type: 'string', enum: ['markdown', 'json'], description: 'Output flavor — markdown (default) or json.' },\r\n },\r\n required: ['taskIds'],\r\n },\r\n async execute(input: unknown) {\r\n const i = input as { taskIds: string[]; style?: 'markdown' | 'json' };\r\n const summary = director.rollUp(i.taskIds, i.style ?? 'markdown');\r\n return { summary, count: i.taskIds.length };\r\n },\r\n };\r\n}\r\n\r\nexport function makeTerminateTool(director: Director): Tool {\r\n return {\r\n name: 'terminate_subagent',\r\n description: 'Forcibly abort a subagent.',\r\n permission: 'auto',\r\n mutating: true,\r\n inputSchema: { type: 'object', properties: { subagentId: { type: 'string', description: 'Subagent to abort.' } }, required: ['subagentId'] },\r\n async execute(input: unknown) {\r\n const i = input as { subagentId: string };\r\n await director.terminate(i.subagentId);\r\n return { ok: true };\r\n },\r\n };\r\n}\r\n\r\nexport function makeFleetStatusTool(director: Director): Tool {\r\n return {\r\n name: 'fleet_status',\r\n description: \"Snapshot of the fleet — every subagent's current status, pending vs. completed task counts.\",\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: { type: 'object', properties: {}, required: [] },\r\n async execute() { return director.status(); },\r\n };\r\n}\r\n\r\nexport function makeFleetUsageTool(director: Director): Tool {\r\n return {\r\n name: 'fleet_usage',\r\n description: 'Token + cost breakdown across the fleet, per-subagent and totals.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: { type: 'object', properties: {}, required: [] },\r\n async execute() { return director.snapshot(); },\r\n };\r\n}\r\n\r\n/**\r\n * Read a subagent's JSONL transcript and return the last assistant text,\r\n * stop reason, and tool-use count. The director can call this on a\r\n * running or timed-out subagent to see what it actually produced without\r\n * having to wait for natural completion.\r\n */\r\nexport function makeFleetSessionTool(director: Director): Tool {\r\n return {\r\n name: 'fleet_session',\r\n description:\r\n 'Read a subagent\\'s JSONL transcript and extract its last assistant text, stop reason, and tool-use count. Use this to see what a running or timed-out subagent actually produced.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n subagentId: { type: 'string', description: 'Subagent id to read the transcript of.' },\r\n /** Number of trailing lines to return (last N JSONL lines). Default: all. */\r\n tail: { type: 'number', description: 'Number of trailing JSONL lines to return. Omit for the full transcript.' },\r\n },\r\n required: ['subagentId'],\r\n },\r\n async execute(input: unknown) {\r\n const i = input as { subagentId: string; tail?: number };\r\n const result = await director.readSession(i.subagentId, i.tail);\r\n if (!result) {\r\n return {\r\n error: `fleet_session: transcript unavailable for \"${i.subagentId}\". Is sessionsRoot configured?`,\r\n };\r\n }\r\n return result;\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Health snapshot per subagent — budget pressure (how close to limits),\r\n * last activity timestamp, and current status. Lets the director make\r\n * smarter routing decisions without having to call fleet_usage + fleet_status separately.\r\n */\r\nexport function makeFleetHealthTool(director: Director): Tool {\r\n return {\r\n name: 'fleet_health',\r\n description:\r\n 'Per-subagent health report: budget pressure (pct of limits consumed), last activity timestamp, and current status. Use to decide whether to assign more work to a subagent or spawn a fresh one.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: { type: 'object', properties: {}, required: [] },\r\n async execute() {\r\n const status = director.status();\r\n const snapshot = director.snapshot();\r\n const subagents = status.subagents ?? [];\r\n const perSubagent = snapshot.perSubagent ?? {};\r\n return {\r\n subagents: subagents.map((s) => {\r\n const usage = perSubagent[s.id];\r\n return {\r\n id: s.id,\r\n status: s.status,\r\n lastEventAt: usage?.lastEventAt,\r\n // Budget pressure: fraction of each limit consumed if we have it.\r\n // BudgetWarning events carry used/limit ratios; surface them here.\r\n budgetPressure: {\r\n iterations: usage?.iterations,\r\n toolCalls: usage?.toolCalls,\r\n costUsd: usage?.cost,\r\n },\r\n };\r\n }),\r\n };\r\n },\r\n };\r\n}\r\n","import { randomUUID } from 'node:crypto';\r\nimport * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { DirectorStateCheckpoint, type DirectorStateSnapshot } from '../storage/director-state.js';\r\nimport type { BridgeMessage } from '../types/agent-bridge.js';\r\nimport type {\r\n CoordinatorStatus,\r\n MultiAgentConfig,\r\n SubagentConfig,\r\n SubagentRunner,\r\n TaskResult,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport type { SessionWriter } from '../types/session.js';\r\nimport type { JSONSchema, Tool } from '../types/tool.js';\r\nimport { InMemoryAgentBridge } from './agent-bridge.js';\r\nimport { ICoordinator } from './icoordinator.js';\r\nimport {\r\n DEFAULT_DIRECTOR_PREAMBLE,\r\n DEFAULT_SUBAGENT_BASELINE,\r\n composeDirectorPrompt,\r\n composeSubagentPrompt,\r\n rosterSummaryFromConfigs,\r\n} from './director-prompts.js';\r\nimport { FleetBus, type FleetUsage, FleetUsageAggregator } from './fleet-bus.js';\r\nimport { FleetManager } from './fleet-manager.js';\r\nimport { InMemoryBridgeTransport } from './in-memory-transport.js';\r\nimport { DefaultMultiAgentCoordinator } from './multi-agent-coordinator.js';\r\nimport { makeAskTool, makeAssignTool, makeAwaitTasksTool, makeFleetHealthTool, makeFleetSessionTool, makeFleetStatusTool, makeFleetUsageTool, makeRollUpTool, makeSpawnTool, makeTerminateTool } from './director-tools.js';\r\n\r\n/**\r\n * Director — high-level orchestrator that owns a `MultiAgentCoordinator`,\r\n * a `FleetBus`, and a `FleetUsageAggregator`. Exposes a small imperative\r\n * API (`spawn`, `assign`, `awaitTasks`, `terminate`, `status`, `usage`)\r\n * that's easy to test, and a `tools()` factory that wraps the same API\r\n * as agent-callable `Tool`s so an LLM can drive the orchestration.\r\n *\r\n * This class is intentionally *not* an `Agent`. It's a coordinator +\r\n * observability surface. To make it LLM-driven, construct an Agent\r\n * with `director.tools()` registered. That keeps the construction\r\n * symmetric with how other agents are built and avoids smuggling a\r\n * heavy LLM dependency into core just for the director path.\r\n */\r\nexport interface DirectorOptions {\r\n config: MultiAgentConfig;\r\n runner?: SubagentRunner;\r\n /**\r\n * When set, the director writes a `fleet.json` manifest to this path\r\n * recording every spawned subagent (id, provider, model, role, task\r\n * ids). Used by `wstack replay <runId>` to rehydrate a fleet. Pass an\r\n * absolute file path — the directory must already exist (the\r\n * director-session factory creates it when used together).\r\n */\r\n manifestPath?: string;\r\n /**\r\n * Optional roster used by `leaderSystemPrompt()` to render a roles\r\n * summary into the leader's preamble. Same shape as the roster passed\r\n * to `tools()` — typically the same value.\r\n */\r\n roster?: Record<string, SubagentConfig>;\r\n /**\r\n * Override the built-in fleet preamble (see `DEFAULT_DIRECTOR_PREAMBLE`).\r\n * Pass an empty string to suppress the preamble entirely.\r\n */\r\n directorPreamble?: string;\r\n /**\r\n * Override the built-in subagent baseline (see\r\n * `DEFAULT_SUBAGENT_BASELINE`). Pass an empty string to suppress.\r\n */\r\n subagentBaseline?: string;\r\n /**\r\n * Absolute path to a directory the fleet can use as a shared scratchpad\r\n * (read + write by every subagent). When set, the director creates it on\r\n * construction and `subagentSystemPrompt()` automatically injects a\r\n * \"Shared notes\" block telling subagents where to drop their findings.\r\n * This is the cheap fleet-coordination channel — agents don't need each\r\n * other's transcripts, just each other's conclusions.\r\n *\r\n * Convention: under a fleet run rooted at `<sessionsRoot>/<runId>/`,\r\n * pass `<sessionsRoot>/<runId>/shared/` here.\r\n */\r\n sharedScratchpadPath?: string;\r\n /**\r\n * Maximum number of spawns this director can perform across its\r\n * lifetime. Default: unlimited. Acts as a hard fleet-wide cost cap —\r\n * a runaway leader that keeps spawning workers gets cut off cleanly\r\n * instead of burning provider tokens until the user kills the\r\n * process. The N+1-th spawn call rejects with a `FleetSpawnBudgetError`.\r\n */\r\n maxSpawns?: number;\r\n /**\r\n * Maximum nesting depth for spawns. The director constructed by the\r\n * user is at depth `spawnDepth` (default 0); any subagent that itself\r\n * acts as a director would construct its own `Director` with\r\n * `spawnDepth: parent.spawnDepth + 1`. When `spawnDepth >= maxSpawnDepth`,\r\n * `spawn()` rejects. Default: 2 (root director can spawn workers; a\r\n * worker that becomes a sub-director cannot itself spawn further).\r\n * This stops infinite recursive director chains from a hostile or\r\n * confused prompt.\r\n */\r\n maxSpawnDepth?: number;\r\n /**\r\n * Current spawn-chain depth for this director instance. Defaults to 0.\r\n * A nested director should pass `parent.spawnDepth + 1`. Together with\r\n * `maxSpawnDepth` this bounds the chain.\r\n */\r\n spawnDepth?: number;\r\n /**\r\n * Absolute path to a director-state checkpoint file. When set, the\r\n * director writes an incremental snapshot of pending/running/completed\r\n * tasks + spawned subagents on every state mutation. Distinct from\r\n * `manifestPath`: the manifest is a final record written on shutdown,\r\n * the checkpoint is a live mirror useful for crash recovery and the\r\n * `wstack resume` \"you had N tasks in flight\" banner.\r\n */\r\n stateCheckpointPath?: string;\r\n /**\r\n * Session writer the director should forward task lifecycle events to\r\n * (`agent_spawned`, `task_created`, `task_completed`, `task_failed`).\r\n * When omitted these events stay in-memory only — useful for tests but\r\n * lossy in production. Production callers (the CLI) pass the same\r\n * writer the host Agent uses so all events land in a single JSONL.\r\n */\r\n sessionWriter?: SessionWriter;\r\n /**\r\n * Debounce window for periodic manifest writes triggered by spawn/\r\n * assign/complete events. Default: 2000ms. Pass 0 to disable periodic\r\n * writes (the manifest will then only be written on `shutdown()`).\r\n */\r\n manifestDebounceMs?: number;\r\n /**\r\n * Fleet-wide cost ceiling. When set, `spawn()` refuses any new subagent\r\n * that would push the fleet's total cost above this limit. The cap\r\n * is checked BEFORE the spawn is recorded — a refused spawn must not\r\n * leak partial state into the manifest or fleet bus. Let in-flight\r\n * tasks complete; refuse new spawns only. When omitted or Infinity,\r\n * no cost cap applies.\r\n *\r\n * Distinct from SubagentBudget.maxCostUsd (per-subagent spend) — this\r\n * field caps the *entire fleet* total.\r\n */\r\n directorBudget?: {\r\n /**\r\n * Maximum total USD the fleet may spend across all subagents.\r\n * Default: Infinity (no cap).\r\n */\r\n maxCostUsd?: number;\r\n };\r\n /**\r\n * Maximum auto-extensions per subagent per budget kind before the\r\n * director denies further extensions. A subagent hitting the same\r\n * soft limit repeatedly (e.g. 3× budget.threshold_reached for\r\n * tool_calls) is likely looping on a prompt/config issue, not\r\n * making legitimate progress. Default: 2. Set to Infinity to\r\n * disable the cap (use with caution — a misconfigured subagent\r\n * could burn unlimited budget).\r\n */\r\n maxBudgetExtensions?: number;\r\n /**\r\n * Debounce window for state-checkpoint writes. Default: 250ms.\r\n * Bursts of spawn/assign/complete events collapse into one disk\r\n * hit. Higher values reduce write amplification on fast machines;\r\n * lower values improve crash-recovery fidelity (less state lost\r\n * on sudden process exit).\r\n */\r\n checkpointDebounceMs?: number;\r\n /**\r\n * Sessions root directory for per-subagent JSONL transcripts.\r\n * When set, the director can read subagent transcripts directly for\r\n * `fleet_session` tool — no bridge round-trip needed. Path convention:\r\n * `<sessionsRoot>/<directorRunId>/<subagentId>.jsonl`.\r\n */\r\n sessionsRoot?: string;\r\n /**\r\n * Director run id — namespaced under `sessionsRoot` to locate per-subagent\r\n * JSONLs. Defaults to the director's own `id` when omitted.\r\n */\r\n directorRunId?: string;\r\n /**\r\n * Pre-built fleet manager. When provided the Director delegates all\r\n * fleet-level policy (spawn budgets, manifest assembly, checkpointing)\r\n * to this instance and takes ownership of the coordinator + bridge\r\n * layer only. This enables unit-testing fleet policy in isolation\r\n * and swapping implementations without changing the Director surface.\r\n *\r\n * When omitted the Director creates its own fleet infrastructure\r\n * (same behavior as before this field was added).\r\n */\r\n fleetManager?: FleetManager;\r\n}\r\n\r\n/**\r\n * Thrown by `Director.spawn()` when a configured spawn cap (`maxSpawns`,\r\n * `maxSpawnDepth`) is hit. Distinct error class so callers — including\r\n * the `spawn_subagent` tool surface — can recognize the budget case and\r\n * report it cleanly instead of treating it like an unexpected failure.\r\n */\r\nexport class FleetSpawnBudgetError extends Error {\r\n readonly kind: 'max_spawns' | 'max_spawn_depth';\r\n readonly limit: number;\r\n readonly observed: number;\r\n constructor(kind: 'max_spawns' | 'max_spawn_depth', limit: number, observed: number) {\r\n super(\r\n kind === 'max_spawns'\r\n ? `Director spawn budget exceeded: tried to spawn #${observed} but maxSpawns is ${limit}`\r\n : `Director spawn depth budget exceeded: this director is at depth ${observed} and maxSpawnDepth is ${limit}`,\r\n );\r\n this.name = 'FleetSpawnBudgetError';\r\n this.kind = kind;\r\n this.limit = limit;\r\n this.observed = observed;\r\n }\r\n}\r\n\r\n/**\r\n * Thrown by `Director.spawn()` when the fleet-wide cost cap is exceeded.\r\n * Distinct from `FleetSpawnBudgetError` (spawn count/depth) — this is a\r\n * dollar-denominated ceiling that tracks cumulative spend across all\r\n * subagents in the fleet.\r\n */\r\nexport class FleetCostCapError extends Error {\r\n readonly kind: 'max_cost_usd';\r\n readonly limit: number;\r\n readonly observed: number;\r\n constructor(limit: number, observed: number) {\r\n super(\r\n `Director cost cap exceeded: total fleet spend ${observed.toFixed(4)} exceeds maxCostUsd ${limit.toFixed(4)}`,\r\n );\r\n this.name = 'FleetCostCapError';\r\n this.kind = 'max_cost_usd';\r\n this.limit = limit;\r\n this.observed = observed;\r\n }\r\n}\r\n\r\nexport class Director implements ICoordinator {\r\n /** Alias for the ICoordinator contract. `id` is retained for backward compatibility. */\r\n get coordinatorId(): string { return this.id; }\r\n readonly id: string;\r\n /**\r\n * The fleet event bus. Backed by `fleetManager?.fleet` when a FleetManager\r\n * is injected; otherwise own FleetBus instance (preserves existing behavior).\r\n */\r\n readonly fleet: FleetBus;\r\n /**\r\n * Usage rollup. Backed by `fleetManager?.usage` when a FleetManager is\r\n * injected; otherwise own FleetUsageAggregator.\r\n */\r\n readonly usage: FleetUsageAggregator;\r\n /**\r\n * Optional fleet-level policy container. When provided the Director\r\n * delegates spawn budgeting, manifest entries, and checkpointing to it\r\n * instead of managing those internally. All other behavior is unchanged.\r\n */\r\n readonly fleetManager: FleetManager | undefined;\r\n /**\r\n * Director-side bridge endpoint. Subagents are wired to the same\r\n * in-memory transport so the director can `ask()` them synchronously\r\n * and they can `send()` progress back. Exposed so external code (e.g.\r\n * the TUI) can subscribe to inbound messages.\r\n */\r\n readonly bridge: InMemoryAgentBridge;\r\n private readonly transport: InMemoryBridgeTransport;\r\n private readonly coordinator: DefaultMultiAgentCoordinator;\r\n /** Resolves with the matching `TaskResult` the first time the\r\n * coordinator emits `task.completed` for a given task id. Each entry\r\n * is created lazily on first poll/await and cleared once consumed. */\r\n private readonly taskWaiters = new Map<\r\n string,\r\n {\r\n promise: Promise<TaskResult>;\r\n resolve: (r: TaskResult) => void;\r\n }\r\n >();\r\n /** Cache of completed results in case the consumer asks AFTER the\r\n * coordinator already fired the event — `awaitTasks(['t-1'])` after\r\n * t-1 finished should resolve immediately, not hang. */\r\n private readonly completed = new Map<string, TaskResult>();\r\n /** Per-subagent provider/model metadata, captured at spawn time so the\r\n * FleetUsageAggregator's metaLookup can surface readable rows. */\r\n private readonly subagentMeta = new Map<string, { provider?: string; model?: string }>();\r\n private readonly priceLookups = new Map<\r\n string,\r\n { input?: number; output?: number; cacheRead?: number; cacheWrite?: number }\r\n >();\r\n /** Bridge endpoints we created per subagent (so we can `stop()` them\r\n * on shutdown and free transport subscriptions). */\r\n private readonly subagentBridges = new Map<string, InMemoryAgentBridge>();\r\n /** Tracks per-spawn config + assigned task ids for manifest writing. */\r\n private readonly manifestEntries = new Map<\r\n string,\r\n {\r\n subagentId: string;\r\n name: string;\r\n role?: string;\r\n provider?: string;\r\n model?: string;\r\n taskIds: string[];\r\n }\r\n >();\r\n private readonly manifestPath?: string;\r\n private readonly roster?: Record<string, SubagentConfig>;\r\n private readonly directorPreamble: string;\r\n private readonly subagentBaseline: string;\r\n /** Absolute path to the fleet's shared scratchpad directory, or null\r\n * when none was configured. Exposed as a readonly getter for callers\r\n * that need to surface the path to the user (e.g. the CLI logging\r\n * the location after `--director` boots). */\r\n readonly sharedScratchpadPath: string | null;\r\n /** Spawn cap (lifetime total). Infinity means unlimited. */\r\n readonly maxSpawns: number;\r\n /** Nesting cap. The N-th director in a chain has `spawnDepth = N-1`. */\r\n readonly maxSpawnDepth: number;\r\n /** This director's position in a director chain. Root director = 0. */\r\n readonly spawnDepth: number;\r\n /** Live spawn counter for `maxSpawns` enforcement. */\r\n private spawnCount = 0;\r\n /** Optional checkpoint mirror — writes the live task graph + roster to disk. */\r\n private readonly stateCheckpoint: DirectorStateCheckpoint | null;\r\n /** Optional session writer for emitting task_* / agent_* lifecycle events. */\r\n private readonly sessionWriter: SessionWriter | null;\r\n /** Debounce timer for periodic manifest writes. */\r\n private manifestTimer: NodeJS.Timeout | null = null;\r\n private readonly manifestDebounceMs: number;\r\n /** Fleet-wide cost cap (entire fleet total, distinct from SubagentBudget limits). Infinity means no cap. */\r\n private readonly maxFleetCostUsd: number;\r\n /** Max auto-extensions per subagent per budget kind before denying. */\r\n private readonly maxBudgetExtensions: number;\r\n /** Sessions root for direct subagent JSONL reads (fleet_session tool). */\r\n private readonly sessionsRoot?: string;\r\n /** Director run id for JSONL path resolution. */\r\n private readonly directorRunId: string;\r\n /** Resolves task descriptions back from `assign()` so completion events\r\n * can also carry a human-readable title. */\r\n private readonly taskDescriptions = new Map<string, string>();\r\n /** Snapshot of which subagent owns each task — drives state-checkpoint\r\n * status updates without re-walking the manifest. */\r\n private readonly taskOwners = new Map<string, string>();\r\n /**\r\n * Handle to the coordinator-side `task.completed` listener so we can\r\n * unsubscribe in `shutdown()`. Without this, repeated Director\r\n * construction (e.g. tests, hot reloads) accumulates listeners on a\r\n * cached coordinator and slowly drifts the EventEmitter past its\r\n * default cap.\r\n */\r\n private taskCompletedListener: ((payload: { task: TaskSpec; result: TaskResult }) => void) | null = null;\r\n\r\n constructor(opts: DirectorOptions) {\r\n this.id = opts.config.coordinatorId || randomUUID();\r\n this.manifestPath = opts.manifestPath;\r\n this.roster = opts.roster;\r\n this.directorPreamble = opts.directorPreamble ?? DEFAULT_DIRECTOR_PREAMBLE;\r\n this.subagentBaseline = opts.subagentBaseline ?? DEFAULT_SUBAGENT_BASELINE;\r\n this.sharedScratchpadPath = opts.sharedScratchpadPath ?? null;\r\n this.maxSpawns = opts.maxSpawns ?? Number.POSITIVE_INFINITY;\r\n this.maxSpawnDepth = opts.maxSpawnDepth ?? 2;\r\n this.spawnDepth = opts.spawnDepth ?? 0;\r\n this.sessionWriter = opts.sessionWriter ?? null;\r\n this.manifestDebounceMs = opts.manifestDebounceMs ?? 2000;\r\n this.maxFleetCostUsd = opts.directorBudget?.maxCostUsd ?? Number.POSITIVE_INFINITY;\r\n this.maxBudgetExtensions = opts.maxBudgetExtensions ?? 2;\r\n this.sessionsRoot = opts.sessionsRoot;\r\n this.directorRunId = opts.directorRunId ?? this.id;\r\n this.stateCheckpoint = opts.stateCheckpointPath\r\n ? new DirectorStateCheckpoint(opts.stateCheckpointPath, {\r\n directorRunId: this.id,\r\n maxSpawns: opts.maxSpawns,\r\n spawnDepth: this.spawnDepth,\r\n maxSpawnDepth: this.maxSpawnDepth,\r\n directorBudget: opts.directorBudget,\r\n }, opts.checkpointDebounceMs ?? 250)\r\n : null;\r\n this.fleetManager = opts.fleetManager;\r\n if (this.sharedScratchpadPath) {\r\n // Create the directory eagerly so subagents that try to write\r\n // there on first iteration don't trip on ENOENT. Fire-and-forget;\r\n // any failure surfaces later when an agent actually writes.\r\n void fsp.mkdir(this.sharedScratchpadPath, { recursive: true }).catch(() => undefined);\r\n }\r\n this.transport = new InMemoryBridgeTransport();\r\n this.bridge = new InMemoryAgentBridge(\r\n { agentId: this.id, coordinatorId: this.id },\r\n this.transport,\r\n );\r\n // Delegate to FleetManager when injected; otherwise create own instances\r\n // (preserves existing behavior for callers that don't pass fleetManager).\r\n if (this.fleetManager) {\r\n this.fleet = this.fleetManager.fleet;\r\n this.usage = this.fleetManager.usage;\r\n } else {\r\n this.fleet = new FleetBus();\r\n this.usage = new FleetUsageAggregator(\r\n this.fleet,\r\n (id) => this.priceLookups.get(id),\r\n (id) => this.subagentMeta.get(id),\r\n );\r\n }\r\n this.coordinator = new DefaultMultiAgentCoordinator(\r\n { ...opts.config, coordinatorId: this.id },\r\n { runner: opts.runner },\r\n );\r\n // Mirror coordinator completion events into the waiter table. This\r\n // lets `awaitTasks([...])` resolve on the *next* completion event\r\n // without polling — and the `completed` cache covers the case where\r\n // a caller asks after the fact.\r\n //\r\n // The listener is captured in a field (`taskCompletedListener`) so\r\n // `shutdown()` can `coordinator.off(...)` it cleanly — otherwise\r\n // repeated Director construction against a cached coordinator\r\n // (tests, hot reloads) leaks listeners and eventually trips\r\n // EventEmitter's max-listener warning.\r\n this.taskCompletedListener = (payload: { task: TaskSpec; result: TaskResult }) => {\r\n const r = payload.result;\r\n this.completed.set(r.taskId, r);\r\n const waiter = this.taskWaiters.get(r.taskId);\r\n if (waiter) {\r\n waiter.resolve(r);\r\n this.taskWaiters.delete(r.taskId);\r\n }\r\n // Mirror into the on-disk checkpoint + session event stream so a\r\n // crashed director leaves a complete picture of which tasks landed.\r\n const title = this.taskDescriptions.get(r.taskId) ?? payload.task.description ?? r.taskId;\r\n const failed = r.status !== 'success';\r\n // Disk-side state-checkpoint and session JSONL both store `error`\r\n // as a string for historical reasons. The structured SubagentError\r\n // envelope carries `kind`, `message`, `retryable`, etc. — flatten\r\n // to a `kind: message` string here so old readers stay valid and\r\n // grep-friendly. The full envelope is still available live via\r\n // the EventBus / TaskResult to in-process consumers.\r\n const errorString = r.error\r\n ? `${r.error.kind}: ${r.error.message}`\r\n : undefined;\r\n this.stateCheckpoint?.recordTaskStatus(r.taskId, {\r\n status: failed ? (r.status as 'failed' | 'timeout' | 'stopped') : 'completed',\r\n completedAt: new Date().toISOString(),\r\n iterations: r.iterations,\r\n toolCalls: r.toolCalls,\r\n durationMs: r.durationMs,\r\n error: errorString,\r\n });\r\n this.stateCheckpoint?.setUsage(this.usage.snapshot());\r\n void this.appendSessionEvent(\r\n failed\r\n ? {\r\n type: 'task_failed',\r\n ts: new Date().toISOString(),\r\n taskId: r.taskId,\r\n title,\r\n error: errorString ?? r.status,\r\n }\r\n : {\r\n type: 'task_completed',\r\n ts: new Date().toISOString(),\r\n taskId: r.taskId,\r\n title,\r\n },\r\n );\r\n this.scheduleManifest();\r\n };\r\n this.coordinator.on('task.completed', this.taskCompletedListener);\r\n\r\n // Wire budget.threshold_reached events from the FleetBus into the\r\n // coordinator's task completion path. When a subagent hits a soft\r\n // limit, the runner emits this event; we intercept it here, resolve\r\n // the decision promise (via extend/deny), and let the normal\r\n // task.completed flow handle the rest.\r\n //\r\n // Extension guard: a subagent that hits the same soft limit\r\n // `maxBudgetExtensions` times without completing its task is looping\r\n // on a prompt/config issue, not running out of budget legitimately.\r\n // After the configured number of extends we deny and let the task\r\n // fail — the host agent should then split the work or narrow the\r\n // scope. We track this per subagent+kind combination.\r\n const extendCounts = new Map<string, number>();\r\n this.fleet.filter('budget.threshold_reached', (e) => {\r\n const payload = e.payload as {\r\n kind: 'iterations' | 'tool_calls' | 'tokens' | 'cost';\r\n used: number;\r\n limit: number;\r\n timeoutMs: number;\r\n extend: (extra: Record<string, unknown>) => void;\r\n deny: () => void;\r\n };\r\n const guardKey = `${e.subagentId}:${payload.kind}`;\r\n const prior = extendCounts.get(guardKey) ?? 0;\r\n if (prior >= this.maxBudgetExtensions) {\r\n // Auto-extend cap hit — let the task fail so the host agent\r\n // can react rather than spinning forever.\r\n payload.deny();\r\n extendCounts.delete(guardKey);\r\n return;\r\n }\r\n // Auto-extend: grant 50% more of the triggering limit type,\r\n // up to a reasonable cap. If no listener responds within\r\n // timeoutMs, the event's own timer fires and denies.\r\n extendCounts.set(guardKey, prior + 1);\r\n setTimeout(() => {\r\n const extra: Record<string, unknown> = {};\r\n switch (payload.kind) {\r\n case 'iterations':\r\n extra.maxIterations = Math.min(payload.used + 50, 500);\r\n break;\r\n case 'tool_calls':\r\n extra.maxToolCalls = Math.min(Math.ceil(payload.limit * 1.5), 1000);\r\n break;\r\n case 'tokens':\r\n extra.maxTokens = Math.min(Math.ceil(payload.limit * 1.5), 500_000);\r\n break;\r\n case 'cost':\r\n extra.maxCostUsd = Math.min(payload.limit * 1.5, 10);\r\n break;\r\n }\r\n payload.extend(extra);\r\n }, Math.min(payload.timeoutMs, 30_000));\r\n });\r\n }\r\n\r\n /** Best-effort session-writer append. Swallows failures — the director\r\n * must not break a fleet run because the session JSONL handle closed. */\r\n private async appendSessionEvent(event: Parameters<SessionWriter['append']>[0]): Promise<void> {\r\n if (!this.sessionWriter) return;\r\n try {\r\n await this.sessionWriter.append(event);\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n /** Debounced manifest writer. A burst of spawn/assign/complete events\r\n * collapses into one write. Set `manifestDebounceMs` to 0 to disable. */\r\n private scheduleManifest(): void {\r\n if (!this.manifestPath || this.manifestDebounceMs <= 0) return;\r\n if (this.manifestTimer) return;\r\n this.manifestTimer = setTimeout(() => {\r\n this.manifestTimer = null;\r\n void this.writeManifest().catch(() => undefined);\r\n }, this.manifestDebounceMs);\r\n }\r\n\r\n /**\r\n * Spawn a subagent. Identical to the coordinator's `spawn()` but\r\n * captures provider/model metadata for the usage aggregator and\r\n * lets the FleetBus attach to the runner's EventBus when the task\r\n * actually runs (see `attachSubagentBus`).\r\n *\r\n * Caller-supplied `priceLookup` is optional but recommended — without\r\n * it the `cost` column in `usage.snapshot()` stays at 0.\r\n */\r\n async spawn(\r\n config: SubagentConfig,\r\n priceLookup?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number },\r\n ): Promise<string> {\r\n // Enforce safety caps BEFORE touching the coordinator — a refused\r\n // spawn must not leak partial state into the manifest or fleet bus.\r\n // Delegate to FleetManager when available; use inline checks otherwise.\r\n if (this.fleetManager) {\r\n const rejection = this.fleetManager.canSpawn(config);\r\n if (rejection) {\r\n if (rejection.kind === 'max_spawn_depth') throw new FleetSpawnBudgetError('max_spawn_depth', rejection.limit, rejection.observed);\r\n if (rejection.kind === 'max_spawns') throw new FleetSpawnBudgetError('max_spawns', rejection.limit, rejection.observed);\r\n if (rejection.kind === 'max_cost_usd') throw new FleetCostCapError(rejection.limit, rejection.observed);\r\n }\r\n } else {\r\n if (this.spawnDepth >= this.maxSpawnDepth) {\r\n throw new FleetSpawnBudgetError('max_spawn_depth', this.maxSpawnDepth, this.spawnDepth);\r\n }\r\n if (this.spawnCount >= this.maxSpawns) {\r\n throw new FleetSpawnBudgetError('max_spawns', this.maxSpawns, this.spawnCount + 1);\r\n }\r\n if (this.maxFleetCostUsd < Number.POSITIVE_INFINITY) {\r\n const totalCost = this.usage.snapshot().total?.cost ?? 0;\r\n if (totalCost >= this.maxFleetCostUsd) {\r\n throw new FleetCostCapError(this.maxFleetCostUsd, totalCost);\r\n }\r\n }\r\n }\r\n const result = await this.coordinator.spawn(config);\r\n // Record with FleetManager when available; otherwise manage inline.\r\n if (this.fleetManager) {\r\n this.fleetManager.recordSpawn(result.subagentId, config, priceLookup);\r\n } else {\r\n this.spawnCount += 1;\r\n this.subagentMeta.set(result.subagentId, {\r\n provider: config.provider,\r\n model: config.model,\r\n });\r\n if (priceLookup) this.priceLookups.set(result.subagentId, priceLookup);\r\n }\r\n // Auto-wire a bridge per spawn — same transport as the director, so\r\n // `director.ask(subagentId, …)` and the subagent's own `bridge.send()`\r\n // round-trip without the caller having to plumb anything. Runners\r\n // grab their bridge from `ctx.bridge` (already populated by the\r\n // coordinator from `subagent.context.parentBridge`).\r\n const subagentBridge = new InMemoryAgentBridge(\r\n { agentId: result.subagentId, coordinatorId: this.id },\r\n this.transport,\r\n );\r\n this.coordinator.setSubagentBridge(result.subagentId, subagentBridge);\r\n this.subagentBridges.set(result.subagentId, subagentBridge);\r\n // Record manifest entry only when not using FleetManager (it manages its own).\r\n if (!this.fleetManager) {\r\n this.manifestEntries.set(result.subagentId, {\r\n subagentId: result.subagentId,\r\n name: config.name,\r\n role: config.role,\r\n provider: config.provider,\r\n model: config.model,\r\n taskIds: [],\r\n });\r\n const spawnedAt = new Date().toISOString();\r\n this.stateCheckpoint?.recordSpawn(\r\n {\r\n id: result.subagentId,\r\n name: config.name,\r\n role: config.role,\r\n provider: config.provider,\r\n model: config.model,\r\n spawnedAt,\r\n },\r\n this.spawnCount,\r\n );\r\n void this.appendSessionEvent({\r\n type: 'agent_spawned',\r\n ts: spawnedAt,\r\n agentId: result.subagentId,\r\n role: config.role ?? config.name,\r\n });\r\n this.scheduleManifest();\r\n }\r\n return result.subagentId;\r\n }\r\n\r\n /**\r\n * Synchronously ask a subagent something via the bridge. Sends a\r\n * `task` message addressed to the subagent and awaits a matching\r\n * reply (matched by message id). Subagent runners that handle these\r\n * requests subscribe to `ctx.bridge` and reply with a message whose\r\n * `id` equals the incoming request's id (see `InMemoryAgentBridge`'s\r\n * `request<T>` implementation).\r\n *\r\n * Returns the response payload directly (the bridge wrapper is\r\n * unwrapped for ergonomics). Times out after `timeoutMs` (default\r\n * matches the bridge's own default of 30s) — surface those rejections\r\n * to the caller as actionable errors instead of letting tools hang.\r\n */\r\n async ask<T = unknown>(subagentId: string, payload: unknown, timeoutMs?: number): Promise<T> {\r\n if (!this.subagentBridges.has(subagentId)) {\r\n throw new Error(\r\n `ask: unknown subagent \"${subagentId}\" (spawn() it first; current fleet: ${Array.from(this.subagentBridges.keys()).join(', ') || '(empty)'})`,\r\n );\r\n }\r\n const msg: BridgeMessage = {\r\n id: randomUUID(),\r\n type: 'task',\r\n from: this.id,\r\n to: subagentId,\r\n payload,\r\n timestamp: Date.now(),\r\n priority: 'normal',\r\n };\r\n const reply = await this.bridge.request<T>(msg, timeoutMs);\r\n return reply.payload;\r\n }\r\n\r\n /**\r\n * Read completed task results and format them as a structured text\r\n * block the director's LLM can paste into its own context. The\r\n * Director keeps every completed `TaskResult` in `completed` so this\r\n * is a pure read — no bridge round-trip, cheap to call.\r\n *\r\n * The returned string is intentionally markdown-flavored: headers per\r\n * subagent, a one-line meta row (iter / tools / ms), and the task's\r\n * result text. Pass `style: 'json'` for a programmatic shape instead\r\n * (useful when the director model is doing structured-output work).\r\n */\r\n rollUp(taskIds: string[], style: 'markdown' | 'json' = 'markdown'): string {\r\n const rows = taskIds.map((id) => this.completed.get(id)).filter((r): r is TaskResult => !!r);\r\n if (style === 'json') {\r\n return JSON.stringify(\r\n rows.map((r) => ({\r\n taskId: r.taskId,\r\n subagentId: r.subagentId,\r\n status: r.status,\r\n iterations: r.iterations,\r\n toolCalls: r.toolCalls,\r\n durationMs: r.durationMs,\r\n result: r.result,\r\n error: r.error,\r\n })),\r\n null,\r\n 2,\r\n );\r\n }\r\n if (rows.length === 0) {\r\n return '_No completed tasks for the requested ids — try waiting first._';\r\n }\r\n const lines: string[] = [];\r\n for (const r of rows) {\r\n const meta = this.subagentMeta.get(r.subagentId);\r\n const tag = meta?.provider && meta?.model ? ` · ${meta.provider}/${meta.model}` : '';\r\n lines.push(`### ${r.subagentId}${tag}`);\r\n lines.push(`_${r.status} — ${r.iterations} iter · ${r.toolCalls} tools · ${r.durationMs}ms_`);\r\n lines.push('');\r\n if (r.error) lines.push(`**Error:** ${r.error}`);\r\n else if (typeof r.result === 'string') lines.push(r.result);\r\n else if (r.result !== undefined)\r\n lines.push('```json\\n' + JSON.stringify(r.result, null, 2) + '\\n```');\r\n else lines.push('_(no output)_');\r\n lines.push('');\r\n }\r\n return lines.join('\\n').trimEnd();\r\n }\r\n\r\n /**\r\n * Write the fleet manifest to `manifestPath`. Returns the path written\r\n * or null when no path was configured. Captures every spawn + its\r\n * assigned tasks — paired with per-subagent JSONLs, this is enough to\r\n * replay an entire director run.\r\n */\r\n async writeManifest(): Promise<string | null> {\r\n if (!this.manifestPath) return null;\r\n const manifest = {\r\n directorRunId: this.id,\r\n writtenAt: new Date().toISOString(),\r\n children: Array.from(this.manifestEntries.values()).map((e) => ({\r\n ...e,\r\n // Surface final status from `completed` when available — manifest\r\n // becomes much more useful for replay when it carries the\r\n // success/failure state.\r\n results: e.taskIds.map((tid) => {\r\n const r = this.completed.get(tid);\r\n return r\r\n ? {\r\n taskId: tid,\r\n status: r.status,\r\n iterations: r.iterations,\r\n toolCalls: r.toolCalls,\r\n durationMs: r.durationMs,\r\n }\r\n : { taskId: tid, status: 'pending' as const };\r\n }),\r\n })),\r\n usage: this.usage.snapshot(),\r\n };\r\n await fsp.mkdir(path.dirname(this.manifestPath), { recursive: true });\r\n await fsp.writeFile(this.manifestPath, JSON.stringify(manifest, null, 2), { mode: 0o600 });\r\n return this.manifestPath;\r\n }\r\n\r\n /**\r\n * Tear down the director: stop every subagent, close every bridge\r\n * endpoint, and (when configured) write the final manifest. Idempotent\r\n * — calling shutdown twice is a no-op on the second invocation.\r\n */\r\n async shutdown(): Promise<void> {\r\n if (this.manifestTimer) {\r\n clearTimeout(this.manifestTimer);\r\n this.manifestTimer = null;\r\n }\r\n // Detach the coordinator-side task.completed listener so a Director\r\n // that lives shorter than its coordinator (rare but possible in\r\n // tests + delegate auto-promotion) doesn't leak the closure on\r\n // the EventEmitter for the coordinator's remaining lifetime.\r\n if (this.taskCompletedListener) {\r\n this.coordinator.off('task.completed', this.taskCompletedListener);\r\n this.taskCompletedListener = null;\r\n }\r\n await this.coordinator.stopAll();\r\n for (const b of this.subagentBridges.values()) {\r\n await b.stop().catch((err) => this.logShutdownError('subagent_bridge_stop', err));\r\n }\r\n this.subagentBridges.clear();\r\n await this.bridge.stop().catch((err) => this.logShutdownError('director_bridge_stop', err));\r\n if (this.manifestPath)\r\n await this.writeManifest().catch((err) => this.logShutdownError('manifest_write', err));\r\n if (this.stateCheckpoint) {\r\n this.stateCheckpoint.setUsage(this.usage.snapshot());\r\n await this.stateCheckpoint\r\n .flush()\r\n .catch((err) => this.logShutdownError('state_checkpoint_flush', err));\r\n // Release the lock so a subsequent --resume can claim this checkpoint.\r\n // Without this, the next director run sees a stale lock and refuses.\r\n await this.stateCheckpoint\r\n .releaseLock()\r\n .catch((err) => this.logShutdownError('state_checkpoint_lock_release', err));\r\n }\r\n }\r\n\r\n /**\r\n * Funnel for shutdown-phase errors. We can't throw — `shutdown()` is\r\n * called from process-exit paths where an uncaught throw would lose\r\n * the manifest write that comes after. But we MUST NOT silently\r\n * swallow either — a persistent bridge-close failure would otherwise\r\n * mask a real bug. `process.emitWarning` is the right tier:\r\n * surfaces on stderr by default, lets the host plug a warning\r\n * listener for structured collection, and never affects exit code.\r\n */\r\n private logShutdownError(phase: string, err: unknown): void {\r\n const detail = err instanceof Error ? err.message : String(err);\r\n process.emitWarning(\r\n `Director shutdown phase \"${phase}\" failed: ${detail}`,\r\n 'DirectorShutdownWarning',\r\n );\r\n }\r\n\r\n /**\r\n * Hand a task to the coordinator. Returns the assigned task id so\r\n * callers can wait on it via `awaitTasks([id])`. The coordinator's\r\n * concurrency limit applies — the task may queue before running.\r\n */\r\n async assign(task: TaskSpec): Promise<string> {\r\n const taskWithId: TaskSpec = task.id ? task : { ...task, id: randomUUID() };\r\n if (task.subagentId) {\r\n // Update manifest entry — delegate to FleetManager when available.\r\n if (this.fleetManager) {\r\n this.fleetManager.addTaskToSubagent(task.subagentId, taskWithId.id);\r\n } else {\r\n const entry = this.manifestEntries.get(task.subagentId);\r\n if (entry) entry.taskIds.push(taskWithId.id);\r\n }\r\n }\r\n await this.coordinator.assign(taskWithId);\r\n // Snapshot task metadata for completion-event titles + state checkpoint\r\n // bookkeeping. Done AFTER coordinator.assign() so we don't checkpoint a\r\n // task the coordinator rejected.\r\n this.taskDescriptions.set(taskWithId.id, taskWithId.description);\r\n if (taskWithId.subagentId) this.taskOwners.set(taskWithId.id, taskWithId.subagentId);\r\n const assignedAt = new Date().toISOString();\r\n this.stateCheckpoint?.recordTaskAssigned({\r\n taskId: taskWithId.id,\r\n subagentId: taskWithId.subagentId,\r\n description: taskWithId.description,\r\n status: 'running',\r\n assignedAt,\r\n });\r\n void this.appendSessionEvent({\r\n type: 'task_created',\r\n ts: assignedAt,\r\n taskId: taskWithId.id,\r\n title: taskWithId.description,\r\n });\r\n this.scheduleManifest();\r\n return taskWithId.id;\r\n }\r\n\r\n /**\r\n * Block until every task id resolves. Returns results in the same\r\n * order as the input. If any task hasn't completed by the time this\r\n * is called, the promise hangs until it does — pair with a timeout\r\n * at the caller if that's a concern. Resolves immediately for ids\r\n * whose results were already cached.\r\n */\r\n awaitTasks(taskIds: string[]): Promise<TaskResult[]> {\r\n return Promise.all(\r\n taskIds.map((id) => {\r\n const cached = this.completed.get(id);\r\n if (cached) return cached;\r\n const existing = this.taskWaiters.get(id);\r\n if (existing) return existing.promise;\r\n let resolve!: (r: TaskResult) => void;\r\n const promise = new Promise<TaskResult>((res) => {\r\n resolve = res;\r\n });\r\n this.taskWaiters.set(id, { promise, resolve });\r\n return promise;\r\n }),\r\n );\r\n }\r\n\r\n async terminate(subagentId: string): Promise<void> {\r\n await this.coordinator.stop(subagentId);\r\n }\r\n\r\n async terminateAll(): Promise<void> {\r\n await this.coordinator.stopAll();\r\n }\r\n\r\n status(): CoordinatorStatus {\r\n return this.coordinator.getStatus();\r\n }\r\n\r\n /**\r\n * Subscribe to coordinator events. Currently only `task.completed` is\r\n * exposed (the others are internal lifecycle). Returns an unsubscribe\r\n * function. External callers (e.g. the CLI's `MultiAgentHost`) use this\r\n * to drive their own pending/results tracking without poking the\r\n * coordinator directly.\r\n */\r\n on(\r\n event: 'task.completed',\r\n handler: (payload: { task: TaskSpec; result: TaskResult }) => void,\r\n ): () => void {\r\n // EventEmitter.on returns `this`; wrap so callers get a stable\r\n // unsubscribe closure (matches the rest of our event API).\r\n this.coordinator.on(event, handler);\r\n return () => {\r\n this.coordinator.off(event, handler);\r\n };\r\n }\r\n\r\n /**\r\n * Snapshot of every task that has resolved (success, failed, timeout,\r\n * stopped) since the director started. Returned in completion order\r\n * via the internal map's iteration order. Used by `/fleet status` to\r\n * paint the completed table without reaching into private state.\r\n */\r\n completedResults(): TaskResult[] {\r\n return Array.from(this.completed.values());\r\n }\r\n\r\n /**\r\n * Inject a previously-saved checkpoint snapshot. Call this right after\r\n * constructing a Director during a `--resume` run so the in-memory state\r\n * (subagents, tasks, waiters) reflects the pre-crash reality instead of\r\n * starting from a blank slate. The director then resumes from there —\r\n * completing any in-flight tasks and ignoring tasks that already reached\r\n * a terminal state in the prior run.\r\n */\r\n setCheckpointState(snapshot: DirectorStateSnapshot): void {\r\n this.stateCheckpoint?.resume(snapshot);\r\n }\r\n\r\n /**\r\n * Read a subagent's JSONL transcript directly from disk (no bridge\r\n * round-trip needed). Returns the last assistant text, stop reason,\r\n * tool-use count, and line count — or null if the file is unavailable.\r\n * Requires `sessionsRoot` to be set on construction.\r\n */\r\n async readSession(subagentId: string, tail?: number): Promise<{\r\n lastAssistantText?: string;\r\n lastStopReason?: string;\r\n toolUsesObserved: number;\r\n events: number;\r\n path?: string;\r\n } | null> {\r\n if (!this.sessionsRoot) return null;\r\n const filePath = path.join(this.sessionsRoot, this.directorRunId, `${subagentId}.jsonl`);\r\n let raw: string;\r\n try {\r\n raw = await fsp.readFile(filePath, 'utf8');\r\n } catch {\r\n return null;\r\n }\r\n const lines = raw.split('\\n').filter((l) => l.trim());\r\n const targetLines = tail ? lines.slice(-tail) : lines;\r\n let lastAssistantText: string | undefined;\r\n let lastStopReason: string | undefined;\r\n let toolUses = 0;\r\n for (const line of targetLines) {\r\n try {\r\n const ev = JSON.parse(line) as { type?: string; text?: string; stopReason?: string };\r\n if (ev.type === 'assistant' && typeof ev.text === 'string') {\r\n lastAssistantText = ev.text;\r\n } else if (ev.type === 'stop' && ev.stopReason) {\r\n lastStopReason = ev.stopReason;\r\n } else if (ev.type === 'tool_use') {\r\n toolUses++;\r\n }\r\n } catch {\r\n // skip malformed lines\r\n }\r\n }\r\n return {\r\n lastAssistantText,\r\n lastStopReason,\r\n toolUsesObserved: toolUses,\r\n events: targetLines.length,\r\n path: filePath,\r\n };\r\n }\r\n\r\n snapshot(): FleetUsage {\r\n return this.usage.snapshot();\r\n }\r\n\r\n /**\r\n * Look up provider/model metadata for a spawned subagent. Returns\r\n * undefined when the subagent id is unknown (not yet spawned, or\r\n * already torn down). Callers — notably the TUI fleet panel — use\r\n * this to render human-readable provider/model tags next to each\r\n * subagent row without reaching into private state.\r\n */\r\n getSubagentMeta(id: string): { provider?: string; model?: string; name?: string } | undefined {\r\n const usage = this.subagentMeta.get(id);\r\n const manifest = this.manifestEntries.get(id);\r\n if (!usage && !manifest) return undefined;\r\n return {\r\n provider: usage?.provider ?? manifest?.provider,\r\n model: usage?.model ?? manifest?.model,\r\n name: manifest?.name,\r\n };\r\n }\r\n\r\n /**\r\n * Compose the leader/director-agent system prompt: fleet preamble +\r\n * (optional) roster summary + user base prompt. Pass the result to your\r\n * leader Agent's `ctx.systemPrompt` when constructing it.\r\n *\r\n * `basePrompt` defaults to `config.leaderSystemPrompt` so callers can\r\n * use the no-arg form when the multi-agent config already carries it.\r\n */\r\n leaderSystemPrompt(basePrompt?: string): string {\r\n return composeDirectorPrompt({\r\n basePrompt: basePrompt ?? this.coordinator.config.leaderSystemPrompt,\r\n directorPreamble: this.directorPreamble,\r\n rosterSummary: this.roster ? rosterSummaryFromConfigs(this.roster) : undefined,\r\n });\r\n }\r\n\r\n /**\r\n * Compose a subagent's system prompt for a given `SubagentConfig`:\r\n * baseline + role + task + per-spawn override. Returned by value — does\r\n * not mutate the config. Factories (the user-supplied `AgentFactory`)\r\n * should call this when building each subagent's Agent so the bridge\r\n * contract, role context, and override are all surfaced.\r\n *\r\n * When `taskBrief` is omitted the Task section is dropped. Pass the\r\n * actual task description here to reinforce it in the system prompt\r\n * (the runner already passes it as user input — duplicating in the\r\n * system prompt is optional but improves anchoring on small models).\r\n */\r\n subagentSystemPrompt(config: SubagentConfig, taskBrief?: string): string {\r\n return composeSubagentPrompt({\r\n baseline: this.subagentBaseline,\r\n role: config.prompt,\r\n task: taskBrief,\r\n sharedScratchpad: this.sharedScratchpadPath ?? undefined,\r\n override: config.systemPromptOverride,\r\n });\r\n }\r\n\r\n /**\r\n * Build the tool set the LLM-driven director uses to orchestrate.\r\n * Returns an array of `Tool` definitions; register these on the\r\n * director's `Agent` to expose `spawn_subagent`, `assign_task`, etc.\r\n * Each tool's `execute()` delegates straight to the matching method\r\n * above.\r\n *\r\n * Tools all carry `permission: 'auto'` — the *user* has already\r\n * approved running the director when they kicked off the run, so\r\n * gating individual orchestration calls behind a confirm prompt\r\n * would just be noise. The actual subagent tools they spawn are\r\n * still permission-checked normally.\r\n */\r\n tools(roster?: Record<string, SubagentConfig>): Tool[] {\r\n // Use stored roster as default — allows `director.tools()` to be\r\n // called without args when the roster was passed at construction.\r\n const effectiveRoster = roster ?? this.roster;\r\n const t: Tool[] = [\r\n makeSpawnTool(this, effectiveRoster),\r\n makeAssignTool(this),\r\n makeAwaitTasksTool(this),\r\n makeAskTool(this),\r\n makeRollUpTool(this),\r\n makeTerminateTool(this),\r\n makeFleetStatusTool(this),\r\n makeFleetUsageTool(this),\r\n makeFleetSessionTool(this),\r\n makeFleetHealthTool(this),\r\n ];\r\n return t;\r\n }\r\n\r\n /**\r\n * Attempt to acquire the checkpoint lock. Must be called before\r\n * resuming — if another director process is alive, this returns\r\n * false and the caller should not proceed with the resume.\r\n */\r\n async acquireCheckpointLock(): Promise<boolean> {\r\n return this.stateCheckpoint ? this.stateCheckpoint.acquireLock() : true;\r\n }\r\n\r\n /**\r\n * Resume from a prior checkpoint snapshot (loaded via\r\n * `loadDirectorState()`). Re-attach to the fleet mid-flight so\r\n * subsequent spawn/assign calls update the checkpoint normally.\r\n */\r\n resumeFromCheckpoint(snapshot: DirectorStateSnapshot): void {\r\n this.stateCheckpoint?.resume(snapshot);\r\n }\r\n}\r\n\r\n","import * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { randomUUID } from 'node:crypto';\r\nimport type { SubagentConfig, TaskResult } from '../types/multi-agent.js';\r\nimport type { JSONSchema, Tool } from '../types/tool.js';\r\nimport type { Director } from './director.js';\r\n\r\n/**\r\n * Opaque host interface so this factory doesn't have to depend on the\r\n * CLI's `MultiAgentHost`. Any caller that exposes the same three\r\n * methods can wire `delegate` — including test doubles.\r\n */\r\nexport interface DelegateHost {\r\n /** True if a Director is already attached and running. */\r\n isDirectorMode(): boolean;\r\n /** Build (or return the cached) Director when director mode is on. */\r\n ensureDirector(): Promise<Director | null>;\r\n /**\r\n * Force-promote a non-director session into director mode at runtime.\r\n * Returns the Director, or null when promotion is impossible (e.g. a\r\n * non-director coordinator has already spawned subagents in the\r\n * legacy code path).\r\n */\r\n promoteToDirector(): Promise<Director | null>;\r\n /**\r\n * Optional: when promotion fails, return the human-readable reason.\r\n * Used to render an actionable error to the calling model instead of\r\n * the prior opaque \"Director could not be activated\" message.\r\n * Implementations may return null when they don't track the reason.\r\n */\r\n getPromotionBlockReason?(): string | null;\r\n}\r\n\r\nexport interface CreateDelegateToolOptions {\r\n host: DelegateHost;\r\n /**\r\n * Roster used to resolve `role` strings into full `SubagentConfig`s.\r\n * Typically `FLEET_ROSTER`. When omitted, `delegate({ role })` calls\r\n * fail and only the explicit `name + provider + model` path works.\r\n */\r\n roster?: Record<string, SubagentConfig>;\r\n /**\r\n * Default await timeout in milliseconds. `delegate` blocks until the\r\n * subagent's task resolves; without a cap, a stuck worker would hang\r\n * the host indefinitely. Set generously (default: 4 hours) so the\r\n * orchestrator can run multi-step refactors / monorepo audits\r\n * without being killed for being slow — the orchestrator must\r\n * decide per-call when a task needs to be cut short.\r\n */\r\n defaultTimeoutMs?: number;\r\n /**\r\n * Absolute directory under which per-subagent JSONL transcripts live —\r\n * matches `MultiAgentHostOptions.sessionsRoot`. When set, the delegate\r\n * tool reads the subagent's transcript on timeout / budget-exhaustion\r\n * to extract partial output, so the host LLM gets *something* useful\r\n * back instead of just an error.\r\n */\r\n sessionsRoot?: string;\r\n /**\r\n * The directorRunId used to namespace transcripts (typically the host\r\n * session id). Combined with `sessionsRoot` to locate per-subagent\r\n * JSONLs at `<sessionsRoot>/<runId>/<subagentId>.jsonl`.\r\n */\r\n directorRunId?: string;\r\n /**\r\n * Buffer subtracted from the caller's `timeoutMs` before passing it\r\n * to the subagent. Gives the host a window to detect a subagent that\r\n * has gone silent and surface a partial result rather than a generic\r\n * timeout. Default: 30_000 ms.\r\n */\r\n subagentTimeoutBufferMs?: number;\r\n}\r\n\r\n/**\r\n * `delegate` — the only multi-agent tool a regular (non-director) agent\r\n * ever needs. It bundles spawn + assign + await into a single call and\r\n * transparently auto-promotes the host into director mode on first use.\r\n *\r\n * The model never has to ask \"are we in director mode?\" — it just calls\r\n * `delegate({ role, task })` and gets back a `TaskResult`. The cost of\r\n * that ergonomic packaging is that `delegate` cannot be used for\r\n * parallel work as-is; the model must fire multiple `delegate` calls in\r\n * parallel through the provider's parallel-tool-call surface, or escalate\r\n * to the explicit `spawn_subagent` + `assign_task` + `await_tasks` flow\r\n * when it wants fan-out it controls itself.\r\n */\r\nexport function createDelegateTool(opts: CreateDelegateToolOptions): Tool {\r\n // 4 hours by default. The previous 5-minute default killed any\r\n // non-trivial fan-out (monorepo audits, multi-file refactors) and\r\n // forced the orchestrator to constantly pass an explicit timeoutMs.\r\n // The right model here: the orchestrator should pick a tight value\r\n // only when it knows the work is small; otherwise let it run.\r\n const defaultTimeoutMs = opts.defaultTimeoutMs ?? 4 * 60 * 60 * 1000;\r\n const rosterIds = opts.roster ? Object.keys(opts.roster) : [];\r\n\r\n const inputSchema: JSONSchema = {\r\n type: 'object',\r\n properties: {\r\n task: {\r\n type: 'string',\r\n description:\r\n 'What the subagent should do — natural language, complete sentence(s). The subagent has its own tool slice, its own LLM call, and returns when its task is done.',\r\n },\r\n role: {\r\n type: 'string',\r\n description:\r\n rosterIds.length > 0\r\n ? `Roster role (preferred). One of: ${rosterIds.join(', ')}. Picks a pre-tuned config (prompt, budgets, tools) for that role.`\r\n : 'No roster is configured — pass `name` instead.',\r\n enum: rosterIds.length > 0 ? rosterIds : undefined,\r\n },\r\n name: {\r\n type: 'string',\r\n description:\r\n 'Display name for the subagent when not using a roster role. Required when `role` is omitted.',\r\n },\r\n provider: {\r\n type: 'string',\r\n description:\r\n 'Provider id (e.g. \"anthropic\", \"openai\"). Defaults to the host provider when omitted.',\r\n },\r\n model: {\r\n type: 'string',\r\n description: 'Model id within the provider. Defaults to the host model when omitted.',\r\n },\r\n systemPromptOverride: {\r\n type: 'string',\r\n description: 'Optional extra prompt text appended to the role baseline.',\r\n },\r\n timeoutMs: {\r\n type: 'number',\r\n description: `Wall-clock budget for this delegate in milliseconds. No hard cap — set as high as the task realistically needs (a monorepo audit can take hours, a single-file lint takes seconds). Default ${Math.round(defaultTimeoutMs / 1000 / 60)} minutes.`,\r\n },\r\n maxIterations: {\r\n type: 'number',\r\n description:\r\n 'Maximum LLM iterations the subagent may take. Unset = use the role/coordinator default. Raise this for tasks with many tool-think-tool cycles (deep code analysis, multi-file refactors).',\r\n },\r\n maxToolCalls: {\r\n type: 'number',\r\n description:\r\n 'Maximum number of tool invocations the subagent may make. Unset = use the role/coordinator default. Raise this for tasks that touch many files (large grep + read + report).',\r\n },\r\n },\r\n required: ['task'],\r\n };\r\n\r\n return {\r\n name: 'delegate',\r\n description:\r\n \"Hand a discrete piece of work to a dedicated subagent and wait for its result. The subagent has its own context, its own LLM call, and its own budget — use this when a task is self-contained, would otherwise blow up your context, or benefits from a specialized role (bug-hunter, security-scanner, refactor-planner, audit-log). YOU decide how big the budget is: pass `timeoutMs`, `maxIterations`, and `maxToolCalls` sized to the actual work. There is no hidden cap forcing a 3-minute / 80-iteration limit — if a monorepo audit needs 2 hours and 500 tool calls, ask for that. Call multiple delegates in parallel through the provider's parallel-tool-call surface to fan work out across roles.\",\r\n usageHint:\r\n \"Set `task` to a complete instruction. Either pick `role` from the roster or pass `name` + `provider` + `model`. For non-trivial work, also pass `timeoutMs` (the wall-clock budget you actually need), `maxIterations`, and `maxToolCalls` — defaults are intentionally generous (4 hours) but the right values depend on scope. Returns the subagent's `TaskResult` — including the textual `result`, iteration count, tool count, and duration. Auto-promotes the host into director mode on first call.\",\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema,\r\n async execute(input: unknown) {\r\n const i = (input ?? {}) as {\r\n task?: string;\r\n role?: string;\r\n name?: string;\r\n provider?: string;\r\n model?: string;\r\n systemPromptOverride?: string;\r\n timeoutMs?: number;\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n };\r\n\r\n if (typeof i.task !== 'string' || !i.task.trim()) {\r\n return { ok: false, error: '`task` is required.' };\r\n }\r\n\r\n try {\r\n let director = await opts.host.ensureDirector();\r\n if (!director) {\r\n director = await opts.host.promoteToDirector();\r\n }\r\n if (!director) {\r\n const reason = opts.host.getPromotionBlockReason?.();\r\n return {\r\n ok: false,\r\n error:\r\n reason ??\r\n 'Director could not be activated — multi-agent host already running in legacy non-director mode. Restart with `--director` for fleet support.',\r\n };\r\n }\r\n\r\n const timeoutMs = i.timeoutMs ?? defaultTimeoutMs;\r\n\r\n let cfg: SubagentConfig;\r\n if (i.role) {\r\n const base = opts.roster?.[i.role];\r\n if (!base) {\r\n return {\r\n ok: false,\r\n error: `Unknown role \"${i.role}\". Available: ${rosterIds.join(', ') || '(no roster configured)'}.`,\r\n };\r\n }\r\n cfg = instantiateRosterConfig(i.role, base);\r\n if (i.systemPromptOverride) cfg.systemPromptOverride = i.systemPromptOverride;\r\n if (i.provider) cfg.provider = i.provider;\r\n if (i.model) cfg.model = i.model;\r\n } else {\r\n if (!i.name) {\r\n return {\r\n ok: false,\r\n error: 'Either `role` (from the roster) or `name` is required.',\r\n };\r\n }\r\n cfg = {\r\n name: i.name,\r\n provider: i.provider,\r\n model: i.model,\r\n systemPromptOverride: i.systemPromptOverride,\r\n };\r\n }\r\n\r\n if (typeof i.maxIterations === 'number' && i.maxIterations > 0) {\r\n cfg.maxIterations = i.maxIterations;\r\n }\r\n if (typeof i.maxToolCalls === 'number' && i.maxToolCalls > 0) {\r\n cfg.maxToolCalls = i.maxToolCalls;\r\n }\r\n\r\n const SUBAGENT_TIMEOUT_BUFFER_MS = opts.subagentTimeoutBufferMs ?? 30_000;\r\n const desiredSubTimeout = Math.max(30_000, timeoutMs - SUBAGENT_TIMEOUT_BUFFER_MS);\r\n if (!cfg.timeoutMs || cfg.timeoutMs > desiredSubTimeout) {\r\n cfg.timeoutMs = desiredSubTimeout;\r\n }\r\n\r\n const subagentId = await director.spawn(cfg);\r\n const taskId = await director.assign({\r\n id: `${randomUUID()}`,\r\n description: i.task,\r\n subagentId,\r\n });\r\n const result = await Promise.race<TaskResult | { __timeout: true }>([\r\n director.awaitTasks([taskId]).then((r) => {\r\n if (!r[0]) throw new Error(`Task \"${taskId}\" not found in completed results`);\r\n return r[0];\r\n }),\r\n new Promise<{ __timeout: true }>((resolve) =>\r\n setTimeout(() => resolve({ __timeout: true }), timeoutMs),\r\n ),\r\n ]);\r\n\r\n if ('__timeout' in result) {\r\n const partial = await readSubagentPartial(opts, subagentId);\r\n return {\r\n ok: false,\r\n stopReason: 'host_timeout',\r\n error: `Subagent did not finish within ${timeoutMs}ms.`,\r\n hint: 'Reduce scope of the next delegate, raise timeoutMs, or use spawn_subagent + await_tasks for long-running work.',\r\n subagentId,\r\n taskId,\r\n partial,\r\n };\r\n }\r\n\r\n const baseStopReason: StopReason =\r\n result.status === 'success'\r\n ? 'end_turn'\r\n : result.status === 'timeout'\r\n ? 'subagent_timeout'\r\n : result.status === 'stopped'\r\n ? 'aborted'\r\n : 'budget_exhausted';\r\n const partial =\r\n result.status === 'success' ? undefined : await readSubagentPartial(opts, subagentId);\r\n\r\n const errorKind = result.error?.kind;\r\n const retryable = result.error?.retryable;\r\n const backoffMs = result.error?.backoffMs;\r\n return {\r\n ok: result.status === 'success',\r\n status: result.status,\r\n stopReason: baseStopReason,\r\n errorKind,\r\n retryable,\r\n backoffMs,\r\n subagentId: result.subagentId,\r\n taskId: result.taskId,\r\n result: result.result,\r\n error: result.error,\r\n iterations: result.iterations,\r\n toolCalls: result.toolCalls,\r\n durationMs: result.durationMs,\r\n ...(partial ? { partial } : {}),\r\n ...(hintForKind(errorKind, retryable, backoffMs, partial)\r\n ? { hint: hintForKind(errorKind, retryable, backoffMs, partial) }\r\n : {}),\r\n };\r\n } catch (err) {\r\n return {\r\n ok: false,\r\n stopReason: 'error' as const,\r\n error: err instanceof Error ? err.message : String(err),\r\n };\r\n }\r\n },\r\n };\r\n}\r\n\r\nfunction instantiateRosterConfig(role: string, base: SubagentConfig): SubagentConfig {\r\n return {\r\n ...base,\r\n // Roster entries are templates. Give each spawn a fresh id so\r\n // parallel or repeated delegates can use the same role safely.\r\n id: `${role}-${randomUUID().slice(0, 8)}`,\r\n };\r\n}\r\n\r\ntype StopReason =\r\n | 'end_turn'\r\n | 'budget_exhausted'\r\n | 'subagent_timeout'\r\n | 'host_timeout'\r\n | 'aborted'\r\n | 'error';\r\n\r\n/**\r\n * Per-kind orchestrator hint. Returned alongside the structured error\r\n * so the calling model has a concrete next step instead of \"task\r\n * failed, good luck\". Returns undefined for success / unknown kinds —\r\n * the caller checks for presence before including in output.\r\n */\r\nfunction hintForKind(\r\n kind: string | undefined,\r\n retryable: boolean | undefined,\r\n backoffMs: number | undefined,\r\n partial?: { lastAssistantText?: string },\r\n): string | undefined {\r\n if (!kind) return undefined;\r\n switch (kind) {\r\n case 'provider_rate_limit':\r\n return `Provider rate-limited. Retry safe after ${backoffMs ?? 5000}ms backoff. Consider a smaller model or fewer parallel delegates.`;\r\n case 'provider_5xx':\r\n return `Provider server error. Retry safe after ${backoffMs ?? 3000}ms backoff — usually transient.`;\r\n case 'provider_timeout':\r\n return 'Provider network timeout. Retry safe; reduce input size if it persists.';\r\n case 'provider_auth':\r\n return 'Provider rejected credentials. Cannot retry — fix the API key / config and re-invoke.';\r\n case 'context_overflow':\r\n return 'Subagent context exceeded the model limit. Narrow the task, use a larger-context model, or split into multiple delegates.';\r\n case 'budget_iterations':\r\n case 'budget_tool_calls':\r\n case 'budget_tokens':\r\n case 'budget_cost': {\r\n const base = 'Subagent exhausted its budget. The coordinator may auto-extend; otherwise raise the matching `max*` field (e.g. maxToolCalls: 600) on the next delegate, or split the task.';\r\n if (partial?.lastAssistantText) {\r\n return `${base}\\n\\nPartial output produced before budget hit:\\n${partial.lastAssistantText}`;\r\n }\r\n return base;\r\n }\r\n case 'budget_timeout': {\r\n const base = 'Subagent hit its wall-clock budget. Raise `timeoutMs` on the next delegate or split the task.';\r\n if (partial?.lastAssistantText) {\r\n return `${base}\\n\\nPartial output produced before timeout:\\n${partial.lastAssistantText}`;\r\n }\r\n return base;\r\n }\r\n case 'aborted_by_parent':\r\n return 'Subagent was aborted (user Ctrl+C, parent unwound, or sibling failure cascade). Not retryable until the abort condition is resolved.';\r\n case 'empty_response':\r\n return 'Subagent ended its turn with no text and no tool calls. Almost always a prompt / config issue — clarify the task or check the model.';\r\n case 'tool_failed': {\r\n const base = 'A tool inside the subagent returned ok:false. Retry with corrected inputs.';\r\n if (partial?.lastAssistantText) {\r\n return `${base}\\n\\nAgent reasoning before failure:\\n${partial.lastAssistantText}`;\r\n }\r\n return base;\r\n }\r\n case 'bridge_failed':\r\n return 'Parent-child bridge transport failed. This is rare — restart the session and retry.';\r\n default:\r\n return retryable\r\n ? 'Failure classified as retryable. Try again with the same input.'\r\n : undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Parse the per-subagent JSONL at `<sessionsRoot>/<runId>/<subagentId>.jsonl`\r\n * and pull out the last few useful pieces — the most recent assistant\r\n * text response, the stop reason, and a count of tool calls. Used by\r\n * `delegate` when the subagent timed out or exhausted budget without\r\n * returning a clean `finalText`, so the host LLM still sees what work\r\n * actually happened.\r\n */\r\nasync function readSubagentPartial(\r\n opts: CreateDelegateToolOptions,\r\n subagentId: string,\r\n): Promise<\r\n | {\r\n lastAssistantText?: string;\r\n lastStopReason?: string;\r\n toolUsesObserved: number;\r\n events: number;\r\n }\r\n | undefined\r\n> {\r\n if (!opts.sessionsRoot) return undefined;\r\n // Locate the JSONL. When `directorRunId` is provided we know the\r\n // exact path; otherwise scan the sessionsRoot for any subdir\r\n // containing this subagent id.\r\n const candidates: string[] = [];\r\n if (opts.directorRunId) {\r\n candidates.push(path.join(opts.sessionsRoot, opts.directorRunId, `${subagentId}.jsonl`));\r\n } else {\r\n try {\r\n const runDirs = await fsp.readdir(opts.sessionsRoot);\r\n for (const r of runDirs) {\r\n candidates.push(path.join(opts.sessionsRoot, r, `${subagentId}.jsonl`));\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n for (const file of candidates) {\r\n let raw: string;\r\n try {\r\n raw = await fsp.readFile(file, 'utf8');\r\n } catch {\r\n continue;\r\n }\r\n const lines = raw.split('\\n').filter((l) => l.trim());\r\n let lastAssistantText: string | undefined;\r\n let lastStopReason: string | undefined;\r\n let toolUses = 0;\r\n for (const line of lines) {\r\n try {\r\n const ev = JSON.parse(line) as {\r\n type: string;\r\n content?: unknown;\r\n stopReason?: string;\r\n name?: string;\r\n };\r\n if (ev.type === 'tool_use') toolUses += 1;\r\n if (ev.type === 'llm_response') {\r\n if (typeof ev.stopReason === 'string') lastStopReason = ev.stopReason;\r\n if (Array.isArray(ev.content)) {\r\n const txt = (ev.content as Array<{ type?: string; text?: string }>)\r\n .filter((b) => b.type === 'text')\r\n .map((b) => b.text ?? '')\r\n .join('\\n')\r\n .trim();\r\n if (txt) lastAssistantText = txt;\r\n }\r\n }\r\n } catch {\r\n // skip\r\n }\r\n }\r\n return {\r\n lastAssistantText,\r\n lastStopReason,\r\n toolUsesObserved: toolUses,\r\n events: lines.length,\r\n };\r\n }\r\n return undefined;\r\n}\r\n","import type { Agent, AgentInput, RunResult } from '../core/agent.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport type {\r\n SubagentConfig,\r\n SubagentRunContext,\r\n SubagentRunOutcome,\r\n SubagentRunner,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport {\r\n BudgetExceededError,\r\n BudgetThresholdDecision,\r\n BudgetThresholdSignal,\r\n} from './subagent-budget.js';\r\nimport type { FleetBus } from './fleet-bus.js';\r\n\r\n/**\r\n * Caller-supplied factory that builds an isolated `Agent` for a subagent.\r\n * The factory MUST construct a fresh `Context` per call — sharing context\r\n * between subagents defeats isolation. Each Agent should also use either\r\n * its own `EventBus` or a forwarded view, so per-subagent metrics can be\r\n * attributed correctly.\r\n */\r\nexport type AgentFactory = (config: SubagentConfig) => Promise<AgentFactoryResult>;\r\n\r\nexport interface AgentFactoryResult {\r\n agent: Agent;\r\n /** Event bus the factory wired to this agent — required for budget hookup. */\r\n events: EventBus;\r\n /**\r\n * Optional cleanup hook invoked in the runner's `finally` block once\r\n * the task ends (success, failure, abort — same exit path). Factories\r\n * that own resources scoped to a single task (per-subagent JSONL\r\n * writers, transient providers, throwaway containers) implement this\r\n * to close them deterministically instead of relying on GC. Errors\r\n * thrown here are swallowed so a flaky cleanup can't mask the task's\r\n * real result.\r\n */\r\n dispose?: () => Promise<void> | void;\r\n}\r\n\r\nexport interface AgentRunnerOptions {\r\n factory: AgentFactory;\r\n /**\r\n * Format a TaskSpec into the user input the agent will receive. Defaults\r\n * to `task.description ?? ''`. Override when subagents expect structured\r\n * input (e.g. JSON contracts, role-prefixed prompts).\r\n */\r\n formatTaskInput?: (task: TaskSpec, config: SubagentConfig) => AgentInput;\r\n /**\r\n * When set, the runner attaches the subagent's EventBus to this FleetBus\r\n * on task start and detaches it when the task finishes. This is the\r\n * injection seam that lets the TUI fleet panel observe subagent activity\r\n * live — without it, FleetBus stays empty.\r\n */\r\n fleetBus?: FleetBus;\r\n}\r\n\r\n/**\r\n * Builds a `SubagentRunner` that drives a real `Agent` per task while honoring\r\n * the coordinator's budget and abort signal. This is the production adapter —\r\n * the coordinator's `runner` option in CLI/TUI assemblies points here.\r\n *\r\n * Lifecycle per task:\r\n * 1. factory(config) → fresh Agent + EventBus.\r\n * 2. Subscribe to events to feed the budget (tool calls, token usage).\r\n * 3. Call agent.run(input, { signal }) — the coordinator's signal cancels.\r\n * 4. Map RunResult.status onto a `SubagentRunOutcome` or throw on failure.\r\n * 5. Unsubscribe and let the factory's resources be GC'd.\r\n *\r\n * The budget is checked synchronously from event handlers — a runaway agent\r\n * that crosses its tool-call limit triggers `BudgetExceededError`, which the\r\n * coordinator surfaces as `status: 'failed'` on the task result.\r\n */\r\nexport function makeAgentSubagentRunner(opts: AgentRunnerOptions): SubagentRunner {\r\n const format = opts.formatTaskInput ?? defaultFormatTaskInput;\r\n\r\n return async (task: TaskSpec, ctx: SubagentRunContext): Promise<SubagentRunOutcome> => {\r\n const factoryResult = await opts.factory(ctx.config);\r\n const { agent, events } = factoryResult;\r\n\r\n // Attach subagent EventBus to FleetBus so the TUI fleet panel (and any\r\n // other FleetBus subscriber) can observe this subagent live. Detach on\r\n // task finish — each task is a fresh Agent + EventBus, so we never\r\n // want a stale bus lingering after the run.\r\n const detachFleet = opts.fleetBus?.attach(ctx.subagentId, events, task.id);\r\n\r\n // Hook budget into the agent's event stream. We capture errors thrown by\r\n // recordToolCall/recordUsage so the budget can short-circuit the run by\r\n // aborting the controller — the agent then unwinds cooperatively.\r\n const aborter = new AbortController();\r\n // Inject the EventBus into the budget so it can emit budget.threshold_reached\r\n // events when a soft limit is hit and the handler wants to ask the coordinator.\r\n ctx.budget._events = events;\r\n let budgetError: BudgetExceededError | null = null;\r\n\r\n /**\r\n * Common error handler for all budget-triggered events. Distinguishes:\r\n * - BudgetExceededError → hard stop, set budgetError + abort\r\n * - BudgetThresholdSignal → soft stop: await the coordinator's\r\n * decision. If 'stop', abort. If 'extend', the signal handler\r\n * has already patched the budget so we can continue without\r\n * actually aborting the agent.\r\n */\r\n const onBudgetError = (err: unknown): void => {\r\n if (err instanceof BudgetThresholdSignal) {\r\n // Await the coordinator's verdict before deciding whether to abort.\r\n err.decision\r\n .then((decision) => {\r\n if (decision === 'stop') {\r\n budgetError = new BudgetExceededError(err.kind, err.limit, err.used);\r\n aborter.abort();\r\n }\r\n // If 'extend': the budget limits were already patched by the\r\n // BudgetThresholdSignal handler (checkLimit → onThreshold →\r\n // coordinator extend → budget patched). Do NOT abort.\r\n // The tool call that triggered the signal will be retried.\r\n })\r\n .catch(() => {\r\n // If the decision promise rejects, treat as hard stop.\r\n budgetError = new BudgetExceededError(err.kind, err.limit, err.used);\r\n aborter.abort();\r\n });\r\n return;\r\n }\r\n // Hard stop (BudgetExceededError or other)\r\n aborter.abort();\r\n budgetError =\r\n err instanceof BudgetExceededError\r\n ? err\r\n : new BudgetExceededError(\r\n 'tool_calls',\r\n 0,\r\n 0,\r\n );\r\n // Attach the real error detail so the task result surfaces\r\n // something actionable instead of a generic budget message.\r\n if (budgetError !== err && err instanceof Error) {\r\n budgetError.message += ` (caused by: ${err.message})`;\r\n }\r\n };\r\n\r\n // Track the name of the most recent tool that returned ok:false so\r\n // we can lift it into the SubagentError when the agent ends without\r\n // recovering. Cleared on every successful tool execution so a tool\r\n // that later succeeded doesn't taint the final report.\r\n let lastToolFailed: string | null = null;\r\n\r\n const unsub: Array<() => void> = [];\r\n unsub.push(\r\n events.on('tool.executed', (e) => {\r\n // Count tool calls on the PAIRED 'tool.executed' event rather\r\n // than 'tool.started'. A tool can fire start then crash before\r\n // emitting executed (process killed, signal aborted mid-exec);\r\n // counting only the paired event keeps the budget tally honest\r\n // and matches what the model actually saw in its turn.\r\n try {\r\n ctx.budget.recordToolCall();\r\n } catch (eb) {\r\n onBudgetError(eb);\r\n }\r\n // Track ok:false so we can fail the subagent if it ends without\r\n // recovering. Successful runs clear it — the model may try a\r\n // tool, get an error, and self-heal on the next iteration; that\r\n // path should still report success.\r\n if (e.ok === false) {\r\n lastToolFailed = e.name;\r\n } else if (e.ok === true) {\r\n lastToolFailed = null;\r\n }\r\n }),\r\n events.on('provider.response', (e) => {\r\n try {\r\n ctx.budget.recordUsage(e.usage);\r\n } catch (e2) {\r\n void onBudgetError(e2);\r\n }\r\n }),\r\n events.on('iteration.started', () => {\r\n try {\r\n ctx.budget.recordIteration();\r\n ctx.budget.checkTimeout();\r\n } catch (e) {\r\n void onBudgetError(e);\r\n }\r\n }),\r\n // D3: cooperative timeout enforcement DURING a long tool call.\r\n // The iteration-loop checkTimeout() only fires between agent\r\n // iterations — a single `bash sleep 3600` call would otherwise\r\n // park inside one tool execution while the timeout silently\r\n // passes, relying solely on the coordinator's hard Promise.race\r\n // to interrupt. Tools that emit `tool.progress` (bash chunks,\r\n // fetch byte progress, spawn-stream stdout) give us a heartbeat\r\n // we can hang the check on. When the budget trips here:\r\n // 1. onBudgetError sets budgetError + aborter.abort()\r\n // 2. aborter signal propagates to agent.run → tool executor\r\n // 3. tool's own signal listener kills the child process\r\n // Cheap: O(1) per progress event, and the budget short-circuits\r\n // when timeoutMs is unset (most subagents have one set anyway).\r\n events.on('tool.progress', () => {\r\n try {\r\n ctx.budget.checkTimeout();\r\n } catch (e) {\r\n void onBudgetError(e);\r\n }\r\n }),\r\n );\r\n\r\n // Forward the coordinator signal so stop() from outside also aborts.\r\n const onParentAbort = () => aborter.abort();\r\n ctx.signal.addEventListener('abort', onParentAbort);\r\n\r\n let result: RunResult;\r\n try {\r\n result = await agent.run(format(task, ctx.config), { signal: aborter.signal });\r\n } finally {\r\n detachFleet?.();\r\n ctx.signal.removeEventListener('abort', onParentAbort);\r\n for (const u of unsub) u();\r\n // Per-task resource cleanup. Closes JSONL writers, throwaway\r\n // providers, etc. that the factory wired up. Swallowed errors —\r\n // a flaky cleanup must not mask the real task result. The\r\n // caller can re-emit via observability if needed.\r\n if (factoryResult.dispose) {\r\n try {\r\n await factoryResult.dispose();\r\n } catch {\r\n // intentional swallow — see comment above\r\n }\r\n }\r\n }\r\n\r\n // A budget violation is the signal — surface it so the coordinator can\r\n // tag the task with the right failure kind ('failed' for budget; the\r\n // coordinator separately recognises 'timeout' from BudgetExceededError).\r\n if (budgetError) throw budgetError;\r\n\r\n if (result.status === 'failed') {\r\n throw result.error instanceof Error\r\n ? result.error\r\n : new Error(String(result.error ?? 'agent failed'));\r\n }\r\n // 'aborted' and 'max_iterations' aren't successes — let the coordinator\r\n // classify them. When the parent signal was aborted, coordinator marks\r\n // the task 'stopped' (matched against subagent.abortController.aborted).\r\n if (result.status === 'aborted') {\r\n throw new Error('agent aborted');\r\n }\r\n if (result.status === 'max_iterations') {\r\n throw new Error('agent exhausted iteration limit');\r\n }\r\n\r\n const usage = ctx.budget.usage();\r\n // Empty-response guard. A \"successful\" run with no text AND no tool\r\n // calls is almost always a prompt / config issue, not a real\r\n // success — the agent burned an iteration to say nothing. Surface\r\n // it as a classified failure so callers can show \"✗ empty_response\"\r\n // instead of a confusing green ✓ with no output. We only trip on\r\n // the (no-text AND no-tools) intersection because text-less runs\r\n // with tool calls are legit (e.g. \"run npm test then end_turn\").\r\n const finalText = (result.finalText ?? '').trim();\r\n if (finalText.length === 0 && usage.toolCalls === 0) {\r\n throw new Error('empty response');\r\n }\r\n // Unrecovered-tool-failure guard. If the last executed tool came\r\n // back ok:false AND the agent ended its turn with no closing text,\r\n // the agent never acknowledged or recovered from the failure — the\r\n // task is effectively broken. A model that handles a tool error\r\n // emits SOME text on the next iteration (\"the read failed, trying\r\n // an alternate path…\") which clears `lastToolFailed`; the only way\r\n // both signals can be live at end-of-run is if the model gave up\r\n // silently. Surface as `tool_failed` so callers see the actual\r\n // failure mode instead of a clean ✓ with no output.\r\n if (finalText.length === 0 && lastToolFailed !== null) {\r\n throw new Error(`tool failed: ${lastToolFailed}`);\r\n }\r\n return {\r\n result: result.finalText,\r\n iterations: result.iterations,\r\n toolCalls: usage.toolCalls,\r\n };\r\n };\r\n}\r\n\r\nfunction defaultFormatTaskInput(task: TaskSpec): AgentInput {\r\n return task.description ?? '';\r\n}\r\n","import type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\n\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = messages[i]!;\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus } from '../kernel/events.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type {\n ResumedSession,\n SessionData,\n SessionEvent,\n SessionMetadata,\n SessionStore,\n SessionSummary,\n SessionWriter,\n} from '../types/session.js';\nimport { ensureDir } from '../utils/atomic-write.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\nexport interface SessionStoreOptions {\n dir: string;\n /** Optional EventBus for emitting session diagnostics. */\n events?: EventBus;\n}\n\nexport class DefaultSessionStore implements SessionStore {\n private readonly dir: string;\n private readonly events?: EventBus;\n\n constructor(opts: SessionStoreOptions) {\n this.dir = opts.dir;\n this.events = opts.events;\n }\n\n async create(meta: Omit<SessionMetadata, 'startedAt'>): Promise<SessionWriter> {\n await ensureDir(this.dir);\n const startedAt = new Date().toISOString();\n const id = meta.id ?? `${startedAt.replace(/[:.]/g, '-')}-${randomBytes(2).toString('hex')}`;\n const file = path.join(this.dir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n // Preserve cause + errno so callers can branch on EACCES vs EMFILE\n // vs ENOSPC etc. instead of substring-matching the error message.\n throw new Error(\n `Failed to open session file: ${err instanceof Error ? err.message : String(err)}`,\n {\n cause: err,\n },\n );\n }\n try {\n return new FileSessionWriter(id, handle, startedAt, meta, this.events, { dir: this.dir, filePath: file });\n } catch (err) {\n await handle.close().catch(() => {});\n throw err;\n }\n }\n\n async resume(id: string): Promise<ResumedSession> {\n const data = await this.load(id);\n const file = path.join(this.dir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n throw new Error(\n `Failed to open session \"${id}\" for append: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n const writer = new FileSessionWriter(\n id,\n handle,\n new Date().toISOString(),\n {\n id,\n model: data.metadata.model,\n provider: data.metadata.provider,\n },\n this.events,\n { resumed: true, dir: this.dir, filePath: file },\n );\n return { writer, data };\n }\n\n async load(id: string): Promise<SessionData> {\n const file = path.join(this.dir, `${id}.jsonl`);\n const raw = await fsp.readFile(file, 'utf8');\n const lines = raw.split('\\n').filter((l) => l.trim());\n const events: SessionEvent[] = [];\n for (const line of lines) {\n try {\n const parsed: unknown = JSON.parse(line);\n // Session JSONL is on-disk user-writable state; downstream replay\n // trusts `e.type` / `e.ts` etc. and would TypeError on a malformed\n // shape. Validate the discriminator + timestamp before pushing.\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n typeof (parsed as { type?: unknown }).type === 'string' &&\n typeof (parsed as { ts?: unknown }).ts === 'string'\n ) {\n events.push(parsed as SessionEvent);\n }\n // else: skip — a hand-edited file with a partial object should not\n // crash replay, just lose that one event.\n } catch {\n // skip malformed JSON\n }\n }\n const meta = this.metaFromEvents(id, events);\n const { messages, usage } = this.replay(events, id);\n return { metadata: meta, events, messages, usage };\n }\n\n async list(limit = 20): Promise<SessionSummary[]> {\n try {\n await ensureDir(this.dir);\n const files = await fsp.readdir(this.dir);\n const ids = files.filter((f) => f.endsWith('.jsonl')).map((f) => f.replace(/\\.jsonl$/, ''));\n // Read all manifests in parallel; fall back to full load only for\n // sessions that haven't been closed cleanly (or predate the manifest).\n const sessions = await Promise.all(ids.map((id) => this.summaryFor(id).catch(() => null)));\n const out = sessions.filter((s): s is SessionSummary => s !== null);\n out.sort((a, b) => {\n if (a.startedAt < b.startedAt) return 1;\n if (a.startedAt > b.startedAt) return -1;\n // Equal timestamps — use id as tiebreaker for stable sort\n return a.id.localeCompare(b.id);\n });\n return out.slice(0, limit);\n } catch {\n return [];\n }\n }\n\n private async summaryFor(id: string): Promise<SessionSummary> {\n const manifest = path.join(this.dir, `${id}.summary.json`);\n try {\n const raw = await fsp.readFile(manifest, 'utf8');\n return JSON.parse(raw) as SessionSummary;\n } catch {\n // Manifest missing/corrupt — fall back to a full parse and backfill\n // the manifest so the next `list()` hits the fast path.\n const full = path.join(this.dir, `${id}.jsonl`);\n const stat = await fsp.stat(full);\n const summary = await this.summarize(id, stat.mtime.toISOString());\n await fsp\n .writeFile(manifest, JSON.stringify(summary), { mode: 0o600 })\n .catch((err) => {\n // Best-effort manifest write — list() falls back to full parse\n // on next invocation, so surface the error for diagnostics but\n // don't fail the listing.\n console.warn(\n `[session-store] Failed to write manifest for \"${id}\":`,\n err instanceof Error ? err.message : String(err),\n );\n });\n return summary;\n }\n }\n\n async delete(id: string): Promise<void> {\n await fsp.unlink(path.join(this.dir, `${id}.jsonl`));\n await fsp.unlink(path.join(this.dir, `${id}.summary.json`)).catch(() => undefined);\n }\n\n private async summarize(id: string, mtime: string): Promise<SessionSummary> {\n try {\n const data = await this.load(id);\n const firstUser = data.events.find((e) => e.type === 'user_input');\n const title =\n firstUser && firstUser.type === 'user_input'\n ? userInputTitle(firstUser.content)\n : '(empty session)';\n return {\n id,\n title,\n startedAt: data.metadata.startedAt,\n model: data.metadata.model ?? 'unknown',\n provider: data.metadata.provider ?? 'unknown',\n tokenTotal: data.usage.input + data.usage.output,\n };\n } catch {\n return {\n id,\n title: '(damaged)',\n startedAt: mtime,\n model: 'unknown',\n provider: 'unknown',\n tokenTotal: 0,\n };\n }\n }\n\n private metaFromEvents(id: string, events: SessionEvent[]): SessionMetadata {\n const start = events.find((e) => e.type === 'session_start');\n const end = events.find((e) => e.type === 'session_end');\n return {\n id,\n startedAt: start?.ts ?? new Date(0).toISOString(),\n endedAt: end?.ts,\n model: start?.model,\n provider: start?.provider,\n };\n }\n\n private replay(\n events: SessionEvent[],\n sessionId = 'unknown',\n ): { messages: Message[]; usage: SessionData['usage'] } {\n const messages: Message[] = [];\n let usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n const openToolUses = new Set<string>();\n for (const e of events) {\n if (e.type === 'user_input') {\n openToolUses.clear();\n messages.push({ role: 'user', content: e.content });\n } else if (e.type === 'llm_response') {\n messages.push({ role: 'assistant', content: e.content });\n for (const b of e.content) {\n if (b.type === 'tool_use') openToolUses.add(b.id);\n }\n usage = {\n input: usage.input + (e.usage.input ?? 0),\n output: usage.output + (e.usage.output ?? 0),\n cacheRead: (usage.cacheRead ?? 0) + (e.usage.cacheRead ?? 0),\n cacheWrite: (usage.cacheWrite ?? 0) + (e.usage.cacheWrite ?? 0),\n };\n } else if (e.type === 'tool_result') {\n if (!openToolUses.has(e.id)) {\n // Orphan tool_result: tool_use was never seen. Skip to avoid\n // corrupting the replayed message sequence.\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `Orphan tool_result \"${e.id}\" has no matching tool_use`,\n });\n continue;\n }\n openToolUses.delete(e.id);\n const content: ContentBlock[] = [\n {\n type: 'tool_result',\n tool_use_id: e.id,\n content: typeof e.content === 'string' ? e.content : JSON.stringify(e.content),\n is_error: e.isError,\n },\n ];\n const last = messages[messages.length - 1];\n if (last && last.role === 'user') {\n if (Array.isArray(last.content)) {\n last.content.push(...content);\n } else if (typeof last.content === 'string') {\n // Convert string content to blocks and append\n last.content = [{ type: 'text', text: last.content }, ...content];\n } else {\n messages.push({ role: 'user', content });\n }\n } else {\n messages.push({ role: 'user', content });\n }\n }\n }\n if (openToolUses.size > 0) {\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `${openToolUses.size} tool_use blocks without matching results - replay repaired`,\n });\n // Damaged sessions still load; the repair pass below removes orphan\n // protocol blocks before the transcript can reach a provider.\n }\n const repaired = repairToolUseAdjacency(messages);\n if (repaired.report.changed) {\n this.events?.emit('session.damaged', {\n sessionId,\n detail:\n `Repaired replay adjacency: removed ${repaired.report.removedToolUses.length} tool_use, ` +\n `${repaired.report.removedToolResults.length} tool_result, ` +\n `${repaired.report.removedMessages} empty messages`,\n });\n }\n return { messages: repaired.messages, usage };\n }\n}\n\nclass FileSessionWriter implements SessionWriter {\n private closed = false;\n private closing = false;\n private manifestFile: string;\n private summary: SessionSummary;\n private tokenIn = 0;\n private tokenOut = 0;\n private readonly filePath: string;\n /** Public accessor for the JSONL path — required by SessionWriter so\n * observability surfaces (`/fleet log`, FleetPanel) can locate the\n * transcript without recomputing the path from session metadata. */\n get transcriptPath(): string | undefined {\n return this.filePath || undefined;\n }\n private initDone = false;\n private readonly resumed: boolean;\n private appendFailCount = 0;\n private lastAppendWarnAt = 0;\n\n // Rewind support: track pending file changes and prompt index\n private promptIndex = 0;\n private pendingFileSnapshots: Array<{\n path: string;\n action: 'created' | 'modified' | 'deleted';\n before: string | null;\n after: string | null;\n }> = [];\n\n // Register a pending file change. Call recordFileChange() from tools.\n recordFileChange(input: { path: string; action: 'created' | 'modified' | 'deleted'; before: string | null; after: string | null }): void {\n this.pendingFileSnapshots.push(input);\n }\n\n constructor(\n public readonly id: string,\n private readonly handle: fsp.FileHandle,\n private readonly startedAt: string,\n private readonly meta: Omit<SessionMetadata, 'startedAt'>,\n private readonly events?: EventBus,\n opts: { resumed?: boolean; dir?: string; filePath?: string } = {},\n ) {\n this.resumed = opts.resumed ?? false;\n this.manifestFile = opts.dir ? path.join(opts.dir, `${id}.summary.json`) : '';\n this.filePath = opts.filePath ?? '';\n this.summary = {\n id,\n title: '(empty session)',\n startedAt,\n model: meta.model ?? 'unknown',\n provider: meta.provider ?? 'unknown',\n tokenTotal: 0,\n };\n // Session start is written lazily on first append to avoid sync I/O\n // in constructor and eliminate reliance on FileHandle.fd private property.\n }\n\n private async writeSessionStartLazy(): Promise<void> {\n const record = `${JSON.stringify({\n type: this.resumed ? 'session_resumed' : 'session_start',\n ts: this.startedAt,\n id: this.id,\n model: this.meta.model ?? 'unknown',\n provider: this.meta.provider ?? 'unknown',\n })}\\n`;\n try {\n if (this.filePath) {\n // Use fs.promises.writeFile directly to avoid FileHandle.fd private access\n await fsp.writeFile(this.filePath, record, { flag: 'a', mode: 0o600 });\n }\n } catch {\n // best-effort; session will still be usable without the start event logged\n }\n }\n\n async append(event: SessionEvent): Promise<void> {\n if (this.closed) return;\n // Guard against concurrent append calls racing on lazy initialization.\n // Set initDone BEFORE the await so a second caller sees it and skips.\n if (!this.initDone) {\n this.initDone = true;\n await this.writeSessionStartLazy();\n }\n this.observeForSummary(event);\n try {\n await this.handle.appendFile(`${JSON.stringify(event)}\\n`, 'utf8');\n } catch (err) {\n // A persistent failure (full disk, broken pipe) would otherwise log\n // once per appended event — which for a chatty agent run is a lot.\n // Debounce to one log per 5 s and surface the suppressed count.\n this.appendFailCount++;\n const now = Date.now();\n if (now - this.lastAppendWarnAt > 5000) {\n const suppressed = this.appendFailCount - 1;\n const tail = suppressed > 0 ? ` (+${suppressed} suppressed)` : '';\n console.warn(\n '[session] append failed:',\n err instanceof Error ? err.message : String(err),\n tail,\n );\n this.lastAppendWarnAt = now;\n this.appendFailCount = 0;\n }\n }\n }\n\n /**\n * Watch events as they're appended and keep the summary state hot, so\n * `close()` can flush a `<id>.summary.json` manifest without re-reading\n * the JSONL. `list()` reads only manifests, turning a per-session full\n * parse into a single stat+read.\n */\n private observeForSummary(event: SessionEvent): void {\n if (event.type === 'user_input' && this.summary.title === '(empty session)') {\n this.summary = { ...this.summary, title: userInputTitle(event.content) };\n } else if (event.type === 'llm_response') {\n this.tokenIn += event.usage.input;\n this.tokenOut += event.usage.output;\n this.summary = { ...this.summary, tokenTotal: this.tokenIn + this.tokenOut };\n } else if (event.type === 'session_end') {\n // session_end usage is the canonical total — prefer it if non-zero.\n const total = event.usage.input + event.usage.output;\n if (total > 0) this.summary = { ...this.summary, tokenTotal: total };\n }\n }\n\n async close(): Promise<void> {\n if (this.closing) return;\n this.closing = true;\n this.closed = true;\n if (this.manifestFile) {\n try {\n await fsp.writeFile(this.manifestFile, JSON.stringify(this.summary), { mode: 0o600 });\n } catch {\n // manifest write is best-effort; list() falls back to full load.\n }\n }\n try {\n await this.handle.close();\n } catch {\n // ignore\n }\n }\n\n async writeCheckpoint(promptIndex: number, promptPreview: string): Promise<void> {\n // Flush pending file snapshots before checkpoint\n const fileCount = this.pendingFileSnapshots.length;\n if (fileCount > 0) {\n await this.writeFileSnapshot(promptIndex, [...this.pendingFileSnapshots]);\n this.pendingFileSnapshots = [];\n }\n this.promptIndex = promptIndex + 1;\n await this.append({\n type: 'checkpoint',\n ts: new Date().toISOString(),\n promptIndex,\n promptPreview,\n });\n // Notify UIs so they can update checkpoint timelines\n this.events?.emit('checkpoint.written', {\n promptIndex,\n promptPreview,\n ts: new Date().toISOString(),\n fileCount,\n });\n }\n\n async writeFileSnapshot(\n promptIndex: number,\n files: import('../types/session.js').FileSnapshot[],\n ): Promise<void> {\n await this.append({\n type: 'file_snapshot',\n ts: new Date().toISOString(),\n promptIndex,\n files,\n });\n }\n\n async truncateToCheckpoint(targetPromptIndex: number): Promise<number> {\n if (!this.filePath) return 0;\n const raw = await fsp.readFile(this.filePath, 'utf8');\n const lines = raw.split('\\n');\n const kept: string[] = [];\n let removedCount = 0;\n\n // Find the line index of the target checkpoint and all later checkpoint events.\n // Events at lines >= targetCheckpointLine are after the target and must be removed\n // (except checkpoint/file_snapshot themselves which we track via promptIndex).\n let targetCheckpointLine = -1;\n let afterTarget = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (!line.trim()) continue;\n\n let event: { type?: string; promptIndex?: number };\n try {\n event = JSON.parse(line);\n } catch {\n kept.push(line);\n continue;\n }\n\n if (event.type === 'checkpoint') {\n if ((event as { promptIndex: number }).promptIndex === targetPromptIndex) {\n targetCheckpointLine = kept.length; // where this checkpoint will be stored\n afterTarget = true;\n } else if ((event as { promptIndex: number }).promptIndex > targetPromptIndex) {\n afterTarget = true;\n }\n }\n\n if (event.promptIndex !== undefined && event.promptIndex > targetPromptIndex) {\n removedCount++;\n } else if (event.promptIndex === undefined) {\n // Events without promptIndex (user_input, llm_response, session_start, etc.)\n // are kept ONLY if we haven't passed the target checkpoint yet\n if (!afterTarget || targetCheckpointLine === -1) {\n kept.push(line);\n } else {\n removedCount++;\n }\n } else {\n kept.push(line);\n }\n }\n\n const truncated = kept.join('\\n');\n await fsp.writeFile(this.filePath, truncated + '\\n', 'utf8');\n\n await this.append({\n type: 'rewound',\n ts: new Date().toISOString(),\n toPromptIndex: targetPromptIndex,\n revertedFiles: [],\n });\n\n this.events?.emit('session.rewound', {\n toPromptIndex: targetPromptIndex,\n revertedFiles: [],\n removedEvents: removedCount,\n });\n\n return removedCount;\n }\n}\n\nfunction userInputTitle(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content.slice(0, 60);\n const text = content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join(' ');\n return (text || '(non-text input)').slice(0, 60);\n}\n","import * as path from 'node:path';\nimport { DefaultSessionStore } from '../storage/session-store.js';\nimport type { SessionStore, SessionWriter } from '../types/session.js';\n\n/**\n * Per-subagent session factory.\n *\n * Director runs produce many parallel transcripts — one per spawned\n * subagent — and we want them all rooted under the same director-run\n * directory so a future `wstack replay <runId>` can rehydrate the whole\n * fleet from a single tree.\n *\n * The factory builds (or accepts) a `SessionStore` whose `dir` points at\n * `<sessionsRoot>/<directorRunId>/`, and returns a small `create()`\n * function that the orchestration layer calls per-spawn. Each call\n * yields a fresh `SessionWriter` whose JSONL file lives in that\n * directory, named by either the caller-supplied `subagentId` (preferred,\n * so the file name is human-readable) or a derived id.\n *\n * **Why a thin factory instead of plumbing options through every spawn\n * site?** Because the director is the only caller that needs this\n * isolation pattern, and shoving `sessionStore` options into\n * `SubagentConfig` would leak storage details into a config shape that\n * agents and the coordinator have no business knowing about.\n */\nexport interface DirectorSessionFactoryOptions {\n /**\n * Either a parent directory where `<directorRunId>/` will be created,\n * or a pre-built `SessionStore` whose `dir` already points at the\n * director run directory. Tests pass an in-memory store for isolation;\n * production code passes the path under `~/.wrongstack/sessions/`.\n */\n store?: SessionStore;\n sessionsRoot?: string;\n /**\n * Director run id — namespaces all subagent JSONLs under one folder.\n * Defaults to a timestamped id; supplied explicitly when resuming a\n * prior fleet manifest.\n */\n directorRunId?: string;\n}\n\nexport interface DirectorSessionFactory {\n /** Absolute directory where this director run's transcripts live. */\n readonly dir: string;\n /** The director run id used to namespace the directory. */\n readonly directorRunId: string;\n /**\n * Create a fresh `SessionWriter` for the named subagent. Each\n * subagent gets its own JSONL file. The writer's `id` matches the\n * supplied `subagentId` so disk paths line up with in-memory ids.\n */\n createSubagentSession(args: {\n subagentId: string;\n provider?: string;\n model?: string;\n title?: string;\n }): Promise<SessionWriter>;\n}\n\n/**\n * Build a `DirectorSessionFactory`. Pass either a pre-configured\n * `SessionStore` (tests) or a `sessionsRoot` path (production). When\n * neither is supplied the factory throws — there's no sane default for\n * \"where do these JSONLs live\".\n */\nexport function makeDirectorSessionFactory(\n opts: DirectorSessionFactoryOptions,\n): DirectorSessionFactory {\n const runId = opts.directorRunId ?? `${new Date().toISOString().replace(/[:.]/g, '-')}-director`;\n\n let store: SessionStore;\n let dir: string;\n if (opts.store) {\n // The caller wired its own store — we trust them on where the\n // files land. We can't introspect a `SessionStore`'s directory\n // without a typed accessor, so we report the run id and let the\n // caller record the path separately if needed.\n store = opts.store;\n dir = opts.sessionsRoot ? path.join(opts.sessionsRoot, runId) : '(caller-managed)';\n } else if (opts.sessionsRoot) {\n dir = path.join(opts.sessionsRoot, runId);\n store = new DefaultSessionStore({ dir });\n } else {\n throw new Error('makeDirectorSessionFactory requires either `store` or `sessionsRoot`');\n }\n\n return {\n dir,\n directorRunId: runId,\n async createSubagentSession({ subagentId, provider, model, title }) {\n // Per-subagent JSONL — DefaultSessionStore generates the file name\n // from the metadata `id`, so we pass `subagentId` directly to\n // keep disk artifacts human-readable.\n return store.create({\n id: subagentId,\n title: title ?? subagentId,\n provider: provider ?? 'unknown',\n model: model ?? 'unknown',\n });\n },\n };\n}\n","import { FleetBus } from './fleet-bus.js';\n\n/**\n * A no-op FleetBus that discards all events. Used when no real fleet\n * bus is available (non-director mode) so the runner's `fleetBus`\n * field is always valid and the `attach()` call is always safe.\n *\n * One singleton instance is sufficient — it has no state to reset.\n */\nexport const NULL_FLEET_BUS = new FleetBus();\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport type { SubagentConfig } from '../types/multi-agent.js';\nimport type { SessionWriter } from '../types/session.js';\nimport { DirectorStateCheckpoint } from '../storage/director-state.js';\nimport { FleetBus, FleetUsageAggregator } from './fleet-bus.js';\nimport type { FleetUsage } from './fleet-bus.js';\nimport type { IFleetManager } from './ifleet-manager.js';\n\n/** Options for constructing a FleetManager. */\nexport interface FleetManagerOptions {\n manifestPath?: string;\n sessionsRoot?: string;\n directorRunId?: string;\n maxSpawns?: number;\n maxSpawnDepth?: number;\n spawnDepth?: number;\n stateCheckpointPath?: string;\n sessionWriter?: SessionWriter;\n manifestDebounceMs?: number;\n checkpointDebounceMs?: number;\n directorBudget?: { maxCostUsd?: number };\n}\n\n/**\n * Fleet-level policy container extracted from `Director`. Owns:\n * - FleetBus + FleetUsageAggregator\n * - Spawn caps and counters\n * - Manifest entries and debounced writing\n * - State checkpointing\n *\n * This lets the `Director` focus on orchestration (spawn/assign/await/ask)\n * while fleet-level decisions live in one place. The class implements\n * `IFleetManager` so it remains swappable in future.\n *\n * @example\n * ```typescript\n * const fm = new FleetManager({ manifestPath: '/tmp/fleet.json' });\n * const err = fm.canSpawn({ name: 'worker' });\n * if (!err) fm.recordSpawn('sub-1', { name: 'worker' });\n * await fm.writeManifest();\n * ```\n */\nexport class FleetManager implements IFleetManager {\n /** The fleet-wide event bus. */\n readonly fleet: FleetBus;\n /** Usage rollup across all subagents. */\n readonly usage: FleetUsageAggregator;\n\n private readonly manifestPath?: string;\n private readonly sessionsRoot?: string;\n private readonly directorRunId: string;\n /** Spawn cap (lifetime total). Infinity means unlimited. */\n readonly maxSpawns: number;\n /** Nesting cap. */\n readonly maxSpawnDepth: number;\n /** This director's depth in a director chain. Root = 0. */\n readonly spawnDepth: number;\n /** Live spawn counter. */\n private spawnCount = 0;\n private readonly stateCheckpoint: DirectorStateCheckpoint | null;\n private readonly sessionWriter: SessionWriter | null;\n private manifestTimer: NodeJS.Timeout | null = null;\n private readonly manifestDebounceMs: number;\n /** Fleet-wide cost cap. Infinity = no cap. Distinct from SubagentBudget limits,\n * which track per-subagent spend — this field caps the entire fleet total. */\n private readonly maxFleetCostUsd: number;\n private readonly manifestEntries = new Map<\n string,\n { subagentId: string; name: string; role?: string; provider?: string; model?: string; taskIds: string[] }\n >();\n /** Pending tasks with their descriptions — populated by `addPendingTask`\n * and cleared by `removePendingTask`. Replaces the host-side `pending`\n * Map so task descriptions live in one place (FleetManager). */\n private readonly pendingTasks = new Map<string, { subagentId: string; description: string }>();\n private readonly subagentMeta = new Map<string, { provider?: string; model?: string }>();\n private readonly priceLookups = new Map<string, { input?: number; output?: number; cacheRead?: number; cacheWrite?: number }>();\n\n constructor(opts: FleetManagerOptions = {}) {\n this.manifestPath = opts.manifestPath;\n this.sessionsRoot = opts.sessionsRoot;\n this.directorRunId = opts.directorRunId ?? randomUUID();\n this.maxSpawns = opts.maxSpawns ?? Number.POSITIVE_INFINITY;\n this.maxSpawnDepth = opts.maxSpawnDepth ?? 2;\n this.spawnDepth = opts.spawnDepth ?? 0;\n this.sessionWriter = opts.sessionWriter ?? null;\n this.manifestDebounceMs = opts.manifestDebounceMs ?? 2000;\n this.maxFleetCostUsd = opts.directorBudget?.maxCostUsd ?? Number.POSITIVE_INFINITY;\n this.stateCheckpoint = opts.stateCheckpointPath\n ? new DirectorStateCheckpoint(\n opts.stateCheckpointPath,\n {\n directorRunId: this.directorRunId,\n maxSpawns: opts.maxSpawns,\n spawnDepth: this.spawnDepth,\n maxSpawnDepth: this.maxSpawnDepth,\n directorBudget: opts.directorBudget,\n },\n opts.checkpointDebounceMs ?? 250,\n )\n : null;\n\n this.fleet = new FleetBus();\n this.usage = new FleetUsageAggregator(\n this.fleet,\n (id) => this.priceLookups.get(id),\n (id) => this.subagentMeta.get(id),\n );\n }\n\n // -----------------------------------------------------------------------\n // IFleetManager surface\n // -----------------------------------------------------------------------\n\n get fleetBus(): FleetBus {\n return this.fleet;\n }\n\n snapshot(): FleetUsage {\n return this.usage.snapshot();\n }\n\n getSubagentMeta(id: string): { provider?: string; model?: string; name?: string } | undefined {\n return this.subagentMeta.get(id);\n }\n\n /**\n * Returns null if the spawn is allowed, or an object describing\n * which cap was exceeded. Does NOT throw — the caller decides\n * how to surface the rejection.\n */\n canSpawn(config: SubagentConfig): { kind: 'max_spawns' | 'max_spawn_depth' | 'max_cost_usd'; limit: number; observed: number } | null {\n if (this.spawnDepth >= this.maxSpawnDepth) {\n return { kind: 'max_spawn_depth', limit: this.maxSpawnDepth, observed: this.spawnDepth };\n }\n if (this.spawnCount >= this.maxSpawns) {\n return { kind: 'max_spawns', limit: this.maxSpawns, observed: this.spawnCount + 1 };\n }\n if (this.maxFleetCostUsd < Number.POSITIVE_INFINITY) {\n const totalCost = this.usage.snapshot().total?.cost ?? 0;\n if (totalCost >= this.maxFleetCostUsd) {\n return { kind: 'max_cost_usd', limit: this.maxFleetCostUsd, observed: totalCost };\n }\n }\n return null;\n }\n\n /**\n * Records a spawn: increments counter, stores metadata, updates state checkpoint,\n * and schedules a debounced manifest write. Call AFTER the coordinator\n * has successfully spawned the subagent.\n *\n * @param subagentId The subagent's id (from coordinator.spawn result)\n * @param config The SubagentConfig that was used\n * @param priceLookup Optional per-subagent pricing data\n */\n recordSpawn(\n subagentId: string,\n config: SubagentConfig,\n priceLookup?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number },\n ): void {\n this.spawnCount += 1;\n this.subagentMeta.set(subagentId, {\n provider: config.provider,\n model: config.model,\n });\n if (priceLookup) this.priceLookups.set(subagentId, priceLookup);\n this.manifestEntries.set(subagentId, {\n subagentId,\n name: config.name,\n role: config.role,\n provider: config.provider,\n model: config.model,\n taskIds: [],\n });\n // State checkpoint: persist the spawn even before any task is assigned\n this.stateCheckpoint?.recordSpawn({\n id: subagentId,\n name: config.name,\n role: config.role,\n provider: config.provider,\n model: config.model,\n spawnedAt: new Date().toISOString(),\n }, this.spawnCount);\n void this.appendSessionEvent({\n type: 'agent_spawned',\n ts: new Date().toISOString(),\n agentId: subagentId,\n role: config.role ?? config.name,\n });\n this.scheduleManifest();\n }\n\n async writeManifest(): Promise<string | null> {\n if (!this.manifestPath) return null;\n const manifest = {\n version: 1,\n directorRunId: this.directorRunId,\n generatedAt: new Date().toISOString(),\n children: Array.from(this.manifestEntries.values()).map((entry) => ({\n id: entry.subagentId,\n name: entry.name,\n role: entry.role,\n provider: entry.provider,\n model: entry.model,\n taskIds: entry.taskIds,\n })),\n usage: this.usage.snapshot(),\n };\n await fsp.mkdir(path.dirname(this.manifestPath), { recursive: true });\n await fsp.writeFile(this.manifestPath, JSON.stringify(manifest, null, 2), { mode: 0o600 });\n return this.manifestPath;\n }\n\n /**\n * Attach task ids to an already-spawned subagent. Called by\n * `Director.assign()` after the coordinator assigns a task.\n */\n addTaskToSubagent(subagentId: string, taskId: string): void {\n const entry = this.manifestEntries.get(subagentId);\n if (entry) entry.taskIds.push(taskId);\n }\n\n /**\n * Debounced manifest write. Call after any state mutation\n * (spawn, assign, complete) so a burst collapses into one write.\n */\n scheduleManifest(): void {\n if (!this.manifestPath || this.manifestDebounceMs <= 0) return;\n if (this.manifestTimer) return;\n this.manifestTimer = setTimeout(() => {\n this.manifestTimer = null;\n void this.writeManifest().catch(() => undefined);\n }, this.manifestDebounceMs);\n }\n\n /** Best-effort session event writer. Swallows failures. */\n private async appendSessionEvent(event: Parameters<SessionWriter['append']>[0]): Promise<void> {\n if (!this.sessionWriter) return;\n try {\n await this.sessionWriter.append(event);\n } catch {\n // ignore\n }\n }\n\n // -----------------------------------------------------------------------\n // Pending task management — eliminates host-side state duplication\n // -----------------------------------------------------------------------\n\n addPendingTask(taskId: string, subagentId: string, description: string): void {\n this.pendingTasks.set(taskId, { subagentId, description });\n }\n\n removePendingTask(taskId: string): void {\n this.pendingTasks.delete(taskId);\n }\n\n getFleetStatus(): {\n pending: { taskId: string; description: string; subagentId: string }[];\n live: { subagentId: string; status: string; task?: string }[];\n } {\n const pending = Array.from(this.pendingTasks.entries()).map(([taskId, v]) => ({\n taskId,\n description: v.description,\n subagentId: v.subagentId,\n }));\n // live is populated by MultiAgentHost from the coordinator — fleet\n // manager has no direct visibility into subagent status\n return { pending, live: [] };\n }\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/atomic-write.ts","../../src/storage/director-state.ts","../../src/coordination/in-memory-transport.ts","../../src/coordination/agent-bridge.ts","../../src/coordination/director-prompts.ts","../../src/coordination/fleet-bus.ts","../../src/types/errors.ts","../../src/types/provider.ts","../../src/coordination/subagent-budget.ts","../../src/coordination/fleet.ts","../../src/coordination/multi-agent-coordinator.ts","../../src/coordination/director-tools.ts","../../src/coordination/director.ts","../../src/coordination/delegate-tool.ts","../../src/coordination/agent-subagent-runner.ts","../../src/utils/message-invariants.ts","../../src/storage/session-store.ts","../../src/coordination/director-session.ts","../../src/coordination/null-fleet-bus.ts","../../src/coordination/fleet-manager.ts"],"names":["path","fs","stat","fsp","lock","handlers","randomUUID","baseMessage","fsp2","path2","instantiateRosterConfig","partial","path3","fsp3","randomBytes","path5","fsp5","path6"],"mappings":"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","file":"index.js","sourcesContent":["import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import * as fsp from 'node:fs/promises';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * Director state checkpoint — written incrementally throughout a fleet\n * run so a crashed director can be inspected (and eventually resumed)\n * instead of leaving only a final `fleet.json` manifest after `shutdown()`.\n *\n * Schema is JSON-friendly and deliberately denormalized. Each mutation\n * triggers an atomic-write of the whole file — small payloads (typically\n * < 10 KB even with dozens of subagents) make this cheap.\n */\nexport interface DirectorSubagentState {\n id: string;\n name?: string;\n role?: string;\n provider?: string;\n model?: string;\n spawnedAt: string;\n}\n\nexport interface DirectorTaskState {\n taskId: string;\n subagentId?: string;\n description?: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'stopped' | 'timeout';\n assignedAt?: string;\n completedAt?: string;\n iterations?: number;\n toolCalls?: number;\n durationMs?: number;\n error?: string;\n}\n\nexport interface DirectorStateSnapshot {\n version: 1;\n directorRunId: string;\n updatedAt: string;\n spawnCount: number;\n maxSpawns?: number;\n spawnDepth: number;\n maxSpawnDepth: number;\n directorBudget?: {\n maxCostUsd?: number;\n };\n subagents: DirectorSubagentState[];\n tasks: DirectorTaskState[];\n /** Aggregated usage snapshot. Optional — populated by the Director on save when available. */\n usage?: unknown;\n}\n\nexport async function loadDirectorState(filePath: string): Promise<DirectorStateSnapshot | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as DirectorStateSnapshot;\n if (parsed?.version !== 1) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\n/**\n * Lock file entry written when a director starts. Prevents two directors\n * from resuming the same run — the second one sees the lock and refuses\n * rather than corrupting the checkpoint by writing concurrently.\n */\nexport interface DirectorStateLock {\n pid: number;\n hostname: string;\n startedAt: string;\n}\n\n/**\n * Write a lock file to claim this checkpoint. Returns false if the lock\n * is already held by a live process; returns true if the lock was acquired\n * (either the file didn't exist, or the previous holder is dead).\n */\nexport async function acquireDirectorStateLock(\n lockPath: string,\n processId = process.pid,\n): Promise<boolean> {\n let existing: string | undefined;\n try {\n existing = await fsp.readFile(lockPath, 'utf8');\n } catch {\n // No lock file — we're safe to claim\n }\n\n if (existing) {\n try {\n const lock = JSON.parse(existing) as DirectorStateLock;\n // Check if the process is still alive\n try {\n process.kill(lock.pid, 0);\n // Signal success means the process is alive — another director\n // owns this checkpoint. Refuse.\n return false;\n } catch {\n // ESRCH means the process is dead — stale lock. We'll overwrite.\n }\n } catch {\n // Malformed lock — treat as stale.\n }\n }\n\n const lock: DirectorStateLock = {\n pid: processId,\n hostname: require('node:os').hostname(),\n startedAt: new Date().toISOString(),\n };\n await atomicWrite(lockPath, JSON.stringify(lock), { mode: 0o600 });\n return true;\n}\n\n/**\n * Remove the lock file. Call this on graceful Director.shutdown() so the\n * next director run can claim the checkpoint without stale-lock checks.\n */\nexport async function releaseDirectorStateLock(lockPath: string): Promise<void> {\n try {\n await fsp.unlink(lockPath);\n } catch {\n // ignore\n }\n}\n\n/**\n * In-memory accumulator with atomic-write checkpoint. The Director keeps\n * an instance, mutates it on every spawn/assign/complete/fail event, and\n * the instance debounces writes so a burst of activity collapses into a\n * single disk hit.\n *\n * Supports crash recovery: use `loadDirectorState()` to read an existing\n * checkpoint, then call `DirectorStateCheckpoint.resume(snapshot)` to\n * re-attach to a fleet mid-flight. The lock mechanism ensures no two\n * directors can claim the same checkpoint.\n */\nexport class DirectorStateCheckpoint {\n private snapshot: DirectorStateSnapshot;\n private readonly filePath: string;\n private readonly lockPath: string;\n private timer: NodeJS.Timeout | null = null;\n private readonly debounceMs: number;\n private writing = false;\n private rewriteRequested = false;\n\n constructor(\n filePath: string,\n init: {\n directorRunId: string;\n maxSpawns?: number;\n spawnDepth: number;\n maxSpawnDepth: number;\n directorBudget?: {\n maxCostUsd?: number;\n };\n },\n debounceMs = 250,\n ) {\n this.filePath = filePath;\n // Lock file lives alongside the checkpoint — `<path>.lock`\n this.lockPath = `${filePath}.lock`;\n this.debounceMs = debounceMs;\n this.snapshot = {\n version: 1,\n directorRunId: init.directorRunId,\n updatedAt: new Date().toISOString(),\n spawnCount: 0,\n maxSpawns: init.maxSpawns,\n spawnDepth: init.spawnDepth,\n maxSpawnDepth: init.maxSpawnDepth,\n directorBudget: init.directorBudget,\n subagents: [],\n tasks: [],\n };\n }\n\n /**\n * Attempt to acquire the lock for this checkpoint. Call this before\n * resuming a crashed director run. If it returns false, another\n * director process is still running this fleet — do not resume.\n */\n async acquireLock(): Promise<boolean> {\n return acquireDirectorStateLock(this.lockPath);\n }\n\n /**\n * Release the lock on graceful shutdown. Call `flush()` first to ensure\n * the final checkpoint state is on disk before removing the lock.\n * Without this, the next resume will see a stale-lock and refuse.\n */\n async releaseLock(): Promise<void> {\n return releaseDirectorStateLock(this.lockPath);\n }\n\n /**\n * Resume from a snapshot previously loaded via `loadDirectorState()`.\n * Use this when `--resume <runId>` is triggered — the snapshot has\n * the full fleet state (subagents, tasks) from before the crash; the\n * checkpoint continues from there.\n */\n resume(snapshot: DirectorStateSnapshot): void {\n this.snapshot = snapshot;\n }\n\n current(): DirectorStateSnapshot {\n return this.snapshot;\n }\n\n recordSpawn(sub: DirectorSubagentState, spawnCount: number): void {\n this.snapshot = {\n ...this.snapshot,\n spawnCount,\n subagents: [...this.snapshot.subagents.filter((s) => s.id !== sub.id), sub],\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n recordTaskAssigned(task: DirectorTaskState): void {\n const exists = this.snapshot.tasks.some((t) => t.taskId === task.taskId);\n this.snapshot = {\n ...this.snapshot,\n tasks: exists\n ? this.snapshot.tasks.map((t) => (t.taskId === task.taskId ? { ...t, ...task } : t))\n : [...this.snapshot.tasks, task],\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n recordTaskStatus(\n taskId: string,\n patch: Partial<DirectorTaskState> & { status: DirectorTaskState['status'] },\n ): void {\n this.snapshot = {\n ...this.snapshot,\n tasks: this.snapshot.tasks.map((t) =>\n t.taskId === taskId ? { ...t, ...patch } : t,\n ),\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n setUsage(usage: unknown): void {\n this.snapshot = { ...this.snapshot, usage };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n /** Force a synchronous flush — used by Director.shutdown(). */\n async flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n await this.persist();\n // If a rewrite was requested while we waited, persist() scheduled\n // a follow-up write. Wait for it so shutdown doesn't return before\n // the most recent state lands on disk.\n if (this.rewriteRequested) {\n this.rewriteRequested = false;\n await this.persist();\n }\n }\n\n private bumpUpdatedAt(): void {\n this.snapshot = { ...this.snapshot, updatedAt: new Date().toISOString() };\n }\n\n private schedule(): void {\n if (this.timer) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.persist();\n }, this.debounceMs);\n }\n\n private async persist(): Promise<void> {\n if (this.writing) {\n // A write is already in flight — defer to a follow-up flush so the\n // most recent state still lands. Without this guard, simultaneous\n // burst mutations can drop the latest snapshot if rename races.\n this.rewriteRequested = true;\n return;\n }\n this.writing = true;\n try {\n await atomicWrite(this.filePath, JSON.stringify(this.snapshot, null, 2), {\n mode: 0o600,\n });\n } catch (err) {\n console.warn(\n '[director-state] checkpoint write failed:',\n err instanceof Error ? err.message : String(err),\n );\n } finally {\n this.writing = false;\n if (this.rewriteRequested) {\n this.rewriteRequested = false;\n this.schedule();\n }\n }\n }\n}\n","import type { BridgeMessage, BridgeTransport } from '../types/agent-bridge.js';\n\n/**\n * In-memory pub/sub transport for agent-to-agent messaging.\n * Subscribers register by agentId and receive messages via callback.\n */\nexport class InMemoryBridgeTransport implements BridgeTransport {\n private readonly subs = new Map<string, Set<(msg: BridgeMessage) => void>>();\n\n send(msg: BridgeMessage, to: string): Promise<void> {\n // Broadcast: deliver to every subscriber except the sender.\n if (to === '*') {\n for (const [id, handlers] of this.subs) {\n if (id === msg.from) continue;\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n const handlers = this.subs.get(to);\n if (handlers) {\n for (const h of handlers) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n }\n return Promise.resolve();\n }\n\n subscribe(agentId: string, handler: (msg: BridgeMessage) => void): () => void {\n if (!this.subs.has(agentId)) this.subs.set(agentId, new Set());\n this.subs.get(agentId)!.add(handler);\n return () => this.subs.get(agentId)?.delete(handler);\n }\n\n close(agentId: string): Promise<void> {\n this.subs.delete(agentId);\n return Promise.resolve();\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type {\n AgentBridge,\n AgentBridgeConfig,\n BridgeMessage,\n BridgeTransport,\n} from '../types/agent-bridge.js';\nimport { InMemoryBridgeTransport } from './in-memory-transport.js';\n\n// Re-export for backwards compatibility\nexport { InMemoryBridgeTransport };\n\nexport class InMemoryAgentBridge implements AgentBridge {\n readonly agentId: string;\n readonly coordinatorId: string;\n private readonly transport: BridgeTransport;\n private readonly subscriptions: Set<(msg: BridgeMessage) => void> = new Set();\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (msg: BridgeMessage) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n private stopped = false;\n private timeoutMs: number;\n /** Guards request() so concurrent calls on the same id can't silently overwrite. */\n private readonly inflightGuards = new Set<string>();\n\n constructor(config: AgentBridgeConfig, transport: BridgeTransport) {\n this.agentId = config.agentId;\n this.coordinatorId = config.coordinatorId;\n this.transport = transport;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n\n this.transport.subscribe(this.agentId, (msg) => {\n if (msg.type === 'heartbeat') return;\n\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id);\n this.inflightGuards.delete(msg.id);\n pending.resolve(msg);\n return;\n }\n\n for (const h of this.subscriptions) {\n try {\n h(msg);\n } catch {\n /* ignore */\n }\n }\n });\n }\n\n async send(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n await this.transport.send(msg, msg.to ?? this.coordinatorId);\n }\n\n async broadcast(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n msg.to = '*';\n await this.transport.send(msg, '*');\n }\n\n subscribe(handler: (msg: BridgeMessage) => void | Promise<void>): () => void {\n this.subscriptions.add(handler as (msg: BridgeMessage) => void);\n return () => this.subscriptions.delete(handler as (msg: BridgeMessage) => void);\n }\n\n async request<T>(msg: BridgeMessage, timeoutMs?: number): Promise<BridgeMessage<T>> {\n if (this.stopped) throw new Error('Bridge is stopped');\n const timeout = timeoutMs ?? this.timeoutMs;\n const correlationId = msg.id;\n\n // Guard against concurrent calls reusing the same id. Without this check,\n // a second .set() would silently overwrite the first record — the original\n // caller's timer fires, deletes the entry, and resolves its promise, but\n // the second caller now has no entry to resolve when its timer fires.\n // Throwing here surfaces the caller bug rather than letting it hang.\n if (this.inflightGuards.has(correlationId)) {\n throw new Error(\n `Bridge request id \"${correlationId}\" collides with an in-flight request — caller is reusing message ids`,\n );\n }\n this.inflightGuards.add(correlationId);\n\n return new Promise((resolve, reject) => {\n // Declare timer first so we can reference it in the stopped-check below.\n const timer = setTimeout(() => {\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(new Error(`Request ${correlationId} timed out after ${timeout}ms`));\n }, timeout);\n\n // Double-check stopped after setting up the pending entry, so stop()\n // can't miss a request that was enqueued before it acquired the lock.\n if (this.stopped) {\n clearTimeout(timer);\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(new Error('Bridge stopped'));\n return;\n }\n\n this.pendingRequests.set(correlationId, {\n resolve: resolve as (msg: BridgeMessage) => void,\n reject,\n timer,\n });\n\n msg.timestamp = Date.now();\n this.transport.send(msg, msg.to ?? this.coordinatorId).catch((e) => {\n clearTimeout(timer);\n this.inflightGuards.delete(correlationId);\n this.pendingRequests.delete(correlationId);\n reject(e);\n });\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n for (const [, p] of this.pendingRequests) {\n clearTimeout(p.timer);\n p.reject(new Error('Bridge stopped'));\n }\n this.pendingRequests.clear();\n this.inflightGuards.clear();\n this.subscriptions.clear();\n await this.transport.close(this.agentId);\n }\n}\n\nexport function createMessage<T = unknown>(\n type: BridgeMessage['type'],\n from: string,\n payload: T,\n to?: string,\n): BridgeMessage<T> {\n return {\n id: randomUUID(),\n type,\n from,\n to,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n}\n","/**\n * System-prompt composition helpers for the Director ecosystem.\n *\n * Two callers need composed prompts:\n *\n * 1. The **leader** (the director's own Agent) — needs a preamble that\n * explains the fleet protocol: when to spawn, when to await, how to\n * roll up, and the eight orchestration tools it owns.\n *\n * 2. Each **subagent** — needs a baseline that explains it has a parent\n * it can call via the bridge, a role-specific block, the task brief,\n * and finally any per-spawn `systemPromptOverride` from `SubagentConfig`.\n *\n * Both composers are pure functions: feed them parts, they return a string.\n * No I/O, no side effects, no implicit defaults beyond the ones exported\n * here. Callers (CLI multi-agent factory, Director itself) decide which\n * parts to fill in — that keeps the composition seam visible and testable.\n */\n\n/**\n * Default fleet-protocol preamble injected at the **front** of the\n * director-agent's system prompt. Kept deliberately short — long preambles\n * crowd out the user's leader prompt and the LLM stops attending. The tool\n * descriptions live on the tool definitions themselves; this preamble only\n * teaches *when* to reach for them.\n */\nexport const DEFAULT_DIRECTOR_PREAMBLE = `\\\nYou are the Director of a multi-agent fleet. You orchestrate worker\nsubagents by spawning them, assigning tasks, awaiting completions, and\nrolling up their outputs into your next decision.\n\nCore fleet tools available to you:\n - spawn_subagent — create a worker with a chosen provider / model / role\n - assign_task — hand a piece of work to a specific subagent\n - await_tasks — block until named task ids complete (parallel-safe)\n - ask_subagent — synchronously query a running subagent via the bridge\n - roll_up — aggregate finished tasks into a markdown/json summary\n - terminate_subagent — abort a stuck worker (use sparingly)\n - fleet_status — snapshot of all subagents and pending tasks\n - fleet_usage — token + cost breakdown per subagent and total\n\nWorking rules:\n 1. Decompose first. Before spawning, decide which sub-tasks are\n independent and can run in parallel. Sequential work doesn't need a\n subagent — do it yourself.\n 2. Match worker to job. Cheap/fast model for triage, capable model for\n synthesis. Different providers per sibling is allowed and encouraged.\n 3. Always pair an assign with an await. Don't fire-and-forget; you owe\n the user a single coherent answer at the end.\n 4. Roll up before deciding. After await_tasks resolves, call roll_up so\n the results are folded back into your context in a compact form.\n 5. Budget is real. Check fleet_usage periodically. If a subagent is\n thrashing, terminate it rather than letting cost climb silently.\n 6. Never claim a subagent's work as your own without verifying it. If a\n result looks wrong, ask_subagent for clarification before passing it\n to the user.\\\n`;\n\n/**\n * Default baseline prepended to every subagent's system prompt. Tells the\n * subagent its place in the hierarchy and the bridge contract — without\n * this, a subagent has no way to know it *can* ask the parent for\n * clarification, and it will hallucinate answers when context is missing.\n *\n * Bridge contract: subagents may `send` progress and `request` answers, but\n * MAY NOT exfiltrate the parent's full system prompt or tools list. The\n * baseline reinforces this in plain text — the actual enforcement is at\n * the bridge transport layer.\n */\nexport const DEFAULT_SUBAGENT_BASELINE = `\\\nYou are a subagent operating under a Director. You were spawned to handle\na specific slice of a larger plan — do that slice well and report back.\n\nBridge contract:\n - You have a parent (the Director). You may call \\`request\\` on the\n parent bridge to ask a clarifying question. Use this sparingly; the\n parent is also working.\n - You MAY NOT request the parent's system prompt, tool list, or other\n subagents' context. Those are not yours to read.\n - Your final task output is what the Director sees. Be concise,\n structured, and self-contained — assume the Director will paste your\n output into its own context.\\\n`;\n\n/** Parts the leader-prompt composer accepts. All optional. */\nexport interface DirectorPromptParts {\n /** The user's existing leader system prompt — typically what was passed\n * via `MultiAgentConfig.leaderSystemPrompt`. */\n basePrompt?: string;\n /** Override the built-in fleet preamble. Pass empty string to suppress. */\n directorPreamble?: string;\n /** Optional roster summary block — a short list of pre-configured roles\n * the director can spawn (e.g. \"researcher, coder, reviewer\"). Helps\n * small models discover the available shapes without scanning tools. */\n rosterSummary?: string;\n}\n\n/**\n * Compose the leader/director's system prompt. Order:\n * 1. Director preamble (fleet protocol)\n * 2. Roster summary (optional, when provided)\n * 3. User base prompt (the per-project leader prompt)\n *\n * Sections are separated by a blank line. Empty parts are skipped so the\n * output never contains stray blank-line runs.\n */\nexport function composeDirectorPrompt(parts: DirectorPromptParts = {}): string {\n const sections: string[] = [];\n const preamble = parts.directorPreamble ?? DEFAULT_DIRECTOR_PREAMBLE;\n if (preamble && preamble.trim().length > 0) sections.push(preamble.trim());\n if (parts.rosterSummary && parts.rosterSummary.trim().length > 0) {\n sections.push(`Available roles you can spawn:\\n${parts.rosterSummary.trim()}`);\n }\n if (parts.basePrompt && parts.basePrompt.trim().length > 0) {\n sections.push(parts.basePrompt.trim());\n }\n return sections.join('\\n\\n');\n}\n\n/** Parts the subagent-prompt composer accepts. Layered from generic to\n * specific; later layers override earlier ones when they conflict. */\nexport interface SubagentPromptParts {\n /** Base persona/identity for *every* subagent. Defaults to the bridge\n * contract baseline. Pass empty string to suppress. */\n baseline?: string;\n /** Role-specific block, e.g. \"You are a code reviewer. Focus on…\". */\n role?: string;\n /** Task brief — usually the same string the runner passes as user input,\n * but exposed here in case the factory wants it duplicated in the\n * system prompt for reinforcement. */\n task?: string;\n /**\n * Absolute path to a shared scratchpad directory the whole fleet can\n * read/write. When set, the composer adds a \"Shared notes\" block that\n * tells the subagent where to drop findings and where to look for\n * sibling output. This is the cheap fleet-coordination channel —\n * agents don't need each other's transcripts, just each other's\n * conclusions. Falls between `task` and `override` so the override\n * can still narrow or replace it.\n */\n sharedScratchpad?: string;\n /** Final per-spawn override from `SubagentConfig.systemPromptOverride`.\n * Added last so it wins on conflict — that's by design: the spawn site\n * knows the most about what this specific subagent should do. */\n override?: string;\n}\n\n/**\n * Compose a subagent's system prompt. Order:\n * 1. Baseline (bridge contract)\n * 2. Role\n * 3. Task brief\n * 4. Per-spawn override\n *\n * Same blank-line-separated joining as the director composer.\n *\n * Layering rationale: the baseline never needs to change between\n * subagents; the role is the \"what kind of worker is this\"; the task is\n * the \"what should you do *now*\"; the override is the spawn-site escape\n * hatch (\"…and respond only in JSON\"). Putting override last means it\n * never gets squashed by something earlier in the chain.\n */\nexport function composeSubagentPrompt(parts: SubagentPromptParts = {}): string {\n const sections: string[] = [];\n const baseline = parts.baseline ?? DEFAULT_SUBAGENT_BASELINE;\n if (baseline && baseline.trim().length > 0) sections.push(baseline.trim());\n if (parts.role && parts.role.trim().length > 0) {\n sections.push(`Role:\\n${parts.role.trim()}`);\n }\n if (parts.task && parts.task.trim().length > 0) {\n sections.push(`Task:\\n${parts.task.trim()}`);\n }\n if (parts.sharedScratchpad && parts.sharedScratchpad.trim().length > 0) {\n sections.push(\n `Shared notes:\\n` +\n `A scratchpad shared with the rest of the fleet is mounted at \\`${parts.sharedScratchpad.trim()}\\`.\\n` +\n `- Write your final findings as markdown files there (e.g. \\`findings.md\\`, \\`security.md\\`).\\n` +\n `- Before starting, list the directory and read any sibling files relevant to your task — ` +\n `they may already contain context you can build on.\\n` +\n `- Use stable filenames (one file per concern); overwrite instead of appending so the ` +\n `Director sees the latest state.`,\n );\n }\n if (parts.override && parts.override.trim().length > 0) {\n sections.push(parts.override.trim());\n }\n return sections.join('\\n\\n');\n}\n\n/**\n * Render a short bullet list summarising a roster — useful for stuffing\n * into `composeDirectorPrompt({ rosterSummary })` so the director model\n * can see available roles without scanning tool descriptions.\n *\n * Each entry: `- <role-id>: <name>[ (provider/model)] — <prompt-headline>`\n * The prompt headline is the first non-empty line of `config.prompt`,\n * truncated to 80 chars. Skipped entirely when the role has no prompt.\n */\nexport function rosterSummaryFromConfigs(\n roster: Record<\n string,\n { name: string; provider?: string; model?: string; prompt?: string; role?: string }\n >,\n): string {\n const lines: string[] = [];\n for (const [roleId, cfg] of Object.entries(roster)) {\n const tag = cfg.provider && cfg.model ? ` (${cfg.provider}/${cfg.model})` : '';\n const headline = cfg.prompt\n ? (cfg.prompt.split('\\n').find((l) => l.trim().length > 0) ?? '').trim().slice(0, 80)\n : '';\n const tail = headline ? ` — ${headline}` : '';\n lines.push(`- ${roleId}: ${cfg.name}${tag}${tail}`);\n }\n return lines.join('\\n');\n}\n","import type { EventBus } from '../kernel/events.js';\r\n\r\n/**\r\n * Single fleet-wide event with subagent attribution. Whatever a child\r\n * agent emits on its own EventBus gets re-published here, prefixed with\r\n * `subagentId` so a single subscriber can multiplex across the fleet.\r\n *\r\n * The director uses `FleetBus.filter('tool.executed', …)` to see every\r\n * tool call across the fleet; the TUI uses\r\n * `FleetBus.subscribe(id, handler)` to render a per-subagent panel.\r\n */\r\nexport interface FleetEvent {\r\n subagentId: string;\r\n taskId?: string;\r\n ts: number;\r\n type: string;\r\n payload: unknown;\r\n}\r\n\r\nexport type FleetHandler = (event: FleetEvent) => void;\r\n\r\n/**\r\n * Fan-in for per-subagent EventBuses. Each subagent's bus is plugged in\r\n * via `attach()`; the FleetBus re-emits every event with subagent\r\n * attribution. Detachment is automatic via the returned disposer — call\r\n * it when a subagent terminates so we don't leak listeners.\r\n *\r\n * The bus exposes two subscription modes: by `subagentId` (everything\r\n * from one child) and by `type` (one event-type across the fleet). They\r\n * compose — if you need a per-subagent + per-type slice, subscribe by\r\n * type and filter on `event.subagentId` in your handler.\r\n */\r\nexport class FleetBus {\r\n private readonly byId = new Map<string, Set<FleetHandler>>();\r\n private readonly byType = new Map<string, Set<FleetHandler>>();\r\n private readonly any = new Set<FleetHandler>();\r\n\r\n /**\r\n * Hook a subagent's EventBus into the fleet. EventBus is strongly\r\n * typed and doesn't expose an `onAny` hook, so we subscribe to the\r\n * canonical set of event types a subagent emits during a run. New\r\n * event types added to the kernel must be added here too — but the\r\n * cost is a tiny single line per type, and the explicit list keeps\r\n * the wire format clear.\r\n *\r\n * Returns a disposer that detaches every subscription; call on\r\n * subagent teardown so the listeners don't outlive the run.\r\n */\r\n attach(subagentId: string, bus: EventBus, taskId?: string): () => void {\r\n const FORWARDED_TYPES = [\r\n 'tool.started',\r\n 'tool.executed',\r\n 'tool.progress',\r\n 'tool.confirm_needed',\r\n 'iteration.started',\r\n 'iteration.completed',\r\n 'provider.text_delta',\r\n // Subagent extended-thinking output. Forwarded so the FleetPanel /\r\n // /fleet log can surface \"the planner is thinking…\" instead of a\r\n // silent gap between iteration.started and the first text_delta.\r\n 'provider.thinking_delta',\r\n 'provider.response',\r\n 'provider.retry',\r\n 'provider.error',\r\n 'session.started',\r\n 'session.ended',\r\n 'session.damaged',\r\n 'compaction.fired',\r\n 'compaction.failed',\r\n 'token.threshold',\r\n // Subagent hit a soft budget limit — coordinator can extend or stop.\r\n 'budget.threshold_reached',\r\n ] as const;\r\n const offs: Array<() => void> = [];\r\n for (const t of FORWARDED_TYPES) {\r\n offs.push(\r\n bus.on(t, (payload: unknown) => {\r\n this.emit({ subagentId, taskId, ts: Date.now(), type: t, payload });\r\n }),\r\n );\r\n }\r\n return () => {\r\n for (const off of offs) off();\r\n };\r\n }\r\n\r\n /** Subscribe to every event from one subagent. */\r\n subscribe(subagentId: string, handler: FleetHandler): () => void {\r\n let set = this.byId.get(subagentId);\r\n if (!set) {\r\n set = new Set();\r\n this.byId.set(subagentId, set);\r\n }\r\n set.add(handler);\r\n return () => {\r\n set!.delete(handler);\r\n };\r\n }\r\n\r\n /** Subscribe to one event type across all subagents. */\r\n filter(type: string, handler: FleetHandler): () => void {\r\n let set = this.byType.get(type);\r\n if (!set) {\r\n set = new Set();\r\n this.byType.set(type, set);\r\n }\r\n set.add(handler);\r\n return () => {\r\n set!.delete(handler);\r\n };\r\n }\r\n\r\n /** Subscribe to literally everything. The fleet roll-up uses this. */\r\n onAny(handler: FleetHandler): () => void {\r\n this.any.add(handler);\r\n return () => {\r\n this.any.delete(handler);\r\n };\r\n }\r\n\r\n emit(event: FleetEvent): void {\r\n // Each fan-out is best-effort — a misbehaving handler must not\r\n // bring down the bus or other handlers. Errors are swallowed\r\n // (matching the rest of the project's listener-error policy).\r\n const byId = this.byId.get(event.subagentId);\r\n if (byId)\r\n for (const h of byId) {\r\n try {\r\n h(event);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n const byType = this.byType.get(event.type);\r\n if (byType)\r\n for (const h of byType) {\r\n try {\r\n h(event);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n for (const h of this.any) {\r\n try {\r\n h(event);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Roll-up of token usage + cost across an entire director run. The\r\n * director's `fleet_status` tool returns this so the model can reason\r\n * about budget in its next turn (\"the researcher already burned $0.40,\r\n * lean on summaries for the next task\").\r\n */\r\nexport interface FleetUsage {\r\n total: {\r\n input: number;\r\n output: number;\r\n cacheRead: number;\r\n cacheWrite: number;\r\n cost: number;\r\n };\r\n perSubagent: Record<string, SubagentUsageSnapshot>;\r\n}\r\n\r\nexport interface SubagentUsageSnapshot {\r\n subagentId: string;\r\n provider?: string;\r\n model?: string;\r\n input: number;\r\n output: number;\r\n cacheRead: number;\r\n cacheWrite: number;\r\n cost: number;\r\n toolCalls: number;\r\n iterations: number;\r\n startedAt: number;\r\n lastEventAt: number;\r\n}\r\n\r\n/**\r\n * Aggregates provider.response + tool.executed events from the FleetBus\r\n * into a live `FleetUsage` snapshot. Costs are computed by the caller\r\n * via a `priceLookup(subagentId)` so we don't bake provider-pricing\r\n * coupling into core; the CLI/tests supply a function that resolves\r\n * each subagent's per-token rates from the models registry.\r\n */\r\nexport class FleetUsageAggregator {\r\n private readonly perSubagent = new Map<string, SubagentUsageSnapshot>();\r\n private readonly total = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 };\r\n\r\n constructor(\r\n private readonly bus: FleetBus,\r\n private readonly priceLookup?: (\r\n subagentId: string,\r\n ) => { input?: number; output?: number; cacheRead?: number; cacheWrite?: number } | undefined,\r\n private readonly metaLookup?: (\r\n subagentId: string,\r\n ) => { provider?: string; model?: string } | undefined,\r\n ) {\r\n bus.filter('provider.response', (e) => this.onProviderResponse(e));\r\n bus.filter('tool.executed', (e) => this.onToolExecuted(e));\r\n bus.filter('iteration.started', (e) => this.onIterationStarted(e));\r\n }\r\n\r\n /** Live snapshot — safe to call from a tool's execute() body. */\r\n snapshot(): FleetUsage {\r\n return {\r\n total: { ...this.total },\r\n perSubagent: Object.fromEntries(\r\n Array.from(this.perSubagent.entries()).map(([k, v]) => [k, { ...v }]),\r\n ),\r\n };\r\n }\r\n\r\n private ensure(subagentId: string): SubagentUsageSnapshot {\r\n let snap = this.perSubagent.get(subagentId);\r\n if (!snap) {\r\n const meta = this.metaLookup?.(subagentId);\r\n snap = {\r\n subagentId,\r\n provider: meta?.provider,\r\n model: meta?.model,\r\n input: 0,\r\n output: 0,\r\n cacheRead: 0,\r\n cacheWrite: 0,\r\n cost: 0,\r\n toolCalls: 0,\r\n iterations: 0,\r\n startedAt: Date.now(),\r\n lastEventAt: Date.now(),\r\n };\r\n this.perSubagent.set(subagentId, snap);\r\n }\r\n return snap;\r\n }\r\n\r\n private onProviderResponse(e: FleetEvent): void {\r\n const snap = this.ensure(e.subagentId);\r\n const p = e.payload as {\r\n usage?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number };\r\n };\r\n const usage = p?.usage;\r\n if (!usage) return;\r\n snap.input += usage.input ?? 0;\r\n snap.output += usage.output ?? 0;\r\n snap.cacheRead += usage.cacheRead ?? 0;\r\n snap.cacheWrite += usage.cacheWrite ?? 0;\r\n this.total.input += usage.input ?? 0;\r\n this.total.output += usage.output ?? 0;\r\n this.total.cacheRead += usage.cacheRead ?? 0;\r\n this.total.cacheWrite += usage.cacheWrite ?? 0;\r\n const price = this.priceLookup?.(e.subagentId);\r\n if (price) {\r\n const delta =\r\n ((usage.input ?? 0) / 1_000_000) * (price.input ?? 0) +\r\n ((usage.output ?? 0) / 1_000_000) * (price.output ?? 0) +\r\n ((usage.cacheRead ?? 0) / 1_000_000) * (price.cacheRead ?? 0) +\r\n ((usage.cacheWrite ?? 0) / 1_000_000) * (price.cacheWrite ?? 0);\r\n snap.cost += delta;\r\n this.total.cost += delta;\r\n }\r\n snap.lastEventAt = e.ts;\r\n }\r\n\r\n private onToolExecuted(e: FleetEvent): void {\r\n const snap = this.ensure(e.subagentId);\r\n snap.toolCalls += 1;\r\n snap.lastEventAt = e.ts;\r\n }\r\n\r\n private onIterationStarted(e: FleetEvent): void {\r\n const snap = this.ensure(e.subagentId);\r\n snap.iterations += 1;\r\n snap.lastEventAt = e.ts;\r\n }\r\n}\r\n","/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\nexport type ErrorCode =\n // Provider\n | 'PROVIDER_RATE_LIMITED'\n | 'PROVIDER_AUTH_FAILED'\n | 'PROVIDER_OVERLOADED'\n | 'PROVIDER_INVALID_REQUEST'\n | 'PROVIDER_SERVER_ERROR'\n | 'PROVIDER_NETWORK_ERROR'\n | 'PROVIDER_CONTEXT_OVERFLOW'\n // Tool\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n // Config\n | 'CONFIG_INVALID'\n | 'CONFIG_NOT_FOUND'\n | 'CONFIG_PARSE_FAILED'\n | 'CONFIG_MIGRATION_NEEDED'\n // Plugin\n | 'PLUGIN_LOAD_FAILED'\n | 'PLUGIN_API_MISMATCH'\n | 'PLUGIN_MISSING_DEPENDENCY'\n // Agent\n | 'AGENT_ITERATION_LIMIT'\n | 'AGENT_CONTEXT_OVERFLOW'\n | 'AGENT_ABORTED'\n | 'AGENT_RUN_FAILED'\n // Session\n | 'SESSION_NOT_FOUND'\n | 'SESSION_CORRUPTED'\n | 'SESSION_WRITE_FAILED'\n // Container / Registry\n | 'CONTAINER_TOKEN_ALREADY_BOUND'\n | 'CONTAINER_TOKEN_NOT_BOUND'\n | 'REGISTRY_DUPLICATE'\n | 'REGISTRY_NOT_FOUND'\n // General\n | 'UNKNOWN';\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// ── Specific error classes ───────────────────────────────────────────\n\n/**\n * Tool execution errors — thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === 'PLUGIN_MISSING_DEPENDENCY',\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === 'AGENT_ABORTED' ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === 'AGENT_ITERATION_LIMIT',\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = 'AGENT_RUN_FAILED',\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? 'AGENT_RUN_FAILED' : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === 'SESSION_WRITE_FAILED' ? 'error' : 'warning',\n recoverable: opts.code !== 'SESSION_CORRUPTED',\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.js';\n\n/**\n * Token usage for a single provider call, normalized across providers.\n *\n * Disjoint semantics: the four fields never overlap. `input` is the count\n * of FRESH input tokens (billed at the full input rate); `cacheRead` and\n * `cacheWrite` are separate cached subsets each priced at their own rate.\n * The total context the model loaded for this turn is\n * `input + (cacheRead ?? 0) + (cacheWrite ?? 0)`.\n *\n * Provider quirks normalized at the adapter layer:\n * - Anthropic: returns `input_tokens` already disjoint from cache fields.\n * - OpenAI / OpenAI-compatible: `prompt_tokens` is the TOTAL including\n * cached portion; the adapter subtracts `cached_tokens` to stay disjoint.\n * - Google: `promptTokenCount` likewise includes cache; adapter subtracts\n * `cachedContentTokenCount`.\n *\n * Cost math and the context-fullness chip both depend on the disjoint\n * invariant — a TOTAL `input` plus a separate `cacheRead` count would bill\n * cached tokens twice and skew cache-hit-ratio reporting.\n */\nexport interface Usage {\n input: number;\n output: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\nexport interface Capabilities {\n tools: boolean;\n parallelTools: boolean;\n vision: boolean;\n streaming: boolean;\n promptCache: boolean;\n systemPrompt: boolean;\n jsonMode: boolean;\n maxContext: number;\n cacheControl: 'native' | 'auto' | 'none';\n}\n\nexport interface Request {\n model: string;\n system?: TextBlock[];\n messages: Message[];\n tools?: Tool[];\n maxTokens: number;\n temperature?: number;\n topP?: number;\n stopSequences?: string[];\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool'; name: string };\n}\n\nexport type StopReason = 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence' | 'refusal';\n\nexport interface Response {\n content: ContentBlock[];\n stopReason: StopReason;\n usage: Usage;\n model: string;\n}\n\nexport type StreamEvent =\n | { type: 'message_start'; model: string }\n | {\n type: 'content_block_start';\n kind: 'text' | 'tool_use' | 'thinking';\n id?: string;\n name?: string;\n }\n | { type: 'content_block_stop'; index: number }\n | { type: 'text_delta'; text: string }\n | { type: 'tool_use_start'; id: string; name: string }\n | { type: 'tool_use_input_delta'; id: string; partial: string }\n | { type: 'tool_use_stop'; id: string; input: unknown; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_start'; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_delta'; text: string }\n | { type: 'thinking_signature'; signature: string }\n | { type: 'thinking_stop' }\n | { type: 'message_stop'; stopReason: StopReason; usage: Usage };\n\nexport interface Provider {\n readonly id: string;\n readonly capabilities: Capabilities;\n /** Canonical streaming entry point. `complete()` defaults to a wrapper that\n * aggregates this stream — providers may override for non-streaming wires. */\n stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent>;\n complete(req: Request, opts: { signal: AbortSignal }): Promise<Response>;\n}\n\n/**\n * Structured body parsed from a provider's HTTP error response. Populated\n * best-effort: providers return JSON shaped differently (Anthropic uses\n * `{error: {type, message}}`, OpenAI uses `{error: {message, code}}`,\n * Google uses `{error: {status, message}}`), so the fields here are the\n * intersection that's usable for rendering and routing.\n */\nexport interface ProviderErrorBody {\n /** Provider-specific kind, e.g. \"overloaded_error\", \"rate_limit_error\", \"invalid_request_error\". */\n type?: string;\n /** Human-readable explanation from the provider. */\n message?: string;\n /** Provider request id, when present in the body or headers. */\n requestId?: string;\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\n retryAfterMs?: number;\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\n raw?: string;\n /** True when `raw` was truncated; check `rawLength` for the original size. */\n truncated?: boolean;\n /** Original length of the response body in bytes, when `truncated` is true. */\n rawLength?: number;\n}\n\nexport class ProviderError extends WrongStackError {\n public readonly status: number;\n public readonly retryable: boolean;\n public readonly providerId: string;\n public readonly body?: ProviderErrorBody;\n\n constructor(\n message: string,\n status: number,\n retryable: boolean,\n providerId: string,\n opts: { body?: ProviderErrorBody; cause?: unknown } = {},\n ) {\n super({\n message,\n code: providerStatusToCode(status, opts.body?.type),\n subsystem: 'provider',\n severity: status >= 500 ? 'error' : 'warning',\n recoverable: retryable,\n context: { providerId, status },\n cause: opts.cause,\n });\n this.name = 'ProviderError';\n this.status = status;\n this.retryable = retryable;\n this.providerId = providerId;\n this.body = opts.body;\n }\n\n /**\n * Render a one-line, user-facing description. Designed for the CLI/TUI\n * status line and the agent's retry warning. Avoids dumping raw JSON\n * (which is what users see today when a 529 lands and the log message\n * includes the full `{\"type\":\"error\",...}` body).\n *\n * Examples:\n * \"minimax-coding-plan overloaded (529): High traffic detected. Upgrade for highspeed model. [req 06534785201de9c0…]\"\n * \"openai rate limited (429): Retry after 12s\"\n * \"anthropic invalid request (400): messages.0.role must be one of 'user'|'assistant'\"\n * \"groq HTTP 500 (server error)\"\n */\n override describe(): string {\n const kind = describeStatus(this.status, this.body?.type);\n const head = `${this.providerId} ${kind}`;\n const detail = this.body?.message?.trim();\n const reqId = this.body?.requestId\n ? ` [req ${this.body.requestId.slice(0, 16)}${this.body.requestId.length > 16 ? '…' : ''}]`\n : '';\n if (detail && detail.length > 0) {\n return `${head}: ${truncate(detail, 240)}${reqId}`;\n }\n return `${head}${reqId}`;\n }\n}\n\nfunction describeStatus(status: number, type?: string): string {\n if (status === 0) return 'network error';\n if (type === 'overloaded_error' || status === 529) return `overloaded (${status})`;\n if (type === 'rate_limit_error' || status === 429) return `rate limited (${status})`;\n if (type === 'authentication_error' || status === 401) return `auth failed (${status})`;\n if (type === 'permission_error' || status === 403) return `forbidden (${status})`;\n if (type === 'not_found_error' || status === 404) return `not found (${status})`;\n if (type === 'invalid_request_error' || status === 400) return `invalid request (${status})`;\n if (status === 408) return `timeout (${status})`;\n if (status >= 500 && status < 600) return `HTTP ${status} (server error)`;\n if (type) return `${type} (${status})`;\n return `HTTP ${status}`;\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\n}\n\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\n if (status === 0) return 'PROVIDER_NETWORK_ERROR';\n if (type === 'rate_limit_error' || status === 429) return 'PROVIDER_RATE_LIMITED';\n if (type === 'authentication_error' || status === 401) return 'PROVIDER_AUTH_FAILED';\n if (type === 'overloaded_error' || status === 529) return 'PROVIDER_OVERLOADED';\n if (type === 'invalid_request_error' || status === 400) return 'PROVIDER_INVALID_REQUEST';\n if (status === 408) return 'PROVIDER_NETWORK_ERROR';\n if (status >= 500) return 'PROVIDER_SERVER_ERROR';\n return 'PROVIDER_INVALID_REQUEST';\n}\n","import type { Usage } from '../types/provider.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\n\r\nexport type BudgetKind = 'tool_calls' | 'iterations' | 'tokens' | 'timeout' | 'cost';\r\n\r\nexport class BudgetExceededError extends Error {\r\n readonly kind: BudgetKind;\r\n readonly limit: number;\r\n readonly observed: number;\r\n\r\n constructor(kind: BudgetKind, limit: number, observed: number) {\r\n super(`Budget exceeded: ${kind} (limit=${limit}, observed=${observed})`);\r\n this.name = 'BudgetExceededError';\r\n this.kind = kind;\r\n this.limit = limit;\r\n this.observed = observed;\r\n }\r\n}\r\n\r\nexport interface BudgetLimits {\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n maxTokens?: number;\r\n /** Estimated USD cost ceiling. */\r\n maxCostUsd?: number;\r\n /** Wall-clock timeout from start() to checkTimeout(). */\r\n timeoutMs?: number;\r\n}\r\n\r\nexport interface BudgetUsage {\r\n iterations: number;\r\n toolCalls: number;\r\n tokens: { input: number; output: number; total: number };\r\n costUsd: number;\r\n elapsedMs: number;\r\n}\r\n\r\n/**\r\n * Thrown by `SubagentBudget.record*` when a soft limit is hit and\r\n * an `onThreshold` handler is configured that wants to ask the\r\n * coordinator (via `budget.threshold_reached` event). The runner\r\n * catches this and awaits the embedded `decision` promise to get\r\n * the coordinator's extend/stop decision.\r\n *\r\n * Distinct from `BudgetExceededError` which is a hard stop.\r\n */\r\nexport class BudgetThresholdSignal extends Error {\r\n readonly kind: BudgetKind;\r\n readonly limit: number;\r\n readonly used: number;\r\n /** Resolves to 'extend' (with optional new limits) or 'stop' */\r\n readonly decision: Promise<BudgetThresholdDecision>;\r\n\r\n constructor(\r\n kind: BudgetKind,\r\n limit: number,\r\n used: number,\r\n decision: Promise<BudgetThresholdDecision>,\r\n ) {\r\n super(`Budget soft limit: ${kind} (limit=${limit}, used=${used})`);\r\n this.name = 'BudgetThresholdSignal';\r\n this.kind = kind;\r\n this.limit = limit;\r\n this.used = used;\r\n this.decision = decision;\r\n }\r\n}\r\n\r\nexport type BudgetThresholdDecision =\r\n | 'stop'\r\n | { extend: Partial<BudgetLimits> };\r\n\r\n/**\r\n * Callback invoked when a budget limit is about to be exceeded.\r\n * Return 'throw' for hard stop (default — throws BudgetExceededError).\r\n * Return 'continue' to allow one more unit and re-check next time.\r\n * Return a Promise to ask the coordinator via `budget.threshold_reached`\r\n * event (uses the same grant/deny pattern as `iteration.limit_reached`).\r\n */\r\nexport type BudgetThresholdHandler = (info: {\r\n kind: BudgetKind;\r\n used: number;\r\n limit: number;\r\n requestDecision: () => Promise<BudgetThresholdDecision>;\r\n}) => 'throw' | 'continue' | Promise<BudgetThresholdDecision>;\r\n\r\n/**\r\n * Per-subagent budget enforcement. Each subagent gets its own instance so a\r\n * runaway agent can't drain the cost ceiling of its siblings. All record/check\r\n * methods are O(1) and safe to call from hot paths.\r\n *\r\n * Behavior: `record*` methods check the limit and throw synchronously when\r\n * no `onThreshold` handler is configured. When a handler IS configured,\r\n * `checkLimit` delegates to it and any async work (coordinator decision)\r\n * is fire-and-forget via `void` — the thrown error is always synchronous\r\n * so event handlers in tests (which use `expect(...).toThrow`) work correctly.\r\n */\r\nexport class SubagentBudget {\r\n readonly limits: Readonly<BudgetLimits>;\r\n private iterations = 0;\r\n private toolCalls = 0;\r\n private tokenInput = 0;\r\n private tokenOutput = 0;\r\n private costUsd = 0;\r\n private startTime: number | null = null;\r\n private _onThreshold: BudgetThresholdHandler | undefined;\r\n /**\r\n * Tracks which budget kinds currently have an extension request\r\n * in flight. While a kind is here, further `checkLimit` calls for the\r\n * same kind are no-ops — without this dedup, every `recordIteration`\r\n * after the limit is reached spawns a fresh decision Promise (until\r\n * the first one lands and patches limits), flooding the FleetBus\r\n * with redundant threshold events. Cleared in `checkLimitAsync`'s\r\n * `finally`.\r\n */\r\n private readonly pendingExtensions: Set<BudgetKind> = new Set();\r\n /**\r\n * Hard cap on how long `checkLimitAsync` waits for the coordinator to\r\n * respond before defaulting to 'stop'. Without this fallback an absent\r\n * or hung listener (Director not built / event filter detached mid-run)\r\n * leaves the budget over-limit and never enforces anything, since\r\n * `checkLimit` returns synchronously via `void this.checkLimitAsync`.\r\n * Hardcoded for now — most fleets set their own per-task timeout that\r\n * dwarfs this anyway. 30 s matches the existing event-emit timeoutMs.\r\n */\r\n private static readonly DECISION_TIMEOUT_MS = 30_000;\r\n /**\r\n * Injected by the runner when wiring the budget to its EventBus.\r\n * Used by `checkLimitAsync` to emit `budget.threshold_reached` events.\r\n */\r\n _events?: EventBus;\r\n\r\n /**\r\n * Optional callback for soft-limit handling. When set, the budget will\r\n * call this instead of throwing when a limit is first reached. The\r\n * handler decides whether to throw, continue, or ask the coordinator.\r\n */\r\n get onThreshold(): BudgetThresholdHandler | undefined {\r\n return this._onThreshold;\r\n }\r\n set onThreshold(fn: BudgetThresholdHandler | undefined) {\r\n this._onThreshold = fn;\r\n }\r\n\r\n constructor(limits: BudgetLimits = {}) {\r\n this.limits = Object.freeze({ ...limits });\r\n }\r\n\r\n start(): void {\r\n this.startTime = Date.now();\r\n }\r\n\r\n /** Returns true if we're within 10% of any limit — useful for pre-flight checks. */\r\n isNearLimit(): boolean {\r\n const { maxIterations, maxToolCalls, maxTokens, maxCostUsd } = this.limits;\r\n if (maxIterations && this.iterations >= maxIterations * 0.9) return true;\r\n if (maxToolCalls && this.toolCalls >= maxToolCalls * 0.9) return true;\r\n if (maxTokens && this.tokenInput + this.tokenOutput >= maxTokens * 0.9) return true;\r\n if (maxCostUsd && this.costUsd >= maxCostUsd * 0.9) return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Synchronous budget check — always throws synchronously so callers\r\n * (especially test event handlers using `expect().toThrow()`) get an\r\n * unhandled rejection when the budget is exceeded without a handler.\r\n * When `onThreshold` IS configured, the actual async threshold-handling\r\n * is dispatched as a fire-and-forget promise.\r\n */\r\n private checkLimit(kind: BudgetKind, used: number, limit: number): void {\r\n // No threshold handler → hard stop, throw synchronously.\r\n if (kind === 'timeout' || !this._onThreshold) {\r\n throw new BudgetExceededError(kind, limit, used);\r\n }\r\n // No EventBus or no listener for the threshold event → there's no\r\n // coordinator to ask. Fall back to the hard-stop contract so callers\r\n // that only set `onThreshold` but never wire a Director (or whose\r\n // FleetBus relay is detached) still get budget enforcement. Without\r\n // this guard the BudgetThresholdSignal path would await a decision\r\n // that nobody resolves, the agent would race past it synchronously,\r\n // and the run would \"succeed\" past its budget.\r\n const bus = this._events;\r\n if (!bus || bus.listenerCount('budget.threshold_reached') === 0) {\r\n throw new BudgetExceededError(kind, limit, used);\r\n }\r\n // Already negotiating an extension for this kind — the first signal\r\n // is in flight; the runner is awaiting its decision and will either\r\n // patch limits (we continue) or abort the run (we unwind). Don't\r\n // throw a fresh signal — it would queue duplicate decisions and spam\r\n // the FleetBus.\r\n if (this.pendingExtensions.has(kind)) return;\r\n this.pendingExtensions.add(kind);\r\n // Throw `BudgetThresholdSignal` carrying the decision Promise. The\r\n // runner's catch handler awaits the promise: `stop` triggers an\r\n // abort so the run actually unwinds; `extend` leaves the (already\r\n // patched) limits in place and the agent continues. The previous\r\n // `void this.checkLimitAsync(...)` pattern silently produced an\r\n // unhandled rejection on stop and let the agent run past budget.\r\n const decision = this.negotiateExtension(kind, used, limit);\r\n throw new BudgetThresholdSignal(kind, limit, used, decision);\r\n }\r\n\r\n /**\r\n * Drive the threshold handler to a decision. Resolves with `'stop'`\r\n * (signal the runner to abort) or `{ extend: ... }` (limits already\r\n * patched in-place; the runner should not abort). Always releases the\r\n * `pendingExtensions` slot in `finally`.\r\n *\r\n * The 'continue' return from a sync handler is treated as\r\n * `{ extend: {} }` — keep going without patching, next overrun will\r\n * fire a fresh signal.\r\n */\r\n private async negotiateExtension(\r\n kind: BudgetKind,\r\n used: number,\r\n limit: number,\r\n ): Promise<BudgetThresholdDecision> {\r\n try {\r\n const result = this._onThreshold!({\r\n kind,\r\n used,\r\n limit,\r\n // Inject a requestDecision helper the handler can call to emit the\r\n // budget.threshold_reached event and wait for the coordinator's verdict.\r\n // A hard fallback timer guarantees the promise eventually resolves\r\n // even if no listener responds — without it, an absent/detached\r\n // Director would leave the budget permanently in \"asking\" state.\r\n requestDecision: (): Promise<BudgetThresholdDecision> => {\r\n // No EventBus wired OR no listener registered → there's nobody\r\n // to grant an extension. Fall straight through to 'stop' so the\r\n // runner aborts immediately. Without this short-circuit the run\r\n // would idle for the 30s fallback before failing — long enough\r\n // for a scripted agent (and our budget-enforcement tests) to\r\n // happily finish past its budget.\r\n const bus = this._events;\r\n if (!bus || bus.listenerCount('budget.threshold_reached') === 0) {\r\n return Promise.resolve('stop');\r\n }\r\n return new Promise<BudgetThresholdDecision>((resolve) => {\r\n let resolved = false;\r\n const respond = (d: BudgetThresholdDecision) => {\r\n if (resolved) return;\r\n resolved = true;\r\n resolve(d);\r\n };\r\n const fallback = setTimeout(\r\n () => respond('stop'),\r\n SubagentBudget.DECISION_TIMEOUT_MS,\r\n );\r\n bus.emit('budget.threshold_reached', {\r\n kind: kind as 'iterations' | 'tool_calls' | 'tokens' | 'cost' | 'timeout',\r\n used,\r\n limit,\r\n timeoutMs: SubagentBudget.DECISION_TIMEOUT_MS,\r\n extend: (extra: Partial<BudgetLimits>) => {\r\n clearTimeout(fallback);\r\n respond({ extend: extra });\r\n },\r\n deny: () => {\r\n clearTimeout(fallback);\r\n respond('stop');\r\n },\r\n });\r\n });\r\n },\r\n });\r\n\r\n if (result === 'throw') return 'stop';\r\n if (result === 'continue') return { extend: {} };\r\n\r\n const decision = await result;\r\n if (decision === 'stop') return 'stop';\r\n\r\n // 'extend' — patch the in-place limits BEFORE resolving so the\r\n // runner's continue path sees the new ceiling. The frozen-object\r\n // cast mirrors the original implementation.\r\n const ext = decision.extend;\r\n if (ext.maxIterations !== undefined) {\r\n (this.limits as Record<string, unknown>).maxIterations = ext.maxIterations;\r\n }\r\n if (ext.maxToolCalls !== undefined) {\r\n (this.limits as Record<string, unknown>).maxToolCalls = ext.maxToolCalls;\r\n }\r\n if (ext.maxTokens !== undefined) {\r\n (this.limits as Record<string, unknown>).maxTokens = ext.maxTokens;\r\n }\r\n if (ext.maxCostUsd !== undefined) {\r\n (this.limits as Record<string, unknown>).maxCostUsd = ext.maxCostUsd;\r\n }\r\n if (ext.timeoutMs !== undefined) {\r\n (this.limits as Record<string, unknown>).timeoutMs = ext.timeoutMs;\r\n }\r\n return decision;\r\n } finally {\r\n this.pendingExtensions.delete(kind);\r\n }\r\n }\r\n\r\n recordIteration(): void {\r\n this.iterations++;\r\n if (this.limits.maxIterations !== undefined && this.iterations > this.limits.maxIterations) {\r\n void this.checkLimit('iterations', this.iterations, this.limits.maxIterations);\r\n }\r\n }\r\n\r\n recordToolCall(): void {\r\n this.toolCalls++;\r\n if (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\r\n void this.checkLimit('tool_calls', this.toolCalls, this.limits.maxToolCalls);\r\n }\r\n }\r\n\r\n recordUsage(usage: Usage, costUsd = 0): void {\r\n this.tokenInput += usage.input;\r\n this.tokenOutput += usage.output;\r\n this.costUsd += costUsd;\r\n\r\n const totalTokens = this.tokenInput + this.tokenOutput;\r\n if (this.limits.maxTokens !== undefined && totalTokens > this.limits.maxTokens) {\r\n void this.checkLimit('tokens', totalTokens, this.limits.maxTokens);\r\n }\r\n if (this.limits.maxCostUsd !== undefined && this.costUsd > this.limits.maxCostUsd) {\r\n void this.checkLimit('cost', this.costUsd, this.limits.maxCostUsd);\r\n }\r\n }\r\n\r\n /**\r\n * Throws if the wall-clock budget is exhausted. Call this from the iteration\r\n * loop so a hung tool can't keep a subagent running past its deadline.\r\n */\r\n checkTimeout(): void {\r\n if (this.startTime === null || this.limits.timeoutMs === undefined) return;\r\n const elapsed = Date.now() - this.startTime;\r\n if (elapsed > this.limits.timeoutMs) {\r\n throw new BudgetExceededError('timeout', this.limits.timeoutMs, elapsed);\r\n }\r\n }\r\n\r\n /** Returns true if a timeout has occurred without throwing. Useful for races. */\r\n isTimedOut(): boolean {\r\n if (this.startTime === null || this.limits.timeoutMs === undefined) return false;\r\n return Date.now() - this.startTime > this.limits.timeoutMs;\r\n }\r\n\r\n usage(): BudgetUsage {\r\n return {\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n tokens: {\r\n input: this.tokenInput,\r\n output: this.tokenOutput,\r\n total: this.tokenInput + this.tokenOutput,\r\n },\r\n costUsd: this.costUsd,\r\n elapsedMs: this.startTime === null ? 0 : Date.now() - this.startTime,\r\n };\r\n }\r\n}","/**\r\n * Pre-built subagent role configurations for the WrongStack fleet.\r\n * These can be passed to `MultiAgentHost.spawn()` or used as templates\r\n * for the director's roster.\r\n */\r\nimport type { SubagentConfig } from '../types/multi-agent.js';\r\n\r\n/**\r\n * Audit Log Agent — analyzes session logs, event streams, and traces.\r\n * Use for: post-mortems, trend analysis, operational insights.\r\n */\r\nexport const AUDIT_LOG_AGENT: SubagentConfig = {\r\n id: 'audit-log',\r\n name: 'Audit Log',\r\n role: 'audit-log',\r\n prompt: `You are the Audit Log agent. Your job is to analyze structured JSONL\r\nsession logs and produce actionable markdown reports.\r\n\r\nScope:\r\n- Parse session logs (iteration counts, tool calls, errors, usage)\r\n- Detect repeated failure patterns across multiple runs\r\n- Identify tool usage anomalies (over-use, failures, unexpected chains)\r\n- Track token consumption trends\r\n- Generate structured audit reports with severity ratings\r\n\r\nInput format you accept:\r\n{ \"task\": \"analyze | report | trends\", \"sessionPath\": \"<path>\", \"focus\": \"errors | tools | usage | all\" }\r\n\r\nOutput: Markdown audit report with sections:\r\n- ## Summary (totals, error rate)\r\n- ## Top Errors (count + context)\r\n- ## Tool Usage (table with calls, failures, avg duration)\r\n- ## Anomalies (pattern → severity)\r\n\r\nWorking rules:\r\n- Never fabricate numbers — read the actual logs first\r\n- Always include file:line references for errors\r\n- If sessionPath is missing, ask the director to provide it\r\n- Report confidence level: high (>90% accuracy), medium, low`,\r\n\r\n // No hardcoded budgets — the orchestrator (delegate tool or\r\n // spawn_subagent) decides per-task how much room a subagent gets.\r\n // A monorepo audit needs hours; a single-file lint check needs\r\n // seconds. Pinning a number here forces the orchestrator to fight\r\n // the role's default instead of just asking for what it needs.\r\n};\r\n\r\n/**\r\n * Bug Hunter Agent — systematic bug and code smell detection.\r\n * Use for: pre-refactoring health checks, code review, regression prevention.\r\n */\r\nexport const BUG_HUNTER_AGENT: SubagentConfig = {\r\n id: 'bug-hunter',\r\n name: 'Bug Hunter',\r\n role: 'bug-hunter',\r\n prompt: `You are the Bug Hunter agent. Your job is to systematically scan\r\nsource code for bugs, anti-patterns, and code smells using pattern matching\r\nand heuristics. Output a prioritized hit list with file:line references.\r\n\r\nScope:\r\n- Detect common bug patterns (uncaught errors, resource leaks, race conditions)\r\n- Identify anti-patterns (callback hell, God objects, circular deps)\r\n- Find TypeScript-specific issues (unsafe any, missing null checks, branded types)\r\n- Flag security-sensitive constructs (eval, innerHTML, hardcoded secrets)\r\n- Rank findings: critical > high > medium > low\r\n\r\nInput format you accept:\r\n{ \"task\": \"scan | hunt | check\", \"paths\": [\"src/**/*.ts\"], \"focus\": \"bugs | patterns | security | all\", \"severityThreshold\": \"medium\" }\r\n\r\nOutput: Markdown bug hunt report:\r\n- ## Critical (must fix first)\r\n- ## High (should fix)\r\n- ## Medium\r\n- ## Low (consider)\r\nEach entry: **[TYPE]** \\`file:line\\` — description + suggested fix\r\n\r\nBug pattern reference you know:\r\n| Pattern | Regex hint | Severity |\r\n|---------|------------|----------|\r\n| Uncaught promise | /\\.then\\\\(.*\\\\)/ without catch | high |\r\n| Event leak | on\\\\( without off/removeListener | high |\r\n| Hardcoded secret | [a-zA-Z0-9/_-]{20,} in config files | critical |\r\n| unsafe any | : any\\\\b or <any> | medium |\r\n| innerHTML | innerHTML\\\\s*= | high |\r\n\r\nWorking rules:\r\n- Never scan node_modules — it's noise\r\n- Always include file:line for every finding\r\n- If >30% of findings are false positives, note the confidence level\r\n- Ask director for clarification if paths are ambiguous`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * Refactor Planner Agent — structured refactoring planning.\r\n * Use for: large rewrites, technical debt reduction, architecture improvements.\r\n */\r\nexport const REFACTOR_PLANNER_AGENT: SubagentConfig = {\r\n id: 'refactor-planner',\r\n name: 'Refactor Planner',\r\n role: 'refactor-planner',\r\n prompt: `You are the Refactor Planner agent. Your job is to analyze code\r\nstructure and produce a concrete, phased refactoring plan with risk\r\nassessment, dependency ordering, and rollback strategy.\r\n\r\nScope:\r\n- Map module-level dependencies (import graph)\r\n- Identify coupling hotspots (high fan-in/out modules)\r\n- Assess refactoring risk by complexity and test coverage\r\n- Generate phased plans with checkpoint milestones\r\n- Produce diff-friendly task lists (one task = one concern)\r\n\r\nInput format you accept:\r\n{ \"task\": \"plan | assess | roadmap\", \"target\": \"src/core\", \"constraint\": \"no-breaking-changes | minimal-downtime | full-rewrite\", \"focus\": \"architecture | performance | maintainability\" }\r\n\r\nOutput: Markdown refactor plan:\r\n- ## Phase 1: Low Risk / High Payoff (do first)\r\n Table: | # | Task | Module | Risk | Est. Time |\r\n- ## Phase 2: Medium Risk\r\n- ## Phase 3: High Risk (requires full regression)\r\n- ## Dependency Graph (abbreviated ASCII)\r\n- ## Rollback Strategy\r\n- ## Exit Criteria (checkbox list)\r\n\r\nRisk scoring criteria:\r\n| Factor | Low | Medium | High |\r\n|--------|-----|--------|------|\r\n| Cyclomatic complexity | <10 | 10-20 | >20 |\r\n| Test coverage | >80% | 50-80% | <50% |\r\n| Fan-out (imports) | <5 | 5-15 | >15 |\r\n\r\nWorking rules:\r\n- Always include rollback strategy — every refactor can fail\r\n- Merge tasks that take <1h into a single phase\r\n- Respect team constraints (reviewer availability, parallelization)\r\n- Never plan without analyzing the actual code first`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * Security Scanner Agent — vulnerability and secret detection.\r\n * Use for: CI checks, pre-release audits, dependency vulnerability scanning.\r\n */\r\nexport const SECURITY_SCANNER_AGENT: SubagentConfig = {\r\n id: 'security-scanner',\r\n name: 'Security Scanner',\r\n role: 'security-scanner',\r\n prompt: `You are the Security Scanner agent. Your job is to scan code,\r\nconfigs, and dependencies for security issues from hardcoded secrets to\r\nsupply chain risks.\r\n\r\nScope:\r\n- Detect hardcoded secrets: API keys, tokens, passwords, private keys\r\n- Find injection vectors: eval, innerHTML, SQL concat, shell injection\r\n- Identify insecure patterns: weak crypto, hardcoded IVs, disabled TLS\r\n- Scan dependencies for known CVEs (via npm/pnpm audit)\r\n- Flag supply chain risks: postinstall hooks, unverified scripts, .npmrc\r\n\r\nInput format you accept:\r\n{ \"task\": \"scan | audit | secrets | dependencies\", \"paths\": [\"src\", \"config\"], \"depth\": \"quick | normal | deep\" }\r\n\r\nOutput: Markdown security report:\r\n- ## CRITICAL: Secrets Found (with code snippets)\r\n- ## HIGH: Injection Vectors\r\n- ## MEDIUM: Insecure Patterns\r\n- ## Dependency Issues (CVE list)\r\n- ## Summary table (severity → count)\r\n- ## Remediation Checklist (with checkboxes)\r\n\r\nSecret patterns you detect:\r\n| Pattern | Example | Severity |\r\n|---------|---------|----------|\r\n| AWS Access Key | AKIAIOSFODNN7EXAMPLE | critical |\r\n| AWS Secret Key | [a-zA-Z0-9/+=]{40} base64 | critical |\r\n| GitHub Token | ghp_[a-zA-Z0-9]{36} | critical |\r\n| Private Key PEM | -----BEGIN.*PRIVATE KEY----- | critical |\r\n| JWT | eyJ[a-zA-Z0-9_-]+ | high |\r\n\r\nInjection patterns:\r\n| Construct | Safe alternative |\r\n|-----------|-----------------|\r\n| eval(str) | new Function() or parse |\r\n| innerHTML = x | textContent or sanitize |\r\n| exec(\\`cmd \\${x}\\`) | execFile with args array |\r\n\r\nWorking rules:\r\n- Never scan node_modules — use npm audit instead\r\n- Always provide remediation steps, not just findings\r\n- Verify regex-based secrets before flagging (false positive risk)\r\n- When in doubt, flag as medium rather than ignoring potential issues`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/** All pre-built agents in a map for easy lookup by role. */\r\nexport const FLEET_ROSTER: Record<string, SubagentConfig> = {\r\n 'audit-log': AUDIT_LOG_AGENT,\r\n 'bug-hunter': BUG_HUNTER_AGENT,\r\n 'refactor-planner': REFACTOR_PLANNER_AGENT,\r\n 'security-scanner': SECURITY_SCANNER_AGENT,\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Default per-role budgets.\r\n// These are the budgets subagents get when the orchestrator doesn't pass\r\n// explicit overrides. They reflect realistic scope expectations for each role:\r\n// audit-log: moderate scan of session logs, ~5 min, 80 iterations\r\n// bug-hunter: targeted file scan, ~10 min, 120 iterations\r\n// refactor-planner: architecture analysis, ~8 min, 100 iterations\r\n// security-scanner: config + source scan, ~10 min, 120 iterations\r\n// ---------------------------------------------------------------------------\r\nexport interface FleetRosterBudget {\r\n timeoutMs?: number;\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n maxTokens?: number;\r\n maxCostUsd?: number;\r\n}\r\n\r\nexport const FLEET_ROSTER_BUDGETS: Record<string, FleetRosterBudget> = {\r\n 'audit-log': { timeoutMs: 5 * 60 * 1000, maxIterations: 80, maxToolCalls: 300 },\r\n 'bug-hunter': { timeoutMs: 10 * 60 * 1000, maxIterations: 120, maxToolCalls: 400 },\r\n 'refactor-planner': { timeoutMs: 8 * 60 * 1000, maxIterations: 100, maxToolCalls: 350 },\r\n 'security-scanner': { timeoutMs: 10 * 60 * 1000, maxIterations: 120, maxToolCalls: 400 },\r\n};\r\n\r\n/**\r\n * Apply roster budget to a config (only when the config has no explicit\r\n * budget fields set). This is called by the coordinator before dispatch.\r\n */\r\nexport function applyRosterBudget(cfg: SubagentConfig): SubagentConfig {\r\n const defaultBudget = FLEET_ROSTER_BUDGETS[cfg.role ?? ''];\r\n if (!defaultBudget) return cfg;\r\n return {\r\n ...cfg,\r\n timeoutMs: cfg.timeoutMs ?? defaultBudget.timeoutMs,\r\n maxIterations: cfg.maxIterations ?? defaultBudget.maxIterations,\r\n maxToolCalls: cfg.maxToolCalls ?? defaultBudget.maxToolCalls,\r\n maxTokens: cfg.maxTokens ?? defaultBudget.maxTokens,\r\n maxCostUsd: cfg.maxCostUsd ?? defaultBudget.maxCostUsd,\r\n };\r\n}\r\n\r\n/** Quick-access list for spawning all at once. */\r\nexport const ALL_FLEET_AGENTS = Object.values(FLEET_ROSTER);\r\n","import { randomUUID } from 'node:crypto';\r\nimport { EventEmitter } from 'node:events';\r\nimport type { AgentBridge, BridgeMessage } from '../types/agent-bridge.js';\r\nimport type {\r\n CoordinatorStatus,\r\n MultiAgentConfig,\r\n MultiAgentCoordinator,\r\n SpawnResult,\r\n SubagentConfig,\r\n SubagentContext,\r\n SubagentError,\r\n SubagentErrorKind,\r\n SubagentRunContext,\r\n SubagentRunner,\r\n TaskResult,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport { ProviderError } from '../types/provider.js';\r\nimport { BudgetExceededError, SubagentBudget } from './subagent-budget.js';\r\nimport { applyRosterBudget } from './fleet.js';\r\n\r\ntype SubagentStatus = 'running' | 'idle' | 'stopped' | 'error';\r\n\r\ninterface SubagentEntry {\r\n config: SubagentConfig;\r\n context: SubagentContext;\r\n status: SubagentStatus;\r\n currentTask?: string;\r\n abortController: AbortController;\r\n /** Lazily created on first dispatch — budget is per-task, not per-subagent. */\r\n activeBudget?: SubagentBudget;\r\n}\r\n\r\nexport interface MultiAgentCoordinatorOptions {\r\n /**\r\n * Callback that executes a task on behalf of a subagent. Required for\r\n * `assign()` to actually run anything — without it, tasks queue forever.\r\n * The coordinator provides per-subagent isolation (own budget, own signal,\r\n * own bridge) and enforces timeout + concurrency.\r\n */\r\n runner?: SubagentRunner;\r\n}\r\n\r\nexport class DefaultMultiAgentCoordinator extends EventEmitter implements MultiAgentCoordinator {\r\n readonly coordinatorId: string;\r\n readonly config: MultiAgentConfig;\r\n private runner?: SubagentRunner;\r\n\r\n private readonly subagents = new Map<string, SubagentEntry>();\r\n\r\n private pendingTasks: TaskSpec[] = [];\r\n private completedResults: TaskResult[] = [];\r\n private totalIterations = 0;\r\n private inFlight = 0;\r\n /**\r\n * Subagents currently being stopped. Set on entry to `stop()`, cleared\r\n * once `recordCompletion` lands the terminal TaskResult. Used by\r\n * `runDispatched` and `findIdleSubagent` to refuse mid-flight dispatch\r\n * to a subagent the caller has already asked to terminate — closes the\r\n * assign+terminate race where a fresh task could land on a worker that\r\n * was about to be killed.\r\n */\r\n private readonly terminating = new Set<string>();\r\n\r\n constructor(config: MultiAgentConfig, options: MultiAgentCoordinatorOptions = {}) {\r\n super();\r\n this.coordinatorId = config.coordinatorId;\r\n this.config = config;\r\n this.runner = options.runner;\r\n }\r\n\r\n /**\r\n * Replace the runner after construction. Used when the runner depends\r\n * on infrastructure (e.g. FleetBus) that isn't available until after\r\n * the coordinator's owning Director is built.\r\n */\r\n setRunner(runner: SubagentRunner): void {\r\n this.runner = runner;\r\n }\r\n\r\n /**\r\n * Change the in-flight dispatch ceiling at runtime. Lowering does NOT\r\n * preempt running tasks — already-dispatched subagents finish their\r\n * current task; only future dispatches respect the new cap. Raising\r\n * immediately tries to fill the freed slots from the pending queue.\r\n */\r\n setMaxConcurrent(n: number): void {\r\n if (!Number.isFinite(n) || n < 1) {\r\n throw new Error(`maxConcurrent must be a finite integer >= 1, got ${n}`);\r\n }\r\n this.config.maxConcurrent = Math.floor(n);\r\n this.tryDispatchNext();\r\n }\r\n\r\n async spawn(subagent: SubagentConfig): Promise<SpawnResult> {\r\n const id = subagent.id || randomUUID();\r\n // Duplicate-id guard. Previously a second spawn({id}) with the\r\n // same id silently overwrote the existing entry — orphaning the\r\n // first subagent's AbortController, Context, and any in-flight\r\n // task referencing it. Two spawns with the same id are almost\r\n // always a bug at the caller; refuse and let them surface it.\r\n if (this.subagents.has(id)) {\r\n throw new Error(`Subagent id \"${id}\" already exists — refusing to overwrite`);\r\n }\r\n const context: SubagentContext = {\r\n subagentId: id,\r\n tasks: [],\r\n // Wired later by the caller via setSubagentBridge() once the\r\n // bidirectional bridge is created. Readers must null-check / use\r\n // hasParentBridge() — the type now reflects this.\r\n parentBridge: null,\r\n doneCondition: this.config.doneCondition,\r\n maxConcurrent: this.config.maxConcurrent ?? 4,\r\n };\r\n\r\n this.subagents.set(id, {\r\n config: { ...subagent, id },\r\n context,\r\n status: 'idle',\r\n abortController: new AbortController(),\r\n });\r\n\r\n this.emit('subagent.started', { subagent: { ...subagent, id } });\r\n\r\n return { subagentId: id, agentId: id };\r\n }\r\n\r\n async assign(task: TaskSpec): Promise<void> {\r\n this.pendingTasks.push(task);\r\n this.tryDispatchNext();\r\n }\r\n\r\n async delegate(to: string, msg: BridgeMessage): Promise<void> {\r\n const subagent = this.subagents.get(to);\r\n if (!subagent) throw new Error(`Subagent \"${to}\" not found`);\r\n if (!subagent.context.parentBridge) {\r\n throw new Error(`Subagent \"${to}\" has no parentBridge — call setSubagentBridge() first`);\r\n }\r\n await subagent.context.parentBridge.send(msg);\r\n }\r\n\r\n /**\r\n * Wire up the communication bridge for a subagent. Call after spawn() once\r\n * the caller has created the bidirectional connection.\r\n */\r\n setSubagentBridge(subagentId: string, bridge: AgentBridge): void {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) throw new Error(`Subagent \"${subagentId}\" not found`);\r\n subagent.context.parentBridge = bridge;\r\n }\r\n\r\n async stop(subagentId: string): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n\r\n // Mark terminating BEFORE the abort so a synchronous tryDispatchNext\r\n // observation in another callback path sees the intent and skips\r\n // this subagent. Cleared by recordCompletion once the runner's\r\n // catch block lands the terminal TaskResult.\r\n this.terminating.add(subagentId);\r\n\r\n // Abort any in-flight run, then sever the bridge so further messages fail\r\n // fast instead of silently queueing on a dead subagent.\r\n subagent.abortController.abort();\r\n subagent.status = 'stopped';\r\n subagent.currentTask = undefined;\r\n subagent.context.parentBridge = null;\r\n\r\n this.emit('subagent.stopped', { subagentId, reason: 'stopped by coordinator' });\r\n }\r\n\r\n async stopAll(): Promise<void> {\r\n // Clear the queue FIRST so no new tasks land on subagents while\r\n // we're tearing them down. Each dropped task gets a synthetic\r\n // `aborted_by_parent` completion so any caller awaiting it (e.g.\r\n // delegate tool's awaitTasks) resolves instead of hanging.\r\n //\r\n // Pending tasks never reached `inFlight`, so we cannot route them\r\n // through `recordCompletion` — its underflow guard would short-\r\n // circuit on the second pending task and emit a warning instead\r\n // of the completion event. The shared helper inline-emits.\r\n this.drainPendingAsAborted('Coordinator stopAll() drained the pending queue');\r\n // allSettled so one failure doesn't leave other subagents un-stopped.\r\n await Promise.allSettled([...this.subagents.keys()].map((id) => this.stop(id)));\r\n }\r\n\r\n getStatus(): CoordinatorStatus {\r\n return {\r\n coordinatorId: this.coordinatorId,\r\n subagents: Array.from(this.subagents.entries()).map(([id, s]) => ({\r\n id,\r\n name: s.config.name,\r\n status: s.status,\r\n currentTask: s.currentTask,\r\n })),\r\n pendingTasks: this.pendingTasks.length,\r\n completedTasks: this.completedResults.length,\r\n totalIterations: this.totalIterations,\r\n done: this.isDone(),\r\n };\r\n }\r\n\r\n /** Expose snapshot of completed results — useful for callers awaiting all done. */\r\n results(): readonly TaskResult[] {\r\n return this.completedResults;\r\n }\r\n\r\n /**\r\n * Manual completion — for callers that drive subagents without a runner\r\n * (e.g. external orchestrators). When a runner is configured the coordinator\r\n * calls this itself.\r\n */\r\n completeTask(result: TaskResult): void {\r\n this.recordCompletion(result);\r\n }\r\n\r\n // --- internal dispatching ---------------------------------------------\r\n\r\n private tryDispatchNext(): void {\r\n while (this.canDispatch()) {\r\n const dispatchable = this.takeNextDispatchableTask();\r\n if (!dispatchable) {\r\n // No idle worker right now. If every spawned subagent is\r\n // stopped or mid-termination, the pending queue is dead —\r\n // a pending task can never start, so synthetic-complete it\r\n // as `aborted_by_parent`. Without this, an `assign()` after\r\n // `stop()` would hang forever waiting for `task.completed`.\r\n // We DO NOT drain when subagents are busy (status='running'):\r\n // those will free up and accept the work normally.\r\n if (this.pendingTasks.length > 0 && !this.hasLiveSubagent()) {\r\n this.drainPendingAsAborted(\r\n 'No live subagent available — all stopped or mid-termination',\r\n );\r\n }\r\n return;\r\n }\r\n const { subagentId, task } = dispatchable;\r\n // Attach a catch so a synchronous throw inside runDispatched (rare —\r\n // e.g. provider misconfiguration before the first await) becomes a\r\n // visible failed task instead of an unhandled rejection that leaves\r\n // `inFlight` permanently elevated.\r\n this.runDispatched(subagentId, task).catch((err) => {\r\n this.recordCompletion({\r\n subagentId,\r\n taskId: task.id,\r\n status: 'failed',\r\n error: classifySubagentError(err),\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n });\r\n });\r\n }\r\n }\r\n\r\n private canDispatch(): boolean {\r\n const max = this.config.maxConcurrent ?? 4;\r\n return this.inFlight < max && this.pendingTasks.length > 0;\r\n }\r\n\r\n private takeNextDispatchableTask(): { subagentId: string; task: TaskSpec } | null {\r\n for (let i = 0; i < this.pendingTasks.length; i++) {\r\n const task = this.pendingTasks[i]!;\r\n const subagentId = task.subagentId\r\n ? this.isIdleSubagent(task.subagentId)\r\n ? task.subagentId\r\n : null\r\n : this.findIdleSubagent();\r\n if (!subagentId) continue;\r\n this.pendingTasks.splice(i, 1);\r\n return { subagentId, task };\r\n }\r\n return null;\r\n }\r\n\r\n private findIdleSubagent(): string | null {\r\n for (const [id, s] of this.subagents) {\r\n // Skip subagents that are mid-termination — `stop()` set the\r\n // `terminating` flag and aborted the controller, but the\r\n // status mutation happens synchronously after; checking both\r\n // is belt-and-suspenders against any race where status is\r\n // transiently still 'idle' while termination is in flight.\r\n if (s.status === 'idle' && !this.terminating.has(id)) return id;\r\n }\r\n return null;\r\n }\r\n\r\n private isIdleSubagent(id: string): boolean {\r\n const subagent = this.subagents.get(id);\r\n return !!subagent && subagent.status === 'idle' && !this.terminating.has(id);\r\n }\r\n\r\n /**\r\n * Returns true iff at least one spawned subagent could still\r\n * process a task. A \"live\" subagent is one that is not stopped\r\n * AND not mid-termination — `running` workers count because they\r\n * will eventually finish and become idle.\r\n *\r\n * When no subagent has ever been spawned, returns `true` so a\r\n * pre-spawn `assign()` simply queues (legacy behaviour). The\r\n * dead-end detection only fires after `stop()` has retired every\r\n * spawned worker.\r\n *\r\n * Used by `tryDispatchNext` to detect a dead-end pending queue.\r\n */\r\n private hasLiveSubagent(): boolean {\r\n if (this.subagents.size === 0) return true;\r\n for (const [id, s] of this.subagents) {\r\n if (s.status !== 'stopped' && !this.terminating.has(id)) return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Drain every pending task with a synthetic `aborted_by_parent`\r\n * completion event. Same shape as the `stopAll()` drain — we go\r\n * around `recordCompletion` because pending tasks were never\r\n * counted in `inFlight` and routing them through would trip the\r\n * underflow guard on every task after the first.\r\n */\r\n private drainPendingAsAborted(message: string): void {\r\n const dropped = this.pendingTasks.splice(0, this.pendingTasks.length);\r\n for (const t of dropped) {\r\n const synthetic: TaskResult = {\r\n subagentId: t.subagentId ?? 'unassigned',\r\n taskId: t.id,\r\n status: 'stopped',\r\n error: {\r\n kind: 'aborted_by_parent',\r\n message,\r\n retryable: false,\r\n },\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n };\r\n this.completedResults.push(synthetic);\r\n this.emit('task.completed', { task: t, result: synthetic });\r\n }\r\n }\r\n\r\n private async runDispatched(subagentId: string, task: TaskSpec): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n // Final race guard: if `stop(subagentId)` ran between dispatch\r\n // and us arriving here, refuse to start the task and surface it\r\n // as `aborted_by_parent` so any caller awaiting the task id\r\n // unblocks. Without this, the task would be marked 'running',\r\n // collide with the just-completed 'stopped' state, and leak\r\n // inFlight by 1 because no recordCompletion path covers it.\r\n if (this.terminating.has(subagentId) || subagent.status === 'stopped') {\r\n this.recordCompletion({\r\n subagentId,\r\n taskId: task.id,\r\n status: 'stopped',\r\n error: {\r\n kind: 'aborted_by_parent',\r\n message: 'Subagent was terminated before task could start',\r\n retryable: false,\r\n },\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n });\r\n return;\r\n }\r\n\r\n subagent.status = 'running';\r\n subagent.currentTask = task.id;\r\n task.subagentId = subagentId;\r\n subagent.context.tasks.push(task);\r\n\r\n this.emit('task.assigned', { task, subagentId });\r\n\r\n // Budget combines coordinator defaults with per-subagent and per-task overrides.\r\n // Precedence: task > subagent > roster default > coordinator default.\r\n const configWithRosterDefaults = applyRosterBudget(subagent.config);\r\n const budget = new SubagentBudget({\r\n maxIterations:\r\n configWithRosterDefaults.maxIterations ?? this.config.defaultBudget?.maxIterations,\r\n maxToolCalls:\r\n task.maxToolCalls ??\r\n configWithRosterDefaults.maxToolCalls ??\r\n this.config.defaultBudget?.maxToolCalls,\r\n maxTokens:\r\n configWithRosterDefaults.maxTokens ?? this.config.defaultBudget?.maxTokens,\r\n maxCostUsd:\r\n configWithRosterDefaults.maxCostUsd ?? this.config.defaultBudget?.maxCostUsd,\r\n timeoutMs:\r\n task.timeoutMs ?? configWithRosterDefaults.timeoutMs ?? this.config.defaultBudget?.timeoutMs,\r\n });\r\n subagent.activeBudget = budget;\r\n\r\n if (!this.runner) {\r\n // No runner wired — caller drives execution via completeTask(). Status\r\n // reverts when the caller reports. We intentionally don't bump\r\n // `inFlight` here: `completeTask` → `recordCompletion` would then\r\n // decrement an inFlight that runDispatched never incremented, masking\r\n // the \"no runner\" state. With this guard, `isDone()`'s all_tasks_done\r\n // check still settles correctly once the caller reports.\r\n return;\r\n }\r\n\r\n // Only count inFlight when we actually own the execution lifecycle.\r\n this.inFlight++;\r\n\r\n const startTime = Date.now();\r\n const runCtx: SubagentRunContext = {\r\n subagentId,\r\n config: subagent.config,\r\n budget,\r\n signal: subagent.abortController.signal,\r\n bridge: subagent.context.parentBridge || null,\r\n };\r\n\r\n let result: TaskResult;\r\n\r\n budget.start();\r\n try {\r\n const outcome = await this.executeWithTimeout(this.runner, task, runCtx, budget);\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status: 'success',\r\n result: outcome.result,\r\n iterations: outcome.iterations,\r\n toolCalls: outcome.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n } catch (err) {\r\n // Order matters: a timeout calls abort() to signal cooperative runners,\r\n // which also flips `signal.aborted=true`. Inspect the error first so we\r\n // surface 'timeout' rather than masking it as 'stopped'.\r\n const status: TaskResult['status'] =\r\n err instanceof BudgetExceededError && err.kind === 'timeout'\r\n ? 'timeout'\r\n : subagent.abortController.signal.aborted\r\n ? 'stopped'\r\n : 'failed';\r\n const usage = budget.usage();\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status,\r\n error: classifySubagentError(err, {\r\n parentAborted: subagent.abortController.signal.aborted,\r\n }),\r\n iterations: usage.iterations,\r\n toolCalls: usage.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n }\r\n\r\n this.recordCompletion(result);\r\n }\r\n\r\n private async executeWithTimeout(\r\n runner: SubagentRunner,\r\n task: TaskSpec,\r\n ctx: SubagentRunContext,\r\n budget: SubagentBudget,\r\n ) {\r\n const initialTimeoutMs = budget.limits.timeoutMs;\r\n if (initialTimeoutMs === undefined) return runner(task, ctx);\r\n\r\n // Re-armable watchdog. When the wall-clock fires, give the budget a\r\n // chance to negotiate an extension (via the same onThreshold path the\r\n // other limit kinds use). The Director's auto-extend listener handles\r\n // `kind: 'timeout'` and patches `budget.limits.timeoutMs`; we observe\r\n // that patch on the next tick and re-arm the timer for the remaining\r\n // window. If onThreshold is unset or negotiation returns 'stop',\r\n // reject as before with `elapsed` (not `Date.now()`) so the error\r\n // message reads sensibly.\r\n const start = Date.now();\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n const armFor = (ms: number) => {\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(async () => {\r\n const elapsed = Date.now() - start;\r\n const limit = budget.limits.timeoutMs ?? initialTimeoutMs;\r\n // Without an onThreshold handler the original behaviour stands:\r\n // abort the signal and hard-reject. This preserves the contract\r\n // for direct SubagentBudget consumers that don't wire negotiation.\r\n if (!budget.onThreshold) {\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('timeout', limit, elapsed));\r\n return;\r\n }\r\n // With a handler, ask for an extension. The budget's\r\n // requestDecision returns 'stop' on no response (decision\r\n // fallback timer inside SubagentBudget), so this never hangs.\r\n try {\r\n const result = budget.onThreshold({\r\n kind: 'timeout',\r\n used: elapsed,\r\n limit,\r\n requestDecision: () =>\r\n new Promise((resolveDecision) => {\r\n budget._events?.emit('budget.threshold_reached', {\r\n kind: 'timeout',\r\n used: elapsed,\r\n limit,\r\n timeoutMs: 30_000,\r\n extend: (extra) => resolveDecision({ extend: extra }),\r\n deny: () => resolveDecision('stop'),\r\n });\r\n }),\r\n });\r\n const decision =\r\n typeof result === 'string' ? result : await result;\r\n if (decision === 'continue') {\r\n armFor(Math.max(1_000, limit));\r\n return;\r\n }\r\n if (decision === 'throw' || decision === 'stop') {\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('timeout', limit, elapsed));\r\n return;\r\n }\r\n // 'extend' — patch budget and re-arm for the new remainder.\r\n if (decision.extend.timeoutMs !== undefined) {\r\n (budget.limits as Record<string, unknown>).timeoutMs =\r\n decision.extend.timeoutMs;\r\n const newLimit = decision.extend.timeoutMs;\r\n const remaining = Math.max(1_000, newLimit - elapsed);\r\n armFor(remaining);\r\n return;\r\n }\r\n // No timeoutMs in extend — fall through to reject.\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('timeout', limit, elapsed));\r\n } catch (err) {\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(\r\n err instanceof BudgetExceededError\r\n ? err\r\n : new BudgetExceededError('timeout', limit, elapsed),\r\n );\r\n }\r\n }, ms);\r\n };\r\n armFor(initialTimeoutMs);\r\n });\r\n\r\n try {\r\n return await Promise.race([runner(task, ctx), timeoutPromise]);\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n }\r\n\r\n private recordCompletion(result: TaskResult): void {\r\n this.completedResults.push(result);\r\n this.totalIterations += result.iterations;\r\n if (this.inFlight > 0) {\r\n this.inFlight--;\r\n } else if (this.runner) {\r\n // Runner-driven path completed without an outstanding inFlight slot —\r\n // shouldn't happen unless completeTask was called externally.\r\n this.emit('warning', {\r\n type: 'inFlight_underflow',\r\n taskId: result.taskId,\r\n subagentId: result.subagentId,\r\n });\r\n return;\r\n }\r\n\r\n const subagent = this.subagents.get(result.subagentId);\r\n if (subagent && subagent.status !== 'stopped') {\r\n const failed = result.status === 'failed' || result.status === 'timeout';\r\n // Synchronously reset the worker to idle after either a clean\r\n // finish or a transient failure. The previous code parked the\r\n // subagent in 'error' and used a `queueMicrotask` to flip it\r\n // back to 'idle' — that opened a window where `assign()` +\r\n // `tryDispatchNext` could race the microtask, leaving the\r\n // worker stuck in 'running' state while actually idle. By\r\n // resetting now, no async gap can leak the state machine.\r\n subagent.status = 'idle';\r\n void failed; // kept for future telemetry hooks\r\n subagent.currentTask = undefined;\r\n // If the run aborted (timeout or explicit stop), the subagent's\r\n // signal is now permanently aborted — recycling the controller lets\r\n // the next dispatched task start with a fresh cancellation scope.\r\n if (subagent.abortController.signal.aborted) {\r\n subagent.abortController = new AbortController();\r\n }\r\n }\r\n // Clear the terminating flag now that the worker has a terminal\r\n // TaskResult on record. Subsequent stop() calls re-add it; new\r\n // assign() calls can flow normally.\r\n this.terminating.delete(result.subagentId);\r\n\r\n this.emit('task.completed', {\r\n task: subagent?.context.tasks.find((t) => t.id === result.taskId) ?? { id: result.taskId },\r\n result,\r\n });\r\n\r\n this.tryDispatchNext();\r\n\r\n if (this.isDone()) {\r\n this.emit('done', {\r\n results: this.completedResults,\r\n totalIterations: this.totalIterations,\r\n });\r\n }\r\n }\r\n\r\n private isDone(): boolean {\r\n if (this.config.doneCondition.type === 'all_tasks_done') {\r\n return this.pendingTasks.length === 0 && this.inFlight === 0;\r\n }\r\n if (\r\n this.config.doneCondition.maxIterations !== undefined &&\r\n this.totalIterations >= this.config.doneCondition.maxIterations\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Map any raw exception thrown out of a subagent's runner into a\r\n * structured `SubagentError`. This is the single point where the\r\n * coordinator decides \"what kind of failure was that\" — so callers\r\n * (delegate tool output, /agents UI, retry policies) branch on\r\n * `kind` instead of substring-matching `error.message`.\r\n *\r\n * The classification order matters:\r\n * 1. Provider errors first (their `status` + `retryable` are\r\n * already structured, just translate to our enum).\r\n * 2. Budget errors next (BudgetExceededError carries a discrete\r\n * `kind` we can lift directly).\r\n * 3. Parent-abort if the subagent's signal was aborted and we\r\n * didn't recognize the error otherwise — distinguishes user\r\n * Ctrl+C from a tool throwing.\r\n * 4. Substring sniffing for stable error markers (\"agent\r\n * aborted\" from agent-subagent-runner, \"Bridge transport\"\r\n * from agent-bridge).\r\n * 5. Fallback to `unknown` so callers know we couldn't classify.\r\n *\r\n * The `cause` field is always populated when `err` is an Error so\r\n * diagnostics survive even when `kind === 'unknown'` — no info is\r\n * dropped, the classifier just refused to commit.\r\n *\r\n * Exported because tests and CLI surfaces want to assert on the\r\n * classification without instantiating a coordinator.\r\n */\r\nexport function classifySubagentError(\r\n err: unknown,\r\n hints: { parentAborted?: boolean } = {},\r\n): SubagentError {\r\n const cause = err instanceof Error\r\n ? { name: err.name, message: err.message, stack: err.stack }\r\n : undefined;\r\n\r\n if (err instanceof ProviderError) {\r\n const baseMessage = err.describe();\r\n return providerErrorToSubagentError(err, baseMessage, cause);\r\n }\r\n\r\n const baseMessage = err instanceof Error ? err.message : String(err);\r\n\r\n if (err instanceof BudgetExceededError) {\r\n const map: Record<BudgetExceededError['kind'], SubagentErrorKind> = {\r\n iterations: 'budget_iterations',\r\n tool_calls: 'budget_tool_calls',\r\n tokens: 'budget_tokens',\r\n cost: 'budget_cost',\r\n timeout: 'budget_timeout',\r\n };\r\n return {\r\n kind: map[err.kind],\r\n message: baseMessage,\r\n // Budgets are user-configured ceilings, not transient failures —\r\n // retrying with the same budget will hit the same ceiling. The\r\n // orchestrator must raise the budget or narrow the task first.\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n\r\n // Distinguish parent-aborted from real failures BEFORE substring\r\n // sniffing — if the parent signal is aborted, the most common\r\n // exception is \"agent aborted\" thrown by agent-subagent-runner.\r\n if (hints.parentAborted) {\r\n return {\r\n kind: 'aborted_by_parent',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n\r\n // Stable markers — these strings live in our own code and are\r\n // checked here intentionally so callers can react without\r\n // exception-type imports.\r\n const lower = baseMessage.toLowerCase();\r\n if (/agent aborted$/i.test(baseMessage)) {\r\n return {\r\n kind: 'aborted_by_parent',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n if (/agent exhausted iteration limit$/i.test(baseMessage)) {\r\n return { kind: 'budget_iterations', message: baseMessage, retryable: false, cause };\r\n }\r\n if (/empty response$/i.test(baseMessage)) {\r\n return { kind: 'empty_response', message: baseMessage, retryable: false, cause };\r\n }\r\n // The runner throws `Error('tool failed: <name>')` when an executed tool\r\n // returned `ok:false` and the agent ultimately ended without recovering\r\n // (or aborted). Surface as `tool_failed` so callers don't conflate a\r\n // failed tool with a thrown tool — both are useful but mean different\r\n // things at the LLM layer.\r\n if (/^tool failed: /i.test(baseMessage)) {\r\n return { kind: 'tool_failed', message: baseMessage, retryable: false, cause };\r\n }\r\n if (lower.includes('bridge transport') || /bridge.*(closed|disconnect)/i.test(baseMessage)) {\r\n return { kind: 'bridge_failed', message: baseMessage, retryable: false, cause };\r\n }\r\n if (/context length|max.*tokens?.*exceeded|prompt is too long/i.test(baseMessage)) {\r\n return { kind: 'context_overflow', message: baseMessage, retryable: false, cause };\r\n }\r\n\r\n // Final fallback — preserve cause so diagnostics aren't lost.\r\n return {\r\n kind: 'unknown',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n}\r\n\r\nfunction providerErrorToSubagentError(\r\n err: ProviderError,\r\n message: string,\r\n cause: SubagentError['cause'],\r\n): SubagentError {\r\n const status = err.status;\r\n // Read suggested retry-after from the provider body when present so\r\n // the orchestrator doesn't have to invent a backoff. Most providers\r\n // include retry-after as a header / body field which our provider\r\n // layer normalises into `body.message` — we cannot trust a numeric\r\n // field exists, so we leave backoffMs unset when unknown.\r\n if (status === 429 || err.body?.type === 'rate_limit_error') {\r\n return {\r\n kind: 'provider_rate_limit',\r\n message,\r\n retryable: true,\r\n // Conservative default: 5s. Provider-specific code can override\r\n // by emitting an error whose body carries an explicit hint.\r\n backoffMs: 5_000,\r\n cause,\r\n };\r\n }\r\n if (status === 401 || status === 403 || err.body?.type === 'authentication_error') {\r\n return { kind: 'provider_auth', message, retryable: false, cause };\r\n }\r\n if (status === 408 || status === 0) {\r\n return { kind: 'provider_timeout', message, retryable: true, cause };\r\n }\r\n if (status >= 500 && status < 600) {\r\n return {\r\n kind: 'provider_5xx',\r\n message,\r\n retryable: true,\r\n backoffMs: 3_000,\r\n cause,\r\n };\r\n }\r\n // Other provider errors (400 invalid request, 404 not found, etc.)\r\n // are not retryable as-is and don't have a dedicated kind — surface\r\n // as 'unknown' so the orchestrator treats them as terminal.\r\n return { kind: 'unknown', message, retryable: err.retryable, cause };\r\n}\r\n","import { randomUUID } from 'node:crypto';\r\nimport type { SubagentConfig, TaskSpec } from '../types/multi-agent.js';\r\nimport type { JSONSchema, Tool } from '../types/tool.js';\r\nimport { type Director, FleetSpawnBudgetError, FleetCostCapError } from './director.js';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Director-facing tool factories.\r\n//\r\n// Each tool's input schema is intentionally minimal — the director model\r\n// reads the descriptions and gets clean structured shapes. We avoid deep\r\n// nested schemas because they confuse smaller models.\r\n\r\nexport function makeSpawnTool(director: Director, roster?: Record<string, SubagentConfig>): Tool {\r\n const inputSchema: JSONSchema = {\r\n type: 'object',\r\n properties: {\r\n role: { type: 'string', description: 'Roster role id (preferred). When set, the spawn uses the matching config from the roster and ignores other fields.' },\r\n name: { type: 'string', description: 'Display name for the subagent. Required when not using roster.' },\r\n provider: { type: 'string', description: 'Provider id (e.g. \"anthropic\", \"openai\"). Defaults to the leader provider when omitted.' },\r\n model: { type: 'string', description: 'Model id within the provider. Defaults to the leader model when omitted.' },\r\n systemPromptOverride: { type: 'string', description: 'Extra prompt text appended after the role-base prompt.' },\r\n maxIterations: { type: 'number' },\r\n maxToolCalls: { type: 'number' },\r\n maxCostUsd: { type: 'number' },\r\n },\r\n required: [],\r\n };\r\n return {\r\n name: 'spawn_subagent',\r\n description: 'Create a new subagent under this director. Returns the subagent id.',\r\n usageHint: 'Either pass `role` (matches the roster) OR pass `name` + optional `provider`/`model`. Returns `{ subagentId }`.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema,\r\n async execute(input: unknown) {\r\n const i = (input ?? {}) as Record<string, unknown>;\r\n const role = typeof i.role === 'string' ? i.role : undefined;\r\n const base: SubagentConfig | undefined = role && roster ? roster[role] : undefined;\r\n if (role && !base) {\r\n return { error: `unknown role \"${role}\". roster has: ${roster ? Object.keys(roster).join(', ') : '(empty)'}` };\r\n }\r\n const cfg: SubagentConfig = base\r\n ? instantiateRosterConfig(role!, base)\r\n : { name: (i.name as string) ?? 'subagent' };\r\n if (typeof i.name === 'string') cfg.name = i.name;\r\n if (typeof i.provider === 'string') cfg.provider = i.provider;\r\n if (typeof i.model === 'string') cfg.model = i.model;\r\n if (typeof i.systemPromptOverride === 'string') cfg.systemPromptOverride = i.systemPromptOverride;\r\n if (typeof i.maxIterations === 'number') cfg.maxIterations = i.maxIterations;\r\n if (typeof i.maxToolCalls === 'number') cfg.maxToolCalls = i.maxToolCalls;\r\n if (typeof i.maxCostUsd === 'number') cfg.maxCostUsd = i.maxCostUsd;\r\n try {\r\n const subagentId = await director.spawn(cfg);\r\n return { subagentId, provider: cfg.provider, model: cfg.model, name: cfg.name };\r\n } catch (err) {\r\n if (err instanceof FleetSpawnBudgetError) {\r\n return { error: err.message, kind: err.kind, limit: err.limit, observed: err.observed };\r\n }\r\n if (err instanceof FleetCostCapError) {\r\n return { error: err.message, kind: err.kind, limit: err.limit, observed: err.observed };\r\n }\r\n return { error: err instanceof Error ? err.message : String(err) };\r\n }\r\n },\r\n };\r\n}\r\n\r\nfunction instantiateRosterConfig(role: string, base: SubagentConfig): SubagentConfig {\r\n return {\r\n ...base,\r\n // Roster entries are templates. A director may spawn several\r\n // workers with the same role, so never reuse the template id.\r\n id: `${role}-${randomUUID().slice(0, 8)}`,\r\n };\r\n}\r\n\r\nexport function makeAssignTool(director: Director): Tool {\r\n const inputSchema: JSONSchema = {\r\n type: 'object',\r\n properties: {\r\n subagentId: { type: 'string', description: 'Target subagent id. Required.' },\r\n description: { type: 'string', description: 'The task in natural language — what you want this subagent to do.' },\r\n maxToolCalls: { type: 'number', description: 'Optional per-task tool-call budget override.' },\r\n timeoutMs: { type: 'number', description: 'Optional per-task timeout in ms.' },\r\n },\r\n required: ['subagentId', 'description'],\r\n };\r\n return {\r\n name: 'assign_task',\r\n description: 'Hand a task to a previously spawned subagent. Returns the task id.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema,\r\n async execute(input: unknown) {\r\n const i = input as { subagentId: string; description: string; maxToolCalls?: number; timeoutMs?: number };\r\n const task: TaskSpec = { id: randomUUID(), description: i.description, subagentId: i.subagentId, maxToolCalls: i.maxToolCalls, timeoutMs: i.timeoutMs };\r\n const taskId = await director.assign(task);\r\n return { taskId, subagentId: i.subagentId };\r\n },\r\n };\r\n}\r\n\r\nexport function makeAwaitTasksTool(director: Director): Tool {\r\n return {\r\n name: 'await_tasks',\r\n description: 'Block until every named task completes. Returns the array of TaskResult.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: { type: 'object', properties: { taskIds: { type: 'array', items: { type: 'string' }, description: 'One or more task ids returned by `assign_task`.' } }, required: ['taskIds'] },\r\n async execute(input: unknown) {\r\n const i = input as { taskIds: string[] };\r\n const results = await director.awaitTasks(i.taskIds);\r\n return { results };\r\n },\r\n };\r\n}\r\n\r\nexport function makeAskTool(director: Director): Tool {\r\n return {\r\n name: 'ask_subagent',\r\n description: 'Synchronously ask a subagent a question. Blocks until the subagent replies via the bridge.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n subagentId: { type: 'string', description: 'Subagent to ask. Must be a previously spawned id.' },\r\n question: { type: 'string', description: 'The question or instruction.' },\r\n timeoutMs: { type: 'number', description: 'Optional timeout in ms (default 30s).' },\r\n },\r\n required: ['subagentId', 'question'],\r\n },\r\n async execute(input: unknown) {\r\n const i = input as { subagentId: string; question: string; timeoutMs?: number };\r\n try {\r\n const answer = await director.ask(i.subagentId, { question: i.question }, i.timeoutMs);\r\n return { ok: true, answer };\r\n } catch (err) {\r\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\r\n }\r\n },\r\n };\r\n}\r\n\r\nexport function makeRollUpTool(director: Director): Tool {\r\n return {\r\n name: 'roll_up',\r\n description: \"Aggregate completed task results into a single formatted summary.\",\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n taskIds: { type: 'array', items: { type: 'string' }, description: 'Completed task ids to aggregate.' },\r\n style: { type: 'string', enum: ['markdown', 'json'], description: 'Output flavor — markdown (default) or json.' },\r\n },\r\n required: ['taskIds'],\r\n },\r\n async execute(input: unknown) {\r\n const i = input as { taskIds: string[]; style?: 'markdown' | 'json' };\r\n const summary = director.rollUp(i.taskIds, i.style ?? 'markdown');\r\n return { summary, count: i.taskIds.length };\r\n },\r\n };\r\n}\r\n\r\nexport function makeTerminateTool(director: Director): Tool {\r\n return {\r\n name: 'terminate_subagent',\r\n description: 'Forcibly abort a subagent.',\r\n permission: 'auto',\r\n mutating: true,\r\n inputSchema: { type: 'object', properties: { subagentId: { type: 'string', description: 'Subagent to abort.' } }, required: ['subagentId'] },\r\n async execute(input: unknown) {\r\n const i = input as { subagentId: string };\r\n await director.terminate(i.subagentId);\r\n return { ok: true };\r\n },\r\n };\r\n}\r\n\r\nexport function makeFleetStatusTool(director: Director): Tool {\r\n return {\r\n name: 'fleet_status',\r\n description: \"Snapshot of the fleet — every subagent's current status, pending vs. completed task counts.\",\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: { type: 'object', properties: {}, required: [] },\r\n async execute() { return director.status(); },\r\n };\r\n}\r\n\r\nexport function makeFleetUsageTool(director: Director): Tool {\r\n return {\r\n name: 'fleet_usage',\r\n description: 'Token + cost breakdown across the fleet, per-subagent and totals.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: { type: 'object', properties: {}, required: [] },\r\n async execute() { return director.snapshot(); },\r\n };\r\n}\r\n\r\n/**\r\n * Read a subagent's JSONL transcript and return the last assistant text,\r\n * stop reason, and tool-use count. The director can call this on a\r\n * running or timed-out subagent to see what it actually produced without\r\n * having to wait for natural completion.\r\n */\r\nexport function makeFleetSessionTool(director: Director): Tool {\r\n return {\r\n name: 'fleet_session',\r\n description:\r\n 'Read a subagent\\'s JSONL transcript and extract its last assistant text, stop reason, and tool-use count. Use this to see what a running or timed-out subagent actually produced.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n subagentId: { type: 'string', description: 'Subagent id to read the transcript of.' },\r\n /** Number of trailing lines to return (last N JSONL lines). Default: all. */\r\n tail: { type: 'number', description: 'Number of trailing JSONL lines to return. Omit for the full transcript.' },\r\n },\r\n required: ['subagentId'],\r\n },\r\n async execute(input: unknown) {\r\n const i = input as { subagentId: string; tail?: number };\r\n const result = await director.readSession(i.subagentId, i.tail);\r\n if (!result) {\r\n return {\r\n error: `fleet_session: transcript unavailable for \"${i.subagentId}\". Is sessionsRoot configured?`,\r\n };\r\n }\r\n return result;\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Health snapshot per subagent — budget pressure (how close to limits),\r\n * last activity timestamp, and current status. Lets the director make\r\n * smarter routing decisions without having to call fleet_usage + fleet_status separately.\r\n */\r\nexport function makeFleetHealthTool(director: Director): Tool {\r\n return {\r\n name: 'fleet_health',\r\n description:\r\n 'Per-subagent health report: budget pressure (pct of limits consumed), last activity timestamp, and current status. Use to decide whether to assign more work to a subagent or spawn a fresh one.',\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema: { type: 'object', properties: {}, required: [] },\r\n async execute() {\r\n const status = director.status();\r\n const snapshot = director.snapshot();\r\n const subagents = status.subagents ?? [];\r\n const perSubagent = snapshot.perSubagent ?? {};\r\n return {\r\n subagents: subagents.map((s) => {\r\n const usage = perSubagent[s.id];\r\n return {\r\n id: s.id,\r\n status: s.status,\r\n lastEventAt: usage?.lastEventAt,\r\n // Budget pressure: fraction of each limit consumed if we have it.\r\n // BudgetWarning events carry used/limit ratios; surface them here.\r\n budgetPressure: {\r\n iterations: usage?.iterations,\r\n toolCalls: usage?.toolCalls,\r\n costUsd: usage?.cost,\r\n },\r\n };\r\n }),\r\n };\r\n },\r\n };\r\n}\r\n","import { randomUUID } from 'node:crypto';\r\nimport * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\nimport { DirectorStateCheckpoint, type DirectorStateSnapshot } from '../storage/director-state.js';\r\nimport type { BridgeMessage } from '../types/agent-bridge.js';\r\nimport type {\r\n CoordinatorStatus,\r\n MultiAgentConfig,\r\n SubagentConfig,\r\n SubagentRunner,\r\n TaskResult,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport type { SessionWriter } from '../types/session.js';\r\nimport type { JSONSchema, Tool } from '../types/tool.js';\r\nimport { InMemoryAgentBridge } from './agent-bridge.js';\r\nimport { ICoordinator } from './icoordinator.js';\r\nimport {\r\n DEFAULT_DIRECTOR_PREAMBLE,\r\n DEFAULT_SUBAGENT_BASELINE,\r\n composeDirectorPrompt,\r\n composeSubagentPrompt,\r\n rosterSummaryFromConfigs,\r\n} from './director-prompts.js';\r\nimport { FleetBus, type FleetUsage, FleetUsageAggregator } from './fleet-bus.js';\r\nimport { FleetManager } from './fleet-manager.js';\r\nimport { InMemoryBridgeTransport } from './in-memory-transport.js';\r\nimport { DefaultMultiAgentCoordinator } from './multi-agent-coordinator.js';\r\nimport { makeAskTool, makeAssignTool, makeAwaitTasksTool, makeFleetHealthTool, makeFleetSessionTool, makeFleetStatusTool, makeFleetUsageTool, makeRollUpTool, makeSpawnTool, makeTerminateTool } from './director-tools.js';\r\n\r\n/**\r\n * Director — high-level orchestrator that owns a `MultiAgentCoordinator`,\r\n * a `FleetBus`, and a `FleetUsageAggregator`. Exposes a small imperative\r\n * API (`spawn`, `assign`, `awaitTasks`, `terminate`, `status`, `usage`)\r\n * that's easy to test, and a `tools()` factory that wraps the same API\r\n * as agent-callable `Tool`s so an LLM can drive the orchestration.\r\n *\r\n * This class is intentionally *not* an `Agent`. It's a coordinator +\r\n * observability surface. To make it LLM-driven, construct an Agent\r\n * with `director.tools()` registered. That keeps the construction\r\n * symmetric with how other agents are built and avoids smuggling a\r\n * heavy LLM dependency into core just for the director path.\r\n */\r\nexport interface DirectorOptions {\r\n config: MultiAgentConfig;\r\n runner?: SubagentRunner;\r\n /**\r\n * When set, the director writes a `fleet.json` manifest to this path\r\n * recording every spawned subagent (id, provider, model, role, task\r\n * ids). Used by `wstack replay <runId>` to rehydrate a fleet. Pass an\r\n * absolute file path — the directory must already exist (the\r\n * director-session factory creates it when used together).\r\n */\r\n manifestPath?: string;\r\n /**\r\n * Optional roster used by `leaderSystemPrompt()` to render a roles\r\n * summary into the leader's preamble. Same shape as the roster passed\r\n * to `tools()` — typically the same value.\r\n */\r\n roster?: Record<string, SubagentConfig>;\r\n /**\r\n * Override the built-in fleet preamble (see `DEFAULT_DIRECTOR_PREAMBLE`).\r\n * Pass an empty string to suppress the preamble entirely.\r\n */\r\n directorPreamble?: string;\r\n /**\r\n * Override the built-in subagent baseline (see\r\n * `DEFAULT_SUBAGENT_BASELINE`). Pass an empty string to suppress.\r\n */\r\n subagentBaseline?: string;\r\n /**\r\n * Absolute path to a directory the fleet can use as a shared scratchpad\r\n * (read + write by every subagent). When set, the director creates it on\r\n * construction and `subagentSystemPrompt()` automatically injects a\r\n * \"Shared notes\" block telling subagents where to drop their findings.\r\n * This is the cheap fleet-coordination channel — agents don't need each\r\n * other's transcripts, just each other's conclusions.\r\n *\r\n * Convention: under a fleet run rooted at `<sessionsRoot>/<runId>/`,\r\n * pass `<sessionsRoot>/<runId>/shared/` here.\r\n */\r\n sharedScratchpadPath?: string;\r\n /**\r\n * Maximum number of spawns this director can perform across its\r\n * lifetime. Default: unlimited. Acts as a hard fleet-wide cost cap —\r\n * a runaway leader that keeps spawning workers gets cut off cleanly\r\n * instead of burning provider tokens until the user kills the\r\n * process. The N+1-th spawn call rejects with a `FleetSpawnBudgetError`.\r\n */\r\n maxSpawns?: number;\r\n /**\r\n * Maximum nesting depth for spawns. The director constructed by the\r\n * user is at depth `spawnDepth` (default 0); any subagent that itself\r\n * acts as a director would construct its own `Director` with\r\n * `spawnDepth: parent.spawnDepth + 1`. When `spawnDepth >= maxSpawnDepth`,\r\n * `spawn()` rejects. Default: 2 (root director can spawn workers; a\r\n * worker that becomes a sub-director cannot itself spawn further).\r\n * This stops infinite recursive director chains from a hostile or\r\n * confused prompt.\r\n */\r\n maxSpawnDepth?: number;\r\n /**\r\n * Current spawn-chain depth for this director instance. Defaults to 0.\r\n * A nested director should pass `parent.spawnDepth + 1`. Together with\r\n * `maxSpawnDepth` this bounds the chain.\r\n */\r\n spawnDepth?: number;\r\n /**\r\n * Absolute path to a director-state checkpoint file. When set, the\r\n * director writes an incremental snapshot of pending/running/completed\r\n * tasks + spawned subagents on every state mutation. Distinct from\r\n * `manifestPath`: the manifest is a final record written on shutdown,\r\n * the checkpoint is a live mirror useful for crash recovery and the\r\n * `wstack resume` \"you had N tasks in flight\" banner.\r\n */\r\n stateCheckpointPath?: string;\r\n /**\r\n * Session writer the director should forward task lifecycle events to\r\n * (`agent_spawned`, `task_created`, `task_completed`, `task_failed`).\r\n * When omitted these events stay in-memory only — useful for tests but\r\n * lossy in production. Production callers (the CLI) pass the same\r\n * writer the host Agent uses so all events land in a single JSONL.\r\n */\r\n sessionWriter?: SessionWriter;\r\n /**\r\n * Debounce window for periodic manifest writes triggered by spawn/\r\n * assign/complete events. Default: 2000ms. Pass 0 to disable periodic\r\n * writes (the manifest will then only be written on `shutdown()`).\r\n */\r\n manifestDebounceMs?: number;\r\n /**\r\n * Fleet-wide cost ceiling. When set, `spawn()` refuses any new subagent\r\n * that would push the fleet's total cost above this limit. The cap\r\n * is checked BEFORE the spawn is recorded — a refused spawn must not\r\n * leak partial state into the manifest or fleet bus. Let in-flight\r\n * tasks complete; refuse new spawns only. When omitted or Infinity,\r\n * no cost cap applies.\r\n *\r\n * Distinct from SubagentBudget.maxCostUsd (per-subagent spend) — this\r\n * field caps the *entire fleet* total.\r\n */\r\n directorBudget?: {\r\n /**\r\n * Maximum total USD the fleet may spend across all subagents.\r\n * Default: Infinity (no cap).\r\n */\r\n maxCostUsd?: number;\r\n };\r\n /**\r\n * Maximum auto-extensions per subagent per budget kind before the\r\n * director denies further extensions. A subagent hitting the same\r\n * soft limit repeatedly (e.g. 3× budget.threshold_reached for\r\n * tool_calls) is likely looping on a prompt/config issue, not\r\n * making legitimate progress. Default: 2. Set to Infinity to\r\n * disable the cap (use with caution — a misconfigured subagent\r\n * could burn unlimited budget).\r\n */\r\n maxBudgetExtensions?: number;\r\n /**\r\n * Debounce window for state-checkpoint writes. Default: 250ms.\r\n * Bursts of spawn/assign/complete events collapse into one disk\r\n * hit. Higher values reduce write amplification on fast machines;\r\n * lower values improve crash-recovery fidelity (less state lost\r\n * on sudden process exit).\r\n */\r\n checkpointDebounceMs?: number;\r\n /**\r\n * Sessions root directory for per-subagent JSONL transcripts.\r\n * When set, the director can read subagent transcripts directly for\r\n * `fleet_session` tool — no bridge round-trip needed. Path convention:\r\n * `<sessionsRoot>/<directorRunId>/<subagentId>.jsonl`.\r\n */\r\n sessionsRoot?: string;\r\n /**\r\n * Director run id — namespaced under `sessionsRoot` to locate per-subagent\r\n * JSONLs. Defaults to the director's own `id` when omitted.\r\n */\r\n directorRunId?: string;\r\n /**\r\n * Pre-built fleet manager. When provided the Director delegates all\r\n * fleet-level policy (spawn budgets, manifest assembly, checkpointing)\r\n * to this instance and takes ownership of the coordinator + bridge\r\n * layer only. This enables unit-testing fleet policy in isolation\r\n * and swapping implementations without changing the Director surface.\r\n *\r\n * When omitted the Director creates its own fleet infrastructure\r\n * (same behavior as before this field was added).\r\n */\r\n fleetManager?: FleetManager;\r\n}\r\n\r\n/**\r\n * Thrown by `Director.spawn()` when a configured spawn cap (`maxSpawns`,\r\n * `maxSpawnDepth`) is hit. Distinct error class so callers — including\r\n * the `spawn_subagent` tool surface — can recognize the budget case and\r\n * report it cleanly instead of treating it like an unexpected failure.\r\n */\r\nexport class FleetSpawnBudgetError extends Error {\r\n readonly kind: 'max_spawns' | 'max_spawn_depth';\r\n readonly limit: number;\r\n readonly observed: number;\r\n constructor(kind: 'max_spawns' | 'max_spawn_depth', limit: number, observed: number) {\r\n super(\r\n kind === 'max_spawns'\r\n ? `Director spawn budget exceeded: tried to spawn #${observed} but maxSpawns is ${limit}`\r\n : `Director spawn depth budget exceeded: this director is at depth ${observed} and maxSpawnDepth is ${limit}`,\r\n );\r\n this.name = 'FleetSpawnBudgetError';\r\n this.kind = kind;\r\n this.limit = limit;\r\n this.observed = observed;\r\n }\r\n}\r\n\r\n/**\r\n * Thrown by `Director.spawn()` when the fleet-wide cost cap is exceeded.\r\n * Distinct from `FleetSpawnBudgetError` (spawn count/depth) — this is a\r\n * dollar-denominated ceiling that tracks cumulative spend across all\r\n * subagents in the fleet.\r\n */\r\nexport class FleetCostCapError extends Error {\r\n readonly kind: 'max_cost_usd';\r\n readonly limit: number;\r\n readonly observed: number;\r\n constructor(limit: number, observed: number) {\r\n super(\r\n `Director cost cap exceeded: total fleet spend ${observed.toFixed(4)} exceeds maxCostUsd ${limit.toFixed(4)}`,\r\n );\r\n this.name = 'FleetCostCapError';\r\n this.kind = 'max_cost_usd';\r\n this.limit = limit;\r\n this.observed = observed;\r\n }\r\n}\r\n\r\nexport class Director implements ICoordinator {\r\n /** Alias for the ICoordinator contract. `id` is retained for backward compatibility. */\r\n get coordinatorId(): string { return this.id; }\r\n readonly id: string;\r\n /**\r\n * The fleet event bus. Backed by `fleetManager?.fleet` when a FleetManager\r\n * is injected; otherwise own FleetBus instance (preserves existing behavior).\r\n */\r\n readonly fleet: FleetBus;\r\n /**\r\n * Usage rollup. Backed by `fleetManager?.usage` when a FleetManager is\r\n * injected; otherwise own FleetUsageAggregator.\r\n */\r\n readonly usage: FleetUsageAggregator;\r\n /**\r\n * Optional fleet-level policy container. When provided the Director\r\n * delegates spawn budgeting, manifest entries, and checkpointing to it\r\n * instead of managing those internally. All other behavior is unchanged.\r\n */\r\n readonly fleetManager: FleetManager | undefined;\r\n /**\r\n * Director-side bridge endpoint. Subagents are wired to the same\r\n * in-memory transport so the director can `ask()` them synchronously\r\n * and they can `send()` progress back. Exposed so external code (e.g.\r\n * the TUI) can subscribe to inbound messages.\r\n */\r\n readonly bridge: InMemoryAgentBridge;\r\n private readonly transport: InMemoryBridgeTransport;\r\n private readonly coordinator: DefaultMultiAgentCoordinator;\r\n /** Resolves with the matching `TaskResult` the first time the\r\n * coordinator emits `task.completed` for a given task id. Each entry\r\n * is created lazily on first poll/await and cleared once consumed. */\r\n private readonly taskWaiters = new Map<\r\n string,\r\n {\r\n promise: Promise<TaskResult>;\r\n resolve: (r: TaskResult) => void;\r\n }\r\n >();\r\n /** Cache of completed results in case the consumer asks AFTER the\r\n * coordinator already fired the event — `awaitTasks(['t-1'])` after\r\n * t-1 finished should resolve immediately, not hang. */\r\n private readonly completed = new Map<string, TaskResult>();\r\n /** Per-subagent provider/model metadata, captured at spawn time so the\r\n * FleetUsageAggregator's metaLookup can surface readable rows. */\r\n private readonly subagentMeta = new Map<string, { provider?: string; model?: string }>();\r\n private readonly priceLookups = new Map<\r\n string,\r\n { input?: number; output?: number; cacheRead?: number; cacheWrite?: number }\r\n >();\r\n /** Bridge endpoints we created per subagent (so we can `stop()` them\r\n * on shutdown and free transport subscriptions). */\r\n private readonly subagentBridges = new Map<string, InMemoryAgentBridge>();\r\n /** Tracks per-spawn config + assigned task ids for manifest writing. */\r\n private readonly manifestEntries = new Map<\r\n string,\r\n {\r\n subagentId: string;\r\n name: string;\r\n role?: string;\r\n provider?: string;\r\n model?: string;\r\n taskIds: string[];\r\n }\r\n >();\r\n private readonly manifestPath?: string;\r\n private readonly roster?: Record<string, SubagentConfig>;\r\n private readonly directorPreamble: string;\r\n private readonly subagentBaseline: string;\r\n /** Absolute path to the fleet's shared scratchpad directory, or null\r\n * when none was configured. Exposed as a readonly getter for callers\r\n * that need to surface the path to the user (e.g. the CLI logging\r\n * the location after `--director` boots). */\r\n readonly sharedScratchpadPath: string | null;\r\n /** Spawn cap (lifetime total). Infinity means unlimited. */\r\n readonly maxSpawns: number;\r\n /** Nesting cap. The N-th director in a chain has `spawnDepth = N-1`. */\r\n readonly maxSpawnDepth: number;\r\n /** This director's position in a director chain. Root director = 0. */\r\n readonly spawnDepth: number;\r\n /** Live spawn counter for `maxSpawns` enforcement. */\r\n private spawnCount = 0;\r\n /** Optional checkpoint mirror — writes the live task graph + roster to disk. */\r\n private readonly stateCheckpoint: DirectorStateCheckpoint | null;\r\n /** Optional session writer for emitting task_* / agent_* lifecycle events. */\r\n private readonly sessionWriter: SessionWriter | null;\r\n /** Debounce timer for periodic manifest writes. */\r\n private manifestTimer: NodeJS.Timeout | null = null;\r\n private readonly manifestDebounceMs: number;\r\n /** Fleet-wide cost cap (entire fleet total, distinct from SubagentBudget limits). Infinity means no cap. */\r\n private readonly maxFleetCostUsd: number;\r\n /** Max auto-extensions per subagent per budget kind before denying. */\r\n private readonly maxBudgetExtensions: number;\r\n /** Sessions root for direct subagent JSONL reads (fleet_session tool). */\r\n private readonly sessionsRoot?: string;\r\n /** Director run id for JSONL path resolution. */\r\n private readonly directorRunId: string;\r\n /** Resolves task descriptions back from `assign()` so completion events\r\n * can also carry a human-readable title. */\r\n private readonly taskDescriptions = new Map<string, string>();\r\n /** Snapshot of which subagent owns each task — drives state-checkpoint\r\n * status updates without re-walking the manifest. */\r\n private readonly taskOwners = new Map<string, string>();\r\n /**\r\n * Handle to the coordinator-side `task.completed` listener so we can\r\n * unsubscribe in `shutdown()`. Without this, repeated Director\r\n * construction (e.g. tests, hot reloads) accumulates listeners on a\r\n * cached coordinator and slowly drifts the EventEmitter past its\r\n * default cap.\r\n */\r\n private taskCompletedListener: ((payload: { task: TaskSpec; result: TaskResult }) => void) | null = null;\r\n\r\n constructor(opts: DirectorOptions) {\r\n this.id = opts.config.coordinatorId || randomUUID();\r\n this.manifestPath = opts.manifestPath;\r\n this.roster = opts.roster;\r\n this.directorPreamble = opts.directorPreamble ?? DEFAULT_DIRECTOR_PREAMBLE;\r\n this.subagentBaseline = opts.subagentBaseline ?? DEFAULT_SUBAGENT_BASELINE;\r\n this.sharedScratchpadPath = opts.sharedScratchpadPath ?? null;\r\n this.maxSpawns = opts.maxSpawns ?? Number.POSITIVE_INFINITY;\r\n this.maxSpawnDepth = opts.maxSpawnDepth ?? 2;\r\n this.spawnDepth = opts.spawnDepth ?? 0;\r\n this.sessionWriter = opts.sessionWriter ?? null;\r\n this.manifestDebounceMs = opts.manifestDebounceMs ?? 2000;\r\n this.maxFleetCostUsd = opts.directorBudget?.maxCostUsd ?? Number.POSITIVE_INFINITY;\r\n this.maxBudgetExtensions = opts.maxBudgetExtensions ?? 2;\r\n this.sessionsRoot = opts.sessionsRoot;\r\n this.directorRunId = opts.directorRunId ?? this.id;\r\n this.stateCheckpoint = opts.stateCheckpointPath\r\n ? new DirectorStateCheckpoint(opts.stateCheckpointPath, {\r\n directorRunId: this.id,\r\n maxSpawns: opts.maxSpawns,\r\n spawnDepth: this.spawnDepth,\r\n maxSpawnDepth: this.maxSpawnDepth,\r\n directorBudget: opts.directorBudget,\r\n }, opts.checkpointDebounceMs ?? 250)\r\n : null;\r\n this.fleetManager = opts.fleetManager;\r\n if (this.sharedScratchpadPath) {\r\n // Create the directory eagerly so subagents that try to write\r\n // there on first iteration don't trip on ENOENT. Fire-and-forget,\r\n // but surface failures via process.emitWarning — the downstream\r\n // ENOENT a subagent hits is opaque without this signal.\r\n void fsp\r\n .mkdir(this.sharedScratchpadPath, { recursive: true })\r\n .catch((err) =>\r\n this.logShutdownError('shared_scratchpad_mkdir', err),\r\n );\r\n }\r\n this.transport = new InMemoryBridgeTransport();\r\n this.bridge = new InMemoryAgentBridge(\r\n { agentId: this.id, coordinatorId: this.id },\r\n this.transport,\r\n );\r\n // Delegate to FleetManager when injected; otherwise create own instances\r\n // (preserves existing behavior for callers that don't pass fleetManager).\r\n if (this.fleetManager) {\r\n this.fleet = this.fleetManager.fleet;\r\n this.usage = this.fleetManager.usage;\r\n } else {\r\n this.fleet = new FleetBus();\r\n this.usage = new FleetUsageAggregator(\r\n this.fleet,\r\n (id) => this.priceLookups.get(id),\r\n (id) => this.subagentMeta.get(id),\r\n );\r\n }\r\n this.coordinator = new DefaultMultiAgentCoordinator(\r\n { ...opts.config, coordinatorId: this.id },\r\n { runner: opts.runner },\r\n );\r\n // Mirror coordinator completion events into the waiter table. This\r\n // lets `awaitTasks([...])` resolve on the *next* completion event\r\n // without polling — and the `completed` cache covers the case where\r\n // a caller asks after the fact.\r\n //\r\n // The listener is captured in a field (`taskCompletedListener`) so\r\n // `shutdown()` can `coordinator.off(...)` it cleanly — otherwise\r\n // repeated Director construction against a cached coordinator\r\n // (tests, hot reloads) leaks listeners and eventually trips\r\n // EventEmitter's max-listener warning.\r\n this.taskCompletedListener = (payload: { task: TaskSpec; result: TaskResult }) => {\r\n const r = payload.result;\r\n this.completed.set(r.taskId, r);\r\n const waiter = this.taskWaiters.get(r.taskId);\r\n if (waiter) {\r\n waiter.resolve(r);\r\n this.taskWaiters.delete(r.taskId);\r\n }\r\n // Mirror into the on-disk checkpoint + session event stream so a\r\n // crashed director leaves a complete picture of which tasks landed.\r\n const title = this.taskDescriptions.get(r.taskId) ?? payload.task.description ?? r.taskId;\r\n const failed = r.status !== 'success';\r\n // Disk-side state-checkpoint and session JSONL both store `error`\r\n // as a string for historical reasons. The structured SubagentError\r\n // envelope carries `kind`, `message`, `retryable`, etc. — flatten\r\n // to a `kind: message` string here so old readers stay valid and\r\n // grep-friendly. The full envelope is still available live via\r\n // the EventBus / TaskResult to in-process consumers.\r\n const errorString = r.error\r\n ? `${r.error.kind}: ${r.error.message}`\r\n : undefined;\r\n this.stateCheckpoint?.recordTaskStatus(r.taskId, {\r\n status: failed ? (r.status as 'failed' | 'timeout' | 'stopped') : 'completed',\r\n completedAt: new Date().toISOString(),\r\n iterations: r.iterations,\r\n toolCalls: r.toolCalls,\r\n durationMs: r.durationMs,\r\n error: errorString,\r\n });\r\n this.stateCheckpoint?.setUsage(this.usage.snapshot());\r\n void this.appendSessionEvent(\r\n failed\r\n ? {\r\n type: 'task_failed',\r\n ts: new Date().toISOString(),\r\n taskId: r.taskId,\r\n title,\r\n error: errorString ?? r.status,\r\n }\r\n : {\r\n type: 'task_completed',\r\n ts: new Date().toISOString(),\r\n taskId: r.taskId,\r\n title,\r\n },\r\n );\r\n this.scheduleManifest();\r\n };\r\n this.coordinator.on('task.completed', this.taskCompletedListener);\r\n\r\n // Wire budget.threshold_reached events from the FleetBus into the\r\n // coordinator's task completion path. When a subagent hits a soft\r\n // limit, the runner emits this event; we intercept it here, resolve\r\n // the decision promise (via extend/deny), and let the normal\r\n // task.completed flow handle the rest.\r\n //\r\n // Extension guard: a subagent that hits the same soft limit\r\n // `maxBudgetExtensions` times without completing its task is looping\r\n // on a prompt/config issue, not running out of budget legitimately.\r\n // After the configured number of extends we deny and let the task\r\n // fail — the host agent should then split the work or narrow the\r\n // scope. We track this per subagent+kind combination.\r\n const extendCounts = new Map<string, number>();\r\n this.fleet.filter('budget.threshold_reached', (e) => {\r\n const payload = e.payload as {\r\n kind: 'iterations' | 'tool_calls' | 'tokens' | 'cost' | 'timeout';\r\n used: number;\r\n limit: number;\r\n timeoutMs: number;\r\n extend: (extra: Record<string, unknown>) => void;\r\n deny: () => void;\r\n };\r\n const guardKey = `${e.subagentId}:${payload.kind}`;\r\n const prior = extendCounts.get(guardKey) ?? 0;\r\n if (prior >= this.maxBudgetExtensions) {\r\n // Auto-extend cap hit — let the task fail so the host agent\r\n // can react rather than spinning forever.\r\n payload.deny();\r\n extendCounts.delete(guardKey);\r\n return;\r\n }\r\n // Auto-extend: grant 50% more of the triggering limit type,\r\n // up to a reasonable cap. Resolved on the next tick so listeners\r\n // can override (e.g. a deny-listener for cost overrun). Timeout\r\n // case extends the wall-clock budget — the runner picks up the\r\n // new `limits.timeoutMs` and re-arms its watchdog timer.\r\n extendCounts.set(guardKey, prior + 1);\r\n setImmediate(() => {\r\n const extra: Record<string, unknown> = {};\r\n switch (payload.kind) {\r\n case 'iterations':\r\n extra.maxIterations = Math.min(payload.used + 50, 500);\r\n break;\r\n case 'tool_calls':\r\n extra.maxToolCalls = Math.min(Math.ceil(payload.limit * 1.5), 1000);\r\n break;\r\n case 'tokens':\r\n extra.maxTokens = Math.min(Math.ceil(payload.limit * 1.5), 500_000);\r\n break;\r\n case 'cost':\r\n extra.maxCostUsd = Math.min(payload.limit * 1.5, 10);\r\n break;\r\n case 'timeout':\r\n // Cap at 1 h so a runaway task can't extend itself\r\n // indefinitely; combined with `maxBudgetExtensions` this\r\n // bounds the worst case to (limit * 1.5^N) clamped.\r\n extra.timeoutMs = Math.min(Math.ceil(payload.limit * 1.5), 60 * 60_000);\r\n break;\r\n }\r\n payload.extend(extra);\r\n });\r\n });\r\n }\r\n\r\n /** Best-effort session-writer append. Swallows failures — the director\r\n * must not break a fleet run because the session JSONL handle closed. */\r\n private async appendSessionEvent(event: Parameters<SessionWriter['append']>[0]): Promise<void> {\r\n if (!this.sessionWriter) return;\r\n try {\r\n await this.sessionWriter.append(event);\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n /** Debounced manifest writer. A burst of spawn/assign/complete events\r\n * collapses into one write. Set `manifestDebounceMs` to 0 to disable. */\r\n private scheduleManifest(): void {\r\n if (!this.manifestPath || this.manifestDebounceMs <= 0) return;\r\n if (this.manifestTimer) return;\r\n this.manifestTimer = setTimeout(() => {\r\n this.manifestTimer = null;\r\n void this.writeManifest().catch((err) =>\r\n this.logShutdownError('manifest_write_debounced', err),\r\n );\r\n }, this.manifestDebounceMs);\r\n }\r\n\r\n /**\r\n * Spawn a subagent. Identical to the coordinator's `spawn()` but\r\n * captures provider/model metadata for the usage aggregator and\r\n * lets the FleetBus attach to the runner's EventBus when the task\r\n * actually runs (see `attachSubagentBus`).\r\n *\r\n * Caller-supplied `priceLookup` is optional but recommended — without\r\n * it the `cost` column in `usage.snapshot()` stays at 0.\r\n */\r\n async spawn(\r\n config: SubagentConfig,\r\n priceLookup?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number },\r\n ): Promise<string> {\r\n // Enforce safety caps BEFORE touching the coordinator — a refused\r\n // spawn must not leak partial state into the manifest or fleet bus.\r\n // Delegate to FleetManager when available; use inline checks otherwise.\r\n if (this.fleetManager) {\r\n const rejection = this.fleetManager.canSpawn(config);\r\n if (rejection) {\r\n if (rejection.kind === 'max_spawn_depth') throw new FleetSpawnBudgetError('max_spawn_depth', rejection.limit, rejection.observed);\r\n if (rejection.kind === 'max_spawns') throw new FleetSpawnBudgetError('max_spawns', rejection.limit, rejection.observed);\r\n if (rejection.kind === 'max_cost_usd') throw new FleetCostCapError(rejection.limit, rejection.observed);\r\n }\r\n } else {\r\n if (this.spawnDepth >= this.maxSpawnDepth) {\r\n throw new FleetSpawnBudgetError('max_spawn_depth', this.maxSpawnDepth, this.spawnDepth);\r\n }\r\n if (this.spawnCount >= this.maxSpawns) {\r\n throw new FleetSpawnBudgetError('max_spawns', this.maxSpawns, this.spawnCount + 1);\r\n }\r\n if (this.maxFleetCostUsd < Number.POSITIVE_INFINITY) {\r\n const totalCost = this.usage.snapshot().total?.cost ?? 0;\r\n if (totalCost >= this.maxFleetCostUsd) {\r\n throw new FleetCostCapError(this.maxFleetCostUsd, totalCost);\r\n }\r\n }\r\n }\r\n const result = await this.coordinator.spawn(config);\r\n // Record with FleetManager when available; otherwise manage inline.\r\n if (this.fleetManager) {\r\n this.fleetManager.recordSpawn(result.subagentId, config, priceLookup);\r\n } else {\r\n this.spawnCount += 1;\r\n this.subagentMeta.set(result.subagentId, {\r\n provider: config.provider,\r\n model: config.model,\r\n });\r\n if (priceLookup) this.priceLookups.set(result.subagentId, priceLookup);\r\n }\r\n // Auto-wire a bridge per spawn — same transport as the director, so\r\n // `director.ask(subagentId, …)` and the subagent's own `bridge.send()`\r\n // round-trip without the caller having to plumb anything. Runners\r\n // grab their bridge from `ctx.bridge` (already populated by the\r\n // coordinator from `subagent.context.parentBridge`).\r\n const subagentBridge = new InMemoryAgentBridge(\r\n { agentId: result.subagentId, coordinatorId: this.id },\r\n this.transport,\r\n );\r\n this.coordinator.setSubagentBridge(result.subagentId, subagentBridge);\r\n this.subagentBridges.set(result.subagentId, subagentBridge);\r\n // Record manifest entry only when not using FleetManager (it manages its own).\r\n if (!this.fleetManager) {\r\n this.manifestEntries.set(result.subagentId, {\r\n subagentId: result.subagentId,\r\n name: config.name,\r\n role: config.role,\r\n provider: config.provider,\r\n model: config.model,\r\n taskIds: [],\r\n });\r\n const spawnedAt = new Date().toISOString();\r\n this.stateCheckpoint?.recordSpawn(\r\n {\r\n id: result.subagentId,\r\n name: config.name,\r\n role: config.role,\r\n provider: config.provider,\r\n model: config.model,\r\n spawnedAt,\r\n },\r\n this.spawnCount,\r\n );\r\n void this.appendSessionEvent({\r\n type: 'agent_spawned',\r\n ts: spawnedAt,\r\n agentId: result.subagentId,\r\n role: config.role ?? config.name,\r\n });\r\n this.scheduleManifest();\r\n }\r\n return result.subagentId;\r\n }\r\n\r\n /**\r\n * Synchronously ask a subagent something via the bridge. Sends a\r\n * `task` message addressed to the subagent and awaits a matching\r\n * reply (matched by message id). Subagent runners that handle these\r\n * requests subscribe to `ctx.bridge` and reply with a message whose\r\n * `id` equals the incoming request's id (see `InMemoryAgentBridge`'s\r\n * `request<T>` implementation).\r\n *\r\n * Returns the response payload directly (the bridge wrapper is\r\n * unwrapped for ergonomics). Times out after `timeoutMs` (default\r\n * matches the bridge's own default of 30s) — surface those rejections\r\n * to the caller as actionable errors instead of letting tools hang.\r\n */\r\n async ask<T = unknown>(subagentId: string, payload: unknown, timeoutMs?: number): Promise<T> {\r\n if (!this.subagentBridges.has(subagentId)) {\r\n throw new Error(\r\n `ask: unknown subagent \"${subagentId}\" (spawn() it first; current fleet: ${Array.from(this.subagentBridges.keys()).join(', ') || '(empty)'})`,\r\n );\r\n }\r\n const msg: BridgeMessage = {\r\n id: randomUUID(),\r\n type: 'task',\r\n from: this.id,\r\n to: subagentId,\r\n payload,\r\n timestamp: Date.now(),\r\n priority: 'normal',\r\n };\r\n const reply = await this.bridge.request<T>(msg, timeoutMs);\r\n return reply.payload;\r\n }\r\n\r\n /**\r\n * Read completed task results and format them as a structured text\r\n * block the director's LLM can paste into its own context. The\r\n * Director keeps every completed `TaskResult` in `completed` so this\r\n * is a pure read — no bridge round-trip, cheap to call.\r\n *\r\n * The returned string is intentionally markdown-flavored: headers per\r\n * subagent, a one-line meta row (iter / tools / ms), and the task's\r\n * result text. Pass `style: 'json'` for a programmatic shape instead\r\n * (useful when the director model is doing structured-output work).\r\n */\r\n rollUp(taskIds: string[], style: 'markdown' | 'json' = 'markdown'): string {\r\n const rows = taskIds.map((id) => this.completed.get(id)).filter((r): r is TaskResult => !!r);\r\n if (style === 'json') {\r\n return JSON.stringify(\r\n rows.map((r) => ({\r\n taskId: r.taskId,\r\n subagentId: r.subagentId,\r\n status: r.status,\r\n iterations: r.iterations,\r\n toolCalls: r.toolCalls,\r\n durationMs: r.durationMs,\r\n result: r.result,\r\n error: r.error,\r\n })),\r\n null,\r\n 2,\r\n );\r\n }\r\n if (rows.length === 0) {\r\n return '_No completed tasks for the requested ids — try waiting first._';\r\n }\r\n const lines: string[] = [];\r\n for (const r of rows) {\r\n const meta = this.subagentMeta.get(r.subagentId);\r\n const tag = meta?.provider && meta?.model ? ` · ${meta.provider}/${meta.model}` : '';\r\n lines.push(`### ${r.subagentId}${tag}`);\r\n lines.push(`_${r.status} — ${r.iterations} iter · ${r.toolCalls} tools · ${r.durationMs}ms_`);\r\n lines.push('');\r\n if (r.error) lines.push(`**Error:** ${r.error}`);\r\n else if (typeof r.result === 'string') lines.push(r.result);\r\n else if (r.result !== undefined)\r\n lines.push('```json\\n' + JSON.stringify(r.result, null, 2) + '\\n```');\r\n else lines.push('_(no output)_');\r\n lines.push('');\r\n }\r\n return lines.join('\\n').trimEnd();\r\n }\r\n\r\n /**\r\n * Write the fleet manifest to `manifestPath`. Returns the path written\r\n * or null when no path was configured. Captures every spawn + its\r\n * assigned tasks — paired with per-subagent JSONLs, this is enough to\r\n * replay an entire director run.\r\n */\r\n async writeManifest(): Promise<string | null> {\r\n if (!this.manifestPath) return null;\r\n const manifest = {\r\n directorRunId: this.id,\r\n writtenAt: new Date().toISOString(),\r\n children: Array.from(this.manifestEntries.values()).map((e) => ({\r\n ...e,\r\n // Surface final status from `completed` when available — manifest\r\n // becomes much more useful for replay when it carries the\r\n // success/failure state.\r\n results: e.taskIds.map((tid) => {\r\n const r = this.completed.get(tid);\r\n return r\r\n ? {\r\n taskId: tid,\r\n status: r.status,\r\n iterations: r.iterations,\r\n toolCalls: r.toolCalls,\r\n durationMs: r.durationMs,\r\n }\r\n : { taskId: tid, status: 'pending' as const };\r\n }),\r\n })),\r\n usage: this.usage.snapshot(),\r\n };\r\n await fsp.mkdir(path.dirname(this.manifestPath), { recursive: true });\r\n await atomicWrite(this.manifestPath, JSON.stringify(manifest, null, 2), { mode: 0o600 });\r\n return this.manifestPath;\r\n }\r\n\r\n /**\r\n * Tear down the director: stop every subagent, close every bridge\r\n * endpoint, and (when configured) write the final manifest. Idempotent\r\n * — calling shutdown twice is a no-op on the second invocation.\r\n */\r\n async shutdown(): Promise<void> {\r\n if (this.manifestTimer) {\r\n clearTimeout(this.manifestTimer);\r\n this.manifestTimer = null;\r\n }\r\n // Detach the coordinator-side task.completed listener so a Director\r\n // that lives shorter than its coordinator (rare but possible in\r\n // tests + delegate auto-promotion) doesn't leak the closure on\r\n // the EventEmitter for the coordinator's remaining lifetime.\r\n if (this.taskCompletedListener) {\r\n this.coordinator.off('task.completed', this.taskCompletedListener);\r\n this.taskCompletedListener = null;\r\n }\r\n await this.coordinator.stopAll();\r\n for (const b of this.subagentBridges.values()) {\r\n await b.stop().catch((err) => this.logShutdownError('subagent_bridge_stop', err));\r\n }\r\n this.subagentBridges.clear();\r\n await this.bridge.stop().catch((err) => this.logShutdownError('director_bridge_stop', err));\r\n if (this.manifestPath)\r\n await this.writeManifest().catch((err) => this.logShutdownError('manifest_write', err));\r\n if (this.stateCheckpoint) {\r\n this.stateCheckpoint.setUsage(this.usage.snapshot());\r\n await this.stateCheckpoint\r\n .flush()\r\n .catch((err) => this.logShutdownError('state_checkpoint_flush', err));\r\n // Release the lock so a subsequent --resume can claim this checkpoint.\r\n // Without this, the next director run sees a stale lock and refuses.\r\n await this.stateCheckpoint\r\n .releaseLock()\r\n .catch((err) => this.logShutdownError('state_checkpoint_lock_release', err));\r\n }\r\n }\r\n\r\n /**\r\n * Funnel for shutdown-phase errors. We can't throw — `shutdown()` is\r\n * called from process-exit paths where an uncaught throw would lose\r\n * the manifest write that comes after. But we MUST NOT silently\r\n * swallow either — a persistent bridge-close failure would otherwise\r\n * mask a real bug. `process.emitWarning` is the right tier:\r\n * surfaces on stderr by default, lets the host plug a warning\r\n * listener for structured collection, and never affects exit code.\r\n */\r\n private logShutdownError(phase: string, err: unknown): void {\r\n const detail = err instanceof Error ? err.message : String(err);\r\n process.emitWarning(\r\n `Director shutdown phase \"${phase}\" failed: ${detail}`,\r\n 'DirectorShutdownWarning',\r\n );\r\n }\r\n\r\n /**\r\n * Hand a task to the coordinator. Returns the assigned task id so\r\n * callers can wait on it via `awaitTasks([id])`. The coordinator's\r\n * concurrency limit applies — the task may queue before running.\r\n */\r\n async assign(task: TaskSpec): Promise<string> {\r\n const taskWithId: TaskSpec = task.id ? task : { ...task, id: randomUUID() };\r\n if (task.subagentId) {\r\n // Update manifest entry — delegate to FleetManager when available.\r\n if (this.fleetManager) {\r\n this.fleetManager.addTaskToSubagent(task.subagentId, taskWithId.id);\r\n } else {\r\n const entry = this.manifestEntries.get(task.subagentId);\r\n if (entry) entry.taskIds.push(taskWithId.id);\r\n }\r\n }\r\n await this.coordinator.assign(taskWithId);\r\n // Snapshot task metadata for completion-event titles + state checkpoint\r\n // bookkeeping. Done AFTER coordinator.assign() so we don't checkpoint a\r\n // task the coordinator rejected.\r\n this.taskDescriptions.set(taskWithId.id, taskWithId.description);\r\n if (taskWithId.subagentId) this.taskOwners.set(taskWithId.id, taskWithId.subagentId);\r\n const assignedAt = new Date().toISOString();\r\n this.stateCheckpoint?.recordTaskAssigned({\r\n taskId: taskWithId.id,\r\n subagentId: taskWithId.subagentId,\r\n description: taskWithId.description,\r\n status: 'running',\r\n assignedAt,\r\n });\r\n void this.appendSessionEvent({\r\n type: 'task_created',\r\n ts: assignedAt,\r\n taskId: taskWithId.id,\r\n title: taskWithId.description,\r\n });\r\n this.scheduleManifest();\r\n return taskWithId.id;\r\n }\r\n\r\n /**\r\n * Block until every task id resolves. Returns results in the same\r\n * order as the input. If any task hasn't completed by the time this\r\n * is called, the promise hangs until it does — pair with a timeout\r\n * at the caller if that's a concern. Resolves immediately for ids\r\n * whose results were already cached.\r\n */\r\n awaitTasks(taskIds: string[]): Promise<TaskResult[]> {\r\n return Promise.all(\r\n taskIds.map((id) => {\r\n const cached = this.completed.get(id);\r\n if (cached) return cached;\r\n const existing = this.taskWaiters.get(id);\r\n if (existing) return existing.promise;\r\n let resolve!: (r: TaskResult) => void;\r\n const promise = new Promise<TaskResult>((res) => {\r\n resolve = res;\r\n });\r\n this.taskWaiters.set(id, { promise, resolve });\r\n return promise;\r\n }),\r\n );\r\n }\r\n\r\n async terminate(subagentId: string): Promise<void> {\r\n await this.coordinator.stop(subagentId);\r\n }\r\n\r\n async terminateAll(): Promise<void> {\r\n await this.coordinator.stopAll();\r\n }\r\n\r\n status(): CoordinatorStatus {\r\n return this.coordinator.getStatus();\r\n }\r\n\r\n /**\r\n * Subscribe to coordinator events. Currently only `task.completed` is\r\n * exposed (the others are internal lifecycle). Returns an unsubscribe\r\n * function. External callers (e.g. the CLI's `MultiAgentHost`) use this\r\n * to drive their own pending/results tracking without poking the\r\n * coordinator directly.\r\n */\r\n on(\r\n event: 'task.completed',\r\n handler: (payload: { task: TaskSpec; result: TaskResult }) => void,\r\n ): () => void {\r\n // EventEmitter.on returns `this`; wrap so callers get a stable\r\n // unsubscribe closure (matches the rest of our event API).\r\n this.coordinator.on(event, handler);\r\n return () => {\r\n this.coordinator.off(event, handler);\r\n };\r\n }\r\n\r\n /**\r\n * Snapshot of every task that has resolved (success, failed, timeout,\r\n * stopped) since the director started. Returned in completion order\r\n * via the internal map's iteration order. Used by `/fleet status` to\r\n * paint the completed table without reaching into private state.\r\n */\r\n completedResults(): TaskResult[] {\r\n return Array.from(this.completed.values());\r\n }\r\n\r\n /**\r\n * Inject a previously-saved checkpoint snapshot. Call this right after\r\n * constructing a Director during a `--resume` run so the in-memory state\r\n * (subagents, tasks, waiters) reflects the pre-crash reality instead of\r\n * starting from a blank slate. The director then resumes from there —\r\n * completing any in-flight tasks and ignoring tasks that already reached\r\n * a terminal state in the prior run.\r\n */\r\n setCheckpointState(snapshot: DirectorStateSnapshot): void {\r\n this.stateCheckpoint?.resume(snapshot);\r\n }\r\n\r\n /**\r\n * Read a subagent's JSONL transcript directly from disk (no bridge\r\n * round-trip needed). Returns the last assistant text, stop reason,\r\n * tool-use count, and line count — or null if the file is unavailable.\r\n * Requires `sessionsRoot` to be set on construction.\r\n */\r\n async readSession(subagentId: string, tail?: number): Promise<{\r\n lastAssistantText?: string;\r\n lastStopReason?: string;\r\n toolUsesObserved: number;\r\n events: number;\r\n path?: string;\r\n } | null> {\r\n if (!this.sessionsRoot) return null;\r\n const filePath = path.join(this.sessionsRoot, this.directorRunId, `${subagentId}.jsonl`);\r\n let raw: string;\r\n try {\r\n raw = await fsp.readFile(filePath, 'utf8');\r\n } catch {\r\n return null;\r\n }\r\n const lines = raw.split('\\n').filter((l) => l.trim());\r\n const targetLines = tail ? lines.slice(-tail) : lines;\r\n let lastAssistantText: string | undefined;\r\n let lastStopReason: string | undefined;\r\n let toolUses = 0;\r\n for (const line of targetLines) {\r\n try {\r\n const ev = JSON.parse(line) as { type?: string; text?: string; stopReason?: string };\r\n if (ev.type === 'assistant' && typeof ev.text === 'string') {\r\n lastAssistantText = ev.text;\r\n } else if (ev.type === 'stop' && ev.stopReason) {\r\n lastStopReason = ev.stopReason;\r\n } else if (ev.type === 'tool_use') {\r\n toolUses++;\r\n }\r\n } catch {\r\n // skip malformed lines\r\n }\r\n }\r\n return {\r\n lastAssistantText,\r\n lastStopReason,\r\n toolUsesObserved: toolUses,\r\n events: targetLines.length,\r\n path: filePath,\r\n };\r\n }\r\n\r\n snapshot(): FleetUsage {\r\n return this.usage.snapshot();\r\n }\r\n\r\n /**\r\n * Look up provider/model metadata for a spawned subagent. Returns\r\n * undefined when the subagent id is unknown (not yet spawned, or\r\n * already torn down). Callers — notably the TUI fleet panel — use\r\n * this to render human-readable provider/model tags next to each\r\n * subagent row without reaching into private state.\r\n */\r\n getSubagentMeta(id: string): { provider?: string; model?: string; name?: string } | undefined {\r\n const usage = this.subagentMeta.get(id);\r\n const manifest = this.manifestEntries.get(id);\r\n if (!usage && !manifest) return undefined;\r\n return {\r\n provider: usage?.provider ?? manifest?.provider,\r\n model: usage?.model ?? manifest?.model,\r\n name: manifest?.name,\r\n };\r\n }\r\n\r\n /**\r\n * Compose the leader/director-agent system prompt: fleet preamble +\r\n * (optional) roster summary + user base prompt. Pass the result to your\r\n * leader Agent's `ctx.systemPrompt` when constructing it.\r\n *\r\n * `basePrompt` defaults to `config.leaderSystemPrompt` so callers can\r\n * use the no-arg form when the multi-agent config already carries it.\r\n */\r\n leaderSystemPrompt(basePrompt?: string): string {\r\n return composeDirectorPrompt({\r\n basePrompt: basePrompt ?? this.coordinator.config.leaderSystemPrompt,\r\n directorPreamble: this.directorPreamble,\r\n rosterSummary: this.roster ? rosterSummaryFromConfigs(this.roster) : undefined,\r\n });\r\n }\r\n\r\n /**\r\n * Compose a subagent's system prompt for a given `SubagentConfig`:\r\n * baseline + role + task + per-spawn override. Returned by value — does\r\n * not mutate the config. Factories (the user-supplied `AgentFactory`)\r\n * should call this when building each subagent's Agent so the bridge\r\n * contract, role context, and override are all surfaced.\r\n *\r\n * When `taskBrief` is omitted the Task section is dropped. Pass the\r\n * actual task description here to reinforce it in the system prompt\r\n * (the runner already passes it as user input — duplicating in the\r\n * system prompt is optional but improves anchoring on small models).\r\n */\r\n subagentSystemPrompt(config: SubagentConfig, taskBrief?: string): string {\r\n return composeSubagentPrompt({\r\n baseline: this.subagentBaseline,\r\n role: config.prompt,\r\n task: taskBrief,\r\n sharedScratchpad: this.sharedScratchpadPath ?? undefined,\r\n override: config.systemPromptOverride,\r\n });\r\n }\r\n\r\n /**\r\n * Build the tool set the LLM-driven director uses to orchestrate.\r\n * Returns an array of `Tool` definitions; register these on the\r\n * director's `Agent` to expose `spawn_subagent`, `assign_task`, etc.\r\n * Each tool's `execute()` delegates straight to the matching method\r\n * above.\r\n *\r\n * Tools all carry `permission: 'auto'` — the *user* has already\r\n * approved running the director when they kicked off the run, so\r\n * gating individual orchestration calls behind a confirm prompt\r\n * would just be noise. The actual subagent tools they spawn are\r\n * still permission-checked normally.\r\n */\r\n tools(roster?: Record<string, SubagentConfig>): Tool[] {\r\n // Use stored roster as default — allows `director.tools()` to be\r\n // called without args when the roster was passed at construction.\r\n const effectiveRoster = roster ?? this.roster;\r\n const t: Tool[] = [\r\n makeSpawnTool(this, effectiveRoster),\r\n makeAssignTool(this),\r\n makeAwaitTasksTool(this),\r\n makeAskTool(this),\r\n makeRollUpTool(this),\r\n makeTerminateTool(this),\r\n makeFleetStatusTool(this),\r\n makeFleetUsageTool(this),\r\n makeFleetSessionTool(this),\r\n makeFleetHealthTool(this),\r\n ];\r\n return t;\r\n }\r\n\r\n /**\r\n * Attempt to acquire the checkpoint lock. Must be called before\r\n * resuming — if another director process is alive, this returns\r\n * false and the caller should not proceed with the resume.\r\n */\r\n async acquireCheckpointLock(): Promise<boolean> {\r\n return this.stateCheckpoint ? this.stateCheckpoint.acquireLock() : true;\r\n }\r\n\r\n /**\r\n * Resume from a prior checkpoint snapshot (loaded via\r\n * `loadDirectorState()`). Re-attach to the fleet mid-flight so\r\n * subsequent spawn/assign calls update the checkpoint normally.\r\n */\r\n resumeFromCheckpoint(snapshot: DirectorStateSnapshot): void {\r\n this.stateCheckpoint?.resume(snapshot);\r\n }\r\n}\r\n\r\n","import * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { randomUUID } from 'node:crypto';\r\nimport type { SubagentConfig, TaskResult } from '../types/multi-agent.js';\r\nimport type { JSONSchema, Tool } from '../types/tool.js';\r\nimport type { Director } from './director.js';\r\n\r\n/**\r\n * Opaque host interface so this factory doesn't have to depend on the\r\n * CLI's `MultiAgentHost`. Any caller that exposes the same three\r\n * methods can wire `delegate` — including test doubles.\r\n */\r\nexport interface DelegateHost {\r\n /** True if a Director is already attached and running. */\r\n isDirectorMode(): boolean;\r\n /** Build (or return the cached) Director when director mode is on. */\r\n ensureDirector(): Promise<Director | null>;\r\n /**\r\n * Force-promote a non-director session into director mode at runtime.\r\n * Returns the Director, or null when promotion is impossible (e.g. a\r\n * non-director coordinator has already spawned subagents in the\r\n * legacy code path).\r\n */\r\n promoteToDirector(): Promise<Director | null>;\r\n /**\r\n * Optional: when promotion fails, return the human-readable reason.\r\n * Used to render an actionable error to the calling model instead of\r\n * the prior opaque \"Director could not be activated\" message.\r\n * Implementations may return null when they don't track the reason.\r\n */\r\n getPromotionBlockReason?(): string | null;\r\n}\r\n\r\nexport interface CreateDelegateToolOptions {\r\n host: DelegateHost;\r\n /**\r\n * Roster used to resolve `role` strings into full `SubagentConfig`s.\r\n * Typically `FLEET_ROSTER`. When omitted, `delegate({ role })` calls\r\n * fail and only the explicit `name + provider + model` path works.\r\n */\r\n roster?: Record<string, SubagentConfig>;\r\n /**\r\n * Default await timeout in milliseconds. `delegate` blocks until the\r\n * subagent's task resolves; without a cap, a stuck worker would hang\r\n * the host indefinitely. Set generously (default: 4 hours) so the\r\n * orchestrator can run multi-step refactors / monorepo audits\r\n * without being killed for being slow — the orchestrator must\r\n * decide per-call when a task needs to be cut short.\r\n */\r\n defaultTimeoutMs?: number;\r\n /**\r\n * Absolute directory under which per-subagent JSONL transcripts live —\r\n * matches `MultiAgentHostOptions.sessionsRoot`. When set, the delegate\r\n * tool reads the subagent's transcript on timeout / budget-exhaustion\r\n * to extract partial output, so the host LLM gets *something* useful\r\n * back instead of just an error.\r\n */\r\n sessionsRoot?: string;\r\n /**\r\n * The directorRunId used to namespace transcripts (typically the host\r\n * session id). Combined with `sessionsRoot` to locate per-subagent\r\n * JSONLs at `<sessionsRoot>/<runId>/<subagentId>.jsonl`.\r\n */\r\n directorRunId?: string;\r\n /**\r\n * Buffer subtracted from the caller's `timeoutMs` before passing it\r\n * to the subagent. Gives the host a window to detect a subagent that\r\n * has gone silent and surface a partial result rather than a generic\r\n * timeout. Default: 30_000 ms.\r\n */\r\n subagentTimeoutBufferMs?: number;\r\n}\r\n\r\n/**\r\n * `delegate` — the only multi-agent tool a regular (non-director) agent\r\n * ever needs. It bundles spawn + assign + await into a single call and\r\n * transparently auto-promotes the host into director mode on first use.\r\n *\r\n * The model never has to ask \"are we in director mode?\" — it just calls\r\n * `delegate({ role, task })` and gets back a `TaskResult`. The cost of\r\n * that ergonomic packaging is that `delegate` cannot be used for\r\n * parallel work as-is; the model must fire multiple `delegate` calls in\r\n * parallel through the provider's parallel-tool-call surface, or escalate\r\n * to the explicit `spawn_subagent` + `assign_task` + `await_tasks` flow\r\n * when it wants fan-out it controls itself.\r\n */\r\nexport function createDelegateTool(opts: CreateDelegateToolOptions): Tool {\r\n // 4 hours by default. The previous 5-minute default killed any\r\n // non-trivial fan-out (monorepo audits, multi-file refactors) and\r\n // forced the orchestrator to constantly pass an explicit timeoutMs.\r\n // The right model here: the orchestrator should pick a tight value\r\n // only when it knows the work is small; otherwise let it run.\r\n const defaultTimeoutMs = opts.defaultTimeoutMs ?? 4 * 60 * 60 * 1000;\r\n const rosterIds = opts.roster ? Object.keys(opts.roster) : [];\r\n\r\n const inputSchema: JSONSchema = {\r\n type: 'object',\r\n properties: {\r\n task: {\r\n type: 'string',\r\n description:\r\n 'What the subagent should do — natural language, complete sentence(s). The subagent has its own tool slice, its own LLM call, and returns when its task is done.',\r\n },\r\n role: {\r\n type: 'string',\r\n description:\r\n rosterIds.length > 0\r\n ? `Roster role (preferred). One of: ${rosterIds.join(', ')}. Picks a pre-tuned config (prompt, budgets, tools) for that role.`\r\n : 'No roster is configured — pass `name` instead.',\r\n enum: rosterIds.length > 0 ? rosterIds : undefined,\r\n },\r\n name: {\r\n type: 'string',\r\n description:\r\n 'Display name for the subagent when not using a roster role. Required when `role` is omitted.',\r\n },\r\n provider: {\r\n type: 'string',\r\n description:\r\n 'Provider id (e.g. \"anthropic\", \"openai\"). Defaults to the host provider when omitted.',\r\n },\r\n model: {\r\n type: 'string',\r\n description: 'Model id within the provider. Defaults to the host model when omitted.',\r\n },\r\n systemPromptOverride: {\r\n type: 'string',\r\n description: 'Optional extra prompt text appended to the role baseline.',\r\n },\r\n timeoutMs: {\r\n type: 'number',\r\n description: `Wall-clock budget for this delegate in milliseconds. No hard cap — set as high as the task realistically needs (a monorepo audit can take hours, a single-file lint takes seconds). Default ${Math.round(defaultTimeoutMs / 1000 / 60)} minutes.`,\r\n },\r\n maxIterations: {\r\n type: 'number',\r\n description:\r\n 'Maximum LLM iterations the subagent may take. Unset = use the role/coordinator default. Raise this for tasks with many tool-think-tool cycles (deep code analysis, multi-file refactors).',\r\n },\r\n maxToolCalls: {\r\n type: 'number',\r\n description:\r\n 'Maximum number of tool invocations the subagent may make. Unset = use the role/coordinator default. Raise this for tasks that touch many files (large grep + read + report).',\r\n },\r\n },\r\n required: ['task'],\r\n };\r\n\r\n return {\r\n name: 'delegate',\r\n description:\r\n \"Hand a discrete piece of work to a dedicated subagent and wait for its result. The subagent has its own context, its own LLM call, and its own budget — use this when a task is self-contained, would otherwise blow up your context, or benefits from a specialized role (bug-hunter, security-scanner, refactor-planner, audit-log). YOU decide how big the budget is: pass `timeoutMs`, `maxIterations`, and `maxToolCalls` sized to the actual work. There is no hidden cap forcing a 3-minute / 80-iteration limit — if a monorepo audit needs 2 hours and 500 tool calls, ask for that. Call multiple delegates in parallel through the provider's parallel-tool-call surface to fan work out across roles.\",\r\n usageHint:\r\n \"Set `task` to a complete instruction. Either pick `role` from the roster or pass `name` + `provider` + `model`. For non-trivial work, also pass `timeoutMs` (the wall-clock budget you actually need), `maxIterations`, and `maxToolCalls` — defaults are intentionally generous (4 hours) but the right values depend on scope. Returns the subagent's `TaskResult` — including the textual `result`, iteration count, tool count, and duration. Auto-promotes the host into director mode on first call.\",\r\n permission: 'auto',\r\n mutating: false,\r\n inputSchema,\r\n async execute(input: unknown) {\r\n const i = (input ?? {}) as {\r\n task?: string;\r\n role?: string;\r\n name?: string;\r\n provider?: string;\r\n model?: string;\r\n systemPromptOverride?: string;\r\n timeoutMs?: number;\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n };\r\n\r\n if (typeof i.task !== 'string' || !i.task.trim()) {\r\n return { ok: false, error: '`task` is required.' };\r\n }\r\n\r\n try {\r\n let director = await opts.host.ensureDirector();\r\n if (!director) {\r\n director = await opts.host.promoteToDirector();\r\n }\r\n if (!director) {\r\n const reason = opts.host.getPromotionBlockReason?.();\r\n return {\r\n ok: false,\r\n error:\r\n reason ??\r\n 'Director could not be activated — multi-agent host already running in legacy non-director mode. Restart with `--director` for fleet support.',\r\n };\r\n }\r\n\r\n const timeoutMs = i.timeoutMs ?? defaultTimeoutMs;\r\n\r\n let cfg: SubagentConfig;\r\n if (i.role) {\r\n const base = opts.roster?.[i.role];\r\n if (!base) {\r\n return {\r\n ok: false,\r\n error: `Unknown role \"${i.role}\". Available: ${rosterIds.join(', ') || '(no roster configured)'}.`,\r\n };\r\n }\r\n cfg = instantiateRosterConfig(i.role, base);\r\n if (i.systemPromptOverride) cfg.systemPromptOverride = i.systemPromptOverride;\r\n if (i.provider) cfg.provider = i.provider;\r\n if (i.model) cfg.model = i.model;\r\n } else {\r\n if (!i.name) {\r\n return {\r\n ok: false,\r\n error: 'Either `role` (from the roster) or `name` is required.',\r\n };\r\n }\r\n cfg = {\r\n name: i.name,\r\n provider: i.provider,\r\n model: i.model,\r\n systemPromptOverride: i.systemPromptOverride,\r\n };\r\n }\r\n\r\n if (typeof i.maxIterations === 'number' && i.maxIterations > 0) {\r\n cfg.maxIterations = i.maxIterations;\r\n }\r\n if (typeof i.maxToolCalls === 'number' && i.maxToolCalls > 0) {\r\n cfg.maxToolCalls = i.maxToolCalls;\r\n }\r\n\r\n const SUBAGENT_TIMEOUT_BUFFER_MS = opts.subagentTimeoutBufferMs ?? 30_000;\r\n const desiredSubTimeout = Math.max(30_000, timeoutMs - SUBAGENT_TIMEOUT_BUFFER_MS);\r\n if (!cfg.timeoutMs || cfg.timeoutMs > desiredSubTimeout) {\r\n cfg.timeoutMs = desiredSubTimeout;\r\n }\r\n\r\n const subagentId = await director.spawn(cfg);\r\n const taskId = await director.assign({\r\n id: `${randomUUID()}`,\r\n description: i.task,\r\n subagentId,\r\n });\r\n const result = await Promise.race<TaskResult | { __timeout: true }>([\r\n director.awaitTasks([taskId]).then((r) => {\r\n if (!r[0]) throw new Error(`Task \"${taskId}\" not found in completed results`);\r\n return r[0];\r\n }),\r\n new Promise<{ __timeout: true }>((resolve) =>\r\n setTimeout(() => resolve({ __timeout: true }), timeoutMs),\r\n ),\r\n ]);\r\n\r\n if ('__timeout' in result) {\r\n const partial = await readSubagentPartial(opts, subagentId);\r\n return {\r\n ok: false,\r\n stopReason: 'host_timeout',\r\n error: `Subagent did not finish within ${timeoutMs}ms.`,\r\n hint: 'Reduce scope of the next delegate, raise timeoutMs, or use spawn_subagent + await_tasks for long-running work.',\r\n subagentId,\r\n taskId,\r\n partial,\r\n };\r\n }\r\n\r\n const baseStopReason: StopReason =\r\n result.status === 'success'\r\n ? 'end_turn'\r\n : result.status === 'timeout'\r\n ? 'subagent_timeout'\r\n : result.status === 'stopped'\r\n ? 'aborted'\r\n : 'budget_exhausted';\r\n const partial =\r\n result.status === 'success' ? undefined : await readSubagentPartial(opts, subagentId);\r\n\r\n const errorKind = result.error?.kind;\r\n const retryable = result.error?.retryable;\r\n const backoffMs = result.error?.backoffMs;\r\n return {\r\n ok: result.status === 'success',\r\n status: result.status,\r\n stopReason: baseStopReason,\r\n errorKind,\r\n retryable,\r\n backoffMs,\r\n subagentId: result.subagentId,\r\n taskId: result.taskId,\r\n result: result.result,\r\n error: result.error,\r\n iterations: result.iterations,\r\n toolCalls: result.toolCalls,\r\n durationMs: result.durationMs,\r\n ...(partial ? { partial } : {}),\r\n ...(hintForKind(errorKind, retryable, backoffMs, partial)\r\n ? { hint: hintForKind(errorKind, retryable, backoffMs, partial) }\r\n : {}),\r\n };\r\n } catch (err) {\r\n return {\r\n ok: false,\r\n stopReason: 'error' as const,\r\n error: err instanceof Error ? err.message : String(err),\r\n };\r\n }\r\n },\r\n };\r\n}\r\n\r\nfunction instantiateRosterConfig(role: string, base: SubagentConfig): SubagentConfig {\r\n return {\r\n ...base,\r\n // Roster entries are templates. Give each spawn a fresh id so\r\n // parallel or repeated delegates can use the same role safely.\r\n id: `${role}-${randomUUID().slice(0, 8)}`,\r\n };\r\n}\r\n\r\ntype StopReason =\r\n | 'end_turn'\r\n | 'budget_exhausted'\r\n | 'subagent_timeout'\r\n | 'host_timeout'\r\n | 'aborted'\r\n | 'error';\r\n\r\n/**\r\n * Per-kind orchestrator hint. Returned alongside the structured error\r\n * so the calling model has a concrete next step instead of \"task\r\n * failed, good luck\". Returns undefined for success / unknown kinds —\r\n * the caller checks for presence before including in output.\r\n */\r\nexport function hintForKind(\r\n kind: string | undefined,\r\n retryable: boolean | undefined,\r\n backoffMs: number | undefined,\r\n partial?: { lastAssistantText?: string },\r\n): string | undefined {\r\n if (!kind) return undefined;\r\n switch (kind) {\r\n case 'provider_rate_limit':\r\n return `Provider rate-limited. Retry safe after ${backoffMs ?? 5000}ms backoff. Consider a smaller model or fewer parallel delegates.`;\r\n case 'provider_5xx':\r\n return `Provider server error. Retry safe after ${backoffMs ?? 3000}ms backoff — usually transient.`;\r\n case 'provider_timeout':\r\n return 'Provider network timeout. Retry safe; reduce input size if it persists.';\r\n case 'provider_auth':\r\n return 'Provider rejected credentials. Cannot retry — fix the API key / config and re-invoke.';\r\n case 'context_overflow':\r\n return 'Subagent context exceeded the model limit. Narrow the task, use a larger-context model, or split into multiple delegates.';\r\n case 'budget_iterations':\r\n case 'budget_tool_calls':\r\n case 'budget_tokens':\r\n case 'budget_cost': {\r\n const base = 'Subagent exhausted its budget. The coordinator may auto-extend; otherwise raise the matching `max*` field (e.g. maxToolCalls: 600) on the next delegate, or split the task.';\r\n if (partial?.lastAssistantText) {\r\n return `${base}\\n\\nPartial output produced before budget hit:\\n${partial.lastAssistantText}`;\r\n }\r\n return base;\r\n }\r\n case 'budget_timeout': {\r\n const base = 'Subagent hit its wall-clock budget. Raise `timeoutMs` on the next delegate or split the task.';\r\n if (partial?.lastAssistantText) {\r\n return `${base}\\n\\nPartial output produced before timeout:\\n${partial.lastAssistantText}`;\r\n }\r\n return base;\r\n }\r\n case 'aborted_by_parent':\r\n return 'Subagent was aborted (user Ctrl+C, parent unwound, or sibling failure cascade). Not retryable until the abort condition is resolved.';\r\n case 'empty_response':\r\n return 'Subagent ended its turn with no text and no tool calls. Almost always a prompt / config issue — clarify the task or check the model.';\r\n case 'tool_failed': {\r\n const base = 'A tool inside the subagent returned ok:false. Retry with corrected inputs.';\r\n if (partial?.lastAssistantText) {\r\n return `${base}\\n\\nAgent reasoning before failure:\\n${partial.lastAssistantText}`;\r\n }\r\n return base;\r\n }\r\n case 'bridge_failed':\r\n return 'Parent-child bridge transport failed. This is rare — restart the session and retry.';\r\n default:\r\n return retryable\r\n ? 'Failure classified as retryable. Try again with the same input.'\r\n : undefined;\r\n }\r\n}\r\n\r\n/**\r\n * Parse the per-subagent JSONL at `<sessionsRoot>/<runId>/<subagentId>.jsonl`\r\n * and pull out the last few useful pieces — the most recent assistant\r\n * text response, the stop reason, and a count of tool calls. Used by\r\n * `delegate` when the subagent timed out or exhausted budget without\r\n * returning a clean `finalText`, so the host LLM still sees what work\r\n * actually happened.\r\n */\r\nasync function readSubagentPartial(\r\n opts: CreateDelegateToolOptions,\r\n subagentId: string,\r\n): Promise<\r\n | {\r\n lastAssistantText?: string;\r\n lastStopReason?: string;\r\n toolUsesObserved: number;\r\n events: number;\r\n }\r\n | undefined\r\n> {\r\n if (!opts.sessionsRoot) return undefined;\r\n // Locate the JSONL. When `directorRunId` is provided we know the\r\n // exact path; otherwise scan the sessionsRoot for any subdir\r\n // containing this subagent id.\r\n const candidates: string[] = [];\r\n if (opts.directorRunId) {\r\n candidates.push(path.join(opts.sessionsRoot, opts.directorRunId, `${subagentId}.jsonl`));\r\n } else {\r\n try {\r\n const entries = await fsp.readdir(opts.sessionsRoot, { withFileTypes: true });\r\n for (const entry of entries) {\r\n if (entry.isDirectory()) {\r\n candidates.push(path.join(opts.sessionsRoot, entry.name, `${subagentId}.jsonl`));\r\n }\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n for (const file of candidates) {\r\n let raw: string;\r\n try {\r\n raw = await fsp.readFile(file, 'utf8');\r\n } catch {\r\n continue;\r\n }\r\n const lines = raw.split('\\n').filter((l) => l.trim());\r\n let lastAssistantText: string | undefined;\r\n let lastStopReason: string | undefined;\r\n let toolUses = 0;\r\n for (const line of lines) {\r\n try {\r\n const ev = JSON.parse(line) as {\r\n type: string;\r\n content?: unknown;\r\n stopReason?: string;\r\n name?: string;\r\n };\r\n if (ev.type === 'tool_use') toolUses += 1;\r\n if (ev.type === 'llm_response') {\r\n if (typeof ev.stopReason === 'string') lastStopReason = ev.stopReason;\r\n if (Array.isArray(ev.content)) {\r\n const txt = (ev.content as Array<{ type?: string; text?: string }>)\r\n .filter((b) => b.type === 'text')\r\n .map((b) => b.text ?? '')\r\n .join('\\n')\r\n .trim();\r\n if (txt) lastAssistantText = txt;\r\n }\r\n }\r\n } catch {\r\n // skip\r\n }\r\n }\r\n return {\r\n lastAssistantText,\r\n lastStopReason,\r\n toolUsesObserved: toolUses,\r\n events: lines.length,\r\n };\r\n }\r\n return undefined;\r\n}\r\n","import type { Agent, AgentInput, RunResult } from '../core/agent.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport type {\r\n SubagentConfig,\r\n SubagentRunContext,\r\n SubagentRunOutcome,\r\n SubagentRunner,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport {\r\n BudgetExceededError,\r\n BudgetThresholdDecision,\r\n BudgetThresholdSignal,\r\n} from './subagent-budget.js';\r\nimport type { FleetBus } from './fleet-bus.js';\r\n\r\n/**\r\n * Caller-supplied factory that builds an isolated `Agent` for a subagent.\r\n * The factory MUST construct a fresh `Context` per call — sharing context\r\n * between subagents defeats isolation. Each Agent should also use either\r\n * its own `EventBus` or a forwarded view, so per-subagent metrics can be\r\n * attributed correctly.\r\n */\r\nexport type AgentFactory = (config: SubagentConfig) => Promise<AgentFactoryResult>;\r\n\r\nexport interface AgentFactoryResult {\r\n agent: Agent;\r\n /** Event bus the factory wired to this agent — required for budget hookup. */\r\n events: EventBus;\r\n /**\r\n * Optional cleanup hook invoked in the runner's `finally` block once\r\n * the task ends (success, failure, abort — same exit path). Factories\r\n * that own resources scoped to a single task (per-subagent JSONL\r\n * writers, transient providers, throwaway containers) implement this\r\n * to close them deterministically instead of relying on GC. Errors\r\n * thrown here are swallowed so a flaky cleanup can't mask the task's\r\n * real result.\r\n */\r\n dispose?: () => Promise<void> | void;\r\n}\r\n\r\nexport interface AgentRunnerOptions {\r\n factory: AgentFactory;\r\n /**\r\n * Format a TaskSpec into the user input the agent will receive. Defaults\r\n * to `task.description ?? ''`. Override when subagents expect structured\r\n * input (e.g. JSON contracts, role-prefixed prompts).\r\n */\r\n formatTaskInput?: (task: TaskSpec, config: SubagentConfig) => AgentInput;\r\n /**\r\n * When set, the runner attaches the subagent's EventBus to this FleetBus\r\n * on task start and detaches it when the task finishes. This is the\r\n * injection seam that lets the TUI fleet panel observe subagent activity\r\n * live — without it, FleetBus stays empty.\r\n */\r\n fleetBus?: FleetBus;\r\n}\r\n\r\n/**\r\n * Builds a `SubagentRunner` that drives a real `Agent` per task while honoring\r\n * the coordinator's budget and abort signal. This is the production adapter —\r\n * the coordinator's `runner` option in CLI/TUI assemblies points here.\r\n *\r\n * Lifecycle per task:\r\n * 1. factory(config) → fresh Agent + EventBus.\r\n * 2. Subscribe to events to feed the budget (tool calls, token usage).\r\n * 3. Call agent.run(input, { signal }) — the coordinator's signal cancels.\r\n * 4. Map RunResult.status onto a `SubagentRunOutcome` or throw on failure.\r\n * 5. Unsubscribe and let the factory's resources be GC'd.\r\n *\r\n * The budget is checked synchronously from event handlers — a runaway agent\r\n * that crosses its tool-call limit triggers `BudgetExceededError`, which the\r\n * coordinator surfaces as `status: 'failed'` on the task result.\r\n */\r\nexport function makeAgentSubagentRunner(opts: AgentRunnerOptions): SubagentRunner {\r\n const format = opts.formatTaskInput ?? defaultFormatTaskInput;\r\n\r\n return async (task: TaskSpec, ctx: SubagentRunContext): Promise<SubagentRunOutcome> => {\r\n const factoryResult = await opts.factory(ctx.config);\r\n const { agent, events } = factoryResult;\r\n\r\n // Attach subagent EventBus to FleetBus so the TUI fleet panel (and any\r\n // other FleetBus subscriber) can observe this subagent live. Detach on\r\n // task finish — each task is a fresh Agent + EventBus, so we never\r\n // want a stale bus lingering after the run.\r\n const detachFleet = opts.fleetBus?.attach(ctx.subagentId, events, task.id);\r\n\r\n // Hook budget into the agent's event stream. We capture errors thrown by\r\n // recordToolCall/recordUsage so the budget can short-circuit the run by\r\n // aborting the controller — the agent then unwinds cooperatively.\r\n const aborter = new AbortController();\r\n // Inject the EventBus into the budget so it can emit budget.threshold_reached\r\n // events when a soft limit is hit and the handler wants to ask the coordinator.\r\n ctx.budget._events = events;\r\n // Wire the threshold-negotiation handler. Without this the soft-limit\r\n // path is dead code: every budget overrun becomes a hard\r\n // BudgetExceededError and the subagent dies on its first 120-iteration\r\n // tick instead of asking the Director for headroom. The Director's\r\n // FleetBus listener (director.ts) auto-grants +50% up to a per-kind\r\n // ceiling and per-subagent extension count — wiring this is the\r\n // missing link that activates that flow.\r\n ctx.budget.onThreshold = ({ requestDecision }) => requestDecision();\r\n let budgetError: BudgetExceededError | null = null;\r\n\r\n /**\r\n * Common error handler for all budget-triggered events. Distinguishes:\r\n * - BudgetExceededError → hard stop, set budgetError + abort\r\n * - BudgetThresholdSignal → soft stop: await the coordinator's\r\n * decision. If 'stop', abort. If 'extend', the signal handler\r\n * has already patched the budget so we can continue without\r\n * actually aborting the agent.\r\n */\r\n const onBudgetError = (err: unknown): void => {\r\n if (err instanceof BudgetThresholdSignal) {\r\n // Await the coordinator's verdict before deciding whether to abort.\r\n err.decision\r\n .then((decision) => {\r\n if (decision === 'stop') {\r\n budgetError = new BudgetExceededError(err.kind, err.limit, err.used);\r\n aborter.abort();\r\n }\r\n // If 'extend': the budget limits were already patched by the\r\n // BudgetThresholdSignal handler (checkLimit → onThreshold →\r\n // coordinator extend → budget patched). Do NOT abort.\r\n // The tool call that triggered the signal will be retried.\r\n })\r\n .catch(() => {\r\n // If the decision promise rejects, treat as hard stop.\r\n budgetError = new BudgetExceededError(err.kind, err.limit, err.used);\r\n aborter.abort();\r\n });\r\n return;\r\n }\r\n // Hard stop (BudgetExceededError or other)\r\n aborter.abort();\r\n budgetError =\r\n err instanceof BudgetExceededError\r\n ? err\r\n : new BudgetExceededError(\r\n 'tool_calls',\r\n 0,\r\n 0,\r\n );\r\n // Attach the real error detail so the task result surfaces\r\n // something actionable instead of a generic budget message.\r\n if (budgetError !== err && err instanceof Error) {\r\n budgetError.message += ` (caused by: ${err.message})`;\r\n }\r\n };\r\n\r\n // Track the name of the most recent tool that returned ok:false so\r\n // we can lift it into the SubagentError when the agent ends without\r\n // recovering. Cleared on every successful tool execution so a tool\r\n // that later succeeded doesn't taint the final report.\r\n let lastToolFailed: string | null = null;\r\n\r\n const unsub: Array<() => void> = [];\r\n unsub.push(\r\n events.on('tool.executed', (e) => {\r\n // Count tool calls on the PAIRED 'tool.executed' event rather\r\n // than 'tool.started'. A tool can fire start then crash before\r\n // emitting executed (process killed, signal aborted mid-exec);\r\n // counting only the paired event keeps the budget tally honest\r\n // and matches what the model actually saw in its turn.\r\n try {\r\n ctx.budget.recordToolCall();\r\n } catch (eb) {\r\n onBudgetError(eb);\r\n }\r\n // Track ok:false so we can fail the subagent if it ends without\r\n // recovering. Successful runs clear it — the model may try a\r\n // tool, get an error, and self-heal on the next iteration; that\r\n // path should still report success.\r\n if (e.ok === false) {\r\n lastToolFailed = e.name;\r\n } else if (e.ok === true) {\r\n lastToolFailed = null;\r\n }\r\n }),\r\n events.on('provider.response', (e) => {\r\n try {\r\n ctx.budget.recordUsage(e.usage);\r\n } catch (e2) {\r\n void onBudgetError(e2);\r\n }\r\n }),\r\n events.on('iteration.started', () => {\r\n try {\r\n ctx.budget.recordIteration();\r\n ctx.budget.checkTimeout();\r\n } catch (e) {\r\n void onBudgetError(e);\r\n }\r\n }),\r\n // D3: cooperative timeout enforcement DURING a long tool call.\r\n // The iteration-loop checkTimeout() only fires between agent\r\n // iterations — a single `bash sleep 3600` call would otherwise\r\n // park inside one tool execution while the timeout silently\r\n // passes, relying solely on the coordinator's hard Promise.race\r\n // to interrupt. Tools that emit `tool.progress` (bash chunks,\r\n // fetch byte progress, spawn-stream stdout) give us a heartbeat\r\n // we can hang the check on. When the budget trips here:\r\n // 1. onBudgetError sets budgetError + aborter.abort()\r\n // 2. aborter signal propagates to agent.run → tool executor\r\n // 3. tool's own signal listener kills the child process\r\n // Cheap: O(1) per progress event, and the budget short-circuits\r\n // when timeoutMs is unset (most subagents have one set anyway).\r\n events.on('tool.progress', () => {\r\n try {\r\n ctx.budget.checkTimeout();\r\n } catch (e) {\r\n void onBudgetError(e);\r\n }\r\n }),\r\n );\r\n\r\n // Forward the coordinator signal so stop() from outside also aborts.\r\n const onParentAbort = () => aborter.abort();\r\n ctx.signal.addEventListener('abort', onParentAbort);\r\n\r\n let result: RunResult;\r\n try {\r\n result = await agent.run(format(task, ctx.config), { signal: aborter.signal });\r\n } finally {\r\n detachFleet?.();\r\n ctx.signal.removeEventListener('abort', onParentAbort);\r\n for (const u of unsub) u();\r\n // Per-task resource cleanup. Closes JSONL writers, throwaway\r\n // providers, etc. that the factory wired up. Swallowed errors —\r\n // a flaky cleanup must not mask the real task result. The\r\n // caller can re-emit via observability if needed.\r\n if (factoryResult.dispose) {\r\n try {\r\n await factoryResult.dispose();\r\n } catch {\r\n // intentional swallow — see comment above\r\n }\r\n }\r\n }\r\n\r\n // A budget violation is the signal — surface it so the coordinator can\r\n // tag the task with the right failure kind ('failed' for budget; the\r\n // coordinator separately recognises 'timeout' from BudgetExceededError).\r\n if (budgetError) throw budgetError;\r\n\r\n if (result.status === 'failed') {\r\n throw result.error instanceof Error\r\n ? result.error\r\n : new Error(String(result.error ?? 'agent failed'));\r\n }\r\n // 'aborted' and 'max_iterations' aren't successes — let the coordinator\r\n // classify them. When the parent signal was aborted, coordinator marks\r\n // the task 'stopped' (matched against subagent.abortController.aborted).\r\n if (result.status === 'aborted') {\r\n throw new Error('agent aborted');\r\n }\r\n if (result.status === 'max_iterations') {\r\n throw new Error('agent exhausted iteration limit');\r\n }\r\n\r\n const usage = ctx.budget.usage();\r\n // Empty-response guard. A \"successful\" run with no text AND no tool\r\n // calls is almost always a prompt / config issue, not a real\r\n // success — the agent burned an iteration to say nothing. Surface\r\n // it as a classified failure so callers can show \"✗ empty_response\"\r\n // instead of a confusing green ✓ with no output. We only trip on\r\n // the (no-text AND no-tools) intersection because text-less runs\r\n // with tool calls are legit (e.g. \"run npm test then end_turn\").\r\n const finalText = (result.finalText ?? '').trim();\r\n if (finalText.length === 0 && usage.toolCalls === 0) {\r\n throw new Error('empty response');\r\n }\r\n // Unrecovered-tool-failure guard. If the last executed tool came\r\n // back ok:false AND the agent ended its turn with no closing text,\r\n // the agent never acknowledged or recovered from the failure — the\r\n // task is effectively broken. A model that handles a tool error\r\n // emits SOME text on the next iteration (\"the read failed, trying\r\n // an alternate path…\") which clears `lastToolFailed`; the only way\r\n // both signals can be live at end-of-run is if the model gave up\r\n // silently. Surface as `tool_failed` so callers see the actual\r\n // failure mode instead of a clean ✓ with no output.\r\n if (finalText.length === 0 && lastToolFailed !== null) {\r\n throw new Error(`tool failed: ${lastToolFailed}`);\r\n }\r\n return {\r\n result: result.finalText,\r\n iterations: result.iterations,\r\n toolCalls: usage.toolCalls,\r\n };\r\n };\r\n}\r\n\r\nfunction defaultFormatTaskInput(task: TaskSpec): AgentInput {\r\n return task.description ?? '';\r\n}\r\n","import type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\n\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = messages[i]!;\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","import { randomBytes } from 'node:crypto';\r\nimport * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport type { ContentBlock } from '../types/blocks.js';\r\nimport type { Message } from '../types/messages.js';\r\nimport type {\r\n ResumedSession,\r\n SessionData,\r\n SessionEvent,\r\n SessionMetadata,\r\n SessionStore,\r\n SessionSummary,\r\n SessionWriter,\r\n} from '../types/session.js';\r\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\r\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\r\n\r\nexport interface SessionStoreOptions {\r\n dir: string;\r\n /** Optional EventBus for emitting session diagnostics. */\r\n events?: EventBus;\r\n}\r\n\r\nexport class DefaultSessionStore implements SessionStore {\r\n private readonly dir: string;\r\n private readonly events?: EventBus;\r\n\r\n constructor(opts: SessionStoreOptions) {\r\n this.dir = opts.dir;\r\n this.events = opts.events;\r\n }\r\n\r\n async create(meta: Omit<SessionMetadata, 'startedAt'>): Promise<SessionWriter> {\r\n await ensureDir(this.dir);\r\n const startedAt = new Date().toISOString();\r\n const id = meta.id ?? `${startedAt.replace(/[:.]/g, '-')}-${randomBytes(2).toString('hex')}`;\r\n const file = path.join(this.dir, `${id}.jsonl`);\r\n let handle: fsp.FileHandle;\r\n try {\r\n handle = await fsp.open(file, 'a', 0o600);\r\n } catch (err) {\r\n // Preserve cause + errno so callers can branch on EACCES vs EMFILE\r\n // vs ENOSPC etc. instead of substring-matching the error message.\r\n throw new Error(\r\n `Failed to open session file: ${err instanceof Error ? err.message : String(err)}`,\r\n {\r\n cause: err,\r\n },\r\n );\r\n }\r\n try {\r\n return new FileSessionWriter(id, handle, startedAt, meta, this.events, { dir: this.dir, filePath: file });\r\n } catch (err) {\r\n await handle.close().catch(() => {});\r\n throw err;\r\n }\r\n }\r\n\r\n async resume(id: string): Promise<ResumedSession> {\r\n const data = await this.load(id);\r\n const file = path.join(this.dir, `${id}.jsonl`);\r\n let handle: fsp.FileHandle;\r\n try {\r\n handle = await fsp.open(file, 'a', 0o600);\r\n } catch (err) {\r\n throw new Error(\r\n `Failed to open session \"${id}\" for append: ${err instanceof Error ? err.message : String(err)}`,\r\n { cause: err },\r\n );\r\n }\r\n // Mirror create(): if writer construction throws, the handle would\r\n // leak. Constructor is non-throwing today but the asymmetry would\r\n // become a real handle leak the moment validation lands here.\r\n try {\r\n const writer = new FileSessionWriter(\r\n id,\r\n handle,\r\n new Date().toISOString(),\r\n {\r\n id,\r\n model: data.metadata.model,\r\n provider: data.metadata.provider,\r\n },\r\n this.events,\r\n { resumed: true, dir: this.dir, filePath: file },\r\n );\r\n return { writer, data };\r\n } catch (err) {\r\n await handle.close().catch(() => {});\r\n throw err;\r\n }\r\n }\r\n\r\n async load(id: string): Promise<SessionData> {\r\n const file = path.join(this.dir, `${id}.jsonl`);\r\n const raw = await fsp.readFile(file, 'utf8');\r\n const lines = raw.split('\\n').filter((l) => l.trim());\r\n const events: SessionEvent[] = [];\r\n for (const line of lines) {\r\n try {\r\n const parsed: unknown = JSON.parse(line);\r\n // Session JSONL is on-disk user-writable state; downstream replay\r\n // trusts `e.type` / `e.ts` etc. and would TypeError on a malformed\r\n // shape. Validate the discriminator + timestamp before pushing.\r\n if (\r\n parsed !== null &&\r\n typeof parsed === 'object' &&\r\n typeof (parsed as { type?: unknown }).type === 'string' &&\r\n typeof (parsed as { ts?: unknown }).ts === 'string'\r\n ) {\r\n events.push(parsed as SessionEvent);\r\n }\r\n // else: skip — a hand-edited file with a partial object should not\r\n // crash replay, just lose that one event.\r\n } catch {\r\n // skip malformed JSON\r\n }\r\n }\r\n const meta = this.metaFromEvents(id, events);\r\n const { messages, usage } = this.replay(events, id);\r\n return { metadata: meta, events, messages, usage };\r\n }\r\n\r\n async list(limit = 20): Promise<SessionSummary[]> {\r\n try {\r\n await ensureDir(this.dir);\r\n const files = await fsp.readdir(this.dir);\r\n const ids = files.filter((f) => f.endsWith('.jsonl')).map((f) => f.replace(/\\.jsonl$/, ''));\r\n // Read all manifests in parallel; fall back to full load only for\r\n // sessions that haven't been closed cleanly (or predate the manifest).\r\n const sessions = await Promise.all(ids.map((id) => this.summaryFor(id).catch(() => null)));\r\n const out = sessions.filter((s): s is SessionSummary => s !== null);\r\n out.sort((a, b) => {\r\n if (a.startedAt < b.startedAt) return 1;\r\n if (a.startedAt > b.startedAt) return -1;\r\n // Equal timestamps — use id as tiebreaker for stable sort\r\n return a.id.localeCompare(b.id);\r\n });\r\n return out.slice(0, limit);\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n private async summaryFor(id: string): Promise<SessionSummary> {\r\n const manifest = path.join(this.dir, `${id}.summary.json`);\r\n try {\r\n const raw = await fsp.readFile(manifest, 'utf8');\r\n return JSON.parse(raw) as SessionSummary;\r\n } catch {\r\n // Manifest missing/corrupt — fall back to a full parse and backfill\r\n // the manifest so the next `list()` hits the fast path.\r\n const full = path.join(this.dir, `${id}.jsonl`);\r\n const stat = await fsp.stat(full);\r\n const summary = await this.summarize(id, stat.mtime.toISOString());\r\n await atomicWrite(manifest, JSON.stringify(summary), { mode: 0o600 })\r\n .catch((err) => {\r\n // Best-effort manifest write — list() falls back to full parse\r\n // on next invocation, so surface the error for diagnostics but\r\n // don't fail the listing.\r\n console.warn(\r\n `[session-store] Failed to write manifest for \"${id}\":`,\r\n err instanceof Error ? err.message : String(err),\r\n );\r\n });\r\n return summary;\r\n }\r\n }\r\n\r\n async delete(id: string): Promise<void> {\r\n await fsp.unlink(path.join(this.dir, `${id}.jsonl`));\r\n await fsp.unlink(path.join(this.dir, `${id}.summary.json`)).catch(() => undefined);\r\n }\r\n\r\n private async summarize(id: string, mtime: string): Promise<SessionSummary> {\r\n try {\r\n const data = await this.load(id);\r\n const firstUser = data.events.find((e) => e.type === 'user_input');\r\n const title =\r\n firstUser && firstUser.type === 'user_input'\r\n ? userInputTitle(firstUser.content)\r\n : '(empty session)';\r\n return {\r\n id,\r\n title,\r\n startedAt: data.metadata.startedAt,\r\n model: data.metadata.model ?? 'unknown',\r\n provider: data.metadata.provider ?? 'unknown',\r\n tokenTotal: data.usage.input + data.usage.output,\r\n };\r\n } catch {\r\n return {\r\n id,\r\n title: '(damaged)',\r\n startedAt: mtime,\r\n model: 'unknown',\r\n provider: 'unknown',\r\n tokenTotal: 0,\r\n };\r\n }\r\n }\r\n\r\n private metaFromEvents(id: string, events: SessionEvent[]): SessionMetadata {\r\n const start = events.find((e) => e.type === 'session_start');\r\n const end = events.find((e) => e.type === 'session_end');\r\n return {\r\n id,\r\n startedAt: start?.ts ?? new Date(0).toISOString(),\r\n endedAt: end?.ts,\r\n model: start?.model,\r\n provider: start?.provider,\r\n };\r\n }\r\n\r\n private replay(\r\n events: SessionEvent[],\r\n sessionId = 'unknown',\r\n ): { messages: Message[]; usage: SessionData['usage'] } {\r\n const messages: Message[] = [];\r\n let usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\r\n const openToolUses = new Set<string>();\r\n for (const e of events) {\r\n if (e.type === 'user_input') {\r\n openToolUses.clear();\r\n messages.push({ role: 'user', content: e.content });\r\n } else if (e.type === 'llm_response') {\r\n messages.push({ role: 'assistant', content: e.content });\r\n for (const b of e.content) {\r\n if (b.type === 'tool_use') openToolUses.add(b.id);\r\n }\r\n usage = {\r\n input: usage.input + (e.usage.input ?? 0),\r\n output: usage.output + (e.usage.output ?? 0),\r\n cacheRead: (usage.cacheRead ?? 0) + (e.usage.cacheRead ?? 0),\r\n cacheWrite: (usage.cacheWrite ?? 0) + (e.usage.cacheWrite ?? 0),\r\n };\r\n } else if (e.type === 'tool_result') {\r\n if (!openToolUses.has(e.id)) {\r\n // Orphan tool_result: tool_use was never seen. Skip to avoid\r\n // corrupting the replayed message sequence.\r\n this.events?.emit('session.damaged', {\r\n sessionId,\r\n detail: `Orphan tool_result \"${e.id}\" has no matching tool_use`,\r\n });\r\n continue;\r\n }\r\n openToolUses.delete(e.id);\r\n const content: ContentBlock[] = [\r\n {\r\n type: 'tool_result',\r\n tool_use_id: e.id,\r\n content: typeof e.content === 'string' ? e.content : JSON.stringify(e.content),\r\n is_error: e.isError,\r\n },\r\n ];\r\n const last = messages[messages.length - 1];\r\n if (last && last.role === 'user') {\r\n if (Array.isArray(last.content)) {\r\n last.content.push(...content);\r\n } else if (typeof last.content === 'string') {\r\n // Convert string content to blocks and append\r\n last.content = [{ type: 'text', text: last.content }, ...content];\r\n } else {\r\n messages.push({ role: 'user', content });\r\n }\r\n } else {\r\n messages.push({ role: 'user', content });\r\n }\r\n }\r\n }\r\n if (openToolUses.size > 0) {\r\n this.events?.emit('session.damaged', {\r\n sessionId,\r\n detail: `${openToolUses.size} tool_use blocks without matching results - replay repaired`,\r\n });\r\n // Damaged sessions still load; the repair pass below removes orphan\r\n // protocol blocks before the transcript can reach a provider.\r\n }\r\n const repaired = repairToolUseAdjacency(messages);\r\n if (repaired.report.changed) {\r\n this.events?.emit('session.damaged', {\r\n sessionId,\r\n detail:\r\n `Repaired replay adjacency: removed ${repaired.report.removedToolUses.length} tool_use, ` +\r\n `${repaired.report.removedToolResults.length} tool_result, ` +\r\n `${repaired.report.removedMessages} empty messages`,\r\n });\r\n }\r\n return { messages: repaired.messages, usage };\r\n }\r\n}\r\n\r\nclass FileSessionWriter implements SessionWriter {\r\n private closed = false;\r\n private closing = false;\r\n private manifestFile: string;\r\n private summary: SessionSummary;\r\n private tokenIn = 0;\r\n private tokenOut = 0;\r\n private readonly filePath: string;\r\n /** Public accessor for the JSONL path — required by SessionWriter so\r\n * observability surfaces (`/fleet log`, FleetPanel) can locate the\r\n * transcript without recomputing the path from session metadata. */\r\n get transcriptPath(): string | undefined {\r\n return this.filePath || undefined;\r\n }\r\n private initDone = false;\r\n private readonly resumed: boolean;\r\n private appendFailCount = 0;\r\n private lastAppendWarnAt = 0;\r\n\r\n // Rewind support: track pending file changes and prompt index\r\n private promptIndex = 0;\r\n private pendingFileSnapshots: Array<{\r\n path: string;\r\n action: 'created' | 'modified' | 'deleted';\r\n before: string | null;\r\n after: string | null;\r\n }> = [];\r\n\r\n // Register a pending file change. Call recordFileChange() from tools.\r\n recordFileChange(input: { path: string; action: 'created' | 'modified' | 'deleted'; before: string | null; after: string | null }): void {\r\n this.pendingFileSnapshots.push(input);\r\n }\r\n\r\n constructor(\r\n public readonly id: string,\r\n private readonly handle: fsp.FileHandle,\r\n private readonly startedAt: string,\r\n private readonly meta: Omit<SessionMetadata, 'startedAt'>,\r\n private readonly events?: EventBus,\r\n opts: { resumed?: boolean; dir?: string; filePath?: string } = {},\r\n ) {\r\n this.resumed = opts.resumed ?? false;\r\n this.manifestFile = opts.dir ? path.join(opts.dir, `${id}.summary.json`) : '';\r\n this.filePath = opts.filePath ?? '';\r\n this.summary = {\r\n id,\r\n title: '(empty session)',\r\n startedAt,\r\n model: meta.model ?? 'unknown',\r\n provider: meta.provider ?? 'unknown',\r\n tokenTotal: 0,\r\n };\r\n // Session start is written lazily on first append to avoid sync I/O\r\n // in constructor and eliminate reliance on FileHandle.fd private property.\r\n }\r\n\r\n private async writeSessionStartLazy(): Promise<void> {\r\n const record = `${JSON.stringify({\r\n type: this.resumed ? 'session_resumed' : 'session_start',\r\n ts: this.startedAt,\r\n id: this.id,\r\n model: this.meta.model ?? 'unknown',\r\n provider: this.meta.provider ?? 'unknown',\r\n })}\\n`;\r\n try {\r\n if (this.filePath) {\r\n // Use fs.promises.writeFile directly to avoid FileHandle.fd private access\r\n await fsp.writeFile(this.filePath, record, { flag: 'a', mode: 0o600 });\r\n }\r\n } catch {\r\n // best-effort; session will still be usable without the start event logged\r\n }\r\n }\r\n\r\n async append(event: SessionEvent): Promise<void> {\r\n if (this.closed) return;\r\n // Guard against concurrent append calls racing on lazy initialization.\r\n // Set initDone BEFORE the await so a second caller sees it and skips.\r\n if (!this.initDone) {\r\n this.initDone = true;\r\n await this.writeSessionStartLazy();\r\n }\r\n this.observeForSummary(event);\r\n try {\r\n await this.handle.appendFile(`${JSON.stringify(event)}\\n`, 'utf8');\r\n } catch (err) {\r\n // A persistent failure (full disk, broken pipe) would otherwise log\r\n // once per appended event — which for a chatty agent run is a lot.\r\n // Debounce to one log per 5 s and surface the suppressed count.\r\n this.appendFailCount++;\r\n const now = Date.now();\r\n if (now - this.lastAppendWarnAt > 5000) {\r\n const suppressed = this.appendFailCount - 1;\r\n const tail = suppressed > 0 ? ` (+${suppressed} suppressed)` : '';\r\n console.warn(\r\n '[session] append failed:',\r\n err instanceof Error ? err.message : String(err),\r\n tail,\r\n );\r\n this.lastAppendWarnAt = now;\r\n this.appendFailCount = 0;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Watch events as they're appended and keep the summary state hot, so\r\n * `close()` can flush a `<id>.summary.json` manifest without re-reading\r\n * the JSONL. `list()` reads only manifests, turning a per-session full\r\n * parse into a single stat+read.\r\n */\r\n private observeForSummary(event: SessionEvent): void {\r\n if (event.type === 'user_input' && this.summary.title === '(empty session)') {\r\n this.summary = { ...this.summary, title: userInputTitle(event.content) };\r\n } else if (event.type === 'llm_response') {\r\n this.tokenIn += event.usage.input;\r\n this.tokenOut += event.usage.output;\r\n this.summary = { ...this.summary, tokenTotal: this.tokenIn + this.tokenOut };\r\n } else if (event.type === 'session_end') {\r\n // session_end usage is the canonical total — prefer it if non-zero.\r\n const total = event.usage.input + event.usage.output;\r\n if (total > 0) this.summary = { ...this.summary, tokenTotal: total };\r\n }\r\n }\r\n\r\n async close(): Promise<void> {\r\n if (this.closing) return;\r\n this.closing = true;\r\n this.closed = true;\r\n if (this.manifestFile) {\r\n try {\r\n await atomicWrite(this.manifestFile, JSON.stringify(this.summary), { mode: 0o600 });\r\n } catch {\r\n // manifest write is best-effort; list() falls back to full load.\r\n }\r\n }\r\n try {\r\n await this.handle.close();\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n async writeCheckpoint(promptIndex: number, promptPreview: string): Promise<void> {\r\n // Flush pending file snapshots before checkpoint\r\n const fileCount = this.pendingFileSnapshots.length;\r\n if (fileCount > 0) {\r\n await this.writeFileSnapshot(promptIndex, [...this.pendingFileSnapshots]);\r\n this.pendingFileSnapshots = [];\r\n }\r\n this.promptIndex = promptIndex + 1;\r\n await this.append({\r\n type: 'checkpoint',\r\n ts: new Date().toISOString(),\r\n promptIndex,\r\n promptPreview,\r\n });\r\n // Notify UIs so they can update checkpoint timelines\r\n this.events?.emit('checkpoint.written', {\r\n promptIndex,\r\n promptPreview,\r\n ts: new Date().toISOString(),\r\n fileCount,\r\n });\r\n }\r\n\r\n async writeFileSnapshot(\r\n promptIndex: number,\r\n files: import('../types/session.js').FileSnapshot[],\r\n ): Promise<void> {\r\n await this.append({\r\n type: 'file_snapshot',\r\n ts: new Date().toISOString(),\r\n promptIndex,\r\n files,\r\n });\r\n }\r\n\r\n async truncateToCheckpoint(targetPromptIndex: number): Promise<number> {\r\n if (!this.filePath) return 0;\r\n const raw = await fsp.readFile(this.filePath, 'utf8');\r\n const lines = raw.split('\\n');\r\n const kept: string[] = [];\r\n let removedCount = 0;\r\n\r\n // Find the line index of the target checkpoint and all later checkpoint events.\r\n // Events at lines >= targetCheckpointLine are after the target and must be removed\r\n // (except checkpoint/file_snapshot themselves which we track via promptIndex).\r\n let targetCheckpointLine = -1;\r\n let afterTarget = false;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i]!;\r\n if (!line.trim()) continue;\r\n\r\n let event: { type?: string; promptIndex?: number };\r\n try {\r\n event = JSON.parse(line);\r\n } catch {\r\n kept.push(line);\r\n continue;\r\n }\r\n\r\n if (event.type === 'checkpoint') {\r\n if ((event as { promptIndex: number }).promptIndex === targetPromptIndex) {\r\n targetCheckpointLine = kept.length; // where this checkpoint will be stored\r\n afterTarget = true;\r\n } else if ((event as { promptIndex: number }).promptIndex > targetPromptIndex) {\r\n afterTarget = true;\r\n }\r\n }\r\n\r\n if (event.promptIndex !== undefined && event.promptIndex > targetPromptIndex) {\r\n removedCount++;\r\n } else if (event.promptIndex === undefined) {\r\n // Events without promptIndex (user_input, llm_response, session_start, etc.)\r\n // are kept ONLY if we haven't passed the target checkpoint yet\r\n if (!afterTarget || targetCheckpointLine === -1) {\r\n kept.push(line);\r\n } else {\r\n removedCount++;\r\n }\r\n } else {\r\n kept.push(line);\r\n }\r\n }\r\n\r\n const truncated = kept.join('\\n');\r\n // NOTE: cannot use atomicWrite() here. The writer holds an append-mode\r\n // FileHandle on this.filePath (see resume/create), and on Windows\r\n // `rename(tmp, target)` fails with EPERM when `target` has an open\r\n // handle. truncateToCheckpoint is only invoked from an explicit /rewind,\r\n // so the small crash window is acceptable.\r\n await fsp.writeFile(this.filePath, truncated + '\\n', 'utf8');\r\n\r\n await this.append({\r\n type: 'rewound',\r\n ts: new Date().toISOString(),\r\n toPromptIndex: targetPromptIndex,\r\n revertedFiles: [],\r\n });\r\n\r\n this.events?.emit('session.rewound', {\r\n toPromptIndex: targetPromptIndex,\r\n revertedFiles: [],\r\n removedEvents: removedCount,\r\n });\r\n\r\n return removedCount;\r\n }\r\n}\r\n\r\nfunction userInputTitle(content: string | ContentBlock[]): string {\r\n if (typeof content === 'string') return content.slice(0, 60);\r\n const text = content\r\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\r\n .map((b) => b.text)\r\n .join(' ');\r\n return (text || '(non-text input)').slice(0, 60);\r\n}\r\n","import * as path from 'node:path';\nimport { DefaultSessionStore } from '../storage/session-store.js';\nimport type { SessionStore, SessionWriter } from '../types/session.js';\n\n/**\n * Per-subagent session factory.\n *\n * Director runs produce many parallel transcripts — one per spawned\n * subagent — and we want them all rooted under the same director-run\n * directory so a future `wstack replay <runId>` can rehydrate the whole\n * fleet from a single tree.\n *\n * The factory builds (or accepts) a `SessionStore` whose `dir` points at\n * `<sessionsRoot>/<directorRunId>/`, and returns a small `create()`\n * function that the orchestration layer calls per-spawn. Each call\n * yields a fresh `SessionWriter` whose JSONL file lives in that\n * directory, named by either the caller-supplied `subagentId` (preferred,\n * so the file name is human-readable) or a derived id.\n *\n * **Why a thin factory instead of plumbing options through every spawn\n * site?** Because the director is the only caller that needs this\n * isolation pattern, and shoving `sessionStore` options into\n * `SubagentConfig` would leak storage details into a config shape that\n * agents and the coordinator have no business knowing about.\n */\nexport interface DirectorSessionFactoryOptions {\n /**\n * Either a parent directory where `<directorRunId>/` will be created,\n * or a pre-built `SessionStore` whose `dir` already points at the\n * director run directory. Tests pass an in-memory store for isolation;\n * production code passes the path under `~/.wrongstack/sessions/`.\n */\n store?: SessionStore;\n sessionsRoot?: string;\n /**\n * Director run id — namespaces all subagent JSONLs under one folder.\n * Defaults to a timestamped id; supplied explicitly when resuming a\n * prior fleet manifest.\n */\n directorRunId?: string;\n}\n\nexport interface DirectorSessionFactory {\n /** Absolute directory where this director run's transcripts live. */\n readonly dir: string;\n /** The director run id used to namespace the directory. */\n readonly directorRunId: string;\n /**\n * Create a fresh `SessionWriter` for the named subagent. Each\n * subagent gets its own JSONL file. The writer's `id` matches the\n * supplied `subagentId` so disk paths line up with in-memory ids.\n */\n createSubagentSession(args: {\n subagentId: string;\n provider?: string;\n model?: string;\n title?: string;\n }): Promise<SessionWriter>;\n}\n\n/**\n * Build a `DirectorSessionFactory`. Pass either a pre-configured\n * `SessionStore` (tests) or a `sessionsRoot` path (production). When\n * neither is supplied the factory throws — there's no sane default for\n * \"where do these JSONLs live\".\n */\nexport function makeDirectorSessionFactory(\n opts: DirectorSessionFactoryOptions,\n): DirectorSessionFactory {\n const runId = opts.directorRunId ?? `${new Date().toISOString().replace(/[:.]/g, '-')}-director`;\n\n let store: SessionStore;\n let dir: string;\n if (opts.store) {\n // The caller wired its own store — we trust them on where the\n // files land. We can't introspect a `SessionStore`'s directory\n // without a typed accessor, so we report the run id and let the\n // caller record the path separately if needed.\n store = opts.store;\n dir = opts.sessionsRoot ? path.join(opts.sessionsRoot, runId) : '(caller-managed)';\n } else if (opts.sessionsRoot) {\n dir = path.join(opts.sessionsRoot, runId);\n store = new DefaultSessionStore({ dir });\n } else {\n throw new Error('makeDirectorSessionFactory requires either `store` or `sessionsRoot`');\n }\n\n return {\n dir,\n directorRunId: runId,\n async createSubagentSession({ subagentId, provider, model, title }) {\n // Per-subagent JSONL — DefaultSessionStore generates the file name\n // from the metadata `id`, so we pass `subagentId` directly to\n // keep disk artifacts human-readable.\n return store.create({\n id: subagentId,\n title: title ?? subagentId,\n provider: provider ?? 'unknown',\n model: model ?? 'unknown',\n });\n },\n };\n}\n","import { FleetBus } from './fleet-bus.js';\n\n/**\n * A no-op FleetBus that discards all events. Used when no real fleet\n * bus is available (non-director mode) so the runner's `fleetBus`\n * field is always valid and the `attach()` call is always safe.\n *\n * One singleton instance is sufficient — it has no state to reset.\n */\nexport const NULL_FLEET_BUS = new FleetBus();\n","import * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { randomUUID } from 'node:crypto';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\nimport type { SubagentConfig } from '../types/multi-agent.js';\r\nimport type { SessionWriter } from '../types/session.js';\r\nimport { DirectorStateCheckpoint } from '../storage/director-state.js';\r\nimport { FleetBus, FleetUsageAggregator } from './fleet-bus.js';\r\nimport type { FleetUsage } from './fleet-bus.js';\r\nimport type { IFleetManager } from './ifleet-manager.js';\r\n\r\n/** Options for constructing a FleetManager. */\r\nexport interface FleetManagerOptions {\r\n manifestPath?: string;\r\n sessionsRoot?: string;\r\n directorRunId?: string;\r\n maxSpawns?: number;\r\n maxSpawnDepth?: number;\r\n spawnDepth?: number;\r\n stateCheckpointPath?: string;\r\n sessionWriter?: SessionWriter;\r\n manifestDebounceMs?: number;\r\n checkpointDebounceMs?: number;\r\n directorBudget?: { maxCostUsd?: number };\r\n}\r\n\r\n/**\r\n * Fleet-level policy container extracted from `Director`. Owns:\r\n * - FleetBus + FleetUsageAggregator\r\n * - Spawn caps and counters\r\n * - Manifest entries and debounced writing\r\n * - State checkpointing\r\n *\r\n * This lets the `Director` focus on orchestration (spawn/assign/await/ask)\r\n * while fleet-level decisions live in one place. The class implements\r\n * `IFleetManager` so it remains swappable in future.\r\n *\r\n * @example\r\n * ```typescript\r\n * const fm = new FleetManager({ manifestPath: '/tmp/fleet.json' });\r\n * const err = fm.canSpawn({ name: 'worker' });\r\n * if (!err) fm.recordSpawn('sub-1', { name: 'worker' });\r\n * await fm.writeManifest();\r\n * ```\r\n */\r\nexport class FleetManager implements IFleetManager {\r\n /** The fleet-wide event bus. */\r\n readonly fleet: FleetBus;\r\n /** Usage rollup across all subagents. */\r\n readonly usage: FleetUsageAggregator;\r\n\r\n private readonly manifestPath?: string;\r\n private readonly sessionsRoot?: string;\r\n private readonly directorRunId: string;\r\n /** Spawn cap (lifetime total). Infinity means unlimited. */\r\n readonly maxSpawns: number;\r\n /** Nesting cap. */\r\n readonly maxSpawnDepth: number;\r\n /** This director's depth in a director chain. Root = 0. */\r\n readonly spawnDepth: number;\r\n /** Live spawn counter. */\r\n private spawnCount = 0;\r\n private readonly stateCheckpoint: DirectorStateCheckpoint | null;\r\n private readonly sessionWriter: SessionWriter | null;\r\n private manifestTimer: NodeJS.Timeout | null = null;\r\n private readonly manifestDebounceMs: number;\r\n /** Fleet-wide cost cap. Infinity = no cap. Distinct from SubagentBudget limits,\r\n * which track per-subagent spend — this field caps the entire fleet total. */\r\n private readonly maxFleetCostUsd: number;\r\n private readonly manifestEntries = new Map<\r\n string,\r\n { subagentId: string; name: string; role?: string; provider?: string; model?: string; taskIds: string[] }\r\n >();\r\n /** Pending tasks with their descriptions — populated by `addPendingTask`\r\n * and cleared by `removePendingTask`. Replaces the host-side `pending`\r\n * Map so task descriptions live in one place (FleetManager). */\r\n private readonly pendingTasks = new Map<string, { subagentId: string; description: string }>();\r\n private readonly subagentMeta = new Map<string, { provider?: string; model?: string }>();\r\n private readonly priceLookups = new Map<string, { input?: number; output?: number; cacheRead?: number; cacheWrite?: number }>();\r\n\r\n constructor(opts: FleetManagerOptions = {}) {\r\n this.manifestPath = opts.manifestPath;\r\n this.sessionsRoot = opts.sessionsRoot;\r\n this.directorRunId = opts.directorRunId ?? randomUUID();\r\n this.maxSpawns = opts.maxSpawns ?? Number.POSITIVE_INFINITY;\r\n this.maxSpawnDepth = opts.maxSpawnDepth ?? 2;\r\n this.spawnDepth = opts.spawnDepth ?? 0;\r\n this.sessionWriter = opts.sessionWriter ?? null;\r\n this.manifestDebounceMs = opts.manifestDebounceMs ?? 2000;\r\n this.maxFleetCostUsd = opts.directorBudget?.maxCostUsd ?? Number.POSITIVE_INFINITY;\r\n this.stateCheckpoint = opts.stateCheckpointPath\r\n ? new DirectorStateCheckpoint(\r\n opts.stateCheckpointPath,\r\n {\r\n directorRunId: this.directorRunId,\r\n maxSpawns: opts.maxSpawns,\r\n spawnDepth: this.spawnDepth,\r\n maxSpawnDepth: this.maxSpawnDepth,\r\n directorBudget: opts.directorBudget,\r\n },\r\n opts.checkpointDebounceMs ?? 250,\r\n )\r\n : null;\r\n\r\n this.fleet = new FleetBus();\r\n this.usage = new FleetUsageAggregator(\r\n this.fleet,\r\n (id) => this.priceLookups.get(id),\r\n (id) => this.subagentMeta.get(id),\r\n );\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n // IFleetManager surface\r\n // -----------------------------------------------------------------------\r\n\r\n get fleetBus(): FleetBus {\r\n return this.fleet;\r\n }\r\n\r\n snapshot(): FleetUsage {\r\n return this.usage.snapshot();\r\n }\r\n\r\n getSubagentMeta(id: string): { provider?: string; model?: string; name?: string } | undefined {\r\n return this.subagentMeta.get(id);\r\n }\r\n\r\n /**\r\n * Returns null if the spawn is allowed, or an object describing\r\n * which cap was exceeded. Does NOT throw — the caller decides\r\n * how to surface the rejection.\r\n */\r\n canSpawn(config: SubagentConfig): { kind: 'max_spawns' | 'max_spawn_depth' | 'max_cost_usd'; limit: number; observed: number } | null {\r\n if (this.spawnDepth >= this.maxSpawnDepth) {\r\n return { kind: 'max_spawn_depth', limit: this.maxSpawnDepth, observed: this.spawnDepth };\r\n }\r\n if (this.spawnCount >= this.maxSpawns) {\r\n return { kind: 'max_spawns', limit: this.maxSpawns, observed: this.spawnCount + 1 };\r\n }\r\n if (this.maxFleetCostUsd < Number.POSITIVE_INFINITY) {\r\n const totalCost = this.usage.snapshot().total?.cost ?? 0;\r\n if (totalCost >= this.maxFleetCostUsd) {\r\n return { kind: 'max_cost_usd', limit: this.maxFleetCostUsd, observed: totalCost };\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Records a spawn: increments counter, stores metadata, updates state checkpoint,\r\n * and schedules a debounced manifest write. Call AFTER the coordinator\r\n * has successfully spawned the subagent.\r\n *\r\n * @param subagentId The subagent's id (from coordinator.spawn result)\r\n * @param config The SubagentConfig that was used\r\n * @param priceLookup Optional per-subagent pricing data\r\n */\r\n recordSpawn(\r\n subagentId: string,\r\n config: SubagentConfig,\r\n priceLookup?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number },\r\n ): void {\r\n this.spawnCount += 1;\r\n this.subagentMeta.set(subagentId, {\r\n provider: config.provider,\r\n model: config.model,\r\n });\r\n if (priceLookup) this.priceLookups.set(subagentId, priceLookup);\r\n this.manifestEntries.set(subagentId, {\r\n subagentId,\r\n name: config.name,\r\n role: config.role,\r\n provider: config.provider,\r\n model: config.model,\r\n taskIds: [],\r\n });\r\n // State checkpoint: persist the spawn even before any task is assigned\r\n this.stateCheckpoint?.recordSpawn({\r\n id: subagentId,\r\n name: config.name,\r\n role: config.role,\r\n provider: config.provider,\r\n model: config.model,\r\n spawnedAt: new Date().toISOString(),\r\n }, this.spawnCount);\r\n void this.appendSessionEvent({\r\n type: 'agent_spawned',\r\n ts: new Date().toISOString(),\r\n agentId: subagentId,\r\n role: config.role ?? config.name,\r\n });\r\n this.scheduleManifest();\r\n }\r\n\r\n async writeManifest(): Promise<string | null> {\r\n if (!this.manifestPath) return null;\r\n const manifest = {\r\n version: 1,\r\n directorRunId: this.directorRunId,\r\n generatedAt: new Date().toISOString(),\r\n children: Array.from(this.manifestEntries.values()).map((entry) => ({\r\n id: entry.subagentId,\r\n name: entry.name,\r\n role: entry.role,\r\n provider: entry.provider,\r\n model: entry.model,\r\n taskIds: entry.taskIds,\r\n })),\r\n usage: this.usage.snapshot(),\r\n };\r\n await fsp.mkdir(path.dirname(this.manifestPath), { recursive: true });\r\n await atomicWrite(this.manifestPath, JSON.stringify(manifest, null, 2), { mode: 0o600 });\r\n return this.manifestPath;\r\n }\r\n\r\n /**\r\n * Attach task ids to an already-spawned subagent. Called by\r\n * `Director.assign()` after the coordinator assigns a task.\r\n */\r\n addTaskToSubagent(subagentId: string, taskId: string): void {\r\n const entry = this.manifestEntries.get(subagentId);\r\n if (entry) entry.taskIds.push(taskId);\r\n }\r\n\r\n /**\r\n * Debounced manifest write. Call after any state mutation\r\n * (spawn, assign, complete) so a burst collapses into one write.\r\n */\r\n scheduleManifest(): void {\r\n if (!this.manifestPath || this.manifestDebounceMs <= 0) return;\r\n if (this.manifestTimer) return;\r\n this.manifestTimer = setTimeout(() => {\r\n this.manifestTimer = null;\r\n void this.writeManifest().catch((err) => {\r\n // Surface via process.emitWarning so a persistent manifest-write\r\n // failure doesn't get silently swallowed (e.g. ENOSPC on the\r\n // sessions dir would otherwise leave fleet state un-persisted with\r\n // no signal until shutdown).\r\n const detail = err instanceof Error ? err.message : String(err);\r\n process.emitWarning(\r\n `FleetManager manifest write failed: ${detail}`,\r\n 'FleetManagerWarning',\r\n );\r\n });\r\n }, this.manifestDebounceMs);\r\n }\r\n\r\n /** Best-effort session event writer. Swallows failures. */\r\n private async appendSessionEvent(event: Parameters<SessionWriter['append']>[0]): Promise<void> {\r\n if (!this.sessionWriter) return;\r\n try {\r\n await this.sessionWriter.append(event);\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n // Pending task management — eliminates host-side state duplication\r\n // -----------------------------------------------------------------------\r\n\r\n addPendingTask(taskId: string, subagentId: string, description: string): void {\r\n this.pendingTasks.set(taskId, { subagentId, description });\r\n }\r\n\r\n removePendingTask(taskId: string): void {\r\n this.pendingTasks.delete(taskId);\r\n }\r\n\r\n getFleetStatus(): {\r\n pending: { taskId: string; description: string; subagentId: string }[];\r\n live: { subagentId: string; status: string; task?: string }[];\r\n } {\r\n const pending = Array.from(this.pendingTasks.entries()).map(([taskId, v]) => ({\r\n taskId,\r\n description: v.description,\r\n subagentId: v.subagentId,\r\n }));\r\n // live is populated by MultiAgentHost from the coordinator — fleet\r\n // manager has no direct visibility into subagent status\r\n return { pending, live: [] };\r\n }\r\n}"]}
|