@wrongstack/core 0.277.1 → 0.280.0
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-BFJ2ODzI.d.ts → agent-bridge-DXC6QDJ4.d.ts} +1 -1
- package/dist/{agent-subagent-runner-BimKihiC.d.ts → agent-subagent-runner-PoqNKiR4.d.ts} +563 -471
- package/dist/{compactor-D3BGw26y.d.ts → compactor-U3agvUIG.d.ts} +1 -1
- package/dist/{config-DAOjriz9.d.ts → config-Cr3312zc.d.ts} +102 -4
- package/dist/coordination/index.d.ts +1087 -998
- package/dist/coordination/index.js +12235 -12052
- package/dist/coordination/index.js.map +1 -1
- package/dist/defaults/index.d.ts +31 -30
- package/dist/defaults/index.js +403 -189
- package/dist/defaults/index.js.map +1 -1
- package/dist/{brain-CCfuEOdp.d.ts → events-Bs2fmldo.d.ts} +117 -112
- package/dist/execution/index.d.ts +27 -19
- package/dist/execution/index.js +216 -63
- package/dist/execution/index.js.map +1 -1
- package/dist/execution/prompt-enhancer.d.ts +1 -1
- package/dist/execution/prompt-enhancer.js.map +1 -1
- package/dist/extension/index.d.ts +8 -7
- package/dist/{global-mailbox-Dr4cTKqL.d.ts → global-mailbox-Ct7IorLJ.d.ts} +84 -6
- package/dist/{goal-store-C1uH4srH.d.ts → goal-store-C4F6DjC0.d.ts} +1 -1
- package/dist/hq/index.d.ts +504 -7
- package/dist/hq/index.js +1069 -20
- package/dist/hq/index.js.map +1 -1
- package/dist/{index-DJXj-dcr.d.ts → index-kidebiDh.d.ts} +8 -5
- package/dist/{index-cMEmzCVN.d.ts → index-nP09-oP2.d.ts} +2 -2
- package/dist/index.d.ts +153 -76
- package/dist/index.js +5791 -3163
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +7 -6
- package/dist/kernel/index.d.ts +14 -13
- package/dist/kernel/index.js +31 -15
- package/dist/kernel/index.js.map +1 -1
- package/dist/{mailbox-types-DTl7bRH3.d.ts → mailbox-types-BGZWrYTJ.d.ts} +38 -0
- package/dist/{mcp-servers-CFb60-pH.d.ts → mcp-servers-D910X5_r.d.ts} +3 -3
- package/dist/models/index.d.ts +5 -5
- package/dist/models/index.js.map +1 -1
- package/dist/{models-registry-5Ufn7f2m.d.ts → models-registry-CLkoOcHk.d.ts} +1 -1
- package/dist/{multi-agent-coordinator-CcrcncvG.d.ts → multi-agent-coordinator-CieyUoEL.d.ts} +1 -1
- package/dist/{null-fleet-bus-C9KsYyrI.d.ts → null-fleet-bus-DkdmZJ_W.d.ts} +464 -464
- package/dist/observability/index.d.ts +3 -2
- package/dist/{path-resolver-CEeX9I7O.d.ts → path-resolver-XfZ9eLxG.d.ts} +3 -3
- package/dist/{permission-DbsGOA1C.d.ts → permission-Dx6dIqS2.d.ts} +2 -7
- package/dist/{permission-policy-BpEea3r7.d.ts → permission-policy-C8vJcnX5.d.ts} +2 -2
- package/dist/{pipeline-CEjBjzVA.d.ts → pipeline-BwAP21_4.d.ts} +9 -4
- package/dist/{provider-model-resolve-BpfXp3Jj.d.ts → provider-model-resolve-CwQNZWt_.d.ts} +3 -3
- package/dist/{provider-runner-CnOSr5BN.d.ts → provider-runner-CYHFImzV.d.ts} +3 -3
- package/dist/{retry-policy-Git9WF6d.d.ts → retry-policy-D4feSLk3.d.ts} +1 -1
- package/dist/sdd/index.d.ts +11 -10
- package/dist/sdd/index.js +2 -2
- package/dist/sdd/index.js.map +1 -1
- package/dist/secret-scrubber-3MHDDAtm.d.ts +6 -0
- package/dist/{secret-vault-DDSMHqIm.d.ts → secret-vault-CImt2XrR.d.ts} +1 -1
- package/dist/security/index.d.ts +6 -5
- package/dist/security/index.js.map +1 -1
- package/dist/{selector-Cq72C0Oy.d.ts → selector-Dy-MzKp1.d.ts} +1 -1
- package/dist/{session-event-bridge-DG94B3Bk.d.ts → session-event-bridge-CqdiGnfU.d.ts} +1 -1
- package/dist/{session-reader-BzT-iMQT.d.ts → session-reader-Hk0WbNm9.d.ts} +1 -1
- package/dist/{skill-DGIXCtdv.d.ts → skill-DHniprNl.d.ts} +15 -1
- package/dist/skills/index.d.ts +472 -26
- package/dist/skills/index.js +872 -129
- package/dist/skills/index.js.map +1 -1
- package/dist/storage/index.d.ts +27 -14
- package/dist/storage/index.js +264 -85
- package/dist/storage/index.js.map +1 -1
- package/dist/{strategy-compactor-Bt_ZH6R0.d.ts → strategy-compactor-CQwhbErd.d.ts} +32 -17
- package/dist/{todos-checkpoint-CH1pcua9.d.ts → todos-checkpoint-Bk2uP7Ex.d.ts} +6 -6
- package/dist/{context-DPlA6kid.d.ts → tool-BkOgs_KL.d.ts} +306 -286
- package/dist/{tool-executor-SVFq7IOR.d.ts → tool-executor-SiE1wlZo.d.ts} +9 -9
- package/dist/tools/index.d.ts +2 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/types/index.d.ts +22 -21
- package/dist/types/index.js +7 -9
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +30 -4
- package/dist/utils/index.js +50 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/{worktree-manager-C4YIf1Fa.d.ts → worktree-manager-BjOFF6bt.d.ts} +1 -1
- package/dist/{wstack-paths-_NrRovdr.d.ts → wstack-paths-CMl_cYgq.d.ts} +8 -0
- package/package.json +1 -1
- package/skills/mailbox-bridge/SKILL.md +1 -0
- package/skills/plugin-author/SKILL.md +350 -0
- package/skills/sdd/SKILL.md +134 -134
- package/skills/skill-creator/SKILL.md +45 -7
- package/skills/wrongstack-mailbox/SKILL.md +40 -21
package/dist/sdd/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/assert-never.ts","../../src/utils/atomic-write.ts","../../src/utils/child-env.ts","../../src/utils/error.ts","../../src/utils/expect-defined.ts","../../src/utils/string.ts","../../src/types/errors.ts","../../src/sdd/spec-parser.ts","../../src/sdd/task-generator.ts","../../src/types/task-graph.ts","../../src/sdd/task-tracker.ts","../../src/sdd/task-flow.ts","../../src/sdd/spec-store.ts","../../src/sdd/task-graph-store.ts","../../src/sdd/board-types.ts","../../src/sdd/sdd-board-store.ts","../../src/sdd/sdd-board-projector.ts","../../src/sdd/sdd-run-registry.ts","../../src/sdd/spec-builder.ts","../../src/sdd/sdd-interview-driver.ts","../../src/sdd/sdd-parallel-run.ts","../../src/coordination/agent-subagent-runner.ts","../../src/coordination/subagent-budget.ts","../../src/types/provider.ts","../../src/coordination/coordinator/error-classifier.ts","../../src/coordination/agents/types.ts","../../src/coordination/agents/agent-prompts.ts","../../src/coordination/agents/phase1-discovery.ts","../../src/coordination/agents/phase2-planning.ts","../../src/coordination/agents/phase3-build.ts","../../src/coordination/agents/phase4-verify.ts","../../src/coordination/agents/phase5-review.ts","../../src/coordination/agents/phase6-domain.ts","../../src/coordination/agents/phase7-knowledge.ts","../../src/coordination/agents/phase8-delivery.ts","../../src/coordination/agents/phase9-meta.ts","../../src/coordination/agents/index.ts","../../src/coordination/fleet.ts","../../src/coordination/subagent-nicknames.ts","../../src/coordination/multi-agent-coordinator.ts","../../src/sdd/sdd-task-decomposer.ts","../../src/sdd/start-sdd-run.ts","../../src/worktree/worktree-manager.ts","../../src/sdd/sdd-lifecycle.ts","../../src/sdd/spec-templates.ts","../../src/sdd/task-visualizer.ts","../../src/sdd/critical-path.ts","../../src/sdd/spec-versioning.ts","../../src/sdd/auto-executor.ts","../../src/core/fallback-model.ts","../../src/sdd/sdd-supervisor.ts","../../src/sdd/verify-task.ts","../../src/utils/instruction-file.ts","../../src/sdd/decompose-task.ts","../../src/sdd/conflict-resolver.ts"],"names":["path","stat","resolve","path2","fsp","path3","fsp2","path4","fsp3","atomicWrite","first","baseMessage","randomUUID","PreemptState","join","mkdir","rm","fsp4","r","spawn","readFileSync","path6","fileURLToPath","isDirectory","statSync","TASK_TYPES","readFile","writeFile"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Exhaustiveness check for discriminated union switches.\n * Place in the `default` branch of a switch over a union type\n * to get a compile-time error when a new variant is added.\n *\n * @example\n * switch (block.type) {\n * case 'text': return renderText(block);\n * case 'tool_use': return renderToolUse(block);\n * default: return assertNever(block);\n * }\n */\nexport function assertNever(x: never, message?: string): never {\n const err = new Error(\n message ?? `Unhandled case: ${JSON.stringify(x)}`,\n );\n err.name = 'AssertNeverError';\n throw err;\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { FsError } from '../types/errors.js';\n\nexport interface AtomicWriteOptions {\n mode?: number | undefined;\n encoding?: BufferEncoding | undefined;\n}\n\nexport interface FileLockOptions {\n timeoutMs?: number | undefined;\n staleMs?: number | undefined;\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 // P3 #20 (before-release.md): on Windows, fs.rename (MoveFileExW) does\n // not preserve Unix permission bits — the chmod above applies to the tmp\n // file, but the rename may reset the destination's mode to the Windows\n // default. Re-apply the mode after rename on win32 so an edited file\n // keeps its executable bit (or any non-default permission). On POSIX,\n // rename preserves metadata so this is a no-op (chmod is idempotent and\n // cheap), but we gate it on win32 to avoid the extra stat+chmod on the\n // common path.\n if (mode !== undefined && process.platform === 'win32') {\n try {\n await fs.chmod(targetPath, mode);\n } catch {\n // Best-effort: a transient EPERM (antivirus lock) should not fail\n // the write — the content is already on disk.\n }\n }\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\nexport async function withFileLock<T>(\n targetPath: string,\n fn: () => Promise<T>,\n opts: FileLockOptions = {},\n): Promise<T> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const lockPath = path.join(dir, `.${path.basename(targetPath)}.lock`);\n const timeoutMs = opts.timeoutMs ?? 5_000;\n const staleMs = opts.staleMs ?? 30_000;\n const started = Date.now();\n let handle: fs.FileHandle | undefined;\n\n for (;;) {\n try {\n handle = await fs.open(lockPath, 'wx');\n await handle.writeFile(`${process.pid}:${Date.now()}`);\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n // ENOENT means the directory was deleted (e.g. by concurrent cleanup).\n // Recreate it and retry acquiring the lock.\n if (code === 'ENOENT') {\n await fs.mkdir(dir, { recursive: true });\n continue;\n }\n if (code !== 'EEXIST') throw err;\n try {\n const stat = await fs.stat(lockPath);\n if (Date.now() - stat.mtimeMs > staleMs) {\n await fs.unlink(lockPath);\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() - started >= timeoutMs) {\n throw new FsError({\n message: `Timed out waiting for file lock: ${targetPath}`,\n code: 'FS_ATOMIC_WRITE_FAILED',\n path: targetPath,\n context: { timeoutMs },\n });\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n\n try {\n return await fn();\n } finally {\n try {\n await handle?.close();\n } catch {\n // ignore\n }\n try {\n await fs.unlink(lockPath);\n } catch {\n // ignore\n }\n }\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","/**\n * Build a sanitized child-process environment.\n *\n * The bash/exec tools and MCP stdio transports execute LLM-generated or\n * configured commands. The parent process carries provider API keys\n * (ANTHROPIC_API_KEY, OPENAI_API_KEY, ...), VCS tokens (GITHUB_TOKEN),\n * and cloud credentials. Forwarding those to a child is an exfiltration\n * vector even with `permission: 'confirm'` — a compromised MCP server\n * or a cleverly composed shell pipeline can leak secrets.\n *\n * Strategy: copy a small, explicit allowlist of variables that real builds\n * need, then copy anything else that does NOT look secret-bearing. This\n * preserves user-friendly behavior (locale, terminal, npm config) while\n * blocking the obvious leak channels. Two value-side guards back up the\n * name-based filter:\n * - any value carrying an embedded URI credential (`scheme://user:pass@host`,\n * e.g. `DATABASE_URL`/`REDIS_URL`/`*_DSN`) is dropped (WS-01);\n * - `NODE_OPTIONS` is forwarded but with module-preload directives\n * (`--require`/`--import`/`--loader`) stripped so a parent-set value can't\n * inject code into node children (WS-02).\n *\n * Override with `WRONGSTACK_CHILD_ENV_PASSTHROUGH=1` to forward the full\n * parent environment unchanged (opt-in for advanced users who understand\n * the risk).\n */\n\nconst ALLOWED_KEYS = new Set<string>([\n 'PATH',\n 'HOME',\n 'USER',\n 'USERNAME',\n 'LOGNAME',\n 'SHELL',\n 'LANG',\n 'LC_ALL',\n 'LC_CTYPE',\n 'TERM',\n 'TZ',\n 'TMPDIR',\n 'TEMP',\n 'TMP',\n 'PWD',\n 'OLDPWD',\n 'COMSPEC',\n 'SYSTEMROOT',\n 'SYSTEMDRIVE',\n 'WINDIR',\n 'PROGRAMFILES',\n 'PROGRAMFILES(X86)',\n 'PROGRAMDATA',\n 'APPDATA',\n 'LOCALAPPDATA',\n 'USERPROFILE',\n 'PUBLIC',\n 'PATHEXT',\n]);\n\n// Substring match against env-var names (case-insensitive). Bias toward\n// false-positives — a missing var is recoverable, an exfiltrated key is not.\n// Only consulted for vars NOT on the curated allowlist; PWD/PASSWD-style\n// false positives there are avoided by checking allowlist first.\nconst SECRET_NAME_PARTS = [\n 'TOKEN',\n 'SECRET',\n 'PASSWORD',\n 'PASSWD',\n 'AUTH',\n 'CRED',\n 'BEARER',\n 'COOKIE',\n 'PRIVATE',\n];\n\nfunction looksSecret(name: string): boolean {\n const upper = name.toUpperCase();\n for (const p of SECRET_NAME_PARTS) {\n if (upper.includes(p)) return true;\n }\n // KEY is tricky — PUBLIC_KEY is fine to forward but most _KEY vars are\n // secrets. Require word boundary so KEYBOARD_LAYOUT etc. are not flagged.\n if (/(?:^|_)KEY(?:$|_|S$)/i.test(upper)) return true;\n if (/API[_-]?KEY/i.test(upper)) return true;\n if (/ACCESS[_-]?KEY/i.test(upper)) return true;\n if (/SESSION[_-]?ID/i.test(upper) === false && /SESSION/i.test(upper)) {\n // SESSION_ID is metadata (we set our own); other SESSION_* often holds\n // session cookies. Be conservative.\n return true;\n }\n return false;\n}\n\n/**\n * Value-side secret detection (WS-01). The name-based `looksSecret` filter\n * misses connection-string variables whose NAME is innocuous but whose VALUE\n * embeds a password — e.g. `DATABASE_URL=postgres://user:pass@host`,\n * `REDIS_URL=redis://:pass@host`, `MONGO_URI`, `AMQP_URL`, `*_DSN`. Forwarding\n * these to a child (bash/exec/MCP server) leaks the embedded credential.\n *\n * Matches a URI userinfo component that contains a password, i.e.\n * `scheme://[user]:<password>@host`. Deliberately precise: a credential-free\n * URL (`https://api.example.com`, `https://user@host` with no password) is NOT\n * matched, so non-secret `*_URL` knobs (registries, endpoints) still forward.\n */\nfunction valueHasEmbeddedCredential(value: string): boolean {\n // scheme:// then optional user, a ':' , a non-empty password, then '@'.\n // Userinfo chars stop at '/', whitespace, ':' (separator) and '@'.\n return /\\b[a-z][a-z0-9+.-]*:\\/\\/[^/\\s:@]*:[^/\\s@]+@/i.test(value);\n}\n\n/**\n * Code-injection directives that turn `NODE_OPTIONS` into an RCE channel by\n * preloading an arbitrary module into every node child process (WS-02).\n */\nconst NODE_OPTIONS_INJECTION_FLAG =\n /^(?:--require|-r|--import|--loader|--experimental-loader)$/;\nconst NODE_OPTIONS_INJECTION_FLAG_EQ =\n /^(?:--require|-r|--import|--loader|--experimental-loader)=/;\n\n/**\n * Strip module-preload directives from a `NODE_OPTIONS` value while preserving\n * benign flags (`--no-warnings`, `--max-old-space-size=…`, etc.). Handles both\n * the `--require=./x.js` and space-separated `--require ./x.js` forms. Returns\n * the sanitized string (possibly empty).\n */\nexport function sanitizeNodeOptions(value: string): string {\n const tokens = value.split(/\\s+/).filter(Boolean);\n const kept: string[] = [];\n for (let i = 0; i < tokens.length; i++) {\n const tok = tokens[i] as string;\n if (NODE_OPTIONS_INJECTION_FLAG_EQ.test(tok)) continue; // --require=./x\n if (NODE_OPTIONS_INJECTION_FLAG.test(tok)) {\n i++; // also drop the following path token (--require ./x)\n continue;\n }\n kept.push(tok);\n }\n return kept.join(' ');\n}\n\nexport interface BuildChildEnvOptions {\n /** Session ID to inject as WRONGSTACK_SESSION_ID. */\n sessionId?: string | undefined;\n /** Additional env vars to merge (takes priority over filtered parent env). */\n extra?: NodeJS.ProcessEnv | undefined;\n}\n\n/**\n * Build a filtered child-process environment suitable for bash, exec, and\n * MCP server subprocesses. Strips API keys, tokens, and other credentials\n * while preserving system/tooling variables.\n */\nexport function buildChildEnv(optsOrSessionId?: BuildChildEnvOptions | string): NodeJS.ProcessEnv {\n const opts: BuildChildEnvOptions =\n typeof optsOrSessionId === 'string'\n ? { sessionId: optsOrSessionId }\n : (optsOrSessionId ?? {});\n\n // WRONGSTACK_CHILD_ENV_PASSTHROUGH may NOT be set via config file.\n // It is a privileged override that opt-outs the entire credential filter\n // and must only be set by the operator's shell environment (real env var,\n // not something a config file injects into process.env). Config-file\n // sources do NOT go through process.env — only the actual shell environment\n // does — so checking Object.prototype.hasOwnProperty.call(process.env, ...)\n // is sufficient to exclude config-driven values.\n const hasOwn = Object.hasOwn(process.env, 'WRONGSTACK_CHILD_ENV_PASSTHROUGH');\n const legacyHasOwn = Object.hasOwn(process.env, 'WRONGSTACK_BASH_ENV_PASSTHROUGH');\n const passthrough = (hasOwn && process.env['WRONGSTACK_CHILD_ENV_PASSTHROUGH'] === '1')\n || (legacyHasOwn && process.env['WRONGSTACK_BASH_ENV_PASSTHROUGH'] === '1');\n if (passthrough && !process.env['CI']) {\n console.warn(\n '[agent] WARNING: WRONGSTACK_*_ENV_PASSTHROUGH=1 is active —\\n' +\n ' all parent env vars (including API keys) forwarded to child processes.\\n' +\n ' Do not use on shared or multi-tenant systems.'\n );\n }\n const out: NodeJS.ProcessEnv = {};\n\n // The CLI entry defaults NODE_ENV=production (so React/Ink resolve their\n // production builds — see cli-main) and marks the injection with this\n // flag. The injected value must NOT reach children: NODE_ENV=production\n // makes `pnpm install` skip devDependencies and flips test-runner\n // behavior. Strip both vars whenever the flag says wrongstack set them —\n // a NODE_ENV genuinely exported by the operator's shell (flag absent)\n // is forwarded unchanged. Applies in passthrough mode too: passthrough\n // means \"the operator's real environment\", which this value is not.\n const nodeEnvDefaulted = process.env['WRONGSTACK_NODE_ENV_DEFAULTED'] === '1';\n\n for (const [k, v] of Object.entries(process.env)) {\n if (v === undefined) continue;\n if (nodeEnvDefaulted && (k === 'NODE_ENV' || k === 'WRONGSTACK_NODE_ENV_DEFAULTED')) continue;\n if (passthrough) {\n out[k] = v;\n continue;\n }\n const upper = k.toUpperCase();\n // 0. Strip any value with an embedded URI credential (user:pass@host),\n // regardless of the variable name (WS-01). Applied before the allowlist\n // so even a \"system\" name carrying a connection string is caught.\n if (valueHasEmbeddedCredential(v)) continue;\n // 1. Forward names on the explicit allowlist — these are well-known\n // non-secret system variables (PATH, HOME, LANG, ...).\n if (ALLOWED_KEYS.has(upper)) {\n out[k] = v;\n continue;\n }\n // 2. Strip anything that looks like a secret.\n if (looksSecret(upper)) continue;\n // NODE_OPTIONS is forwarded (builds rely on flags like --no-warnings) but\n // module-preload directives (--require/--import/--loader) are stripped —\n // they would let a parent-set NODE_OPTIONS inject code into every node\n // child (WS-02 defense-in-depth).\n if (upper === 'NODE_OPTIONS') {\n const sanitized = sanitizeNodeOptions(v);\n if (sanitized) out[k] = sanitized;\n continue;\n }\n // 3. Forward tooling-prefixed vars that builds commonly need, unless\n // they already failed the secret check above.\n if (\n upper.startsWith('NODE_') ||\n upper.startsWith('NPM_') ||\n upper.startsWith('PNPM_') ||\n upper.startsWith('YARN_') ||\n upper.startsWith('GIT_') ||\n upper.startsWith('CI') ||\n upper.startsWith('XDG_') ||\n // Our own non-secret knobs (WRONGSTACK_HOME, WRONGSTACK_SESSION_ID, …).\n // Secrets never live in WRONGSTACK_* env vars (they're in the encrypted\n // vault). Forwarding keeps child wstack processes — e.g. ones spawned\n // by the test suite — inside the same redirected global root.\n upper.startsWith('WRONGSTACK_') ||\n upper === 'EDITOR' ||\n upper === 'VISUAL' ||\n upper === 'PAGER'\n ) {\n out[k] = v;\n }\n }\n\n // Merge explicit extras AFTER filtering. Callers MUST treat `opts.extra`\n // as a small, user-authored allowlist (e.g. MCP server tokens, LSP env\n // overrides from config). Do NOT pass `process.env` or any object derived\n // from it — that would defeat the parent-env scrub above. The secret\n // filter is intentionally skipped here so legitimate secret-bearing\n // tokens the user explicitly configured can still reach the child.\n if (opts.extra) {\n Object.assign(out, opts.extra);\n }\n\n if (opts.sessionId) out['WRONGSTACK_SESSION_ID'] = opts.sessionId;\n return out;\n}\n","/**\n * Converts an unknown error value to a human-readable string.\n * Used in 40+ files across the codebase to normalize error messaging.\n */\nexport function toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","/** Assert a value is neither null nor undefined. Throws if it is.\n * Useful after optional chaining and indexed access when the\n * control flow guarantees the value exists but TypeScript can't\n * prove it (e.g. after a check on a related field). */\nexport function expectDefined<T>(value: T | null | undefined, label?: string): T {\n if (value === null || value === undefined) {\n const err = new Error(label ? `Expected ${label} to be defined` : 'Expected value to be defined');\n err.name = 'ExpectDefinedError';\n throw err;\n }\n return value;\n}\n","/**\n * String utilities shared across the WrongStack codebase.\n */\n\n/**\n * Truncate a string to at most `max` characters, appending an ellipsis if it\n * was longer. Returns the original string unchanged when it fits.\n */\nexport function truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n","import { toErrorMessage } from '../utils/index.js';\n\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\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // SDD (Spec-Driven Development)\n SDD_VALIDATION_FAILED: 'SDD_VALIDATION_FAILED',\n SDD_PARSE_FAILED: 'SDD_PARSE_FAILED',\n SDD_INVALID_STATE: 'SDD_INVALID_STATE',\n SDD_NOT_READY: 'SDD_NOT_READY',\n // General\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n PARSE_FAILED: 'PARSE_FAILED',\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'sdd'\n | 'container'\n | 'fs'\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> | undefined;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity | undefined;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\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 | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\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> | undefined;\n cause?: unknown | undefined;\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> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.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 | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.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'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = toErrorMessage(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.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 | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.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/**\n * SDD (Spec-Driven Development) errors — spec validation, parsing, and\n * state machine violations in the AISpecBuilder, TaskFlow, and TaskTracker.\n */\nexport class SddError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'SDD_VALIDATION_FAILED' | 'SDD_PARSE_FAILED' | 'SDD_INVALID_STATE' | 'SDD_NOT_READY'\n >;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'sdd',\n severity: opts.code === ERROR_CODES.SDD_PARSE_FAILED ? 'warning' : 'error',\n recoverable: opts.code === ERROR_CODES.SDD_NOT_READY,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'SddError';\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n/**\n * HTTP fetch error — thrown when a network request returns a non-OK status.\n * Carries the response status so {@link classifyToolError} can branch on it\n * (429 → transient, 404 → not_found, 401 → permission) without duck-typing\n * the error via `'response' in err`.\n *\n * P3 #18 (before-release.md): the previous `'response' in err` check caught\n * any Error with a `response` property, including custom errors, proxy\n * objects, or mocked errors in tests. `instanceof FetchError` is reliable.\n *\n * Tools and providers that make HTTP requests and need the executor to\n * classify their failures should throw `new FetchError({ status, message })`\n * instead of a bare `Error` with an ad-hoc `response` field.\n */\nexport class FetchError extends WrongStackError {\n readonly status: number;\n\n constructor(opts: {\n message: string;\n status: number;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: opts.status === 429 || opts.status >= 500,\n context: { status: opts.status, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FetchError';\n this.status = opts.status;\n }\n}\n\n/**\n * Tool input validation error — thrown when a tool's input fails a validation\n * check that the JSON Schema cannot express (e.g. `old_string === new_string`\n * in edit, or a cross-field invariant). Use this instead of a bare\n * `throw new Error('...validation...')` so {@link classifyToolError} can\n * match on `instanceof` rather than a locale-dependent message substring.\n *\n * P2 #6 (before-release.md): the previous `err.message.includes('validation')`\n * check misclassified any error whose message happened to contain \"validation\"\n * (e.g. a third-party \"input validation timeout\") as a VALIDATION error.\n *\n * Named `ToolValidationError` (not `ValidationError`) to avoid colliding with\n * the existing `ValidationError` interface exported by json-schema-validate.ts\n * (a validation-result shape, not an Error subclass).\n */\nexport class ToolValidationError extends WrongStackError {\n constructor(opts: {\n message: string;\n /** Field path or tool name that failed validation, for diagnostics. */\n field?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { field: opts.field, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolValidationError';\n }\n}\n\n/**\n * Response / payload parse error — thrown when an upstream HTTP response,\n * file, or data structure is well-formed at the transport layer (HTTP 200,\n * valid JSON) but is missing required fields or has an unexpected shape.\n *\n * Distinct from `ConfigError(CONFIG_PARSE_FAILED)` (which is specifically\n * for config-file parsing) and `FetchError` (which covers HTTP non-OK\n * responses). `ParseError` fills the gap: the request succeeded but the\n * response body couldn't be interpreted.\n *\n * Common sites: OAuth token responses missing `access_token`, device-code\n * responses missing `device_code`, registry responses with unexpected\n * schemas.\n */\nexport class ParseError extends WrongStackError {\n readonly source?: string | undefined;\n\n constructor(opts: {\n message: string;\n /**\n * What was being parsed — e.g. `'oauth-token-response'`,\n * `'device-code-response'`. Lets consumers distinguish parse failures\n * from different upstream APIs without parsing the message.\n */\n source?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.PARSE_FAILED,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { source: opts.source, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ParseError';\n this.source = opts.source;\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\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n\nexport function isToolValidationError(err: unknown): err is ToolValidationError {\n return err instanceof ToolValidationError;\n}\n\nexport function isFetchError(err: unknown): err is FetchError {\n return err instanceof FetchError;\n}\n\nexport function isParseError(err: unknown): err is ParseError {\n return err instanceof ParseError;\n}\n\nexport function isSddError(err: unknown): err is SddError {\n return err instanceof SddError;\n}\n","import type {\n SpecAnalysis,\n SpecRequirement,\n SpecSection,\n SpecValidationResult,\n Specification,\n} from '../types/spec.js';\n\nexport class SpecParser {\n parse(content: string): Specification {\n const lines = content.split('\\n');\n const sections = this.extractSections(lines);\n const requirements = this.extractRequirements(lines);\n const now = Date.now();\n\n return {\n id: crypto.randomUUID(),\n title: this.extractTitle(lines),\n version: this.extractVersion(lines),\n status: 'draft',\n overview: this.extractOverview(lines),\n sections,\n requirements,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n private extractTitle(lines: string[]): string {\n for (const line of lines) {\n const m = /^#\\s+(.+)/.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return 'Untitled Specification';\n }\n\n private extractVersion(lines: string[]): string {\n for (const line of lines) {\n const m = /version[:\\s]+(\\d+\\.\\d+\\.\\d+)/i.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return '0.0.1';\n }\n\n private extractOverview(lines: string[]): string {\n const overviewLines: string[] = [];\n let inOverview = false;\n let foundHeading = false;\n\n for (const line of lines) {\n if (/^##\\s+Overview/i.test(line.trim())) {\n inOverview = true;\n foundHeading = true;\n continue;\n }\n if (foundHeading && /^##\\s+/.test(line.trim())) break;\n if (inOverview) overviewLines.push(line);\n }\n\n return overviewLines.join('\\n').trim() || 'No overview provided';\n }\n\n private extractSections(lines: string[]): SpecSection[] {\n const sections: SpecSection[] = [];\n let currentSection: Partial<SpecSection> | null = null;\n let currentLines: string[] = [];\n let depth = 1;\n\n for (const line of lines) {\n const h2 = /^##\\s+(.+)/.exec(line.trim());\n const h3 = /^###\\s+(.+)/.exec(line.trim());\n\n if (h2) {\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n currentSection = { title: h2[1] ?? 'Unknown' };\n currentLines = [];\n depth = 2;\n continue;\n }\n\n if (h3) {\n currentLines.push(line);\n continue;\n }\n\n if (currentSection) {\n currentLines.push(line);\n }\n }\n\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n\n return sections;\n }\n\n private extractRequirements(lines: string[]): SpecRequirement[] {\n const requirements: SpecRequirement[] = [];\n let inRequirements = false;\n let idCounter = 0;\n\n for (const line of lines) {\n if (/^##\\s+Requirements/i.test(line.trim())) {\n inRequirements = true;\n continue;\n }\n if (inRequirements && /^##\\s+/.test(line.trim())) break;\n\n if (inRequirements) {\n const req = this.parseRequirementLine(line, `REQ-${++idCounter}`);\n if (req) requirements.push(req);\n }\n }\n\n return requirements;\n }\n\n private parseRequirementLine(line: string, id: string): SpecRequirement | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return null;\n\n const lower = trimmed.toLowerCase();\n const types: SpecRequirement['type'][] = [\n 'functional',\n 'non-functional',\n 'security',\n 'performance',\n 'ux',\n ];\n let type: SpecRequirement['type'] = 'functional';\n for (const t of types) {\n if (lower.includes(`[${t}]`)) type = t;\n }\n\n let priority: SpecRequirement['priority'] = 'medium';\n if (trimmed.includes('[critical]') || trimmed.includes('[prio:high]')) {\n priority = 'critical';\n } else if (trimmed.includes('[high]')) {\n priority = 'high';\n } else if (trimmed.includes('[low]')) {\n priority = 'low';\n }\n\n return {\n id,\n type,\n priority,\n description: trimmed.replace(/\\[[^\\]]+\\]/g, '').trim(),\n acceptanceCriteria: [],\n };\n }\n\n private mapSectionType(title: string): SpecSection['type'] {\n const t = title.toLowerCase();\n if (t.includes('overview')) return 'overview';\n if (t.includes('requirement')) return 'requirements';\n if (t.includes('architect')) return 'architecture';\n if (t.includes('api')) return 'api';\n if (t.includes('data')) return 'data';\n if (t.includes('security')) return 'security';\n if (t.includes('acceptance')) return 'acceptance';\n return 'overview';\n }\n\n analyze(spec: Specification): SpecAnalysis {\n const gaps: string[] = [];\n const suggestions: string[] = [];\n const risks: SpecAnalysis['risks'] = [];\n\n // Check completeness\n const hasOverview = spec.sections.some((s) => s.type === 'overview');\n const hasRequirements = spec.sections.some((s) => s.type === 'requirements');\n const hasAcceptance = spec.sections.some((s) => s.type === 'acceptance');\n\n if (!hasOverview) gaps.push('Missing Overview section');\n if (!hasRequirements) gaps.push('Missing Requirements section');\n if (!hasAcceptance) gaps.push('Missing Acceptance Criteria section');\n\n if (spec.requirements.length === 0) {\n gaps.push('No requirements defined');\n suggestions.push('Add specific functional and non-functional requirements');\n }\n\n const unverifiedReqs = spec.requirements.filter((r) => r.acceptanceCriteria.length === 0);\n if (unverifiedReqs.length > 0) {\n gaps.push(`${unverifiedReqs.length} requirements without acceptance criteria`);\n suggestions.push('Define clear acceptance criteria for each requirement');\n }\n\n const criticalUnresolved = spec.requirements.filter(\n (r) => r.priority === 'critical' && r.blockedBy && r.blockedBy.length > 0,\n );\n for (const req of criticalUnresolved) {\n risks.push({\n requirement: req.id,\n risk: `Critical requirement blocked by ${req.blockedBy?.length} other requirements`,\n severity: 'high',\n });\n }\n\n const completeness = Math.round(\n (((hasOverview ? 1 : 0) +\n (hasRequirements ? 1 : 0) +\n (hasAcceptance ? 1 : 0) +\n (spec.requirements.length > 0 ? 1 : 0) +\n (spec.sections.length > 3 ? 1 : 0)) /\n 5) *\n 100,\n );\n\n return {\n specId: spec.id,\n completeness,\n coverage: {\n requirements: spec.requirements.length,\n apiEndpoints: spec.apiEndpoints?.length ?? 0,\n edgeCases: 0,\n errorHandling: 0,\n },\n gaps,\n risks,\n suggestions,\n };\n }\n\n validate(spec: Specification): SpecValidationResult {\n const errors: SpecValidationResult['errors'] = [];\n const warnings: SpecValidationResult['warnings'] = [];\n\n if (!spec.title.trim()) {\n errors.push({ path: 'title', message: 'Title is required' });\n }\n\n if (!spec.version.trim()) {\n errors.push({ path: 'version', message: 'Version is required' });\n }\n\n for (const req of spec.requirements) {\n if (!req.description.trim()) {\n errors.push({ path: `requirement.${req.id}`, message: 'Requirement description is empty' });\n }\n if (req.acceptanceCriteria.length === 0) {\n warnings.push({ path: `requirement.${req.id}`, message: 'No acceptance criteria defined' });\n }\n }\n\n const reqIds = new Set(spec.requirements.map((r) => r.id));\n const blockedByIds = new Set(spec.requirements.flatMap((r) => r.blockedBy ?? []));\n for (const id of blockedByIds) {\n if (!reqIds.has(id)) {\n errors.push({\n path: 'requirements',\n message: `BlockedBy references non-existent requirement: ${id}`,\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n}\n","import type { SpecRequirement, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode, TaskPriority, TaskType } from '../types/task-graph.js';\nimport type { TaskStore, TaskTracker } from './task-tracker.js';\n\nexport interface TaskGeneratorOptions {\n taskTracker: TaskTracker;\n /**\n * Opt-in (default off): derive each task's completion-gate\n * `metadata.verificationCommand` from an acceptance criterion that carries a\n * runnable-command marker (`$ <cmd>`, or `run:`/`verify:`/`cmd:` prefix). Off\n * by default so the common case stays fast — auto-running a check per task is\n * exactly the slowness the robustness initiative set out to avoid; enable it\n * explicitly (the CLI gates it behind WRONGSTACK_SDD_VERIFY_FROM_ACCEPTANCE).\n */\n verificationFromAcceptance?: boolean | undefined;\n}\n\n/**\n * Pull a runnable verification command out of a requirement's acceptance\n * criteria. A criterion qualifies only when it carries an explicit marker —\n * `$ <cmd>` (shell-prompt style) or a `run:` / `verify:` / `cmd:` prefix — so\n * free-text criteria are never mistaken for commands. Returns the first match.\n */\nexport function extractVerificationCommand(criteria: readonly string[]): string | undefined {\n const marker = /^\\s*(?:\\$\\s+|(?:run|verify|cmd)\\s*:\\s*)(.+\\S)\\s*$/i;\n for (const c of criteria) {\n const m = marker.exec(c);\n if (m?.[1]) return m[1].trim();\n }\n return undefined;\n}\n\nexport interface GeneratedTask {\n specRequirementId?: string | undefined;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n estimateHours?: number | undefined;\n tags?: string[] | undefined;\n}\n\nexport class TaskGenerator {\n constructor(private readonly opts: TaskGeneratorOptions) {}\n\n async generateFromSpec(spec: Specification): Promise<TaskGraph> {\n const graph = await this.opts.taskTracker.createGraph(spec.id, spec.title);\n\n // Track feature/implementation node ids so the deterministic fallback still\n // produces a real DAG: tests depend on the features they cover, docs depend\n // on everything. Without this the generated graph is edgeless and every task\n // looks independently runnable (the naive slot-filling the user rejected).\n const featureIds: string[] = [];\n\n const overview = spec.sections.find((s) => s.type === 'overview');\n if (overview) {\n featureIds.push(\n this.opts.taskTracker.addNode({\n title: `Implement ${spec.title}`,\n description: overview.content,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n }).id,\n );\n }\n\n // Group requirements by priority in a single pass, then emit in priority order.\n const byPriority: Record<TaskPriority, SpecRequirement[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n for (const req of spec.requirements) {\n const bucket = byPriority[req.priority] ?? byPriority.medium;\n bucket.push(req);\n }\n\n const order: TaskPriority[] = ['critical', 'high', 'medium', 'low'];\n for (const p of order) {\n for (const req of byPriority[p]) {\n featureIds.push(this.opts.taskTracker.addNode(this.createTaskFromRequirement(req)).id);\n }\n }\n\n // API tasks\n if (spec.apiEndpoints && spec.apiEndpoints.length > 0) {\n const apiParent = this.opts.taskTracker.addNode({\n title: 'API Implementation',\n description: `Implement ${spec.apiEndpoints.length} API endpoints`,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n });\n featureIds.push(apiParent.id);\n\n for (const endpoint of spec.apiEndpoints) {\n const task = this.createTaskFromEndpoint(endpoint);\n featureIds.push(\n this.opts.taskTracker.addNode({\n ...task,\n parentId: apiParent.id,\n }).id,\n );\n }\n }\n\n // Test tasks — depend on every feature so they run after implementation.\n const testId = this.opts.taskTracker.addNode({\n title: 'Write Tests',\n description: 'Comprehensive test coverage for all features',\n type: 'test',\n priority: 'high',\n status: 'pending',\n }).id;\n for (const f of featureIds) this.opts.taskTracker.addDependency(f, testId);\n\n // Documentation tasks — depend on features + tests (last in the chain).\n const docsId = this.opts.taskTracker.addNode({\n title: 'Update Documentation',\n description: 'Update docs for new features',\n type: 'docs',\n priority: 'medium',\n status: 'pending',\n }).id;\n for (const f of [...featureIds, testId]) this.opts.taskTracker.addDependency(f, docsId);\n\n return graph;\n }\n\n private createTaskFromRequirement(\n req: SpecRequirement,\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n const verificationCommand = this.opts.verificationFromAcceptance\n ? extractVerificationCommand(req.acceptanceCriteria)\n : undefined;\n return {\n title: req.description,\n description: this.buildDescription(req),\n type: this.mapRequirementType(req.type),\n priority: req.priority,\n status: 'pending',\n specRequirementId: req.id,\n tags: [req.type, req.priority],\n estimateHours: this.estimateHours(req),\n ...(verificationCommand ? { metadata: { verificationCommand } } : {}),\n };\n }\n\n private createTaskFromEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n title: `${endpoint.method} ${endpoint.path}`,\n description: endpoint.description,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n tags: [endpoint.method],\n estimateHours: this.estimateForEndpoint(endpoint),\n };\n }\n\n private buildDescription(req: SpecRequirement): string {\n const lines = [req.description, '', '**Type:** ' + req.type, '**Priority:** ' + req.priority];\n\n if (req.acceptanceCriteria.length > 0) {\n lines.push('', '**Acceptance Criteria:**');\n for (const criterion of req.acceptanceCriteria) {\n lines.push(`- ${criterion}`);\n }\n }\n\n if (req.blockedBy && req.blockedBy.length > 0) {\n lines.push('', `**Blocked by:** ${req.blockedBy.join(', ')}`);\n }\n\n return lines.join('\\n');\n }\n\n private mapRequirementType(type: SpecRequirement['type']): TaskType {\n switch (type) {\n case 'functional':\n return 'feature';\n case 'non-functional':\n return 'feature';\n case 'security':\n return 'feature';\n case 'performance':\n return 'feature';\n case 'ux':\n return 'feature';\n default:\n return 'feature';\n }\n }\n\n private estimateHours(req: SpecRequirement): number {\n switch (req.priority) {\n case 'critical':\n return 8;\n case 'high':\n return 4;\n case 'medium':\n return 2;\n case 'low':\n return 1;\n default:\n return 2;\n }\n }\n\n private estimateForEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): number {\n let hours = 2;\n if (endpoint.auth) hours += 1;\n if (endpoint.request) hours += 1;\n return hours;\n }\n\n async generateSubtasks(parentTaskId: string, spec: Specification): Promise<void> {\n const reqId = this.opts.taskTracker.getNode(parentTaskId)?.specRequirementId;\n if (!reqId) return;\n\n const req = spec.requirements.find((r) => r.id === reqId);\n if (!req) return;\n\n if (req.acceptanceCriteria.length > 0) {\n for (const criterion of req.acceptanceCriteria) {\n this.opts.taskTracker.addNode({\n title: criterion,\n description: `Verify: ${criterion}`,\n type: 'test',\n priority: 'medium',\n status: 'pending',\n parentId: parentTaskId,\n });\n }\n }\n }\n}\n\nexport class DefaultTaskStore implements TaskStore {\n private graphs = new Map<string, TaskGraph>();\n\n async saveGraph(graph: TaskGraph): Promise<void> {\n this.graphs.set(graph.id, this.cloneGraph(graph));\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n const g = this.graphs.get(id);\n return g ? this.cloneGraph(g) : null;\n }\n\n async listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]> {\n return Array.from(this.graphs.values()).map((g) => ({\n id: g.id,\n title: g.title,\n updatedAt: g.updatedAt,\n }));\n }\n\n async deleteGraph(id: string): Promise<void> {\n this.graphs.delete(id);\n }\n\n private cloneGraph(g: TaskGraph): TaskGraph {\n return {\n ...g,\n nodes: new Map(g.nodes),\n edges: [...g.edges],\n rootNodes: [...g.rootNodes],\n };\n }\n}\n","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\r\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\r\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\r\n\r\nexport interface TaskNode {\r\n id: string;\r\n title: string;\r\n description: string;\r\n type: TaskType;\r\n priority: TaskPriority;\r\n status: TaskStatus;\r\n assignee?: string | undefined;\r\n estimateHours?: number | undefined;\r\n actualHours?: number | undefined;\r\n tags?: string[] | undefined;\r\n specRequirementId?: string | undefined;\r\n parentId?: string | undefined;\r\n children?: string[] | undefined;\r\n createdAt: number;\r\n updatedAt: number;\r\n startedAt?: number | undefined; // set when status → in_progress\r\n completedAt?: number | undefined;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface TaskEdge {\r\n id: string;\r\n from: string;\r\n to: string;\r\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\r\n weight?: number | undefined;\r\n}\r\n\r\nexport interface TaskGraph {\r\n id: string;\r\n specId: string;\r\n title: string;\r\n nodes: Map<string, TaskNode>;\r\n edges: TaskEdge[];\r\n rootNodes: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface TaskDependency {\r\n taskId: string;\r\n blockedBy: string[];\r\n blocking: string[];\r\n}\r\n\r\nexport interface TaskAssignment {\r\n taskId: string;\r\n assignee: string;\r\n assignedAt: number;\r\n}\r\n\r\nexport interface TaskProgress {\r\n total: number;\r\n pending: number;\r\n inProgress: number;\r\n blocked: number;\r\n failed: number;\r\n review: number;\r\n completed: number;\r\n percentComplete: number;\r\n estimatedHours: number;\r\n actualHours: number;\r\n}\r\n\r\nexport interface TaskFilter {\r\n status?: TaskStatus[] | undefined;\r\n priority?: TaskPriority[] | undefined;\r\n type?: TaskType[] | undefined;\r\n assignee?: string[] | undefined;\r\n tags?: string[] | undefined;\r\n specRequirementId?: string | undefined;\r\n}\r\n\r\nexport interface TaskSort {\r\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\r\n direction: 'asc' | 'desc';\r\n}\r\n\r\nexport interface CriticalPathResult {\r\n taskIds: string[];\r\n totalEstimateHours: number;\r\n bottleneckTasks: string[];\r\n}\r\n\r\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\r\n let completed = 0;\r\n let pending = 0;\r\n let inProgress = 0;\r\n let blocked = 0;\r\n let failed = 0;\r\n let review = 0;\r\n let estimatedHours = 0;\r\n let actualHours = 0;\r\n for (const n of graph.nodes.values()) {\r\n switch (n.status) {\r\n case 'completed':\r\n completed++;\r\n break;\r\n case 'pending':\r\n pending++;\r\n break;\r\n case 'in_progress':\r\n inProgress++;\r\n break;\r\n case 'blocked':\r\n blocked++;\r\n break;\r\n case 'failed':\r\n failed++;\r\n break;\r\n case 'review':\r\n review++;\r\n break;\r\n }\r\n estimatedHours += n.estimateHours ?? 0;\r\n actualHours += n.actualHours ?? 0;\r\n }\r\n const total = graph.nodes.size;\r\n\r\n return {\r\n total,\r\n pending,\r\n inProgress,\r\n blocked,\r\n failed,\r\n review,\r\n completed,\r\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\r\n estimatedHours,\r\n actualHours,\r\n };\r\n}\r\n\r\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\r\n const nodes = Array.from(graph.nodes.values());\r\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\r\n const bottleneckTasks = criticalNodes\r\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\r\n .map((n) => n.id);\r\n\r\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\r\n\r\n return {\r\n taskIds: criticalNodes.map((n) => n.id),\r\n totalEstimateHours,\r\n bottleneckTasks,\r\n };\r\n}\r\n\r\nexport function topologicalSort(graph: TaskGraph): string[] {\r\n const visited = new Set<string>();\r\n const inStack = new Set<string>();\r\n const result: string[] = [];\r\n\r\n function visit(id: string): void {\r\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\r\n if (inStack.has(id)) return;\r\n if (visited.has(id)) return;\r\n if (!graph.nodes.has(id)) return;\r\n\r\n visited.add(id);\r\n inStack.add(id);\r\n\r\n for (const edge of graph.edges) {\r\n if (edge.from === id) visit(edge.to);\r\n }\r\n\r\n inStack.delete(id);\r\n result.push(id);\r\n }\r\n\r\n for (const rootId of graph.rootNodes) {\r\n visit(rootId);\r\n }\r\n\r\n return result;\r\n}\r\n","import type {\n TaskFilter,\n TaskGraph,\n TaskNode,\n TaskProgress,\n TaskSort,\n} from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\nimport { SddError, ERROR_CODES } from '../types/errors.js';\nimport { toErrorMessage } from '../utils/error.js';\n\nexport interface TaskStore {\n saveGraph(graph: TaskGraph): Promise<void>;\n loadGraph(id: string): Promise<TaskGraph | null>;\n listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]>;\n deleteGraph(id: string): Promise<void>;\n}\n\nexport interface TaskTrackerOptions {\n store: TaskStore;\n /**\n * Called when an in-the-background persistence (`saveGraph`) rejects.\n * The synchronous TaskTracker methods (addNode/addEdge/updateNodeStatus)\n * fire-and-forget their writes; without this, a failing store silently\n * loses graph mutations. Defaults to a console.warn.\n */\n onPersistError?: (((err: unknown) => void)) | undefined;\n}\n\nexport interface TaskTransition {\n from: TaskNode['status'];\n to: TaskNode['status'];\n timestamp: number;\n reason?: string | undefined;\n}\n\n/** A change notification emitted to `TaskTracker.subscribe` listeners. */\nexport interface TaskTrackerChange {\n type: 'node_added' | 'node_updated' | 'status_changed' | 'node_removed';\n nodeId: string;\n /** For `node_removed` this is the node as it was just before deletion. */\n node: TaskNode;\n transition?: TaskTransition | undefined;\n}\n\nexport type TaskTrackerListener = (change: TaskTrackerChange) => void;\n\nexport class TaskTracker {\n private graph: TaskGraph | null = null;\n private transitions: TaskTransition[] = [];\n private listeners: TaskTrackerListener[] = [];\n\n constructor(private readonly opts: TaskTrackerOptions) {}\n\n /**\n * Subscribe to live task mutations (add / update / status change). Returns an\n * unsubscribe fn. This is the hook the board projector uses to stream a live\n * snapshot — the tracker was previously fire-and-forget with no observability.\n */\n subscribe(listener: TaskTrackerListener): () => void {\n this.listeners.push(listener);\n return () => {\n const i = this.listeners.indexOf(listener);\n if (i >= 0) this.listeners.splice(i, 1);\n };\n }\n\n private notifyChange(change: TaskTrackerChange): void {\n for (const l of this.listeners) {\n try {\n l(change);\n } catch {\n // A faulty listener must never break a tracker mutation.\n }\n }\n }\n\n /**\n * Attach an existing graph (used by PhaseOrchestrator to associate a tracker\n * with a phase's pre-built task graph without re-creating it).\n */\n setGraph(graph: TaskGraph): void {\n this.graph = graph;\n }\n\n async createGraph(specId: string, title: string): Promise<TaskGraph> {\n this.graph = {\n id: crypto.randomUUID(),\n specId,\n title,\n nodes: new Map(),\n edges: [],\n rootNodes: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n await this.opts.store.saveGraph(this.graph);\n return this.graph;\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n this.graph = await this.opts.store.loadGraph(id);\n return this.graph;\n }\n\n addNode(node: Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'>): TaskNode {\n if (!this.graph) throw new SddError({\n message: 'No graph loaded',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n\n const now = Date.now();\n const newNode: TaskNode = {\n ...node,\n id: crypto.randomUUID(),\n status: node.status ?? 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n this.graph.nodes.set(newNode.id, newNode);\n\n if (!node.parentId) {\n this.graph.rootNodes.push(newNode.id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n this.notifyChange({ type: 'node_added', nodeId: newNode.id, node: newNode });\n\n return newNode;\n }\n\n addEdge(from: string, to: string, type: TaskGraph['edges'][0]['type'] = 'depends_on'): void {\n if (!this.graph) throw new SddError({\n message: 'No graph loaded',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n\n this.graph.edges.push({\n id: crypto.randomUUID(),\n from,\n to,\n type,\n });\n this.graph.updatedAt = Date.now();\n this.persist();\n }\n\n /**\n * Declare that `taskId` depends on `depId` (a `depends_on` edge `depId → taskId`),\n * guarding against self-loops, duplicates, missing nodes, and cycles. Returns\n * true if the dependency now holds (added or already present), false if it was\n * rejected (would create a cycle / unknown node). This is the safe entry point\n * for wiring agent-declared `dependsOn` references into the graph.\n */\n addDependency(depId: string, taskId: string): boolean {\n if (!this.graph) return false;\n if (depId === taskId) return false;\n if (!this.graph.nodes.has(depId) || !this.graph.nodes.has(taskId)) return false;\n // Already a blocker — idempotent success.\n if (this.getBlockers(taskId).includes(depId)) return true;\n // Cycle guard: if `depId` already (transitively) depends on `taskId`, adding\n // `taskId → depId` would close a loop. Reject rather than deadlock the run.\n if (this.dependsOnTransitively(depId, taskId, new Set())) return false;\n this.addEdge(depId, taskId, 'depends_on');\n return true;\n }\n\n /** True when `taskId` transitively depends on `targetId` (follows depends_on blockers). */\n private dependsOnTransitively(taskId: string, targetId: string, seen: Set<string>): boolean {\n if (taskId === targetId) return true;\n if (seen.has(taskId)) return false;\n seen.add(taskId);\n for (const blocker of this.getBlockers(taskId)) {\n if (this.dependsOnTransitively(blocker, targetId, seen)) return true;\n }\n return false;\n }\n\n /**\n * Merge `patch` into a node's `metadata` (used for per-task model/provider/\n * fallback assignment and the cancel marker). Persists + notifies as a node\n * update. No-op if the node is missing.\n */\n patchMetadata(id: string, patch: Record<string, unknown>): void {\n if (!this.graph) return;\n const node = this.graph.nodes.get(id);\n if (!node) return;\n node.metadata = { ...node.metadata, ...patch };\n node.updatedAt = Date.now();\n this.graph.updatedAt = node.updatedAt;\n this.persist();\n this.notifyChange({ type: 'node_updated', nodeId: id, node });\n }\n\n /**\n * Remove a node and every edge touching it. Intended for deleting a task that\n * has not started yet — callers must gate on status (do not remove a running\n * task). Dependents simply lose this blocker (re-evaluated by `canStart`).\n * Returns true if a node was removed.\n */\n removeNode(id: string): boolean {\n if (!this.graph) return false;\n const node = this.graph.nodes.get(id);\n if (!node) return false;\n this.graph.nodes.delete(id);\n this.graph.edges = this.graph.edges.filter((e) => e.from !== id && e.to !== id);\n this.graph.rootNodes = this.graph.rootNodes.filter((r) => r !== id);\n // Detach from any parent's children list.\n for (const n of this.graph.nodes.values()) {\n if (n.children?.includes(id)) n.children = n.children.filter((c) => c !== id);\n }\n this.graph.updatedAt = Date.now();\n this.persist();\n this.notifyChange({ type: 'node_removed', nodeId: id, node });\n return true;\n }\n\n updateNodeStatus(id: string, status: TaskNode['status'], reason?: string): void {\n if (!this.graph) throw new SddError({\n message: 'No graph loaded',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n\n const node = this.graph.nodes.get(id);\n if (!node) throw new SddError({\n message: `Node ${id} not found`,\n code: ERROR_CODES.SDD_NOT_READY,\n context: { nodeId: id },\n });\n\n const from = node.status;\n const now = Date.now();\n node.status = status;\n node.updatedAt = now;\n\n if (status === 'completed') {\n node.completedAt = now;\n node.startedAt = node.startedAt ?? now; // ensure startedAt is set\n }\n if (status === 'in_progress') {\n node.startedAt = now;\n }\n\n this.transitions.push({ from, to: status, timestamp: now, reason });\n\n // Auto-unblock dependents\n if (status === 'completed') {\n this.unblockDependents(id);\n }\n\n // Auto-block blockers\n if (status === 'in_progress') {\n this.checkAndBlockIfNeeded(id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n this.notifyChange({\n type: 'status_changed',\n nodeId: id,\n node,\n transition: { from, to: status, timestamp: now, reason },\n });\n }\n\n updateNode(id: string, patch: Partial<Pick<TaskNode, 'title' | 'description' | 'priority' | 'estimateHours' | 'tags' | 'assignee'>>): void {\n if (!this.graph) throw new SddError({\n message: 'No graph loaded',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n\n const node = this.graph.nodes.get(id);\n if (!node) throw new SddError({\n message: `Node ${id} not found`,\n code: ERROR_CODES.SDD_NOT_READY,\n context: { nodeId: id },\n });\n\n if (patch.title !== undefined) node.title = patch.title;\n if (patch.description !== undefined) node.description = patch.description;\n if (patch.priority !== undefined) node.priority = patch.priority;\n if (patch.estimateHours !== undefined) node.estimateHours = patch.estimateHours;\n if (patch.tags !== undefined) node.tags = patch.tags;\n if (patch.assignee !== undefined) node.assignee = patch.assignee;\n node.updatedAt = Date.now();\n this.graph.updatedAt = node.updatedAt;\n this.persist();\n this.notifyChange({ type: 'node_updated', nodeId: id, node });\n }\n\n getNode(id: string): TaskNode | undefined {\n return this.graph?.nodes.get(id);\n }\n\n getAllNodes(filter?: TaskFilter, sort?: TaskSort): TaskNode[] {\n if (!this.graph) return [];\n\n let nodes = Array.from(this.graph.nodes.values());\n\n if (filter) {\n nodes = nodes.filter((n) => {\n if (filter.status?.length && !filter.status.includes(n.status)) return false;\n if (filter.priority?.length && !filter.priority.includes(n.priority)) return false;\n if (filter.type?.length && !filter.type.includes(n.type)) return false;\n if (filter.assignee?.length && n.assignee && !filter.assignee.includes(n.assignee))\n return false;\n if (filter.tags?.length && n.tags && !n.tags.some((t) => filter.tags?.includes(t)))\n return false;\n if (filter.specRequirementId && n.specRequirementId !== filter.specRequirementId)\n return false;\n return true;\n });\n }\n\n if (sort) {\n nodes.sort((a, b) => {\n const cmp = compareByField(a, b, sort.field);\n return sort.direction === 'asc' ? cmp : -cmp;\n });\n }\n\n return nodes;\n }\n\n getChildren(parentId: string): TaskNode[] {\n if (!this.graph) return [];\n return Array.from(this.graph.nodes.values()).filter((n) => n.parentId === parentId);\n }\n\n getDependents(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.from === taskId && e.type === 'depends_on')\n .map((e) => e.to);\n }\n\n getBlockers(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.to === taskId && e.type === 'depends_on')\n .map((e) => e.from);\n }\n\n canStart(taskId: string): boolean {\n const blockers = this.getBlockers(taskId);\n return blockers.every((id) => {\n const node = this.graph?.nodes.get(id);\n // A task can start when all blockers are either completed or failed.\n // Failed blockers should not permanently deadlock dependent tasks.\n return node?.status === 'completed' || node?.status === 'failed';\n });\n }\n\n getProgress(): TaskProgress {\n if (!this.graph) {\n return {\n total: 0,\n pending: 0,\n inProgress: 0,\n blocked: 0,\n failed: 0,\n review: 0,\n completed: 0,\n percentComplete: 0,\n estimatedHours: 0,\n actualHours: 0,\n };\n }\n return computeTaskProgress(this.graph);\n }\n\n getTransitions(_taskId?: string): TaskTransition[] {\n return [...this.transitions];\n }\n\n private unblockDependents(completedId: string): void {\n if (!this.graph) return;\n const dependents = this.getDependents(completedId);\n for (const depId of dependents) {\n const dep = this.graph.nodes.get(depId);\n if (dep?.status === 'blocked') {\n // Check if all blockers are now completed\n const remainingBlockers = this.getBlockers(depId);\n const allUnblocked = remainingBlockers.every((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status === 'completed' || blocker?.status === 'failed';\n });\n if (allUnblocked) {\n dep.status = 'pending';\n dep.updatedAt = Date.now();\n }\n }\n }\n }\n\n private checkAndBlockIfNeeded(taskId: string): void {\n if (!this.graph) return;\n const blockers = this.getBlockers(taskId);\n const someBlocked = blockers.some((id) => {\n const blocker = this.graph?.nodes.get(id);\n // A task is only blocked by incomplete blockers that haven't failed.\n // Failed tasks should not block their dependents.\n return blocker?.status !== 'completed' && blocker?.status !== 'failed';\n });\n if (someBlocked) {\n const node = this.graph.nodes.get(taskId);\n if (node) {\n node.status = 'blocked';\n node.updatedAt = Date.now();\n }\n }\n }\n\n /**\n * Fire-and-forget persistence with attached error handler.\n * Synchronous mutators (addNode/addEdge/updateNodeStatus) use this to\n * avoid forcing an async cascade through every caller; if the store\n * is missing or throwing, the error is surfaced via onPersistError.\n */\n private persist(): void {\n if (!this.graph) return;\n this.opts.store.saveGraph(this.graph).catch((err) => {\n this.opts.onPersistError\n ? this.opts.onPersistError(err)\n : console.warn(JSON.stringify({\n level: 'warn',\n event: 'task_tracker.save_graph_failed',\n message: toErrorMessage(err),\n timestamp: new Date().toISOString(),\n }));\n });\n }\n}\n\n// Sort comparison helpers\nconst PRIORITY_RANK: Record<TaskNode['priority'], number> = {\n critical: 0,\n high: 1,\n medium: 2,\n low: 3,\n};\nconst STATUS_RANK: Record<TaskNode['status'], number> = {\n in_progress: 0,\n pending: 1,\n review: 2,\n blocked: 3,\n failed: 4,\n completed: 5,\n};\n\nfunction compareByField(a: TaskNode, b: TaskNode, field: TaskSort['field']): number {\n switch (field) {\n case 'priority': return PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority];\n case 'status': return STATUS_RANK[a.status] - STATUS_RANK[b.status];\n case 'createdAt': return a.createdAt - b.createdAt;\n case 'updatedAt': return a.updatedAt - b.updatedAt;\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { DoneCondition } from '../types/multi-agent.js';\nimport type { SpecAnalysis, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { SddError, ERROR_CODES } from '../types/errors.js';\nimport { SpecParser } from './spec-parser.js';\nimport { DefaultTaskStore, TaskGenerator } from './task-generator.js';\nimport { TaskTracker } from './task-tracker.js';\n\n/**\n * Extended event map used internally by TaskFlow and multi-agent components.\n * These events are emitted on the injected EventBus and are a subset of\n * the full EventMap — they do not require a separate registration.\n */\nexport interface TaskFlowEventMap {\n 'phase.change': { from: TaskFlowPhase; to: TaskFlowPhase };\n 'task.started': { taskId: string };\n 'task.completed': { taskId: string; result?: unknown | undefined };\n 'task.failed': { taskId: string; error: string };\n 'task.review': { taskId: string };\n 'spec.analyzed': { analysis: SpecAnalysis };\n progress: { percent: number; message: string };\n done: { graph: TaskGraph };\n error: { phase: TaskFlowPhase; error: Error };\n}\n\nexport type TaskFlowPhase =\n | 'idle'\n | 'parsing'\n | 'analyzing'\n | 'generating'\n | 'executing'\n | 'reviewing'\n | 'completing'\n | 'done'\n | 'failed';\n\nexport type TaskFlowEventName = keyof TaskFlowEventMap;\n\nexport interface TaskFlowOptions {\n tracker: TaskTracker;\n events: EventBus;\n doneCondition?: DoneCondition | undefined;\n maxConcurrent?: number | undefined;\n}\n\nexport interface TaskFlowExecutionContext {\n executeTask: (task: TaskNode) => Promise<unknown>;\n onTaskComplete?: (task: TaskNode | undefined, result: unknown) => void;\n onTaskFail?: (task: TaskNode | undefined, error: Error) => void;\n}\n\nexport class TaskFlow {\n private phase: TaskFlowPhase = 'idle';\n private spec: Specification | null = null;\n private graph: TaskGraph | null = null;\n private stopped = false;\n\n constructor(private readonly opts: TaskFlowOptions) {\n this.setPhase('idle');\n }\n\n private emit<K extends TaskFlowEventName>(event: K, payload: TaskFlowEventMap[K]): void {\n (this.opts.events.emit as (event: string, payload: unknown) => void)(event, payload);\n }\n\n async fromSpec(specContent: string): Promise<TaskGraph> {\n this.setPhase('parsing');\n\n const parser = new SpecParser();\n this.spec = parser.parse(specContent);\n\n this.setPhase('analyzing');\n const analysis = parser.analyze(this.spec);\n this.emit('spec.analyzed', { analysis });\n\n if (analysis.completeness < 50) {\n const err = new SddError({\n message: `Spec completeness too low: ${analysis.completeness}%`,\n code: ERROR_CODES.SDD_VALIDATION_FAILED,\n context: { completeness: analysis.completeness },\n });\n this.emit('error', { phase: 'analyzing', error: err });\n this.setPhase('failed');\n throw err;\n }\n\n this.setPhase('generating');\n const generator = new TaskGenerator({\n taskTracker: this.opts.tracker,\n verificationFromAcceptance: process.env['WRONGSTACK_SDD_VERIFY_FROM_ACCEPTANCE'] === '1',\n });\n this.graph = await generator.generateFromSpec(this.spec);\n\n return this.graph;\n }\n\n async execute(ctx: TaskFlowExecutionContext): Promise<TaskGraph> {\n if (!this.graph) throw new SddError({\n message: 'No graph loaded. Call fromSpec first.',\n code: ERROR_CODES.SDD_INVALID_STATE,\n context: { phase: this.phase },\n });\n\n this.setPhase('executing');\n this.stopped = false;\n\n const pendingTasks = this.getExecutableTasks();\n const maxConcurrent = this.opts.maxConcurrent ?? 2;\n\n while (pendingTasks.length > 0 && !this.stopped) {\n const batch = pendingTasks.splice(0, maxConcurrent);\n const results = await Promise.allSettled(\n batch.map((task) => this.executeSingleTask(task, ctx)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n\n if (!result || !task) continue;\n\n if (result.status === 'rejected') {\n const reason = result.reason as Error | undefined;\n this.opts.tracker.updateNodeStatus(task.id, 'failed', reason?.message);\n this.emit('task.failed', { taskId: task.id, error: reason?.message ?? 'unknown' });\n ctx.onTaskFail?.(task, reason as Error);\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n this.emit('task.completed', { taskId: task.id, result: result.value });\n ctx.onTaskComplete?.(task, result.value);\n }\n\n this.emitProgress();\n }\n\n // Re-evaluate pending tasks (some may have become unblocked)\n const stillPending = this.getExecutableTasks();\n pendingTasks.length = 0;\n pendingTasks.push(...stillPending);\n\n // Check done condition\n if (this.checkDoneCondition()) {\n break;\n }\n }\n\n this.setPhase('completing');\n this.emit('done', { graph: this.graph });\n this.setPhase('done');\n\n return this.graph;\n }\n\n async reviewTask(taskId: string, approved: boolean, comment?: string): Promise<void> {\n const task = this.opts.tracker.getNode(taskId);\n if (!task) throw new SddError({\n message: `Task ${taskId} not found`,\n code: ERROR_CODES.SDD_NOT_READY,\n context: { taskId },\n });\n\n if (approved) {\n this.opts.tracker.updateNodeStatus(taskId, 'completed', comment);\n this.emit('task.completed', { taskId });\n } else {\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress', comment ?? 'Needs revision');\n this.emit('task.review', { taskId });\n }\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n getPhase(): TaskFlowPhase {\n return this.phase;\n }\n\n getGraph(): TaskGraph | null {\n return this.graph;\n }\n\n getSpec(): Specification | null {\n return this.spec;\n }\n\n private setPhase(phase: TaskFlowPhase): void {\n const from = this.phase;\n this.phase = phase;\n this.emit('phase.change', { from, to: phase });\n }\n\n private getExecutableTasks(): TaskNode[] {\n return this.opts.tracker\n .getAllNodes({ status: ['pending', 'blocked'] })\n .filter((n) => n.status === 'pending' && this.opts.tracker.canStart(n.id))\n .sort((a, b) => {\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\n });\n }\n\n private async executeSingleTask(task: TaskNode, ctx: TaskFlowExecutionContext): Promise<unknown> {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.emit('task.started', { taskId: task.id });\n return ctx.executeTask(task);\n }\n\n private checkDoneCondition(): boolean {\n const condition = this.opts.doneCondition;\n if (!condition) {\n const progress = this.opts.tracker.getProgress();\n return progress.percentComplete === 100;\n }\n\n switch (condition.type) {\n case 'all_tasks_done': {\n const progress = this.opts.tracker.getProgress();\n return progress.pending === 0 && progress.inProgress === 0;\n }\n case 'iterations':\n return false; // Not tracked here\n case 'tool_calls':\n return false;\n default:\n return false;\n }\n }\n\n private emitProgress(): void {\n const progress = this.opts.tracker.getProgress();\n this.emit('progress', {\n percent: progress.percentComplete,\n message: `${progress.completed}/${progress.total} tasks completed`,\n });\n }\n}\n\nexport interface SpecDrivenDevOptions {\n workingDirectory: string;\n events: EventBus;\n doneCondition?: DoneCondition | undefined;\n}\n\nexport class SpecDrivenDev {\n private store: DefaultTaskStore;\n private tracker: TaskTracker;\n private readonly events: EventBus;\n private flows = new Map<string, TaskFlow>();\n\n constructor(opts: SpecDrivenDevOptions) {\n this.store = new DefaultTaskStore();\n this.tracker = new TaskTracker({ store: this.store });\n this.events = opts.events;\n }\n\n async createFlow(specContent: string, options?: Partial<TaskFlowOptions>): Promise<TaskFlow> {\n const flow = new TaskFlow({\n tracker: this.tracker,\n events: this.events,\n ...options,\n });\n\n const graph = await flow.fromSpec(specContent);\n this.flows.set(graph.id, flow);\n\n return flow;\n }\n\n getTracker(): TaskTracker {\n return this.tracker;\n }\n\n getFlow(graphId: string): TaskFlow | undefined {\n return this.flows.get(graphId);\n }\n\n listFlows(): { id: string; title: string; phase: TaskFlowPhase }[] {\n return Array.from(this.flows.entries()).map(([id, flow]) => ({\n id,\n title: flow.getGraph()?.title ?? 'Untitled',\n phase: flow.getPhase(),\n }));\n }\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { Specification, SpecStatus } from '../types/spec.js';\n\nexport interface SpecStoreOptions {\n /** Directory where spec files are stored. Defaults to `.wrongstack/specs`. */\n baseDir: string;\n}\n\nexport interface SpecIndexEntry {\n id: string;\n title: string;\n version: string;\n status: SpecStatus;\n updatedAt: number;\n filePath: string;\n}\n\ninterface SpecIndex {\n version: 1;\n entries: SpecIndexEntry[];\n}\n\n/**\n * File-backed spec storage. Each spec is a JSON file under `baseDir/`.\n * An index file (`_index.json`) tracks all specs for fast listing.\n */\nexport class SpecStore {\n private readonly baseDir: string;\n private readonly indexPath: string;\n\n constructor(opts: SpecStoreOptions) {\n this.baseDir = opts.baseDir;\n this.indexPath = path.join(this.baseDir, '_index.json');\n }\n\n async save(spec: Specification): Promise<void> {\n await ensureDir(this.baseDir);\n const filePath = this.filePath(spec.id);\n await atomicWrite(filePath, JSON.stringify(spec, null, 2), { mode: 0o600 });\n await this.updateIndex(spec);\n }\n\n async load(id: string): Promise<Specification | null> {\n try {\n const raw = await fsp.readFile(this.filePath(id), 'utf8');\n return JSON.parse(raw) as Specification;\n } catch {\n return null;\n }\n }\n\n async list(): Promise<SpecIndexEntry[]> {\n const index = await this.readIndex();\n return index.entries.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async delete(id: string): Promise<boolean> {\n try {\n await fsp.unlink(this.filePath(id));\n await this.removeFromIndex(id);\n return true;\n } catch {\n return false;\n }\n }\n\n async exists(id: string): Promise<boolean> {\n try {\n await fsp.access(this.filePath(id));\n return true;\n } catch {\n return false;\n }\n }\n\n /** Create a new spec with defaults, assign ID, and persist. */\n async createDraft(title: string, overview?: string): Promise<Specification> {\n const now = Date.now();\n const spec: Specification = {\n id: randomUUID(),\n title,\n version: '0.1.0',\n status: 'draft',\n overview: overview ?? '',\n sections: [],\n requirements: [],\n createdAt: now,\n updatedAt: now,\n };\n await this.save(spec);\n return spec;\n }\n\n /** Update spec fields and persist. */\n async update(id: string, patch: Partial<Omit<Specification, 'id' | 'createdAt'>>): Promise<Specification | null> {\n const spec = await this.load(id);\n if (!spec) return null;\n const updated: Specification = {\n ...spec,\n ...patch,\n id: spec.id,\n createdAt: spec.createdAt,\n updatedAt: Date.now(),\n };\n await this.save(updated);\n return updated;\n }\n\n private filePath(id: string): string {\n return path.join(this.baseDir, `${id}.json`);\n }\n\n private async readIndex(): Promise<SpecIndex> {\n try {\n const raw = await fsp.readFile(this.indexPath, 'utf8');\n const parsed = JSON.parse(raw) as SpecIndex;\n if (parsed?.version === 1) return parsed;\n } catch {\n /* no index yet */\n }\n return { version: 1, entries: [] };\n }\n\n private async updateIndex(spec: Specification): Promise<void> {\n const index = await this.readIndex();\n const entry: SpecIndexEntry = {\n id: spec.id,\n title: spec.title,\n version: spec.version,\n status: spec.status,\n updatedAt: spec.updatedAt,\n filePath: this.filePath(spec.id),\n };\n const idx = index.entries.findIndex((e) => e.id === spec.id);\n if (idx >= 0) {\n index.entries[idx] = entry;\n } else {\n index.entries.push(entry);\n }\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n\n private async removeFromIndex(id: string): Promise<void> {\n const index = await this.readIndex();\n index.entries = index.entries.filter((e) => e.id !== id);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\n\nexport interface TaskGraphStoreOptions {\n /** Directory where task graph files are stored. Defaults to `.wrongstack/task-graphs`. */\n baseDir: string;\n}\n\nexport interface TaskGraphIndexEntry {\n id: string;\n specId: string;\n title: string;\n nodeCount: number;\n completedCount: number;\n updatedAt: number;\n filePath: string;\n}\n\ninterface TaskGraphIndex {\n version: 1;\n entries: TaskGraphIndexEntry[];\n}\n\n/**\n * JSON serialisation helpers for TaskGraph (Map → Array round-trip).\n */\nfunction graphToJSON(graph: TaskGraph): string {\n const serialisable = {\n ...graph,\n nodes: Array.from(graph.nodes.entries()),\n };\n return JSON.stringify(serialisable, null, 2);\n}\n\nfunction graphFromJSON(raw: string): TaskGraph {\n const parsed = JSON.parse(raw) as Omit<TaskGraph, 'nodes'> & { nodes: [string, TaskNode][] };\n return {\n ...parsed,\n nodes: new Map(parsed.nodes),\n };\n}\n\n/**\n * File-backed task graph storage. Each graph is a JSON file under `baseDir/`.\n * An index file (`_index.json`) tracks all graphs for fast listing.\n */\nexport class TaskGraphStore {\n private readonly baseDir: string;\n private readonly indexPath: string;\n\n constructor(opts: TaskGraphStoreOptions) {\n this.baseDir = opts.baseDir;\n this.indexPath = path.join(this.baseDir, '_index.json');\n }\n\n async save(graph: TaskGraph): Promise<void> {\n await ensureDir(this.baseDir);\n const filePath = this.filePath(graph.id);\n await atomicWrite(filePath, graphToJSON(graph), { mode: 0o600 });\n await this.updateIndex(graph);\n }\n\n async load(id: string): Promise<TaskGraph | null> {\n try {\n const raw = await fsp.readFile(this.filePath(id), 'utf8');\n return graphFromJSON(raw);\n } catch {\n return null;\n }\n }\n\n async list(): Promise<TaskGraphIndexEntry[]> {\n const index = await this.readIndex();\n return index.entries.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async delete(id: string): Promise<boolean> {\n try {\n await fsp.unlink(this.filePath(id));\n await this.removeFromIndex(id);\n return true;\n } catch {\n return false;\n }\n }\n\n async exists(id: string): Promise<boolean> {\n try {\n await fsp.access(this.filePath(id));\n return true;\n } catch {\n return false;\n }\n }\n\n private filePath(id: string): string {\n return path.join(this.baseDir, `${id}.json`);\n }\n\n private async readIndex(): Promise<TaskGraphIndex> {\n try {\n const raw = await fsp.readFile(this.indexPath, 'utf8');\n const parsed = JSON.parse(raw) as TaskGraphIndex;\n if (parsed?.version === 1) return parsed;\n } catch {\n /* no index yet */\n }\n return { version: 1, entries: [] };\n }\n\n private async updateIndex(graph: TaskGraph): Promise<void> {\n const index = await this.readIndex();\n const completedCount = Array.from(graph.nodes.values()).filter(\n (n) => n.status === 'completed',\n ).length;\n const entry: TaskGraphIndexEntry = {\n id: graph.id,\n specId: graph.specId,\n title: graph.title,\n nodeCount: graph.nodes.size,\n completedCount,\n updatedAt: graph.updatedAt,\n filePath: this.filePath(graph.id),\n };\n const idx = index.entries.findIndex((e) => e.id === graph.id);\n if (idx >= 0) {\n index.entries[idx] = entry;\n } else {\n index.entries.push(entry);\n }\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n\n private async removeFromIndex(id: string): Promise<void> {\n const index = await this.readIndex();\n index.entries = index.entries.filter((e) => e.id !== id);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n}\n","/**\n * SDD live board model.\n *\n * A board snapshot is the canonical, surface-agnostic projection of a running\n * (or persisted) SDD TaskGraph: tasks laid into topological dependency columns,\n * each carrying its short id, status, blockers and the agent currently on it.\n * The projector (sdd-board-projector.ts) emits these over the EventBus and\n * persists them (sdd-board-store.ts); every surface (WebUI/TUI) renders the\n * same shape.\n */\n\nimport type { TaskGraph, TaskNode, TaskProgress } from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\n\nexport type SddBoardStatus =\n | 'idle'\n | 'running'\n | 'paused'\n | 'stopped'\n | 'completed'\n | 'failed'\n | 'deadlocked';\n\n/**\n * FORGE-style display status: `queued` = pending with all blockers done;\n * `cancelled` = a task the user stopped (stored as a terminal `failed` node\n * carrying `metadata.cancelled`, surfaced distinctly so it doesn't read as an\n * error). Display-only — not a core `TaskStatus`.\n */\nexport type SddTaskDisplayStatus = TaskNode['status'] | 'queued' | 'cancelled';\n\nexport interface SddBoardTask {\n id: string;\n /** Stable short id (t01, t02, …) in creation order. */\n shortId: string;\n title: string;\n description: string;\n status: TaskNode['status'];\n displayStatus: SddTaskDisplayStatus;\n priority: TaskNode['priority'];\n type: TaskNode['type'];\n /** Short ids of the tasks that block this one (depends_on edges). */\n deps: string[];\n /** Worker on the task right now (scientist nickname), if any. */\n agentName?: string | undefined;\n /** Git worktree branch this task runs in, when isolated. */\n worktreeBranch?: string | undefined;\n startedAt?: number | undefined;\n completedAt?: number | undefined;\n retries: number;\n /** Per-task model assignment (overrides the run default), if set. */\n model?: string | undefined;\n /** Per-task provider assignment (overrides the run default), if set. */\n provider?: string | undefined;\n /** Per-task fallback model chain (overrides the run default), if set. */\n fallbackModels?: string[] | undefined;\n /** Per-task completion-gate verification command, if set. */\n verificationCommand?: string | undefined;\n}\n\n/** A topological column: tasks whose deepest dependency chain is `depth`. */\nexport interface SddBoardColumn {\n label: string;\n /** Short ids of the tasks in this column (join against `tasks`). */\n taskIds: string[];\n}\n\nexport interface SddDeadlockChain {\n /** Short id of the blocked task. */\n blocked: string;\n /** Short ids of the failed/incomplete blockers holding it. */\n blockedBy: string[];\n}\n\n/** One entry in the live activity feed (the board's \"what just happened\" ticker). */\nexport interface SddBoardFeedEntry {\n ts: number;\n kind:\n | 'started'\n | 'completed'\n | 'failed'\n | 'retrying'\n | 'wave'\n | 'deadlock'\n | 'verification_failed'\n | 'conflict'\n | 'split'\n | 'supervisor';\n /** Short id of the task this entry concerns, when applicable. */\n taskShortId?: string | undefined;\n /** Worker involved, when applicable. */\n agentName?: string | undefined;\n /** Human-readable one-line summary. */\n text: string;\n}\n\nexport interface SddBoardSnapshot {\n runId: string;\n specId?: string | undefined;\n graphId: string;\n title: string;\n status: SddBoardStatus;\n startedAt: number;\n updatedAt: number;\n progress: TaskProgress;\n /** Current wave index (0-based) of the parallel run. */\n wave: number;\n tasks: SddBoardTask[];\n columns: SddBoardColumn[];\n diagnostics?: { deadlockChains?: SddDeadlockChain[] } | undefined;\n /** Live activity feed — most recent first (capped). */\n feed?: SddBoardFeedEntry[] | undefined;\n /** Run-level default worker model (task overrides take precedence). */\n defaultModel?: string | undefined;\n /** Run-level default worker provider. */\n defaultProvider?: string | undefined;\n /** Run-level default fallback model chain. */\n fallbackModels?: string[] | undefined;\n /** Base branch the run's squash commits land on (worktree runs only). */\n baseBranch?: string | undefined;\n /**\n * Squash commits the run landed on the base branch, in landing order. Lets a\n * post-run `/sdd rollback` revert them from disk after the live run is gone.\n */\n mergedCommits?: Array<{ taskId: string; sha: string; title: string }> | undefined;\n}\n\n/**\n * Lay a TaskGraph's nodes into topological dependency columns with stable short\n * ids and per-task blocker refs. Shared by the projector (live) and any static\n * board browser. Pure; no run state — `agentName`/`worktreeBranch`/`retries`\n * are read from the node's `assignee`/`metadata` so a reload reflects the last\n * persisted run.\n */\n/**\n * Stable short-id map (t01, t02, …) for a graph's nodes in creation order.\n * Shared by the board renderer and the projector (deadlock-chain labelling).\n */\nexport function shortIdMap(graph: TaskGraph): Map<string, string> {\n const nodes = Array.from(graph.nodes.values()).sort((a, b) => a.createdAt - b.createdAt);\n const m = new Map<string, string>();\n nodes.forEach((n, i) => {\n m.set(n.id, `t${String(i + 1).padStart(2, '0')}`);\n });\n return m;\n}\n\nexport function buildBoardTasks(graph: TaskGraph): {\n tasks: SddBoardTask[];\n columns: SddBoardColumn[];\n} {\n const nodes = Array.from(graph.nodes.values()).sort((a, b) => a.createdAt - b.createdAt);\n const shortId = shortIdMap(graph);\n\n // Blockers per node (depends_on edges pointing at the node).\n const blockers = new Map<string, string[]>();\n for (const n of nodes) blockers.set(n.id, []);\n for (const e of graph.edges) {\n if (e.type === 'depends_on') blockers.get(e.to)?.push(e.from);\n }\n\n const statusOf = (id: string) => graph.nodes.get(id)?.status;\n\n // Memoized topological depth (longest blocker chain), cycle-guarded.\n const depthCache = new Map<string, number>();\n const depthOf = (id: string, seen = new Set<string>()): number => {\n const cached = depthCache.get(id);\n if (cached !== undefined) return cached;\n if (seen.has(id)) return 0;\n seen.add(id);\n const deps = blockers.get(id) ?? [];\n const d = deps.length === 0 ? 0 : 1 + Math.max(...deps.map((b) => depthOf(b, seen)));\n depthCache.set(id, d);\n return d;\n };\n\n const toTask = (n: TaskNode): SddBoardTask => {\n const deps = blockers.get(n.id) ?? [];\n const allDepsDone = deps.every((b) => statusOf(b) === 'completed');\n const meta = (n.metadata ?? {}) as Record<string, unknown>;\n const cancelled = Boolean(meta['cancelled']);\n const displayStatus: SddTaskDisplayStatus = cancelled\n ? 'cancelled'\n : n.status === 'pending' && deps.length > 0 && allDepsDone\n ? 'queued'\n : n.status;\n return {\n id: n.id,\n shortId: shortId.get(n.id) ?? n.id.slice(0, 6),\n title: n.title,\n description: n.description,\n status: n.status,\n displayStatus,\n priority: n.priority,\n type: n.type,\n deps: deps.map((b) => shortId.get(b) ?? b.slice(0, 6)),\n agentName: n.assignee,\n worktreeBranch: typeof meta['worktreeBranch'] === 'string' ? (meta['worktreeBranch'] as string) : undefined,\n startedAt: n.startedAt,\n completedAt: n.completedAt,\n retries: typeof meta['retries'] === 'number' ? (meta['retries'] as number) : 0,\n model: typeof meta['model'] === 'string' ? (meta['model'] as string) : undefined,\n provider: typeof meta['provider'] === 'string' ? (meta['provider'] as string) : undefined,\n fallbackModels: Array.isArray(meta['fallbackModels']) ? (meta['fallbackModels'] as string[]) : undefined,\n verificationCommand:\n typeof meta['verificationCommand'] === 'string' ? (meta['verificationCommand'] as string) : undefined,\n };\n };\n\n const tasks = nodes.map(toTask);\n\n const byDepth = new Map<number, string[]>();\n for (const n of nodes) {\n const d = depthOf(n.id);\n if (!byDepth.has(d)) byDepth.set(d, []);\n byDepth.get(d)?.push(shortId.get(n.id) ?? n.id.slice(0, 6));\n }\n const columns: SddBoardColumn[] = [...byDepth.keys()]\n .sort((a, b) => a - b)\n .map((d) => ({ label: d === 0 ? 'Start' : `Phase ${d}`, taskIds: byDepth.get(d) ?? [] }));\n\n return { tasks, columns };\n}\n\n/**\n * Build a full board snapshot from a graph + run state. The projector calls\n * this on every (throttled) change.\n */\nexport function buildBoardSnapshot(\n graph: TaskGraph,\n run: {\n runId: string;\n specId?: string | undefined;\n status: SddBoardStatus;\n startedAt: number;\n wave: number;\n deadlockChains?: SddDeadlockChain[] | undefined;\n defaultModel?: string | undefined;\n defaultProvider?: string | undefined;\n fallbackModels?: string[] | undefined;\n baseBranch?: string | undefined;\n mergedCommits?: Array<{ taskId: string; sha: string; title: string }> | undefined;\n },\n now: number,\n): SddBoardSnapshot {\n const { tasks, columns } = buildBoardTasks(graph);\n return {\n runId: run.runId,\n specId: run.specId,\n graphId: graph.id,\n title: graph.title,\n status: run.status,\n startedAt: run.startedAt,\n updatedAt: now,\n progress: computeTaskProgress(graph),\n wave: run.wave,\n tasks,\n columns,\n diagnostics: run.deadlockChains?.length ? { deadlockChains: run.deadlockChains } : undefined,\n defaultModel: run.defaultModel,\n defaultProvider: run.defaultProvider,\n fallbackModels: run.fallbackModels,\n baseBranch: run.baseBranch,\n mergedCommits: run.mergedCommits?.length ? run.mergedCommits : undefined,\n };\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { SddBoardSnapshot } from './board-types.js';\n\nexport interface SddBoardStoreOptions {\n /** Directory for board snapshots + event logs (wpaths.projectSddBoards). */\n baseDir: string;\n}\n\nexport interface SddBoardIndexEntry {\n runId: string;\n specId?: string | undefined;\n title: string;\n status: string;\n total: number;\n completed: number;\n updatedAt: number;\n}\n\ninterface SddBoardIndex {\n version: 1;\n entries: SddBoardIndexEntry[];\n}\n\n/** One appended line in a board's JSONL event log. */\nexport interface SddBoardEvent {\n ts: number;\n type: string;\n payload?: unknown;\n}\n\n/**\n * File-backed SDD board storage. Each board (= one parallel run) has:\n * - `<runId>.json` — latest full snapshot (atomic; resume + standalone-webui mirror)\n * - `<runId>.events.jsonl`— append-only event log (audit / replay)\n * - `<runId>.control.jsonl` — append-only command queue (cross-process control, written by readers)\n * plus `_index.json` for fast listing. JSON for state, JSONL for streams.\n */\nexport class SddBoardStore {\n private readonly baseDir: string;\n private readonly indexPath: string;\n\n constructor(opts: SddBoardStoreOptions) {\n this.baseDir = opts.baseDir;\n this.indexPath = path.join(this.baseDir, '_index.json');\n }\n\n snapshotPath(runId: string): string {\n return path.join(this.baseDir, `${this.safe(runId)}.json`);\n }\n eventsPath(runId: string): string {\n return path.join(this.baseDir, `${this.safe(runId)}.events.jsonl`);\n }\n controlPath(runId: string): string {\n return path.join(this.baseDir, `${this.safe(runId)}.control.jsonl`);\n }\n\n async saveSnapshot(snapshot: SddBoardSnapshot): Promise<void> {\n await ensureDir(this.baseDir);\n await atomicWrite(this.snapshotPath(snapshot.runId), JSON.stringify(snapshot, null, 2), {\n mode: 0o600,\n });\n await this.updateIndex(snapshot);\n }\n\n async load(runId: string): Promise<SddBoardSnapshot | null> {\n try {\n const raw = await fsp.readFile(this.snapshotPath(runId), 'utf8');\n return JSON.parse(raw) as SddBoardSnapshot;\n } catch {\n return null;\n }\n }\n\n async list(): Promise<SddBoardIndexEntry[]> {\n const index = await this.readIndex();\n return index.entries.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async loadLatestForSpec(specId: string): Promise<SddBoardSnapshot | null> {\n const entry = (await this.list()).find((e) => e.specId === specId);\n return entry ? this.load(entry.runId) : null;\n }\n\n /** Append one line to the board's JSONL event log (best-effort, never throws). */\n async appendEvent(runId: string, event: SddBoardEvent): Promise<void> {\n try {\n await ensureDir(this.baseDir);\n await fsp.appendFile(this.eventsPath(runId), `${JSON.stringify(event)}\\n`, { mode: 0o600 });\n } catch {\n /* event log is best-effort */\n }\n }\n\n /** Append a control command (used by readers to steer a CLI-owned run). */\n async appendControl(runId: string, command: { ts: number; type: string; payload?: unknown }): Promise<void> {\n await ensureDir(this.baseDir);\n await fsp.appendFile(this.controlPath(runId), `${JSON.stringify(command)}\\n`, { mode: 0o600 });\n }\n\n /** Read + truncate the control queue (the run drains it). Returns parsed commands. */\n async drainControl(runId: string): Promise<Array<{ ts: number; type: string; payload?: unknown }>> {\n const p = this.controlPath(runId);\n let raw: string;\n try {\n raw = await fsp.readFile(p, 'utf8');\n } catch {\n return [];\n }\n try {\n await fsp.writeFile(p, '', { mode: 0o600 });\n } catch {\n /* ignore truncate failure */\n }\n return raw\n .split('\\n')\n .filter((l) => l.trim())\n .map((l) => {\n try {\n return JSON.parse(l) as { ts: number; type: string; payload?: unknown };\n } catch {\n return null;\n }\n })\n .filter((c): c is { ts: number; type: string; payload?: unknown } => c !== null);\n }\n\n async delete(runId: string): Promise<void> {\n await Promise.allSettled([\n fsp.unlink(this.snapshotPath(runId)),\n fsp.unlink(this.eventsPath(runId)),\n fsp.unlink(this.controlPath(runId)),\n ]);\n await this.removeFromIndex(runId);\n }\n\n // ── internal ────────────────────────────────────────────────────────────\n\n private safe(runId: string): string {\n return runId.replace(/[^a-zA-Z0-9._-]/g, '_');\n }\n\n private async readIndex(): Promise<SddBoardIndex> {\n try {\n const raw = await fsp.readFile(this.indexPath, 'utf8');\n const parsed = JSON.parse(raw) as SddBoardIndex;\n if (parsed?.version === 1) return parsed;\n } catch {\n /* no index yet */\n }\n return { version: 1, entries: [] };\n }\n\n private async updateIndex(snapshot: SddBoardSnapshot): Promise<void> {\n const index = await this.readIndex();\n const entry: SddBoardIndexEntry = {\n runId: snapshot.runId,\n specId: snapshot.specId,\n title: snapshot.title,\n status: snapshot.status,\n total: snapshot.progress.total,\n completed: snapshot.progress.completed,\n updatedAt: snapshot.updatedAt,\n };\n const idx = index.entries.findIndex((e) => e.runId === snapshot.runId);\n if (idx >= 0) index.entries[idx] = entry;\n else index.entries.push(entry);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n\n private async removeFromIndex(runId: string): Promise<void> {\n const index = await this.readIndex();\n index.entries = index.entries.filter((e) => e.runId !== runId);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n}\n","/**\n * SddBoardProjector\n *\n * Composes a live SDD board snapshot from a running graph and streams it to\n * every surface. It subscribes to `TaskTracker` mutations (the source of truth\n * for task state) plus the run's `sdd.*` lifecycle events (status / wave /\n * deadlock), and on each change — throttled — rebuilds a `SddBoardSnapshot`,\n * emits `sdd.board.snapshot` on the EventBus, persists it (JSON) and appends the\n * triggering event to the board's JSONL log.\n *\n * The graph is the single source of truth: task status/assignee/worktree live\n * on the nodes (the run mutates them through the tracker), so the projector\n * mostly re-derives the snapshot and only tracks run-level status/wave/deadlock.\n */\nimport type { EventBus, EventMap } from '../kernel/events.js';\nimport type { TaskGraph } from '../types/task-graph.js';\nimport type { TaskTracker } from './task-tracker.js';\nimport {\n buildBoardSnapshot,\n shortIdMap,\n type SddBoardFeedEntry,\n type SddBoardStatus,\n type SddDeadlockChain,\n} from './board-types.js';\nimport type { SddBoardStore } from './sdd-board-store.js';\n\nexport interface SddBoardProjectorOptions {\n runId: string;\n graph: TaskGraph;\n tracker: TaskTracker;\n events: EventBus;\n /** Parent session id for emitted `sdd.board.snapshot` events. */\n sessionId?: string | (() => string | undefined) | undefined;\n /** Persist snapshots + JSONL events (optional — omit for in-memory only). */\n store?: SddBoardStore | undefined;\n specId?: string | undefined;\n /** Run-level default worker model/provider/fallbacks (shown in the board header). */\n defaultModel?: string | undefined;\n defaultProvider?: string | undefined;\n fallbackModels?: string[] | undefined;\n /** Base branch the run's squash commits land on (for the board + rollback). */\n baseBranch?: string | undefined;\n /** Snapshot coalescing window in ms (default 250). */\n throttleMs?: number | undefined;\n /** Clock injection for tests; defaults to Date.now. */\n now?: (() => number) | undefined;\n}\n\nexport class SddBoardProjector {\n private readonly o: SddBoardProjectorOptions;\n private readonly now: () => number;\n private readonly throttleMs: number;\n private readonly shortId: Map<string, string>;\n\n private status: SddBoardStatus = 'idle';\n private wave = 0;\n private startedAt: number;\n private deadlockChains: SddDeadlockChain[] = [];\n /** Live activity feed, most recent first (capped). */\n private feed: SddBoardFeedEntry[] = [];\n private static readonly FEED_CAP = 60;\n private finished = false;\n private runDeadlocked = false;\n private runStopped = false;\n /** Squash commits the run landed on the base branch (for post-run rollback). */\n private mergedCommits: Array<{ taskId: string; sha: string; title: string }> = [];\n /** Base branch reported by the run at start (overrides the constructor option). */\n private runBaseBranch: string | undefined;\n\n private dirty = false;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly unsubs: Array<() => void> = [];\n /** Tail of in-flight persistence, so callers can await a settled state. */\n private lastSave: Promise<void> = Promise.resolve();\n\n constructor(opts: SddBoardProjectorOptions) {\n this.o = opts;\n this.now = opts.now ?? Date.now;\n this.throttleMs = opts.throttleMs ?? 250;\n this.shortId = shortIdMap(opts.graph);\n this.startedAt = this.now();\n\n // Source of truth: any task mutation redraws the board.\n this.unsubs.push(opts.tracker.subscribe(() => this.markDirty()));\n\n // Run lifecycle → status/wave/deadlock + JSONL audit.\n this.onRun('sdd.run.started', (e) => {\n this.status = 'running';\n this.startedAt = this.now();\n if (e.baseBranch) this.runBaseBranch = e.baseBranch;\n this.markDirty();\n });\n this.onRun('sdd.run.finished', (e) => {\n this.finished = true;\n this.runDeadlocked = e.deadlocked;\n this.runStopped = e.stopped;\n this.flush(); // final snapshot persists synchronously\n });\n this.onRun('sdd.wave', (e) => {\n this.wave = e.wave;\n this.pushFeed({ ts: this.now(), kind: 'wave', text: `Wave ${e.wave + 1} started · ${e.batchSize} task(s) in parallel` });\n this.markDirty();\n });\n this.onRun('sdd.deadlock', (e) => {\n this.deadlockChains = e.chains.map((c) => ({\n blocked: this.shortId.get(c.blocked) ?? c.blocked.slice(0, 6),\n blockedBy: c.blockedBy.map((b) => this.shortId.get(b) ?? b.slice(0, 6)),\n }));\n this.pushFeed({ ts: this.now(), kind: 'deadlock', text: `Deadlock — ${e.chains.length} task(s) blocked by failed work` });\n this.markDirty();\n });\n // Task lifecycle → live activity feed (task STATE comes from the tracker,\n // which already triggers a redraw; here we narrate \"what just happened\").\n this.onRun('sdd.task.started', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'started',\n taskShortId: sid,\n agentName: e.agentName,\n text: `${e.agentName || 'a worker'} picked up ${sid ?? 'a task'}${this.titleOf(e.taskId)}`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.completed', (e) => {\n const sid = this.shortId.get(e.taskId);\n const agent = this.assigneeOf(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'completed',\n taskShortId: sid,\n agentName: agent,\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} completed${agent ? ` by ${agent}` : ''} · ${(e.durationMs / 1000).toFixed(1)}s`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.failed', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'failed',\n taskShortId: sid,\n agentName: this.assigneeOf(e.taskId),\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} failed — ${e.error}`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.retrying', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'retrying',\n taskShortId: sid,\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} retrying (${e.attempt}/${e.maxRetries})`,\n });\n this.markDirty();\n });\n // Robustness events (completion gate / merge / supervisor / split) — narrate\n // \"why a task didn't just sail to done\" so the board never silently hides a\n // gate rejection, conflict, or supervisor verdict.\n this.onRun('sdd.task.verification_failed', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'verification_failed',\n taskShortId: sid,\n agentName: this.assigneeOf(e.taskId),\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} failed verification — ${e.reason}`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.conflict', (e) => {\n const sid = this.shortId.get(e.taskId);\n const files = e.conflictFiles.length;\n this.pushFeed({\n ts: this.now(),\n kind: 'conflict',\n taskShortId: sid,\n agentName: this.assigneeOf(e.taskId),\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} merge conflict — ${files} file(s)${files ? `: ${e.conflictFiles.slice(0, 3).join(', ')}${files > 3 ? '…' : ''}` : ''}`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.merged', (e) => {\n // Persist the run commit so a post-run rollback can revert it off disk.\n const title = this.o.graph.nodes.get(e.taskId)?.title ?? '';\n this.mergedCommits.push({ taskId: e.taskId, sha: e.sha, title });\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'completed',\n taskShortId: sid,\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} merged → ${this.runBaseBranch ?? this.o.baseBranch ?? 'base'} (${e.sha.slice(0, 8)})`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.split', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'split',\n taskShortId: sid,\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} split into ${e.subtaskIds.length} sub-task(s)`,\n });\n this.markDirty();\n });\n this.onRun('sdd.supervisor.decision', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'supervisor',\n taskShortId: sid,\n text: `supervisor → ${e.action} for ${sid ?? 'task'}${this.titleOf(e.taskId)}${e.rationale ? ` (${e.rationale})` : ''}`,\n });\n this.markDirty();\n });\n }\n\n private pushFeed(entry: SddBoardFeedEntry): void {\n this.feed.unshift(entry);\n if (this.feed.length > SddBoardProjector.FEED_CAP) this.feed.length = SddBoardProjector.FEED_CAP;\n }\n\n /** ` (title…)` suffix for a feed line, or '' when the node/title is missing. */\n private titleOf(taskId: string): string {\n const t = this.o.graph.nodes.get(taskId)?.title;\n if (!t) return '';\n return ` (${t.length > 40 ? `${t.slice(0, 39)}…` : t})`;\n }\n\n private assigneeOf(taskId: string): string | undefined {\n return this.o.graph.nodes.get(taskId)?.assignee;\n }\n\n /** Latest snapshot, built on demand (e.g. for a late-joining client). */\n snapshot() {\n return this.build();\n }\n\n /** Resolve once all in-flight snapshot persistence has settled. */\n async drain(): Promise<void> {\n await this.lastSave;\n }\n\n /** Stop projecting and release subscriptions. */\n dispose(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n for (const u of this.unsubs) u();\n this.unsubs.length = 0;\n }\n\n // ── internal ────────────────────────────────────────────────────────────\n\n /** Subscribe to a run event scoped to this run id; also append to JSONL. */\n private onRun<K extends keyof EventMap>(event: K, handler: (e: EventMap[K]) => void): void {\n const wrapped = (e: EventMap[K]) => {\n if ((e as { runId?: string }).runId !== this.o.runId) return;\n void this.o.store?.appendEvent(this.o.runId, { ts: this.now(), type: event, payload: e });\n handler(e);\n };\n const off = this.o.events.on(event, wrapped as (p: EventMap[K]) => void);\n this.unsubs.push(off);\n }\n\n private resolveStatus(completed: number, total: number): SddBoardStatus {\n if (!this.finished) return this.status;\n if (this.runDeadlocked) return 'deadlocked';\n if (total > 0 && completed >= total) return 'completed';\n // A user-stopped run is a TERMINAL 'stopped' — distinct from a live 'paused'\n // run (which is still resumable). Surfaces must treat 'stopped' as inactive\n // so the post-run lifecycle controls (clean / rollback / destroy) apply.\n if (this.runStopped) return 'stopped';\n return 'failed';\n }\n\n private build() {\n const snap = buildBoardSnapshot(\n this.o.graph,\n {\n runId: this.o.runId,\n specId: this.o.specId,\n status: 'running',\n startedAt: this.startedAt,\n wave: this.wave,\n deadlockChains: this.deadlockChains,\n defaultModel: this.o.defaultModel,\n defaultProvider: this.o.defaultProvider,\n fallbackModels: this.o.fallbackModels,\n baseBranch: this.runBaseBranch ?? this.o.baseBranch,\n mergedCommits: this.mergedCommits,\n },\n this.now(),\n );\n snap.status = this.resolveStatus(snap.progress.completed, snap.progress.total);\n snap.feed = this.feed.slice(0, SddBoardProjector.FEED_CAP);\n return snap;\n }\n\n private markDirty(): void {\n this.dirty = true;\n if (this.timer || this.finished) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n if (this.dirty) this.flush();\n }, this.throttleMs);\n }\n\n private flush(): void {\n this.dirty = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n const snap = this.build();\n const sessionId = this.currentSessionId();\n this.o.events.emit('sdd.board.snapshot', {\n ...(sessionId ? { sessionId } : {}),\n runId: this.o.runId,\n snapshot: snap,\n });\n if (this.o.store) {\n // Serialize writes (no two snapshots race on the same file) and swallow\n // persistence errors — a live stream must never crash on a disk hiccup.\n const store = this.o.store;\n this.lastSave = this.lastSave.then(() => store.saveSnapshot(snap)).catch(() => {});\n }\n }\n\n private currentSessionId(): string | undefined {\n const value =\n typeof this.o.sessionId === 'function'\n ? this.o.sessionId()\n : this.o.sessionId;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\n}\n","import type { SddBoardSnapshot } from './board-types.js';\nimport type { SddSubtaskSpec } from './sdd-parallel-run.js';\n\n/**\n * Control surface over a live SDD run, exposed to every steering surface\n * (TUI, CLI-hosted WebUI in-process; standalone WebUI via a control file the\n * run drains). The run itself stays CLI-owned — this is the only sanctioned\n * way to pause / retry / reassign from outside the run loop.\n */\nexport interface SddRunControl {\n runId: string;\n specId?: string | undefined;\n pause(): void;\n resume(): void;\n stop(): void;\n retryTask(taskId: string): boolean;\n /** Requeue every failed task to pending (board \"Retry all failed\"). Returns the count. */\n retryAllFailed(): number;\n reassignTask(taskId: string, agentName: string): boolean;\n /** Set/override a task's worker model (+ optional provider). Next dispatch. */\n setTaskModel(taskId: string, model: string | undefined, provider?: string | undefined): boolean;\n /** Set/override a task's fallback model chain. Next dispatch. */\n setTaskFallbacks(taskId: string, fallbackModels: string[] | undefined): boolean;\n /** Set/override a task's completion-gate verification command. Next dispatch. */\n setTaskVerification(taskId: string, verificationCommand: string | undefined): boolean;\n /** Cancel a task — abort it if running, else mark it cancelled. */\n cancelTask(taskId: string): Promise<boolean> | boolean;\n /** Delete a not-started task from the graph (refused while running). */\n deleteTask(taskId: string): boolean;\n /** Split a task into sub-tasks (refused while running). Returns the new leaf ids. */\n splitTask(taskId: string, subtasks: SddSubtaskSpec[]): string[];\n /**\n * Remove every git worktree + branch the run created (refused while running —\n * stop first). Returns the number removed.\n */\n cleanupWorktrees(): Promise<number>;\n /**\n * Undo the run's merged commits by reverting each on the base branch (refused\n * while running). History-preserving; refuses on a dirty tree / revert conflict.\n */\n rollback(): Promise<{ ok: boolean; reverted: number; reason?: string }>;\n /** Base branch the run's squash commits land on (worktree runs only). */\n getBaseBranch(): string | undefined;\n /** Squash commits the run landed on the base branch, in landing order. */\n getMergedCommits(): ReadonlyArray<{ taskId: string; sha: string; title: string }>;\n /** Latest board snapshot (built on demand). */\n snapshot(): SddBoardSnapshot;\n isRunning(): boolean;\n}\n\n/**\n * In-process registry of the active SDD run. One run is active at a time (a\n * single fleet drives it); a new run replaces the previous. Lives in the CLI\n * process where the fleet runs.\n */\nexport class SddRunRegistry {\n private current: SddRunControl | null = null;\n\n register(control: SddRunControl): void {\n this.current = control;\n }\n\n clear(runId: string): void {\n if (this.current?.runId === runId) this.current = null;\n }\n\n getActive(): SddRunControl | null {\n return this.current;\n }\n}\n","import { expectDefined } from '../utils/expect-defined.js';\r\nimport { toErrorMessage } from '../utils/error.js';\r\nimport type { Specification, SpecRequirement, SpecSection } from '../types/spec.js';\r\nimport type { SpecStore } from './spec-store.js';\r\nimport { SddError, ERROR_CODES } from '../types/errors.js';\r\n\r\n// ─── Session Types ────────────────────────────────────────────────────────────\r\n\r\nexport type AISpecPhase =\r\n | 'questioning' // AI is asking questions\r\n | 'spec_review' // Spec generated, waiting for user approval\r\n | 'implementation' // Implementation plan phase\r\n | 'task_review' // Tasks generated, waiting for execution\r\n | 'executing' // Running tasks\r\n | 'done'; // Everything complete\r\n\r\nexport interface CollectedAnswer {\r\n question: string;\r\n answer: string;\r\n timestamp: number;\r\n}\r\n\r\nexport interface AISpecSession {\r\n id: string;\r\n phase: AISpecPhase;\r\n title: string;\r\n userIntent: string;\r\n projectContext: string;\r\n answers: CollectedAnswer[];\r\n questionCount: number;\r\n spec?: Specification | undefined;\r\n implementation?: string | undefined;\r\n taskGraphId?: string | undefined;\r\n approved: boolean;\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\n// ─── Builder Options ──────────────────────────────────────────────────────────\r\n\r\nexport interface AISpecBuilderOptions {\r\n store: SpecStore;\r\n /** Minimum questions the AI should ask. Default: 2 */\r\n minQuestions?: number | undefined;\r\n /** Maximum questions before forcing spec generation. Default: 10 */\r\n maxQuestions?: number | undefined;\r\n /** Project context string (package.json, file structure, etc.) */\r\n projectContext?: string | undefined;\r\n /** Path to persist session state. If set, session survives process restarts. */\r\n sessionPath?: string | undefined;\r\n}\r\n\r\n// ─── AI Prompts ───────────────────────────────────────────────────────────────\r\n\r\nfunction buildQuestioningPrompt(session: AISpecSession, min: number, max: number): string {\r\n const answered = session.answers.length;\r\n const remaining = Math.max(0, min - answered);\r\n const budget = max - answered;\r\n\r\n const lines: string[] = [\r\n `═══ SDD Spec Builder ═══`,\r\n `Feature: \"${session.title}\"`,\r\n session.userIntent ? `Intent: ${session.userIntent}` : '',\r\n `Phase: Questioning (${answered} answered, ${budget} remaining budget)`,\r\n '',\r\n '**Instructions for AI:**',\r\n '',\r\n 'You are conducting a specification interview. Your job is to ask the user',\r\n 'intelligent, contextual questions to understand what they want to build.',\r\n '',\r\n `You have asked ${answered} questions so far.`,\r\n ];\r\n\r\n if (remaining > 0) {\r\n lines.push(`You MUST ask at least ${remaining} more question(s) before generating the spec.`);\r\n } else if (budget <= 0) {\r\n lines.push('You have reached the maximum question budget. Generate the spec NOW.');\r\n } else {\r\n lines.push(\r\n 'You may ask more questions if needed, or generate the spec if you have enough information.',\r\n 'Ask a question ONLY if it reveals something you genuinely need to know.',\r\n );\r\n }\r\n\r\n lines.push(\r\n '',\r\n '**Rules:**',\r\n '- Ask ONE question at a time',\r\n '- Questions must be specific and contextual — never generic',\r\n '- Adapt based on previous answers',\r\n '- Cover: scope, constraints, edge cases, integrations, security, performance as relevant',\r\n '- When you have enough info, respond with the full specification in JSON format',\r\n '- This is a planning interview: respond with TEXT ONLY (a question, or the spec JSON).',\r\n ' Do NOT write or edit files, and do NOT run shell/terminal commands — the code is',\r\n ' written later, after the plan is approved.',\r\n '',\r\n `**Question budget:** ${budget}/${max} remaining`,\r\n `**Minimum required:** ${remaining > 0 ? remaining : 'met'}`,\r\n );\r\n\r\n if (session.projectContext) {\r\n lines.push('', '**Project Context:**', '```', session.projectContext, '```');\r\n }\r\n\r\n if (answered > 0) {\r\n lines.push('', '**Conversation so far:**');\r\n for (let i = 0; i < answered; i++) {\r\n const a = expectDefined(session.answers[i]);\r\n lines.push(``, `Q${i + 1}: ${a.question}`, `A${i + 1}: ${a.answer}`);\r\n }\r\n }\r\n\r\n lines.push(\r\n '',\r\n '---',\r\n 'Now either:',\r\n `1. Ask your next question (if you need more info)`,\r\n `2. Generate the complete specification as JSON (if ready)`,\r\n '',\r\n 'If generating spec, output JSON inside ```json code block with this structure:',\r\n '```json',\r\n '{',\r\n ' \"title\": \"...\",',\r\n ' \"overview\": \"...\",',\r\n ' \"sections\": [{ \"type\": \"overview|requirements|architecture|api|data|security|acceptance\", \"title\": \"...\", \"content\": \"...\", \"level\": 1 }],',\r\n ' \"requirements\": [{ \"id\": \"REQ-1\", \"type\": \"functional|non-functional|security|performance|ux\", \"priority\": \"critical|high|medium|low\", \"description\": \"...\", \"acceptanceCriteria\": [\"...\"] }]',\r\n '}',\r\n '```',\r\n );\r\n\r\n return lines.filter(Boolean).join('\\n');\r\n}\r\n\r\nfunction buildSpecReviewPrompt(session: AISpecSession): string {\r\n const spec = session.spec;\r\n if (!spec) return 'No spec generated yet.';\r\n\r\n const reqSummary = spec.requirements\r\n .map((r) => ` [${r.priority}] ${r.description}`)\r\n .join('\\n');\r\n\r\n return [\r\n `═══ Spec Review ═══`,\r\n `Feature: \"${spec.title}\"`,\r\n `Requirements: ${spec.requirements.length}`,\r\n '',\r\n '**Specification:**',\r\n spec.overview,\r\n '',\r\n '**Requirements:**',\r\n reqSummary,\r\n '',\r\n '---',\r\n 'Approve this spec? The AI will then generate an implementation plan and tasks.',\r\n 'Say \"approve\" to proceed, or describe what needs to change.',\r\n ].join('\\n');\r\n}\r\n\r\nfunction buildImplementationPrompt(session: AISpecSession): string {\r\n const spec = session.spec;\r\n if (!spec) return 'No spec to implement.';\r\n\r\n const reqList = spec.requirements\r\n .map((r) => ` - [${r.priority}] ${r.description}`)\r\n .join('\\n');\r\n\r\n return [\r\n `═══ Implementation Planning ═══`,\r\n `Feature: \"${spec.title}\"`,\r\n `Requirements: ${spec.requirements.length}`,\r\n '',\r\n '**Requirements to implement:**',\r\n reqList,\r\n '',\r\n '**Instructions for AI:**',\r\n 'Generate a detailed implementation plan for this specification.',\r\n 'This is a PLANNING step — describe the plan and emit the task JSON as TEXT. Do NOT',\r\n 'create or edit files and do NOT run shell/terminal commands here; the tasks you list',\r\n 'are executed later, one by one, after you approve them.',\r\n 'Include:',\r\n '1. Architecture decisions',\r\n '2. File structure changes',\r\n '3. Key implementation details',\r\n '4. Dependency requirements',\r\n '5. Testing strategy',\r\n '',\r\n '**IMPORTANT:** After the plan, you MUST generate executable tasks as a JSON array.',\r\n 'Each task should be a concrete, actionable step. Output the JSON inside a ```json code block:',\r\n '```json',\r\n '[',\r\n ' {',\r\n ' \"id\": \"t1\",',\r\n ' \"title\": \"Create auth middleware\",',\r\n ' \"description\": \"Implement JWT verification middleware for protected routes\",',\r\n ' \"type\": \"feature\",',\r\n ' \"priority\": \"critical\",',\r\n ' \"estimateHours\": 3,',\r\n ' \"dependsOn\": [],',\r\n ' \"tags\": [\"auth\", \"middleware\"]',\r\n ' },',\r\n ' {',\r\n ' \"id\": \"t2\",',\r\n ' \"title\": \"Write auth tests\",',\r\n ' \"description\": \"Unit and integration tests for authentication flow\",',\r\n ' \"type\": \"test\",',\r\n ' \"priority\": \"high\",',\r\n ' \"estimateHours\": 2,',\r\n ' \"dependsOn\": [\"t1\"],',\r\n ' \"tags\": [\"test\", \"auth\"]',\r\n ' }',\r\n ']',\r\n '```',\r\n '',\r\n 'Rules:',\r\n '- Give every task a short stable \"id\" (t1, t2, …). Reference prerequisites in \"dependsOn\"',\r\n ' as a list of those ids — this builds the real dependency graph that drives parallel vs',\r\n ' sequential execution.',\r\n '- \"dependsOn\": [] means the task is independent and may run in parallel with other roots.',\r\n '- A task with dependsOn runs ONLY after every listed task completes. Model true ordering:',\r\n ' tests depend on the feature they test, docs/integration depend on the parts they cover.',\r\n '- Do NOT create cycles (t1→t2→t1). Keep chains as shallow as correctness allows so',\r\n ' independent work runs concurrently.',\r\n '- Use type: \"feature\" for code, \"test\" for tests, \"docs\" for documentation, \"chore\" for config',\r\n '- Use priority: \"critical\" for blockers, \"high\" for core features, \"medium\" for nice-to-haves, \"low\" for polish',\r\n ].join('\\n');\r\n}\r\n\r\nfunction buildTaskReviewPrompt(session: AISpecSession): string {\r\n return [\r\n `═══ Task Review ═══`,\r\n `Feature: \"${session.spec?.title ?? session.title}\"`,\r\n '',\r\n session.implementation ?? 'No implementation plan yet.',\r\n '',\r\n '---',\r\n 'Ready to execute these tasks? Say \"execute\" to begin, or describe changes needed.',\r\n ].join('\\n');\r\n}\r\n\r\nfunction buildExecutingPrompt(session: AISpecSession): string {\r\n return [\r\n `═══ Task Execution ═══`,\r\n `Feature: \"${session.spec?.title ?? session.title}\"`,\r\n '',\r\n '**Instructions for AI:**',\r\n 'Execute the tasks one by one in the order shown in the task list above.',\r\n '',\r\n 'For each task:',\r\n '1. Implement the code (create/modify files)',\r\n '2. Write tests if applicable',\r\n '3. After completing a task, tell the user to run: /sdd done <task number or title>',\r\n '4. Then move to the next task',\r\n '',\r\n '**Important:**',\r\n '- Focus on ONE task at a time',\r\n '- After completing each task, explicitly state what you did',\r\n '- Tell the user: \"Run /sdd done <N> to mark this task complete\"',\r\n '- Then proceed to the next task automatically',\r\n '- When ALL tasks are done, provide a summary of everything implemented',\r\n '',\r\n 'Start executing the first pending task now.',\r\n ].join('\\n');\r\n}\r\n\r\n// ─── Spec Builder Class ───────────────────────────────────────────────────────\r\n\r\n/**\r\n * AI-driven specification builder. Instead of static questions, this builder\r\n * tracks conversation state and generates prompts that instruct the AI agent\r\n * to ask contextual questions and build specifications interactively.\r\n */\r\nexport class AISpecBuilder {\r\n private session: AISpecSession;\r\n private readonly store: SpecStore;\r\n private readonly minQuestions: number;\r\n private readonly maxQuestions: number;\r\n private readonly sessionPath?: string | undefined;\r\n\r\n constructor(opts: AISpecBuilderOptions) {\r\n this.store = opts.store;\r\n this.minQuestions = opts.minQuestions ?? 2;\r\n this.maxQuestions = opts.maxQuestions ?? 10;\r\n this.sessionPath = opts.sessionPath;\r\n this.session = {\r\n id: crypto.randomUUID(),\r\n phase: 'questioning',\r\n title: '',\r\n userIntent: '',\r\n projectContext: opts.projectContext ?? '',\r\n answers: [],\r\n questionCount: 0,\r\n approved: false,\r\n createdAt: Date.now(),\r\n updatedAt: Date.now(),\r\n };\r\n }\r\n\r\n // ── Session Persistence ──────────────────────────────────────────────────\r\n\r\n /** Save session state to disk. */\r\n async saveSession(): Promise<void> {\r\n if (!this.sessionPath) return;\r\n try {\r\n const fsp = await import('node:fs/promises');\r\n const path = await import('node:path');\r\n const { atomicWrite } = await import('../utils/atomic-write.js');\r\n await fsp.mkdir(path.dirname(this.sessionPath), { recursive: true });\r\n // atomicWrite: torn save would corrupt the SDD session JSON and the\r\n // next load would silently fall back to a fresh session.\r\n await atomicWrite(this.sessionPath, JSON.stringify(this.session, null, 2));\r\n } catch {\r\n // Best-effort persistence — don't crash if save fails\r\n }\r\n }\r\n\r\n /** Load session state from disk. Returns true if a session was loaded. */\r\n async loadSession(): Promise<boolean> {\r\n if (!this.sessionPath) return false;\r\n try {\r\n const fsp = await import('node:fs/promises');\r\n const raw = await fsp.readFile(this.sessionPath, 'utf8');\r\n const loaded = JSON.parse(raw) as AISpecSession;\r\n // Validate basic structure\r\n if (loaded?.id && loaded?.phase && loaded?.title) {\r\n this.session = loaded;\r\n return true;\r\n }\r\n } catch {\r\n // No saved session or invalid file\r\n }\r\n return false;\r\n }\r\n\r\n /** Delete saved session from disk. */\r\n async deleteSession(): Promise<void> {\r\n if (!this.sessionPath) return;\r\n try {\r\n const fsp = await import('node:fs/promises');\r\n await fsp.unlink(this.sessionPath);\r\n } catch {\r\n // File might not exist\r\n }\r\n }\r\n\r\n /** Auto-save helper — calls saveSession() but never throws.\r\n * Failures are surfaced via process.emitWarning so a persistent\r\n * ENOSPC / EACCES doesn't silently strand session edits in memory. */\r\n private autoSave(): void {\r\n this.saveSession().catch((err) => {\r\n const detail = toErrorMessage(err);\r\n process.emitWarning(\r\n `SpecBuilder autoSave failed: ${detail}`,\r\n 'SpecBuilderWarning',\r\n );\r\n });\r\n }\r\n\r\n // ── Session Lifecycle ─────────────────────────────────────────────────────\r\n\r\n /** Start a new session with a title and optional intent. */\r\n startSession(title: string, intent?: string): void {\r\n this.session.title = title;\r\n this.session.userIntent = intent ?? '';\r\n this.session.phase = 'questioning';\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n }\r\n\r\n /** Get current session state (readonly). */\r\n getSession(): Readonly<AISpecSession> {\r\n return { ...this.session };\r\n }\r\n\r\n /** Get the current phase. */\r\n getPhase(): AISpecPhase {\r\n return this.session.phase;\r\n }\r\n\r\n // ── AI Prompt Generation ──────────────────────────────────────────────────\r\n\r\n /**\r\n * Get the AI prompt for the current phase.\r\n * This prompt is injected into the conversation so the AI agent knows\r\n * what to do next (ask a question, generate a spec, etc.).\r\n */\r\n getAIPrompt(): string {\r\n switch (this.session.phase) {\r\n case 'questioning':\r\n return buildQuestioningPrompt(this.session, this.minQuestions, this.maxQuestions);\r\n case 'spec_review':\r\n return buildSpecReviewPrompt(this.session);\r\n case 'implementation':\r\n return buildImplementationPrompt(this.session);\r\n case 'task_review':\r\n return buildTaskReviewPrompt(this.session);\r\n case 'executing':\r\n return buildExecutingPrompt(this.session);\r\n case 'done':\r\n return 'All tasks completed. Specification is fully implemented.';\r\n }\r\n }\r\n\r\n // ── Answer Processing ─────────────────────────────────────────────────────\r\n\r\n /**\r\n * Record a question/answer pair from the AI conversation.\r\n * Call this when the AI asks a question and the user responds.\r\n */\r\n addAnswer(question: string, answer: string): void {\r\n this.session.answers.push({ question, answer, timestamp: Date.now() });\r\n this.session.questionCount++;\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n }\r\n\r\n /**\r\n * Check if more questions should be asked.\r\n * Returns false if max reached or if the AI has signaled it has enough info.\r\n */\r\n shouldContinueQuestioning(): boolean {\r\n return this.session.questionCount < this.maxQuestions;\r\n }\r\n\r\n /**\r\n * Check if minimum questions have been asked.\r\n */\r\n hasMetMinimumQuestions(): boolean {\r\n return this.session.questionCount >= this.minQuestions;\r\n }\r\n\r\n // ── Phase Transitions ─────────────────────────────────────────────────────\r\n\r\n /**\r\n * Set the generated specification and move to spec_review phase.\r\n */\r\n setSpec(spec: Specification): void {\r\n this.session.spec = spec;\r\n this.session.phase = 'spec_review';\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n }\r\n\r\n /**\r\n * Approve the current phase and advance to the next.\r\n * questioning → spec_review (requires spec to be set)\r\n * spec_review → implementation\r\n * implementation → task_review (requires implementation to be set)\r\n * task_review → executing\r\n * executing → done\r\n */\r\n approve(): AISpecPhase {\r\n switch (this.session.phase) {\r\n case 'questioning':\r\n if (!this.session.spec) {\r\n throw new SddError({\r\n message: 'Cannot approve: no spec generated yet.',\r\n code: ERROR_CODES.SDD_INVALID_STATE,\r\n context: { phase: 'questioning', sessionId: this.session.id },\r\n });\r\n }\r\n this.session.phase = 'spec_review';\r\n break;\r\n case 'spec_review':\r\n this.session.phase = 'implementation';\r\n break;\r\n case 'implementation':\r\n this.session.phase = 'task_review';\r\n break;\r\n case 'task_review':\r\n this.session.phase = 'executing';\r\n break;\r\n case 'executing':\r\n this.session.phase = 'done';\r\n break;\r\n case 'done':\r\n break;\r\n }\r\n this.session.approved = true;\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n return this.session.phase;\r\n }\r\n\r\n /**\r\n * Set the implementation plan text.\r\n */\r\n setImplementation(plan: string): void {\r\n this.session.implementation = plan;\r\n this.session.phase = 'task_review';\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n }\r\n\r\n /**\r\n * Mark session as done.\r\n */\r\n markDone(): void {\r\n this.session.phase = 'done';\r\n this.session.updatedAt = Date.now();\r\n this.autoSave();\r\n }\r\n\r\n /**\r\n * Set the task graph ID for this session.\r\n */\r\n setTaskGraphId(graphId: string): void {\r\n this.session.taskGraphId = graphId;\r\n this.autoSave();\r\n }\r\n\r\n /**\r\n * Get the task graph ID for this session.\r\n */\r\n getTaskGraphId(): string | undefined {\r\n return this.session.taskGraphId;\r\n }\r\n\r\n // ── Spec Persistence ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Save the current spec to the store.\r\n */\r\n async saveSpec(): Promise<Specification> {\r\n if (!this.session.spec) {\r\n throw new SddError({\r\n message: 'No spec to save.',\r\n code: ERROR_CODES.SDD_NOT_READY,\r\n context: { sessionId: this.session.id },\r\n });\r\n }\r\n await this.store.save(this.session.spec);\r\n return this.session.spec;\r\n }\r\n\r\n // ── Spec Generation Helpers ───────────────────────────────────────────────\r\n\r\n /**\r\n * Parse a spec from a JSON string (from AI output).\r\n * Validates and normalizes the structure.\r\n */\r\n parseSpecFromJSON(jsonStr: string): Specification {\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(jsonStr);\r\n } catch (e) {\r\n throw new SddError({\r\n message: 'Invalid JSON for spec',\r\n code: ERROR_CODES.SDD_PARSE_FAILED,\r\n cause: e,\r\n context: { detail: e instanceof Error ? e.message : 'parse error' },\r\n });\r\n }\r\n\r\n if (!parsed || typeof parsed !== 'object') {\r\n throw new SddError({\r\n message: 'Spec JSON must be an object',\r\n code: ERROR_CODES.SDD_VALIDATION_FAILED,\r\n context: { actualType: typeof parsed },\r\n });\r\n }\r\n\r\n const raw = parsed as Record<string, unknown>;\r\n const now = Date.now();\r\n\r\n const title = String(raw.title ?? this.session.title ?? 'Untitled');\r\n const overview = String(raw.overview ?? '');\r\n\r\n // Validate overview is not empty\r\n if (!overview || overview === 'undefined') {\r\n throw new SddError({\r\n message: 'Spec must have an overview',\r\n code: ERROR_CODES.SDD_VALIDATION_FAILED,\r\n context: { field: 'overview', title },\r\n });\r\n }\r\n\r\n const rawSections = Array.isArray(raw.sections) ? raw.sections : [];\r\n const sections: SpecSection[] = rawSections\r\n .filter((s: unknown) => s && typeof s === 'object')\r\n .map((s: Record<string, unknown>) => ({\r\n type: (['overview', 'requirements', 'architecture', 'api', 'data', 'security', 'acceptance']\r\n .includes(String(s.type)) ? String(s.type) : 'overview') as SpecSection['type'],\r\n title: String(s.title ?? ''),\r\n content: String(s.content ?? ''),\r\n level: Number(s.level) || 1,\r\n }));\r\n\r\n const rawReqs = Array.isArray(raw.requirements) ? raw.requirements : [];\r\n const requirements: SpecRequirement[] = rawReqs\r\n .filter((r: unknown) => r && typeof r === 'object')\r\n .map((r: Record<string, unknown>, i: number) => ({\r\n id: String(r.id ?? `REQ-${i + 1}`),\r\n type: (['functional', 'non-functional', 'security', 'performance', 'ux']\r\n .includes(String(r.type)) ? String(r.type) : 'functional') as SpecRequirement['type'],\r\n priority: (['critical', 'high', 'medium', 'low']\r\n .includes(String(r.priority)) ? String(r.priority) : 'medium') as SpecRequirement['priority'],\r\n description: String(r.description ?? ''),\r\n acceptanceCriteria: Array.isArray(r.acceptanceCriteria)\r\n ? r.acceptanceCriteria.map(String)\r\n : [],\r\n }));\r\n\r\n const spec: Specification = {\r\n id: crypto.randomUUID(),\r\n title,\r\n version: '0.1.0',\r\n status: 'draft',\r\n overview,\r\n sections,\r\n requirements,\r\n createdAt: now,\r\n updatedAt: now,\r\n metadata: {\r\n generatedBy: 'AISpecBuilder',\r\n sessionId: this.session.id,\r\n },\r\n };\r\n\r\n return spec;\r\n }\r\n\r\n /**\r\n * Extract JSON from AI output (handles ```json blocks and raw JSON).\r\n */\r\n extractJSON(text: string): string | null {\r\n // Try ```json ... ``` first\r\n const codeBlockMatch = text.match(/```json\\s*([\\s\\S]*?)```/);\r\n if (codeBlockMatch?.[1]) {\r\n return codeBlockMatch[1].trim();\r\n }\r\n\r\n // Try ``` ... ``` without language tag\r\n const genericBlockMatch = text.match(/```\\s*([\\s\\S]*?)```/);\r\n if (genericBlockMatch?.[1]) {\r\n const trimmed = genericBlockMatch[1].trim();\r\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\r\n return trimmed;\r\n }\r\n }\r\n\r\n // Try raw JSON object\r\n const jsonMatch = text.match(/(\\{[\\s\\S]*\\})/);\r\n if (jsonMatch?.[1]) {\r\n try {\r\n JSON.parse(jsonMatch[1]);\r\n return jsonMatch[1];\r\n } catch {\r\n // not valid JSON\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Detect if AI output contains a spec (JSON block).\r\n */\r\n hasSpecInOutput(text: string): boolean {\r\n return this.extractJSON(text) !== null;\r\n }\r\n\r\n /**\r\n * Try to parse a spec from AI output text.\r\n * Returns null if no valid spec found.\r\n */\r\n tryParseSpecFromOutput(text: string): Specification | null {\r\n const json = this.extractJSON(text);\r\n if (!json) return null;\r\n\r\n try {\r\n return this.parseSpecFromJSON(json);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n // ── JSON Array Extraction (for tasks) ─────────────────────────────────────\r\n\r\n /**\r\n * Extract a JSON array from AI output (for task lists).\r\n */\r\n extractJSONArray(text: string): string | null {\r\n const codeBlockMatch = text.match(/```json\\s*([\\s\\S]*?)```/);\r\n if (codeBlockMatch?.[1]) {\r\n const trimmed = codeBlockMatch[1].trim();\r\n if (trimmed.startsWith('[')) return trimmed;\r\n }\r\n\r\n const arrayMatch = text.match(/(\\[[\\s\\S]*\\])/);\r\n if (arrayMatch?.[1]) {\r\n try {\r\n const parsed = JSON.parse(arrayMatch[1]);\r\n if (Array.isArray(parsed)) return arrayMatch[1];\r\n } catch {\r\n // not valid\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","// SddInterviewDriver — a headless, REPL-free wrapper around AISpecBuilder that\n// drives the interactive Spec-Driven-Development interview (questioning → spec\n// → implementation plan → task graph) from any surface (WebUI, CLI, tests).\n//\n// The CLI `/sdd` slash command historically owned this loop via module-singleton\n// state (`sddState`) plus thin detection helpers in `packages/cli` — which the\n// WebUI cannot import (layer rule: webui ⇏ cli). This driver lifts the *pure*\n// logic into core so every surface shares one implementation: feed it the\n// agent's text output, it detects the spec / plan / task JSON, advances the\n// AISpecBuilder phases, and persists the resulting TaskGraph to disk so the run\n// machinery (SddParallelRun) can pick it up.\n//\n// The driver never runs the agent itself — the caller runs `agent.run(prompt)`\n// and feeds the output back via `ingestAgentOutput`. That keeps core free of any\n// agent-loop / provider coupling.\n\nimport type { Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { AISpecBuilder, type AISpecPhase } from './spec-builder.js';\nimport type { SpecStore } from './spec-store.js';\nimport type { TaskGraphStore } from './task-graph-store.js';\nimport { TaskTracker } from './task-tracker.js';\nimport { DefaultTaskStore, TaskGenerator } from './task-generator.js';\nimport { buildBoardTasks, type SddBoardTask, type SddBoardColumn } from './board-types.js';\n\nexport interface SddInterviewDriverOptions {\n /** Disk-backed spec store (`wpaths.projectSpecs`). */\n specStore: SpecStore;\n /** Disk-backed task-graph store (`wpaths.projectTaskGraphs`). */\n graphStore: TaskGraphStore;\n /** Persist the interview session here so a reconnect can resume it. */\n sessionPath?: string | undefined;\n /** Project context string injected into the questioning prompt. */\n projectContext?: string | undefined;\n minQuestions?: number | undefined;\n maxQuestions?: number | undefined;\n}\n\n/** A serialisable view of the interview, streamed to observing surfaces. */\nexport interface SddInterviewSnapshot {\n sessionId: string;\n phase: AISpecPhase;\n title: string;\n /** The operator's original goal prompt (verbatim). `title` is a short heading. */\n goal: string;\n questionCount: number;\n minQuestions: number;\n maxQuestions: number;\n answers: Array<{ question: string; answer: string }>;\n spec?:\n | {\n id: string;\n title: string;\n overview: string;\n requirements: Array<{ priority: string; description: string }>;\n }\n | undefined;\n graphId?: string | undefined;\n taskCount: number;\n /**\n * Topologically-laid-out task graph (once decomposed) — lets the wizard\n * render the same animated DAG as the live board (\"decomposition reveal\").\n */\n board?: { tasks: SddBoardTask[]; columns: SddBoardColumn[] } | undefined;\n /** The current AI prompt for this phase (what to send the agent next). */\n prompt: string;\n}\n\n/** What `ingestAgentOutput` detected and acted on. */\nexport interface SddIngestResult {\n specDetected: boolean;\n implementationDetected: boolean;\n tasksDetected: boolean;\n graphId?: string | undefined;\n}\n\nexport class SddInterviewDriver {\n readonly builder: AISpecBuilder;\n private readonly o: SddInterviewDriverOptions;\n private readonly minQuestions: number;\n private readonly maxQuestions: number;\n private tracker: TaskTracker | null = null;\n private graph: TaskGraph | null = null;\n\n constructor(opts: SddInterviewDriverOptions) {\n this.o = opts;\n this.minQuestions = opts.minQuestions ?? 2;\n this.maxQuestions = opts.maxQuestions ?? 10;\n this.builder = new AISpecBuilder({\n store: opts.specStore,\n sessionPath: opts.sessionPath,\n projectContext: opts.projectContext,\n minQuestions: this.minQuestions,\n maxQuestions: this.maxQuestions,\n });\n }\n\n /** Begin a fresh interview. Returns the first AI prompt (a question kickoff). */\n start(title: string, intent?: string): string {\n this.builder.startSession(title, intent);\n this.tracker = null;\n this.graph = null;\n return this.builder.getAIPrompt();\n }\n\n /**\n * Resume a previously-persisted interview from disk. Re-hydrates the task\n * graph too when one was already produced. Returns true if a session loaded.\n */\n async loadExisting(): Promise<boolean> {\n const loaded = await this.builder.loadSession();\n if (!loaded) return false;\n const graphId = this.builder.getTaskGraphId();\n if (graphId) {\n const graph = await this.o.graphStore.load(graphId);\n if (graph) {\n this.graph = graph;\n const tracker = new TaskTracker({ store: new DefaultTaskStore() });\n tracker.setGraph(graph);\n this.tracker = tracker;\n }\n }\n return true;\n }\n\n phase(): AISpecPhase {\n return this.builder.getPhase();\n }\n\n currentPrompt(): string {\n return this.builder.getAIPrompt();\n }\n\n getTracker(): TaskTracker | null {\n return this.tracker;\n }\n\n getGraph(): TaskGraph | null {\n return this.graph;\n }\n\n /** Record a Q/A pair (the agent asked `question`, the user replied `answer`). */\n submitAnswer(question: string, answer: string): void {\n this.builder.addAnswer(question, answer);\n }\n\n /**\n * Feed the agent's text output back into the interview. Detects, in order:\n * 1. a Specification JSON → setSpec (phase → spec_review) + persist to SpecStore\n * 2. an implementation plan (implementation phase) → setImplementation\n * 3. a task JSON array → build + persist a TaskGraph\n * Each step is independent and best-effort; a malformed payload is ignored\n * rather than thrown, so a chatty agent turn never breaks the interview.\n */\n async ingestAgentOutput(text: string): Promise<SddIngestResult> {\n const result: SddIngestResult = {\n specDetected: false,\n implementationDetected: false,\n tasksDetected: false,\n };\n\n // 1. Spec JSON → spec_review.\n if (!this.builder.getSession().spec) {\n const spec = this.builder.tryParseSpecFromOutput(text);\n if (spec) {\n this.builder.setSpec(spec);\n await this.persistSpec(spec);\n result.specDetected = true;\n }\n }\n\n // 2. Implementation plan (only meaningful in the implementation phase).\n if (this.builder.getPhase() === 'implementation') {\n if (this.trySaveImplementationPlan(text)) result.implementationDetected = true;\n }\n\n // 3. Task JSON array → TaskGraph (requires a spec to anchor the graph).\n const session = this.builder.getSession();\n if (session.spec) {\n const built = await this.tryBuildTasksFromOutput(text);\n if (built) {\n result.tasksDetected = true;\n result.graphId = built;\n }\n }\n\n return result;\n }\n\n /**\n * Advance to the next phase (mirrors `/sdd approve`). When moving into the\n * executing phase, guarantees a task graph exists — deterministically\n * generating one from the approved spec if the agent never emitted a valid\n * task array. Returns the new phase and its AI prompt.\n */\n async approve(): Promise<{ phase: AISpecPhase; prompt: string }> {\n const phase = this.builder.approve();\n if (phase === 'executing') {\n await this.ensureTaskGraph();\n }\n return { phase, prompt: this.builder.getAIPrompt() };\n }\n\n /**\n * Ensure a TaskGraph exists for the approved spec. If the agent already\n * produced one (via `ingestAgentOutput`), returns it; otherwise builds a\n * deterministic graph from the spec's requirements via TaskGenerator. This is\n * the robustness backstop: a run can always start, even if the model never\n * emitted a parseable task array.\n */\n async ensureTaskGraph(): Promise<TaskGraph | null> {\n if (this.graph) return this.graph;\n const spec = this.builder.getSession().spec;\n if (!spec) return null;\n\n const tracker = new TaskTracker({ store: new DefaultTaskStore() });\n const generator = new TaskGenerator({\n taskTracker: tracker,\n verificationFromAcceptance: process.env['WRONGSTACK_SDD_VERIFY_FROM_ACCEPTANCE'] === '1',\n });\n const graph = await generator.generateFromSpec(spec);\n this.tracker = tracker;\n this.graph = graph;\n await this.persistGraph(graph);\n this.builder.setTaskGraphId(graph.id);\n // Flush the session synchronously so a reconnect (loadExisting) sees the\n // graphId — setTaskGraphId's own auto-save is fire-and-forget.\n await this.builder.saveSession();\n return graph;\n }\n\n snapshot(): SddInterviewSnapshot {\n const s = this.builder.getSession();\n const spec = s.spec;\n return {\n sessionId: s.id,\n phase: s.phase,\n title: s.title,\n goal: s.userIntent || s.title,\n questionCount: s.questionCount,\n minQuestions: this.minQuestions,\n maxQuestions: this.maxQuestions,\n answers: s.answers.map((a) => ({ question: a.question, answer: a.answer })),\n spec: spec\n ? {\n id: spec.id,\n title: spec.title,\n overview: spec.overview,\n requirements: spec.requirements.map((r) => ({\n priority: r.priority,\n description: r.description,\n })),\n }\n : undefined,\n graphId: s.taskGraphId,\n taskCount: this.graph ? this.graph.nodes.size : 0,\n board: this.graph ? buildBoardTasks(this.graph) : undefined,\n prompt: this.builder.getAIPrompt(),\n };\n }\n\n // ── internals ────────────────────────────────────────────────────────────\n\n private async persistSpec(spec: Specification): Promise<void> {\n try {\n await this.o.specStore.save(spec);\n } catch {\n // best-effort — the in-memory session still has the spec\n }\n }\n\n private async persistGraph(graph: TaskGraph): Promise<void> {\n try {\n await this.o.graphStore.save(graph);\n } catch {\n // best-effort — the in-memory tracker still drives the run\n }\n }\n\n /**\n * Port of the CLI `trySaveImplementationPlan` operating on this driver's\n * builder. Captures the prose plan that precedes the task JSON block.\n */\n private trySaveImplementationPlan(text: string): boolean {\n const current = this.builder.getSession().implementation ?? '';\n const jsonStart = text.match(/```json\\s*\\[/);\n if (jsonStart?.index && jsonStart.index > 0) {\n const plan = text.substring(0, jsonStart.index).trim();\n if (plan.length > 50 && plan !== current && !isExplanatoryText(plan)) {\n this.builder.setImplementation(plan);\n return true;\n }\n }\n if (\n text.length > 100 &&\n !text.includes('```json') &&\n text.trim() !== current &&\n !isExplanatoryText(text)\n ) {\n this.builder.setImplementation(text.trim());\n return true;\n }\n return false;\n }\n\n /**\n * Port of the CLI `trySaveTasksFromAIOutput`: parse a task JSON array from the\n * agent output, build (or extend) the tracker + graph, persist to disk, and\n * link the graphId to the session. Returns the graphId on success.\n */\n private async tryBuildTasksFromOutput(text: string): Promise<string | undefined> {\n const json = this.builder.extractJSONArray(text);\n if (!json) return undefined;\n\n let tasks: Array<Record<string, unknown>>;\n try {\n tasks = JSON.parse(json) as Array<Record<string, unknown>>;\n } catch {\n return undefined;\n }\n const valid = tasks.filter(\n (t) => t && typeof t === 'object' && typeof t.title === 'string' && t.title.length > 0,\n );\n if (valid.length === 0) return undefined;\n\n const spec = this.builder.getSession().spec;\n if (!spec) return undefined;\n\n if (!this.tracker || !this.graph) {\n const tracker = new TaskTracker({ store: new DefaultTaskStore() });\n this.graph = await tracker.createGraph(spec.id, spec.title);\n this.tracker = tracker;\n }\n // Two passes: (1) create every node, recording every reference key by which\n // a `dependsOn` entry might name it (declared id, positional `t1`/`1`, title);\n // (2) resolve each task's `dependsOn` refs into real `depends_on` edges. This\n // is what turns a flat task list into a true dependency DAG — the scheduler\n // then runs independent tasks in parallel and dependent ones in order.\n const refMap = new Map<string, string>();\n const created: Array<{ nodeId: string; task: Record<string, unknown> }> = [];\n valid.forEach((task, i) => {\n const node = addTaskToTracker(this.tracker!, task);\n created.push({ nodeId: node.id, task });\n if (typeof task.id === 'string' && task.id.trim()) {\n refMap.set(task.id.trim().toLowerCase(), node.id);\n }\n refMap.set(`t${i + 1}`, node.id);\n refMap.set(String(i + 1), node.id);\n refMap.set(normalizeTaskRef(String(task.title)), node.id);\n });\n for (const { nodeId, task } of created) {\n const deps = Array.isArray(task.dependsOn) ? task.dependsOn : [];\n for (const ref of deps) {\n const depId = refMap.get(normalizeTaskRef(String(ref)));\n // addDependency self/duplicate/cycle-guards; a stale ref just no-ops.\n if (depId && depId !== nodeId) this.tracker!.addDependency(depId, nodeId);\n }\n }\n await this.persistGraph(this.graph);\n this.builder.setTaskGraphId(this.graph.id);\n // Flush so a reconnect resumes with the graph linked (see ensureTaskGraph).\n await this.builder.saveSession();\n return this.graph.id;\n }\n}\n\nconst TASK_TYPES = ['feature', 'bugfix', 'refactor', 'docs', 'test', 'chore'] as const;\nconst TASK_PRIORITIES = ['critical', 'high', 'medium', 'low'] as const;\n\n/** Normalize a dependsOn reference (id / positional / title) for map lookup. */\nfunction normalizeTaskRef(ref: string): string {\n return ref.trim().toLowerCase();\n}\n\nfunction addTaskToTracker(tracker: TaskTracker, task: Record<string, unknown>): TaskNode {\n return tracker.addNode({\n title: String(task.title),\n description: String(task.description ?? ''),\n type: (TASK_TYPES as readonly string[]).includes(String(task.type))\n ? (String(task.type) as (typeof TASK_TYPES)[number])\n : 'feature',\n priority: (TASK_PRIORITIES as readonly string[]).includes(String(task.priority))\n ? (String(task.priority) as (typeof TASK_PRIORITIES)[number])\n : 'medium',\n status: 'pending',\n estimateHours: Number(task.estimateHours) || 2,\n tags: Array.isArray(task.tags) ? task.tags.map(String) : [],\n });\n}\n\n/**\n * True when the text reads like conversational filler rather than a structured\n * implementation plan. Ported verbatim from the CLI detection so behaviour is\n * identical across surfaces.\n */\nexport function isExplanatoryText(text: string): boolean {\n const lower = text.toLowerCase();\n return (\n lower.startsWith(\"i'\") ||\n lower.startsWith('i will') ||\n lower.startsWith('let me') ||\n lower.startsWith(\"here's my\") ||\n lower.startsWith('here is my') ||\n lower.startsWith(\"i'm going to\") ||\n lower.startsWith('first, let me') ||\n lower.startsWith('sure') ||\n lower.startsWith('of course') ||\n lower.startsWith('okay') ||\n lower.startsWith('ok,') ||\n lower.startsWith('sounds good') ||\n lower.startsWith('no problem') ||\n (text.split('\\n').length < 3 && !text.includes('.'))\n );\n}\n","import { expectDefined } from '../utils/expect-defined.js';\n/**\n * SddParallelRun\n *\n * Drives a TaskGraph through ParallelEternalEngine's infrastructure\n * (DefaultMultiAgentCoordinator + AgentSubagentRunner) but powered by\n * SddTaskDecomposer — producing dependency-aware waves instead of\n * goal-driven iterations.\n *\n * One-shot: completes when all tasks are done OR a deadlock is detected.\n * Does NOT loop — each run() call is a discrete execution.\n *\n * Usage:\n * ```\n * const run = new SddParallelRun({ tracker, graph, agent, projectRoot });\n * await run.run({ onWave });\n * // or with progress callback:\n * await run.run({ onProgress: (p) => console.log(renderProgress(p)) });\n * ```\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { Agent } from '../core/agent.js';\nimport type { SubagentConfig, TaskResult } from '../types/multi-agent.js';\nimport type { AgentFactory } from '../coordination/agent-subagent-runner.js';\nimport { makeAgentSubagentRunner, withDisabledToolFiltering } from '../coordination/agent-subagent-runner.js';\nimport { DefaultMultiAgentCoordinator } from '../coordination/multi-agent-coordinator.js';\nimport { assignNickname } from '../coordination/subagent-nicknames.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { WorktreeHandle, WorktreeManager } from '../worktree/worktree-manager.js';\nimport type { MultiAgentConfig } from '../types/multi-agent.js';\nimport type { TaskGraph, TaskNode, TaskProgress } from '../types/task-graph.js';\nimport type { TaskTracker } from './task-tracker.js';\nimport { SddError, ERROR_CODES } from '../types/errors.js';\nimport { SddTaskDecomposer, type TaskBatch } from './sdd-task-decomposer.js';\n/** A sub-task produced by splitting a parent task (see `splitTask`). */\nexport interface SddSubtaskSpec {\n title: string;\n description: string;\n type?: TaskNode['type'] | undefined;\n priority?: TaskNode['priority'] | undefined;\n}\n\n/**\n * Verdict returned by the optional failure supervisor when a task is about to go\n * terminal. `retry` re-queues with a fresh attempt budget; `reassign` swaps the\n * worker model (+ optional provider) then re-queues; `split` breaks the task\n * into sub-tasks; `fail` (or `undefined`) lets it terminal-fail.\n */\nexport type SddSupervisorVerdict =\n | { action: 'retry' }\n | { action: 'reassign'; model?: string | undefined; provider?: string | undefined }\n | { action: 'split'; subtasks: SddSubtaskSpec[] }\n | { action: 'fail' };\n\nexport interface SddParallelRunOptions {\n /** Pre-constructed TaskTracker (must already hold the graph's initial state). */\n tracker: TaskTracker;\n /** The TaskGraph produced by TaskGenerator from an approved spec. */\n graph: TaskGraph;\n /** The main agent — used as the subagent factory. */\n agent: Agent;\n /** Project root (used for coordinator id). */\n projectRoot: string;\n /**\n * Override default parallel slots (1–16). Default: 2 — deliberately low so a\n * run never juggles more git worktrees than a human can review. Independent\n * tasks still run concurrently up to this cap; dependency chains run in order.\n */\n parallelSlots?: number | undefined;\n /**\n * Hard wall-clock cap per task in ms. OPT-IN — `undefined` by default so a\n * long-but-productive task is never killed merely for running long (the old\n * 5-min default hard-killed real coding tasks with `budget_timeout`). When\n * set, the coordinator watchdog enforces it. Prefer `taskIdleTimeoutMs`.\n */\n taskTimeoutMs?: number | undefined;\n /**\n * Idle reaper per task in ms: reap a task only after this long with NO\n * activity (iteration / tool call / streamed token / tool progress). Resets\n * on every sign of forward motion, so an actively-working agent runs until\n * its task naturally ends. Default: 600_000 (10 min of silence = genuinely\n * stuck). This is the default guard — wall-clock (`taskTimeoutMs`) is opt-in.\n */\n taskIdleTimeoutMs?: number | undefined;\n /** Maximum in-run retry attempts for a failed task before it goes terminal. Default: 3. */\n maxRetries?: number | undefined;\n /**\n * After the graph settles with terminal-failed tasks, requeue ALL failed\n * (non-cancelled) tasks to `pending` and run them again — up to this many\n * sweeps. Each sweep gives every failed task a fresh `maxRetries` budget. The\n * loop stops early once a sweep produces no new completions (no progress).\n * 0 = off. Default: 2.\n */\n maxFailedRetrySweeps?: number | undefined;\n /** Override the default agent factory. */\n subagentFactory?: AgentFactory | undefined;\n /**\n * Run-level default model for worker subagents. A task's own\n * `metadata.model` (set per-task in the WebUI) takes precedence; this is the\n * fallback for every task that has no explicit assignment. Undefined → the\n * factory's own default (the leader's model).\n */\n defaultModel?: string | undefined;\n /** Run-level default provider id (same precedence rules as defaultModel). */\n defaultProvider?: string | undefined;\n /**\n * Run-level fallback model chain (entries: `model` / `provider/model`). A\n * task's `metadata.fallbackModels` overrides this. The subagent factory wires\n * these into a fallback extension so a 429/stream-hang rotates to the next.\n */\n fallbackModels?: string[] | undefined;\n /**\n * Post-task verification gate. When set, a task whose worker reported success\n * is NOT marked `completed` (and NOT merged) until this resolves `{ok:true}`.\n * Runs in the task's worktree cwd (or the project root when no worktree). Core\n * stays shell-agnostic — the caller injects a verifier that, e.g., runs the\n * task's `metadata.verificationCommand` (tests / typecheck). A task with no\n * command should return `{ok:true}`. An `{ok:false}` routes the task into the\n * normal failure path (retry while attempts remain, else terminal-fail).\n */\n verifyTask?:\n | ((info: { task: TaskNode; result: TaskResult; cwd: string }) => Promise<{ ok: boolean; reason?: string }>)\n | undefined;\n /**\n * Optional merge-conflict resolver, forwarded to `WorktreeManager.merge`. Given\n * the conflicted files + the base checkout cwd, return `true` once resolved (no\n * markers left). When omitted or it returns `false`, the task is requeued (a\n * re-run forks a fresh worktree off the advanced base) and, if retries are\n * exhausted, terminally failed with its worktree kept for review.\n */\n conflictResolver?:\n | ((info: { task: TaskNode; conflictFiles: string[]; cwd: string }) => Promise<boolean>)\n | undefined;\n /**\n * Failure supervisor: consulted ONLY when a task has exhausted its retries and\n * is about to go terminal-failed. Returning a verdict lets a decision agent\n * keep the run moving — `retry` / `reassign` (swap model) / `split` — instead\n * of dead-ending. Returning `{action:'fail'}` / `undefined` lets it fail. Each\n * task can be rescued at most `maxSupervisorEscalations` times (loop guard).\n */\n superviseFailure?:\n | ((info: { task: TaskNode; error: string; attempts: number }) => Promise<SddSupervisorVerdict | undefined>)\n | undefined;\n /** Max times the supervisor may rescue a single task before it must fail. Default 2. */\n maxSupervisorEscalations?: number | undefined;\n /** Called after each wave completes. */\n onWave?: ((wave: WaveResult) => void) | undefined;\n /** Called with progress stats every ~2s during execution. */\n onProgress?: ((progress: SddProgress) => void) | undefined;\n /** Shared EventBus — when set, the run emits `sdd.*` live-board events. */\n events?: EventBus | undefined;\n /** Parent session id for every emitted `sdd.*` event. */\n sessionId?: string | (() => string | undefined) | undefined;\n /** Stable id correlating all events of this run (default: random). */\n runId?: string | undefined;\n /**\n * Optional git-worktree manager. When set (and the project is a git repo),\n * each task runs in its own isolated worktree and merges back into the base\n * branch after success — so parallel agents never collide on the same files.\n */\n worktrees?: WorktreeManager | undefined;\n /** Run-level backstops (prevent an autonomous run from looping forever). */\n maxTotalWaves?: number | undefined;\n maxWallClockMs?: number | undefined;\n /**\n * Deadlock auto-recovery rounds: when the graph deadlocks on failed blockers,\n * requeue those failed blockers `pending` and try again, up to N times. 0 = off.\n */\n maxRecoveryRounds?: number | undefined;\n}\n\nexport interface SddProgress {\n wave: number;\n total: number;\n completed: number;\n inProgress: number;\n failed: number;\n blocked: number;\n pending: number;\n percent: number;\n deadlocked: boolean;\n}\n\nexport interface WaveResult {\n wave: number;\n batch: TaskBatch;\n results: TaskResult[];\n successCount: number;\n failCount: number;\n durationMs: number;\n stopRequested: boolean;\n}\n\n/** Result of a single task's execution in the continuous scheduler. */\ninterface TaskOutcome {\n taskId: string;\n success: boolean;\n result?: TaskResult | undefined;\n}\n\nexport interface RunResult {\n totalWaves: number;\n totalCompleted: number;\n totalFailed: number;\n totalDurationMs: number;\n deadlocked: boolean;\n stopRequested: boolean;\n finalProgress: TaskProgress;\n}\n\nexport class SddParallelRun {\n private readonly slots: number;\n /** Opt-in hard wall-clock cap (undefined → no cap; idle reaper guards instead). */\n private readonly timeoutMs: number | undefined;\n /** Idle reaper window (ms) — resets on activity; reaps only a genuine stall. */\n private readonly idleTimeoutMs: number;\n private readonly maxRetries: number;\n /** Max supervisor rescues per task before it must terminal-fail (loop guard). */\n private readonly maxSupervisorEscalations: number;\n /** Per-task count of supervisor rescues used (resets nothing — bounds the loop). */\n private supervisorEscalations = new Map<string, number>();\n /** Max end-of-run failed-task sweeps (see `maxFailedRetrySweeps`). */\n private readonly maxFailedSweeps: number;\n /** How many failed-task sweeps have run this `run()` so far. */\n private failedSweeps = 0;\n /** Completed-count snapshot at the last sweep, to detect a no-progress sweep. */\n private lastSweepCompleted = 0;\n private decomposer: SddTaskDecomposer;\n private coordinator: DefaultMultiAgentCoordinator | null = null;\n private stopRequested = false;\n private retryMap = new Map<string, number>();\n readonly runId: string;\n private readonly events?: EventBus | undefined;\n private readonly sessionIdSource: string | (() => string | undefined) | undefined;\n private readonly maxTotalWaves: number;\n private readonly maxWallClockMs?: number | undefined;\n private readonly maxRecoveryRounds: number;\n private recoveryRounds = 0;\n /** Per-run worker identities, so the board shows \"who is on what\". */\n private usedNicknames = new Set<string>();\n /** Per-task git worktree cwd (Layer 2 worktree isolation; empty otherwise). */\n private taskCwds = new Map<string, string>();\n /** Per-task git worktree branch, for board display. */\n private taskBranches = new Map<string, string>();\n /** Live worktree handles keyed by task id (for commit/merge/release). */\n private taskWorktrees = new Map<string, WorktreeHandle>();\n /** Live subagent id per running task — lets cancelTask() abort exactly one. */\n private taskSubagents = new Map<string, string>();\n /** Tasks the user cancelled mid-flight — skip retry, mark terminal-cancelled. */\n private cancelledTasks = new Set<string>();\n /**\n * Base branch the run's squash commits land on (captured once at start when\n * worktrees are enabled). Anchors a later `rollback()`.\n */\n private baseBranch: string | undefined;\n /**\n * Squash-merge commits this run landed on the base branch, in landing order.\n * `rollback()` reverts these (newest → oldest). Persisted via the board\n * snapshot so a post-run rollback can read them off disk.\n */\n private mergedCommits: Array<{ taskId: string; sha: string; title: string }> = [];\n /** Monotonic dispatch counter (unique subagent ids) + dispatch-round counter. */\n private dispatchSeq = 0;\n private round = 0;\n\n constructor(private readonly opts: SddParallelRunOptions) {\n this.slots = Math.min(16, Math.max(1, opts.parallelSlots ?? 2));\n // Wall-clock cap is OPT-IN (undefined → none). The idle reaper is the\n // default guard: it resets on every activity signal so a productive task\n // is never killed for running long — only a genuine stall is reaped.\n this.timeoutMs = opts.taskTimeoutMs;\n this.idleTimeoutMs = Math.max(1, opts.taskIdleTimeoutMs ?? 600_000);\n this.maxRetries = Math.max(0, opts.maxRetries ?? 3);\n this.maxSupervisorEscalations = Math.max(0, opts.maxSupervisorEscalations ?? 2);\n this.maxFailedSweeps = Math.max(0, opts.maxFailedRetrySweeps ?? 2);\n this.runId = opts.runId ?? `sdd-${randomUUID().slice(0, 8)}`;\n this.events = opts.events;\n this.sessionIdSource = opts.sessionId;\n // Backstop: even with retries + recovery the loop must terminate. Derive a\n // generous ceiling from the graph size unless the caller pins one.\n this.maxTotalWaves =\n opts.maxTotalWaves ?? opts.graph.nodes.size * (this.maxRetries + 2) + 10;\n this.maxWallClockMs = opts.maxWallClockMs;\n this.maxRecoveryRounds = Math.max(0, opts.maxRecoveryRounds ?? 0);\n this.decomposer = new SddTaskDecomposer(opts.tracker, opts.graph, { parallelSlots: this.slots });\n }\n\n /** Type-safe emit on the optional EventBus (no-op when unwired). */\n private emit<K extends keyof import('../kernel/events.js').EventMap>(\n event: K,\n payload: import('../kernel/events.js').EventMap[K],\n ): void {\n const sessionId = this.currentSessionId();\n this.events?.emit(\n event,\n (sessionId ? { ...payload, sessionId } : payload) as import('../kernel/events.js').EventMap[K],\n );\n }\n\n private currentSessionId(): string | undefined {\n const value =\n typeof this.sessionIdSource === 'function'\n ? this.sessionIdSource()\n : this.sessionIdSource;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\n\n // -------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------\n\n private paused = false;\n\n /** Trigger stop — causes run() to abort after the current wave. */\n stop(): void {\n this.stopRequested = true;\n this.paused = false;\n this.coordinator?.stopAll();\n }\n\n /** Pause: no new wave starts until resume() (the current wave finishes). */\n pause(): void {\n this.paused = true;\n }\n resume(): void {\n this.paused = false;\n }\n isPaused(): boolean {\n return this.paused;\n }\n isRunning(): boolean {\n return !this.stopRequested && !this.decomposer.isSettled();\n }\n\n /** Base branch the run's squash commits land on (undefined when worktrees off). */\n getBaseBranch(): string | undefined {\n return this.baseBranch;\n }\n\n /** Squash commits this run landed on the base branch, in landing order. */\n getMergedCommits(): ReadonlyArray<{ taskId: string; sha: string; title: string }> {\n return this.mergedCommits;\n }\n\n /**\n * Remove every git worktree + branch this run (and any prior run) created.\n * Refuses while the run is still live — cleaning a checkout under an active\n * worker would corrupt it. Stop first. Returns the number of worktrees removed\n * (0 when worktrees are disabled). Idempotent.\n */\n async cleanupWorktrees(): Promise<number> {\n if (this.isRunning()) return 0;\n const wt = this.opts.worktrees;\n if (!wt) return 0;\n // Release any handles this run still holds (kept on stop / needs-review).\n for (const [taskId, handle] of [...this.taskWorktrees]) {\n await wt.release(handle, { keep: false }).catch(() => {});\n this.forgetWorktree(taskId);\n }\n const { removed } = await wt.cleanupAllManaged();\n return removed;\n }\n\n /**\n * Undo the run's merged commits by reverting each on the base branch (history\n * preserving). Refuses while the run is still live (stop first). Returns the\n * revert outcome; a dirty tree or revert conflict surfaces as `ok:false`.\n */\n async rollback(): Promise<{ ok: boolean; reverted: number; reason?: string }> {\n if (this.isRunning()) return { ok: false, reverted: 0, reason: 'run still active — stop it first' };\n const wt = this.opts.worktrees;\n if (!wt || !this.baseBranch) {\n return { ok: false, reverted: 0, reason: 'no worktree run to roll back' };\n }\n return wt.revertCommits(\n this.baseBranch,\n this.mergedCommits.map((c) => c.sha),\n );\n }\n\n /** Requeue a task to `pending` so the scheduler re-runs it (clears retries + cancel marker). */\n retryTask(taskId: string): boolean {\n if (!this.opts.tracker.getNode(taskId)) return false;\n this.retryMap.delete(taskId);\n this.persistRetries(taskId, 0);\n // Clear any cancel marker so a previously-cancelled task can run again.\n this.cancelledTasks.delete(taskId);\n this.opts.tracker.patchMetadata(taskId, { cancelled: undefined });\n this.opts.tracker.updateNodeStatus(taskId, 'pending', 'manual retry');\n return true;\n }\n\n /** Reassign a task to a specific agent name (reflected on the board). */\n reassignTask(taskId: string, agentName: string): boolean {\n if (!this.opts.tracker.getNode(taskId)) return false;\n this.opts.tracker.updateNode(taskId, { assignee: agentName });\n return true;\n }\n\n /**\n * Set/override a task's worker model (and optionally provider) — applied on its\n * NEXT dispatch (a running task must be cancelled + retried to take effect). The\n * assignment lives on node metadata so it survives crash → resume.\n */\n setTaskModel(taskId: string, model: string | undefined, provider?: string | undefined): boolean {\n if (!this.opts.tracker.getNode(taskId)) return false;\n this.opts.tracker.patchMetadata(taskId, { model, ...(provider !== undefined ? { provider } : {}) });\n return true;\n }\n\n /** Set/override a task's fallback model chain (applied on its next dispatch). */\n setTaskFallbacks(taskId: string, fallbackModels: string[] | undefined): boolean {\n if (!this.opts.tracker.getNode(taskId)) return false;\n this.opts.tracker.patchMetadata(taskId, { fallbackModels });\n return true;\n }\n\n /**\n * Set/override a task's verification command (the completion gate runs it in\n * the task's cwd and only lets the task complete on exit 0). Empty/undefined\n * clears it. Applied on the task's next verification — i.e. its next dispatch.\n */\n setTaskVerification(taskId: string, verificationCommand: string | undefined): boolean {\n if (!this.opts.tracker.getNode(taskId)) return false;\n const cmd = verificationCommand?.trim();\n this.opts.tracker.patchMetadata(taskId, { verificationCommand: cmd ? cmd : undefined });\n return true;\n }\n\n /**\n * Cancel a task. If it is currently running, abort its subagent and mark the\n * node terminally failed+cancelled (so the scheduler frees the slot and does\n * NOT retry it). If it has not started, it is simply marked cancelled. Use\n * `retryTask` to bring a cancelled task back. Returns false for an unknown task.\n */\n async cancelTask(taskId: string): Promise<boolean> {\n const node = this.opts.tracker.getNode(taskId);\n if (!node) return false;\n this.cancelledTasks.add(taskId);\n // Terminal failed + cancel marker: failed keeps dependents un-deadlocked,\n // the marker drives the \"Cancelled\" board look and blocks retry/auto-redispatch.\n this.opts.tracker.patchMetadata(taskId, { cancelled: true });\n this.opts.tracker.updateNodeStatus(taskId, 'failed', 'cancelled by user');\n this.emit('sdd.task.failed', { runId: this.runId, taskId, subagentId: '', error: 'cancelled by user' });\n const subagentId = this.taskSubagents.get(taskId);\n if (subagentId && this.coordinator) {\n await this.coordinator.stop(subagentId).catch(() => {});\n }\n return true;\n }\n\n /**\n * Delete a not-yet-started task from the graph (pending/blocked/failed only —\n * never a running task; cancel it first). Removes the node and every edge\n * touching it; dependents lose this blocker. Returns false if missing or running.\n */\n deleteTask(taskId: string): boolean {\n const node = this.opts.tracker.getNode(taskId);\n if (!node) return false;\n if (node.status === 'in_progress' || this.taskSubagents.has(taskId)) return false;\n this.cancelledTasks.delete(taskId);\n this.retryMap.delete(taskId);\n return this.opts.tracker.removeNode(taskId);\n }\n\n /**\n * Split a task into sub-tasks and delegate them to separate workers. The new\n * leaves inherit the parent's blockers (so they don't start before the\n * parent's dependencies are met), every existing dependent is rewired to\n * depend on ALL leaves (so downstream work waits for the whole split), and the\n * parent becomes a `completed` container. Refuses a running task (cancel it\n * first) or empty subtask list. Returns the new leaf ids (empty on refusal).\n * The scheduler picks the new pending leaves up on its next dispatch pass.\n */\n splitTask(taskId: string, subtasks: SddSubtaskSpec[]): string[] {\n const tracker = this.opts.tracker;\n const node = tracker.getNode(taskId);\n if (!node) return [];\n if (node.status === 'in_progress' || this.taskSubagents.has(taskId)) return [];\n if (!subtasks.length) return [];\n\n const blockers = tracker.getBlockers(taskId);\n const dependents = tracker.getDependents(taskId);\n\n const leafIds = subtasks.map(\n (s) =>\n tracker.addNode({\n title: s.title,\n description: s.description,\n type: s.type ?? node.type,\n priority: s.priority ?? node.priority,\n status: 'pending',\n parentId: taskId,\n } as never).id,\n );\n\n for (const leaf of leafIds) {\n // Each leaf inherits the parent's dependencies…\n for (const b of blockers) tracker.addDependency(b, leaf);\n // …and every prior dependent of the parent now waits on every leaf.\n for (const dep of dependents) tracker.addDependency(leaf, dep);\n }\n\n // The parent is now just a grouping node — mark it completed so the graph\n // can settle (its real work lives in the leaves).\n this.retryMap.delete(taskId);\n this.persistRetries(taskId, 0);\n tracker.updateNodeStatus(taskId, 'completed', `split into ${leafIds.length} subtasks`);\n this.emit('sdd.task.split', { runId: this.runId, taskId, subtaskIds: leafIds });\n return leafIds;\n }\n\n private async waitWhilePaused(): Promise<void> {\n while (this.paused && !this.stopRequested) {\n await new Promise((r) => setTimeout(r, 100));\n }\n }\n\n /**\n * Continuous dependency-driven execution. Unlike a wave-barrier loop (where a\n * whole batch must finish before the next starts), this fills free worker\n * slots the instant a task's dependencies are satisfied: a fast task's\n * dependent starts immediately rather than waiting for a slow sibling. Truly\n * independent tasks run in parallel; dependency chains run in order. Returns\n * the final summary when the graph settles, deadlocks, stops, or hits a backstop.\n */\n async run(): Promise<RunResult> {\n this.stopRequested = false;\n this.restoreRetryMap();\n const startTime = Date.now();\n this.round = 0;\n this.dispatchSeq = 0;\n let totalDispatched = 0;\n\n this.buildCoordinator();\n\n // Capture the base branch once so a later rollback knows where the run's\n // squash commits landed (worktree path only; no-op without a manager).\n if (this.opts.worktrees && !this.baseBranch) {\n const base = await this.opts.worktrees.currentBase().catch(() => null);\n if (base) this.baseBranch = base.branch;\n }\n\n this.emit('sdd.run.started', {\n runId: this.runId,\n graphId: this.opts.graph.id,\n specId: this.opts.graph.specId,\n total: this.opts.graph.nodes.size,\n baseBranch: this.baseBranch,\n });\n\n this.recoveryRounds = 0;\n this.failedSweeps = 0;\n this.lastSweepCompleted = 0;\n let deadlocked = false;\n // node id → in-flight executeOne promise. size = live worker count.\n const running = new Map<string, Promise<TaskOutcome>>();\n\n const dispatch = (task: TaskNode): void => {\n totalDispatched++;\n const tracked = (async (): Promise<TaskOutcome> => {\n try {\n return await this.executeOne(task);\n } catch (err) {\n // A dispatch-time throw must not wedge the scheduler: mark the node\n // terminally failed (frees its dependents per failed-blocker rules).\n this.opts.tracker.updateNodeStatus(task.id, 'failed', `dispatch error: ${String(err)}`);\n this.emit('sdd.task.failed', { runId: this.runId, taskId: task.id, subagentId: '', error: String(err) });\n return { taskId: task.id, success: false };\n } finally {\n running.delete(task.id);\n }\n })();\n running.set(task.id, tracked);\n };\n\n while (!this.stopRequested) {\n // Run-level backstops — an autonomous run must always terminate.\n if (totalDispatched >= this.maxTotalWaves) break;\n if (this.maxWallClockMs && Date.now() - startTime >= this.maxWallClockMs) break;\n\n await this.waitWhilePaused();\n if (this.stopRequested) break;\n\n // Fill free slots with ready (dependency-satisfied) tasks not already running.\n let dispatchedThisRound = 0;\n if (running.size < this.slots) {\n const ready = this.decomposer.readyNodes().filter((t) => !running.has(t.id));\n for (const task of ready) {\n if (running.size >= this.slots) break;\n dispatch(task);\n dispatchedThisRound++;\n }\n }\n if (dispatchedThisRound > 0) {\n this.emit('sdd.wave', { runId: this.runId, wave: this.round, batchSize: dispatchedThisRound });\n this.round++;\n }\n\n if (running.size === 0) {\n // Nothing in flight and nothing dispatched this pass.\n if (this.decomposer.isSettled()) {\n // End-of-run failed-task sweep: requeue every terminal-failed\n // (non-cancelled) task and run them again, bounded by\n // maxFailedSweeps. Stop early once a sweep yields no new completions\n // (no progress) so a hopeless task can't spin the loop forever.\n const completed = this.opts.tracker.getProgress().completed;\n const madeProgress = this.failedSweeps === 0 || completed > this.lastSweepCompleted;\n if (this.failedSweeps < this.maxFailedSweeps && madeProgress && this.requeueFailedTasks() > 0) {\n this.lastSweepCompleted = completed;\n this.failedSweeps++;\n continue;\n }\n break;\n }\n const chains = this.computeDeadlockChains();\n if (chains.length > 0) {\n this.emit('sdd.deadlock', { runId: this.runId, chains });\n if (this.recoveryRounds < this.maxRecoveryRounds && this.recoverFailedBlockers()) {\n this.recoveryRounds++;\n continue;\n }\n deadlocked = true;\n }\n // No running, no ready, no recoverable deadlock → no further progress.\n break;\n }\n\n // If we still have a free slot AND a ready task, loop to dispatch it now;\n // otherwise wait for any in-flight task to settle (which may unblock more).\n const moreReadyNow =\n running.size < this.slots && this.decomposer.readyNodes().some((t) => !running.has(t.id));\n if (!moreReadyNow) {\n await Promise.race(running.values());\n this.opts.onProgress?.(this.buildProgress());\n }\n }\n\n // Drain any still-running tasks so the run never returns with live workers.\n if (running.size > 0) await Promise.allSettled(running.values());\n\n // Clean teardown on stop: interrupted tasks reset, worktrees released.\n if (this.stopRequested) await this.teardown();\n\n const finalProgress = this.opts.tracker.getProgress();\n\n this.emit('sdd.run.finished', {\n runId: this.runId,\n deadlocked,\n completed: finalProgress.completed,\n failed: finalProgress.failed,\n stopped: this.stopRequested,\n });\n\n return {\n totalWaves: this.round,\n totalCompleted: finalProgress.completed,\n totalFailed: finalProgress.failed,\n totalDurationMs: Date.now() - startTime,\n deadlocked,\n stopRequested: this.stopRequested,\n finalProgress,\n };\n }\n\n /**\n * Compute the blocking chains for a deadlock: every still-incomplete task and\n * the blockers (by node id) that are NOT completed. Failed blockers are\n * included since they're the usual deadlock cause once retries are exhausted.\n */\n private computeDeadlockChains(): Array<{ blocked: string; blockedBy: string[] }> {\n const tracker = this.opts.tracker;\n const chains: Array<{ blocked: string; blockedBy: string[] }> = [];\n for (const node of tracker.getAllNodes()) {\n if (node.status === 'completed' || node.status === 'failed') continue;\n const blockedBy = tracker\n .getBlockers(node.id)\n .filter((id) => tracker.getNode(id)?.status !== 'completed');\n if (blockedBy.length > 0) chains.push({ blocked: node.id, blockedBy });\n }\n return chains;\n }\n\n /** Requeue failed tasks that block an incomplete dependent. Returns true if any. */\n private recoverFailedBlockers(): boolean {\n const tracker = this.opts.tracker;\n let recovered = false;\n for (const node of tracker.getAllNodes({ status: ['failed'] })) {\n const blocksIncomplete = tracker.getDependents(node.id).some((d) => {\n const s = tracker.getNode(d)?.status;\n return s !== 'completed' && s !== 'failed';\n });\n if (blocksIncomplete) {\n this.retryMap.delete(node.id);\n this.persistRetries(node.id, 0);\n tracker.updateNodeStatus(node.id, 'pending', 'deadlock recovery');\n recovered = true;\n }\n }\n return recovered;\n }\n\n /**\n * Requeue every terminal-failed task that the user did NOT cancel, giving each\n * a fresh `maxRetries` budget. Shared by the automatic end-of-run sweep and\n * the manual \"retry all failed\" control. Returns the number requeued.\n */\n private requeueFailedTasks(reason = 'retry failed sweep'): number {\n const tracker = this.opts.tracker;\n let n = 0;\n for (const node of tracker.getAllNodes({ status: ['failed'] })) {\n if (this.cancelledTasks.has(node.id) || node.metadata?.cancelled) continue;\n this.retryMap.delete(node.id);\n this.persistRetries(node.id, 0);\n tracker.updateNodeStatus(node.id, 'pending', reason);\n this.emit('sdd.task.retrying', {\n runId: this.runId,\n taskId: node.id,\n attempt: 0,\n maxRetries: this.maxRetries,\n });\n n++;\n }\n return n;\n }\n\n /**\n * Manually requeue all failed tasks to `pending` (board \"Retry all failed\").\n * Unlike the automatic sweep this also clears any `cancelled` marker, so a\n * user can bring cancelled tasks back in the same action — mirroring\n * `retryTask`. Picked up by the running scheduler on its next dispatch pass.\n * Returns the number of tasks requeued.\n */\n retryAllFailed(): number {\n const failed = this.opts.tracker.getAllNodes({ status: ['failed'] });\n for (const node of failed) {\n this.cancelledTasks.delete(node.id);\n this.opts.tracker.patchMetadata(node.id, { cancelled: undefined });\n }\n return this.requeueFailedTasks('manual retry all');\n }\n\n /** Restore per-task retry counts persisted in node metadata (resume support). */\n private restoreRetryMap(): void {\n this.retryMap.clear();\n for (const node of this.opts.tracker.getAllNodes()) {\n const r = (node.metadata as { retries?: unknown } | undefined)?.retries;\n if (typeof r === 'number' && r > 0) this.retryMap.set(node.id, r);\n }\n }\n\n /**\n * Reset orphaned `in_progress` tasks (no agent runs them after a crash) back\n * to `pending` so a fresh run re-executes them. Call before constructing a run\n * from a reloaded graph. Static so callers don't need a run instance.\n */\n static resetOrphans(tracker: TaskTracker): number {\n let n = 0;\n for (const node of tracker.getAllNodes({ status: ['in_progress'] })) {\n tracker.updateNodeStatus(node.id, 'pending', 'resume: orphaned in_progress');\n n++;\n }\n return n;\n }\n\n /** Clean teardown after a stop: reset interrupted tasks + release worktrees. */\n private async teardown(): Promise<void> {\n for (const node of this.opts.tracker.getAllNodes({ status: ['in_progress'] })) {\n this.opts.tracker.updateNodeStatus(node.id, 'pending', 'run stopped');\n }\n const wt = this.opts.worktrees;\n if (wt) {\n for (const [taskId, handle] of [...this.taskWorktrees]) {\n await wt.release(handle, { keep: true }).catch(() => {});\n this.forgetWorktree(taskId);\n }\n }\n }\n\n // -------------------------------------------------------------------\n // Internal\n // -------------------------------------------------------------------\n\n private buildCoordinator(): void {\n const config: MultiAgentConfig = {\n coordinatorId: `sdd-parallel-${randomUUID().slice(0, 8)}`,\n maxConcurrent: this.slots,\n doneCondition: { type: 'all_tasks_done' },\n // Default budget guard for every spawned worker: idle reaper (resets on\n // activity) plus the opt-in wall-clock cap when one was configured. This\n // ensures the reaper applies even if a per-spawn config path is bypassed.\n defaultBudget: {\n idleTimeoutMs: this.idleTimeoutMs,\n ...(this.timeoutMs ? { timeoutMs: this.timeoutMs } : {}),\n },\n };\n this.coordinator = new DefaultMultiAgentCoordinator(config);\n // Wrap factory with disabled tool filtering to prevent subagents from\n // using the delegate tool (or any other disabledTools in their config)\n const baseFactory = this.opts.subagentFactory ?? this.defaultFactory();\n const filteredFactory = withDisabledToolFiltering(baseFactory);\n const runner = makeAgentSubagentRunner({ factory: filteredFactory });\n this.coordinator.setRunner?.(runner);\n }\n\n private defaultFactory(): AgentFactory {\n return async (_config: SubagentConfig) => ({\n agent: this.opts.agent,\n events: this.opts.agent.events,\n });\n }\n\n /**\n * Execute a batch of tasks together. Retained as a thin wrapper over the\n * single-task primitive `executeOne` so the wave-oriented tests and any\n * batch callers keep working; the continuous scheduler in `run()` calls\n * `executeOne` directly. Throws if no coordinator is wired or a spawn fails\n * (surfaced from `executeOne`), preserving the original all-or-nothing contract.\n */\n async executeWave(batch: TaskBatch): Promise<WaveResult> {\n const waveStart = Date.now();\n const outcomes = await Promise.all(batch.tasks.map((task) => this.executeOne(task)));\n const results = outcomes.map((o) => o.result).filter((r): r is TaskResult => Boolean(r));\n const successCount = outcomes.filter((o) => o.success).length;\n const failCount = outcomes.length - successCount;\n return {\n wave: batch.wave,\n batch,\n results,\n successCount,\n failCount,\n durationMs: Date.now() - waveStart,\n stopRequested: this.stopRequested,\n };\n }\n\n /**\n * Execute one task end-to-end: assign a worker identity, allocate its worktree,\n * spawn + assign the subagent, await its result, then update tracker status\n * (success / retry / terminal-fail / cancelled) and resolve the worktree. This\n * is the unit the continuous scheduler dispatches into a free slot. Throws on a\n * missing coordinator or failed spawn so callers can enforce all-or-nothing.\n */\n async executeOne(task: TaskNode): Promise<TaskOutcome> {\n const taskId = task.id;\n\n // Worker identity (reuse a manual assignment if present), shown on the board.\n let agentName = task.assignee;\n if (!agentName) {\n const nick = assignNickname('executor', this.usedNicknames);\n this.usedNicknames.add(nick.key);\n agentName = nick.display.replace(/\\s*\\([^)]*\\)\\s*$/, '');\n this.opts.tracker.updateNode(taskId, { assignee: agentName });\n }\n\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress');\n\n // Per-task git-worktree isolation: a fresh checkout off the current base\n // (which already holds every dependency's merged work).\n await this.allocateWorktrees([task]);\n\n if (!this.coordinator) throw new SddError({\n message: 'SDD parallel runner requires a coordinator',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n const coordinator = this.coordinator;\n\n const subagentId = `sdd-d${this.dispatchSeq++}`;\n const correlationId = randomUUID();\n\n // Per-task model / provider / fallback resolution: the node's own assignment\n // (set per-task in the WebUI) wins, else the run-level default.\n const meta = (task.metadata ?? {}) as Record<string, unknown>;\n const model = (typeof meta.model === 'string' ? meta.model : undefined) ?? this.opts.defaultModel;\n const provider =\n (typeof meta.provider === 'string' ? meta.provider : undefined) ?? this.opts.defaultProvider;\n const fallbackModels = Array.isArray(meta.fallbackModels)\n ? (meta.fallbackModels as string[])\n : this.opts.fallbackModels;\n\n const spawnResult = await coordinator.spawn({\n id: subagentId,\n name: agentName ?? subagentId,\n role: 'executor',\n // Idle reaper is always on; the hard wall-clock cap only when opted in.\n idleTimeoutMs: this.idleTimeoutMs,\n ...(this.timeoutMs ? { timeoutMs: this.timeoutMs } : {}),\n cwd: this.taskCwds.get(taskId),\n disabledTools: ['delegate'],\n ...(model ? { model } : {}),\n ...(provider ? { provider } : {}),\n ...(fallbackModels && fallbackModels.length ? { fallbackModels } : {}),\n });\n if (!spawnResult.subagentId) {\n throw new SddError({\n message: 'One or more subagent spawns failed',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n }\n // Record the live subagent so cancelTask() can abort exactly this task.\n this.taskSubagents.set(taskId, subagentId);\n\n this.emit('sdd.task.started', {\n runId: this.runId,\n taskId,\n subagentId,\n agentName: agentName ?? '',\n worktreeBranch: this.taskBranches.get(taskId),\n });\n\n const directivePreamble = [\n '═══ SDD PARALLEL EXECUTION ═══',\n '',\n `Graph: ${this.opts.graph.title}`,\n '',\n '── EXECUTION PROTOCOL ──',\n '• Execute the assigned SDD task end-to-end using multiple tool calls.',\n '• Mark the task [done] in the tracker when complete.',\n '• Do not ask before routine in-project tool use; if a permission gate appears, wait for that flow.',\n '• Keep output concise — summarize changes, do not transcribe files.',\n ].join('\\n');\n\n await coordinator.assign({\n id: correlationId,\n description: [\n directivePreamble,\n '',\n `── TASK ──`,\n `[${task.priority.toUpperCase()}] ${task.title}`,\n '',\n task.description,\n ].join('\\n'),\n subagentId,\n ...(this.timeoutMs ? { timeoutMs: this.timeoutMs } : {}),\n });\n\n let result: TaskResult;\n try {\n const got = await coordinator.awaitTasks([correlationId]);\n result = expectDefined(got[0]);\n } catch (err) {\n result = {\n subagentId,\n taskId: correlationId,\n status: 'failed',\n error: { kind: 'unknown', message: String(err), retryable: false },\n iterations: 0,\n toolCalls: 0,\n durationMs: 0,\n };\n }\n\n this.taskSubagents.delete(taskId);\n\n // Cancelled mid-flight: cancelTask() already marked the node terminal — don't\n // resurrect it via the retry path. Discard its worktree and report failure.\n if (this.cancelledTasks.has(taskId)) {\n await this.resolveWorktrees([task]);\n return { taskId, success: false, result };\n }\n\n // Completion gate: a worker-reported success is not trusted until the\n // optional verification gate passes. A rejection here is treated exactly\n // like a task failure (retry while attempts remain, else terminal-fail) and\n // — crucially — happens BEFORE the worktree merge, so unverified work never\n // reaches the base branch.\n let verificationFailReason: string | undefined;\n if (result.status === 'success' && this.opts.verifyTask) {\n const cwd = this.taskCwds.get(taskId) ?? this.opts.projectRoot;\n try {\n const verdict = await this.opts.verifyTask({ task, result, cwd });\n if (!verdict.ok) {\n verificationFailReason = `verification failed: ${verdict.reason ?? 'acceptance criteria not met'}`;\n }\n } catch (err) {\n verificationFailReason = `verification error: ${String(err)}`;\n }\n if (verificationFailReason) {\n this.emit('sdd.task.verification_failed', {\n runId: this.runId,\n taskId,\n reason: verificationFailReason,\n });\n }\n }\n\n let success = false;\n if (result.status === 'success' && !verificationFailReason) {\n // Merge gate: only declare 'completed' once this task's worktree integrates\n // cleanly into the base. An unresolved conflict is treated like any other\n // failure (retry on a fresh base, else terminal-fail) so the run never\n // wedges and dependents never build on un-merged work.\n const merged = await this.integrateWorktree(task, result);\n if (merged.ok) {\n success = true;\n this.opts.tracker.updateNodeStatus(taskId, 'completed');\n this.retryMap.delete(taskId);\n this.persistRetries(taskId, 0);\n this.emit('sdd.task.completed', {\n runId: this.runId,\n taskId,\n subagentId,\n durationMs: result.durationMs,\n });\n } else if (merged.reason) {\n // A conflict-resolved merge that regressed re-verification — the squash\n // commit was reverted. Surface it as a verification failure (not a raw\n // conflict) and let the retry path re-run on a fresh base.\n this.emit('sdd.task.verification_failed', {\n runId: this.runId,\n taskId,\n reason: merged.reason,\n });\n await this.applyTaskFailure(taskId, subagentId, merged.reason);\n } else {\n this.emit('sdd.task.conflict', {\n runId: this.runId,\n taskId,\n conflictFiles: merged.conflictFiles ?? [],\n });\n const reason = `merge conflict${merged.conflictFiles?.length ? `: ${merged.conflictFiles.join(', ')}` : ''}`;\n await this.applyTaskFailure(taskId, subagentId, reason);\n }\n } else {\n const errMsg =\n verificationFailReason ??\n (result.error?.kind\n ? `${result.error.kind}: ${result.error.message}`\n : result.error?.message ?? 'unknown error');\n await this.applyTaskFailure(taskId, subagentId, errMsg);\n // Resolve the worktree for the non-success path (failed → keep, retry → discard).\n await this.resolveWorktrees([task]);\n }\n\n return { taskId, success, result };\n }\n\n /**\n * Apply a task failure: retry (→ pending, bump retry count) while attempts\n * remain, else consult the optional supervisor (which can rescue via\n * retry/reassign/split), else terminal-fail (→ failed). Shared by the\n * worker-failure, verification-gate, and merge-conflict paths so all three\n * negotiate the same retry budget and emit the same events.\n */\n private async applyTaskFailure(taskId: string, subagentId: string, errMsg: string): Promise<void> {\n const currentRetries = this.retryMap.get(taskId) ?? 0;\n if (currentRetries < this.maxRetries) {\n this.retryMap.set(taskId, currentRetries + 1);\n this.persistRetries(taskId, currentRetries + 1);\n this.opts.tracker.updateNodeStatus(\n taskId,\n 'pending',\n `Retry ${currentRetries + 1}/${this.maxRetries}: ${errMsg}`,\n );\n this.emit('sdd.task.retrying', {\n runId: this.runId,\n taskId,\n attempt: currentRetries + 1,\n maxRetries: this.maxRetries,\n });\n return;\n }\n\n // Retries exhausted — give the supervisor a bounded chance to rescue the\n // task before it goes terminal, so a run \"decides\" rather than dead-ends.\n if (await this.trySupervisorRescue(taskId, errMsg)) return;\n\n this.opts.tracker.updateNodeStatus(taskId, 'failed', errMsg);\n this.emit('sdd.task.failed', { runId: this.runId, taskId, subagentId, error: errMsg });\n }\n\n /**\n * Consult `superviseFailure` for a task that has exhausted its retries.\n * Applies the verdict (retry / reassign+retry / split) and returns true when\n * the task was rescued (caller must NOT terminal-fail it). Bounded per task by\n * `maxSupervisorEscalations` so an always-\"retry\" supervisor can't loop forever.\n */\n private async trySupervisorRescue(taskId: string, errMsg: string): Promise<boolean> {\n const supervise = this.opts.superviseFailure;\n if (!supervise) return false;\n const used = this.supervisorEscalations.get(taskId) ?? 0;\n if (used >= this.maxSupervisorEscalations) return false;\n const node = this.opts.tracker.getNode(taskId);\n if (!node) return false;\n\n let verdict: SddSupervisorVerdict | undefined;\n try {\n verdict = await supervise({ task: node, error: errMsg, attempts: used });\n } catch {\n return false; // a flaky supervisor must not block terminal failure\n }\n if (!verdict || verdict.action === 'fail') return false;\n\n this.supervisorEscalations.set(taskId, used + 1);\n const requeue = (reason: string) => {\n this.retryMap.delete(taskId);\n this.persistRetries(taskId, 0);\n this.opts.tracker.updateNodeStatus(taskId, 'pending', reason);\n };\n\n if (verdict.action === 'reassign') {\n this.setTaskModel(taskId, verdict.model, verdict.provider);\n requeue(`supervisor reassign: ${verdict.model ?? 'default'}`);\n this.emit('sdd.supervisor.decision', { runId: this.runId, taskId, action: 'reassign' });\n return true;\n }\n if (verdict.action === 'split') {\n const ids = this.splitTask(taskId, verdict.subtasks);\n if (ids.length === 0) return false; // split refused (e.g. running) → let it fail\n this.emit('sdd.supervisor.decision', { runId: this.runId, taskId, action: 'split' });\n return true;\n }\n // 'retry'\n requeue('supervisor retry');\n this.emit('sdd.supervisor.decision', { runId: this.runId, taskId, action: 'retry' });\n return true;\n }\n\n /**\n * Integrate a verified-successful task's worktree into the base branch.\n * Commits, squash-merges (optionally running `conflictResolver` first), and on\n * success releases the worktree. On an UNRESOLVED conflict it returns\n * `{ok:false}` with the conflicting files so the caller routes the task into\n * the failure path (a retry forks a fresh worktree off the now-advanced base,\n * which usually clears the conflict). No-op `{ok:true}` when worktrees are\n * disabled or none was allocated for this task. Never throws — a merge hiccup\n * degrades to a (retryable) failure rather than wedging the run.\n */\n private async integrateWorktree(\n task: TaskNode,\n result?: TaskResult,\n ): Promise<{ ok: boolean; conflictFiles?: string[]; reason?: string }> {\n const wt = this.opts.worktrees;\n if (!wt) return { ok: true };\n const handle = this.taskWorktrees.get(task.id);\n if (!handle) return { ok: true };\n try {\n await wt.commitAll(handle, `sdd(${task.title}): ${task.id}`);\n // Capture the base tip before merging so a regressed conflict-resolution\n // can be reverted to exactly this commit (see the re-verify branch below),\n // and so we can tell whether this merge actually advanced the base (an\n // empty squash creates no commit → nothing to record for rollback).\n const baseShaBefore = await wt.baseHead(handle);\n const baseSha = this.opts.conflictResolver ? baseShaBefore : null;\n const res = await wt.merge(handle, {\n squash: true,\n ...(this.opts.conflictResolver\n ? {\n resolve: (info: { conflictFiles: string[]; cwd: string }) =>\n this.opts.conflictResolver!({ task, conflictFiles: info.conflictFiles, cwd: info.cwd }),\n }\n : {}),\n });\n if (res.ok) {\n // A merge that only landed because the conflictResolver rewrote files is\n // not trusted blindly: re-run the completion gate against the INTEGRATED\n // base. If it regresses, revert the squash commit so the auto-resolution\n // never sticks, and treat the task as a (retryable) failure.\n if (res.resolved && this.opts.verifyTask && baseSha) {\n let regressed: string | undefined;\n try {\n const verdict = await this.opts.verifyTask({\n task,\n result: result ?? ({} as TaskResult),\n cwd: this.opts.projectRoot,\n });\n if (!verdict.ok) regressed = verdict.reason ?? 'verification failed after conflict resolution';\n } catch (err) {\n regressed = `verification error after conflict resolution: ${String(err)}`;\n }\n if (regressed) {\n await wt.revertBaseTo(handle, baseSha).catch(() => {});\n await wt.release(handle, { keep: false }).catch(() => {});\n this.forgetWorktree(task.id, { keepBranchLabel: true });\n return { ok: false, conflictFiles: [], reason: regressed };\n }\n }\n // Record the squash commit for rollback — but only if the merge actually\n // advanced the base tip (an empty/no-op squash leaves it unchanged).\n const baseShaAfter = await wt.baseHead(handle);\n if (baseShaAfter && baseShaAfter !== baseShaBefore) {\n this.mergedCommits.push({ taskId: task.id, sha: baseShaAfter, title: task.title });\n this.emit('sdd.task.merged', { runId: this.runId, taskId: task.id, sha: baseShaAfter });\n }\n await wt.release(handle, { keep: false });\n this.forgetWorktree(task.id);\n return { ok: true };\n }\n // Unresolved conflict: the manager already hard-reset the base and parked\n // the handle as `needs-review` (force-kept for inspection). Drop our handle\n // reference so a retry allocates a fresh worktree off the advanced base.\n await wt.release(handle, { keep: false }).catch(() => {});\n this.forgetWorktree(task.id, { keepBranchLabel: true });\n return { ok: false, conflictFiles: res.conflictFiles ?? [] };\n } catch {\n // Commit/merge hiccup — don't wedge the run; treat as a retryable failure.\n this.forgetWorktree(task.id);\n return { ok: false, conflictFiles: [] };\n }\n }\n\n /** Allocate a fresh git worktree per task in the batch (no-op without a manager). */\n private async allocateWorktrees(tasks: TaskNode[]): Promise<void> {\n const wt = this.opts.worktrees;\n if (!wt) return;\n for (const task of tasks) {\n if (this.taskWorktrees.has(task.id)) continue;\n try {\n const handle = await wt.allocate(`sdd-${task.id}`, {\n slugHint: task.title,\n ownerLabel: task.title,\n });\n if (handle.status === 'active') {\n this.taskWorktrees.set(task.id, handle);\n this.taskCwds.set(task.id, handle.dir);\n this.taskBranches.set(task.id, handle.branch);\n const node = this.opts.tracker.getNode(task.id);\n if (node) node.metadata = { ...node.metadata, worktreeBranch: handle.branch };\n }\n } catch {\n // Allocation failed → this task runs on the shared working tree.\n }\n }\n }\n\n /**\n * Resolve each task's worktree after its result is known. Serialized merges\n * (one at a time) keep the base branch consistent; the wave structure already\n * guarantees dependency order (a task's blockers merged in an earlier wave).\n */\n private async resolveWorktrees(tasks: TaskNode[]): Promise<void> {\n const wt = this.opts.worktrees;\n if (!wt) return;\n for (const task of tasks) {\n const handle = this.taskWorktrees.get(task.id);\n if (!handle) continue;\n const node = this.opts.tracker.getNode(task.id);\n const status = node?.status;\n const cancelled = Boolean(node?.metadata?.cancelled);\n try {\n if (cancelled) {\n // User cancelled → throw away the partial checkout, don't merge it.\n await wt.release(handle, { keep: false });\n this.forgetWorktree(task.id, { keepBranchLabel: false });\n } else if (status === 'completed') {\n await wt.commitAll(handle, `sdd(${task.title}): ${task.id}`);\n await wt.merge(handle, { squash: true });\n await wt.release(handle, { keep: false });\n this.forgetWorktree(task.id);\n } else if (status === 'failed') {\n // Discard the failed checkout so worktrees don't pile up across a run\n // with many failures. (A genuine merge-conflict handle — status\n // 'needs-review'/'failed' — is force-kept by the manager regardless,\n // so conflicts that actually need a human still stay on disk.)\n await wt.release(handle, { keep: false });\n this.forgetWorktree(task.id, { keepBranchLabel: false });\n } else {\n // Pending again (retry) → discard so the next wave starts clean.\n await wt.release(handle, { keep: false });\n this.forgetWorktree(task.id, { keepBranchLabel: false });\n }\n } catch {\n // Merge/release hiccup must not abort the run; leave the handle parked.\n this.forgetWorktree(task.id);\n }\n }\n }\n\n private forgetWorktree(taskId: string, opts: { keepBranchLabel?: boolean } = {}): void {\n this.taskWorktrees.delete(taskId);\n this.taskCwds.delete(taskId);\n if (!opts.keepBranchLabel) this.taskBranches.delete(taskId);\n }\n\n /** Persist a task's retry count into node metadata (survives crash → resume). */\n private persistRetries(taskId: string, retries: number): void {\n const node = this.opts.tracker.getNode(taskId);\n if (node) node.metadata = { ...node.metadata, retries };\n }\n\n private buildProgress(): SddProgress {\n const gp = this.opts.tracker.getProgress();\n const isDeadlocked = !this.decomposer.isDone() &&\n this.decomposer.nextBatch().deadlocked;\n return {\n wave: this.decomposer.getWaveCount(),\n total: gp.total,\n completed: gp.completed,\n inProgress: gp.inProgress,\n failed: gp.failed,\n blocked: gp.blocked,\n pending: gp.pending,\n percent: gp.percentComplete,\n deadlocked: isDeadlocked,\n };\n }\n}\n","import type { Agent, AgentInput, RunResult } from '../core/agent.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type {\n SubagentConfig,\n SubagentRunContext,\n SubagentRunOutcome,\n SubagentRunner,\n TaskSpec,\n} from '../types/multi-agent.js';\nimport { AgentError, ERROR_CODES } from '../types/errors.js';\nimport {\n BudgetExceededError,\n BudgetThresholdSignal,\n} from './subagent-budget.js';\nimport type { FleetBus } from './fleet-bus.js';\n\n/**\n * Caller-supplied factory that builds an isolated `Agent` for a subagent.\n * The factory MUST construct a fresh `Context` per call — sharing context\n * between subagents defeats isolation. Each Agent should also use either\n * its own `EventBus` or a forwarded view, so per-subagent metrics can be\n * attributed correctly.\n */\nexport type AgentFactory = (config: SubagentConfig) => Promise<AgentFactoryResult>;\n\n/**\n * Wrap a factory to automatically filter out disabled tools from subagent\n * configurations. This provides mechanical enforcement of tool restrictions\n * (e.g., preventing delegation) in addition to the baseline prompt constraint.\n *\n * The wrapper reads `config.disabledTools` and removes those tools from the\n * agent's tool registry before returning.\n *\n * Usage:\n * const filteredFactory = withDisabledToolFiltering(originalFactory);\n * const runner = makeAgentSubagentRunner({ factory: filteredFactory });\n */\nexport function withDisabledToolFiltering(factory: AgentFactory): AgentFactory {\n return async (config: SubagentConfig) => {\n const result = await factory(config);\n const disabled = config.disabledTools ?? [];\n if (disabled.length === 0) return result;\n\n // Agent.tools is a ToolRegistry with unregister() method\n const registry = result.agent.tools;\n if (registry && typeof registry.unregister === 'function') {\n for (const toolName of disabled) {\n registry.unregister(toolName);\n }\n }\n return result;\n };\n}\n\nexport interface AgentFactoryResult {\n agent: Agent;\n /** Event bus the factory wired to this agent — required for budget hookup. */\n events: EventBus;\n /**\n * Optional cleanup hook invoked in the runner's `finally` block once\n * the task ends (success, failure, abort — same exit path). Factories\n * that own resources scoped to a single task (per-subagent JSONL\n * writers, transient providers, throwaway containers) implement this\n * to close them deterministically instead of relying on GC. Errors\n * thrown here are swallowed so a flaky cleanup can't mask the task's\n * real result.\n */\n dispose?: ((() => Promise<void> | void)) | undefined;\n}\n\nexport interface AgentRunnerOptions {\n factory: AgentFactory;\n /**\n * Format a TaskSpec into the user input the agent will receive. Defaults\n * to `task.description ?? ''`. Override when subagents expect structured\n * input (e.g. JSON contracts, role-prefixed prompts).\n */\n formatTaskInput?: (task: TaskSpec, config: SubagentConfig) => AgentInput;\n /**\n * When set, the runner attaches the subagent's EventBus to this FleetBus\n * on task start and detaches it when the task finishes. This is the\n * injection seam that lets the TUI fleet panel observe subagent activity\n * live — without it, FleetBus stays empty.\n */\n fleetBus?: FleetBus | undefined;\n}\n\n/**\n * Builds a `SubagentRunner` that drives a real `Agent` per task while honoring\n * the coordinator's budget and abort signal. This is the production adapter —\n * the coordinator's `runner` option in CLI/TUI assemblies points here.\n *\n * Lifecycle per task:\n * 1. factory(config) → fresh Agent + EventBus.\n * 2. Subscribe to events to feed the budget (tool calls, token usage).\n * 3. Call agent.run(input, { signal }) — the coordinator's signal cancels.\n * 4. Map RunResult.status onto a `SubagentRunOutcome` or throw on failure.\n * 5. Unsubscribe and let the factory's resources be GC'd.\n *\n * The budget is checked synchronously from event handlers — a runaway agent\n * that crosses its tool-call limit triggers `BudgetExceededError`, which the\n * coordinator surfaces as `status: 'failed'` on the task result.\n */\nexport function makeAgentSubagentRunner(opts: AgentRunnerOptions): SubagentRunner {\n const format = opts.formatTaskInput ?? defaultFormatTaskInput;\n\n return async (task: TaskSpec, ctx: SubagentRunContext): Promise<SubagentRunOutcome> => {\n const taskStartedAt = Date.now();\n const factoryResult = await opts.factory(ctx.config);\n const { agent, events } = factoryResult;\n\n // Attach subagent EventBus to FleetBus so the TUI fleet panel (and any\n // other FleetBus subscriber) can observe this subagent live. Detach on\n // task finish — each task is a fresh Agent + EventBus, so we never\n // want a stale bus lingering after the run.\n const detachFleet = opts.fleetBus?.attach(ctx.subagentId, events, task.id);\n\n // Hook budget into the agent's event stream. We capture errors thrown by\n // recordToolCall/recordUsage so the budget can short-circuit the run by\n // aborting the controller — the agent then unwinds cooperatively.\n const aborter = new AbortController();\n // Inject the EventBus into the budget so it can emit budget.threshold_reached\n // events when a soft limit is hit and the handler wants to ask the coordinator.\n ctx.budget._events = events;\n // Wire the threshold-negotiation handler. Without this the soft-limit\n // path is dead code: every budget overrun becomes a hard\n // BudgetExceededError and the subagent dies on its first 120-iteration\n // tick instead of asking the Director for headroom. The Director's\n // FleetBus listener (director.ts) auto-grants +50% up to a per-kind\n // ceiling and per-subagent extension count — wiring this is the\n // missing link that activates that flow.\n ctx.budget.onThreshold = ({ requestDecision }) => requestDecision();\n let budgetError: Error | null = null;\n\n /**\n * Common error handler for all budget-triggered events. Distinguishes:\n * - BudgetExceededError → hard stop, set budgetError + abort\n * - BudgetThresholdSignal → soft stop: await the coordinator's\n * decision. If 'stop', abort. If 'extend', the signal handler\n * has already patched the budget so we can continue without\n * actually aborting the agent.\n */\n const onBudgetError = (err: unknown): void => {\n if (err instanceof BudgetThresholdSignal) {\n // Defer the stop/extend decision to the post-finally block below.\n // The coordinator's verdict may arrive after agent.run() returns;\n // awaiting it there (rather than in this fire-and-forget handler)\n // avoids a race where both this callback and the post-finally\n // block try to mutate `budgetError` concurrently.\n budgetError = err;\n return;\n }\n // Hard stop (BudgetExceededError or other)\n aborter.abort();\n budgetError =\n err instanceof BudgetExceededError\n ? err\n : new BudgetExceededError(\n 'tool_calls',\n 0,\n 0,\n );\n // Attach the real error detail so the task result surfaces\n // something actionable instead of a generic budget message.\n if (budgetError !== err && err instanceof Error) {\n budgetError.message += ` (caused by: ${err.message})`;\n }\n };\n\n // Track the name of the most recent tool that returned ok:false so\n // we can lift it into the SubagentError when the agent ends without\n // recovering. Cleared on every successful tool execution so a tool\n // that later succeeded doesn't taint the final report.\n let lastToolFailed: string | null = null;\n\n const unsub: Array<() => void> = [];\n unsub.push(\n events.on('tool.executed', (e) => {\n // Count tool calls on the PAIRED 'tool.executed' event rather\n // than 'tool.started'. A tool can fire start then crash before\n // emitting executed (process killed, signal aborted mid-exec);\n // counting only the paired event keeps the budget tally honest\n // and matches what the model actually saw in its turn.\n try {\n ctx.budget.recordToolCall();\n } catch (eb) {\n onBudgetError(eb);\n }\n // Track ok:false so we can fail the subagent if it ends without\n // recovering. Successful runs clear it — the model may try a\n // tool, get an error, and self-heal on the next iteration; that\n // path should still report success.\n if (e.ok === false) {\n lastToolFailed = e.name;\n } else if (e.ok === true) {\n lastToolFailed = null;\n }\n }),\n events.on('provider.response', (e) => {\n try {\n ctx.budget.recordUsage(e.usage);\n } catch (e2) {\n void onBudgetError(e2);\n }\n }),\n events.on('iteration.started', () => {\n try {\n ctx.budget.recordIteration();\n } catch (e) {\n void onBudgetError(e);\n }\n // Emit a periodic progress snapshot every SUMMARY_INTERVAL\n // iterations so the leader can surface \"AGENT#2 ● L25 · 47 tools\"\n // in the main chat history without needing the FleetPanel open.\n const u = ctx.budget.usage();\n const since = u.iterations - lastSummaryAtIteration;\n if (since >= SUMMARY_INTERVAL) {\n lastSummaryAtIteration = u.iterations;\n events.emit('subagent.iteration_summary', {\n subagentId: ctx.subagentId,\n iteration: u.iterations,\n toolCalls: u.toolCalls,\n costUsd: u.costUsd,\n currentTool: currentToolName,\n partialText: streamingTextAcc.trim() || undefined,\n });\n }\n }),\n // D3: cooperative timeout enforcement DURING a long tool call.\n // The iteration-loop checkTimeout() only fires between agent\n // iterations — a single `bash sleep 3600` call would otherwise\n // park inside one tool execution while the timeout silently\n // passes, relying solely on the coordinator's hard Promise.race\n // to interrupt. Tools that emit `tool.progress` (bash chunks,\n // fetch byte progress, spawn-stream stdout) give us a heartbeat\n // we can hang the check on. When the budget trips here:\n // 1. onBudgetError sets budgetError + aborter.abort()\n // 2. aborter signal propagates to agent.run → tool executor\n // 3. tool's own signal listener kills the child process\n // Cheap: O(1) per progress event, and the budget short-circuits\n // when timeoutMs is unset (most subagents have one set anyway).\n events.on('tool.progress', () => {\n // Streamed progress (bash chunks, fetch bytes, spawn stdout) is forward\n // motion — reset the idle clock so a long-but-working tool is never\n // mistaken for a stall, THEN check whether a genuine timeout tripped.\n ctx.budget.markActivity();\n try {\n ctx.budget.checkTimeout();\n } catch (e) {\n void onBudgetError(e);\n }\n }),\n );\n\n // Track current tool name + streaming text for the periodic summary.\n let currentToolName: string | undefined;\n let streamingTextAcc = '';\n let lastSummaryAtIteration = 0;\n const SUMMARY_INTERVAL = 25;\n\n unsub.push(\n events.on('tool.started', (e) => {\n currentToolName = e.name;\n }),\n events.on('provider.text_delta', (e) => {\n // Streamed assistant text is forward motion too — keep the idle\n // clock fresh while the model is actively generating.\n ctx.budget.markActivity();\n // Accumulate last ~2000 chars for the partial text snapshot.\n streamingTextAcc = (streamingTextAcc + e.text).slice(-2000);\n }),\n );\n\n // Forward the coordinator signal so stop() from outside also aborts.\n const onParentAbort = () => aborter.abort();\n ctx.signal.addEventListener('abort', onParentAbort);\n\n let result: RunResult;\n try {\n result = await agent.run(format(task, ctx.config), { signal: aborter.signal });\n // Emit task_completed BEFORE the finally block unsubscribes the\n // FleetBus — this lets the WebUI see the subagent's final output.\n events.emit('subagent.task_completed', {\n subagentId: ctx.subagentId,\n taskId: task.id,\n status: result.status === 'done' ? 'success' : 'failed',\n iterations: result.iterations,\n toolCalls: ctx.budget.usage().toolCalls,\n durationMs: Date.now() - taskStartedAt,\n finalText: result.finalText?.trim() || undefined,\n });\n } finally {\n detachFleet?.();\n ctx.signal.removeEventListener('abort', onParentAbort);\n for (const u of unsub) u();\n // Per-task resource cleanup. Closes JSONL writers, throwaway\n // providers, etc. that the factory wired up. Swallowed errors —\n // a flaky cleanup must not mask the real task result. The\n // caller can re-emit via observability if needed.\n if (factoryResult.dispose) {\n try {\n await factoryResult.dispose();\n } catch {\n // intentional swallow — see comment above\n }\n }\n }\n\n // A budget violation is the signal — surface it so the coordinator can\n // tag the task with the right failure kind ('failed' for budget; the\n // coordinator separately recognises 'timeout' from BudgetExceededError).\n if (budgetError) {\n // BudgetThresholdSignal: the soft limit was hit but the coordinator\n // hasn't resolved the extension decision yet. If the decision was\n // 'extend', the coordinator patched limits and the agent finished\n // normally — no error to surface. If 'stop', budgetError becomes\n // a BudgetExceededError thrown below.\n // instanceof check on Error subtypes requires 'any' intersection\n // on the union — use a property guard instead.\n if ('decision' in budgetError) {\n try {\n const decision = await (budgetError as BudgetThresholdSignal).decision;\n if (decision === 'stop') {\n budgetError = new BudgetExceededError(\n (budgetError as BudgetThresholdSignal).kind,\n (budgetError as BudgetThresholdSignal).limit,\n (budgetError as BudgetThresholdSignal).used,\n );\n } else {\n budgetError = null;\n }\n } catch {\n // Decision promise rejected — treat as hard stop.\n budgetError = new BudgetExceededError(\n (budgetError as BudgetThresholdSignal).kind,\n (budgetError as BudgetThresholdSignal).limit,\n (budgetError as BudgetThresholdSignal).used,\n );\n }\n }\n if (budgetError) throw budgetError;\n }\n\n if (result.status === 'failed') {\n throw result.error instanceof AgentError\n ? result.error\n : new AgentError({\n message: result.error instanceof Error ? result.error.message : String(result.error ?? 'agent failed'),\n code: ERROR_CODES.AGENT_RUN_FAILED,\n cause: result.error,\n });\n }\n // 'aborted' and 'max_iterations' aren't successes — let the coordinator\n // classify them. When the parent signal was aborted, coordinator marks\n // the task 'stopped' (matched against subagent.abortController.aborted).\n if (result.status === 'aborted') {\n throw new AgentError({\n message: 'agent aborted',\n code: ERROR_CODES.AGENT_ABORTED,\n });\n }\n if (result.status === 'max_iterations') {\n throw new AgentError({\n message: 'agent exhausted iteration limit',\n code: ERROR_CODES.AGENT_ITERATION_LIMIT,\n recoverable: true,\n });\n }\n\n const usage = ctx.budget.usage();\n // Empty-response guard. A \"successful\" run with no text AND no tool\n // calls is almost always a prompt / config issue, not a real\n // success — the agent burned an iteration to say nothing. Surface\n // it as a classified failure so callers can show \"✗ empty_response\"\n // instead of a confusing green ✓ with no output. We only trip on\n // the (no-text AND no-tools) intersection because text-less runs\n // with tool calls are legit (e.g. \"run npm test then end_turn\").\n const finalText = (result.finalText ?? '').trim();\n if (finalText.length === 0 && usage.toolCalls === 0) {\n throw new AgentError({\n message: 'empty response — agent produced no text and no tool calls',\n code: ERROR_CODES.AGENT_RUN_FAILED,\n context: { iterations: result.iterations },\n });\n }\n // Unrecovered-tool-failure guard. If the last executed tool came\n // back ok:false AND the agent ended its turn with no closing text,\n // the agent never acknowledged or recovered from the failure — the\n // task is effectively broken. A model that handles a tool error\n // emits SOME text on the next iteration (\"the read failed, trying\n // an alternate path…\") which clears `lastToolFailed`; the only way\n // both signals can be live at end-of-run is if the model gave up\n // silently. Surface as `tool_failed` so callers see the actual\n // failure mode instead of a clean ✓ with no output.\n if (finalText.length === 0 && lastToolFailed !== null) {\n throw new AgentError({\n message: `unrecovered tool failure: ${lastToolFailed} — agent ended turn without acknowledging the error`,\n code: ERROR_CODES.AGENT_RUN_FAILED,\n context: { tool: lastToolFailed, iterations: result.iterations },\n });\n }\n return {\n result: result.finalText,\n iterations: result.iterations,\n toolCalls: usage.toolCalls,\n };\n };\n}\n\nfunction defaultFormatTaskInput(task: TaskSpec): AgentInput {\n return task.description ?? '';\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' | 'idle_timeout' | 'cost';\n\n/**\n * Fraction of the wall-clock `timeoutMs` window at which a PROACTIVE extension\n * is negotiated — BEFORE the deadline is actually crossed. The coordinator\n * watchdog (`executeWithTimeout`) arms at `timeoutMs * TIMEOUT_PREEMPT_FRACTION`\n * so a still-progressing subagent gets its ceiling raised while it is below the\n * limit, and never enters a \"timed out\" state. Reactive enforcement at the real\n * deadline still stands for the no-progress / denied case. Shared so the asking\n * side and any future caller agree on the same lead point.\n */\nexport const TIMEOUT_PREEMPT_FRACTION = 0.85;\n\n/**\n * Hard safety net for budget negotiation decisions. If no listener responds to\n * `budget.threshold_reached` within this window the negotiation defaults to\n * `'stop'`. Exported so the coordinator's watchdog can reuse the same ceiling\n * without hardcoding a second copy.\n */\nexport const DECISION_TIMEOUT_MS = 60_000;\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 | undefined;\n maxToolCalls?: number | undefined;\n maxTokens?: number | undefined;\n /** Estimated USD cost ceiling. */\n maxCostUsd?: number | undefined;\n /**\n * Hard wall-clock timeout measured from `start()`. Off by default — set it\n * explicitly only when a task must finish within an absolute window. For\n * the everyday \"don't kill an agent that's still working\" guard, prefer\n * `idleTimeoutMs`, which resets on activity.\n */\n timeoutMs?: number | undefined;\n /**\n * Idle timeout: the maximum gap (ms) between activity signals (iterations,\n * tool calls, token usage, streamed progress) before the subagent is\n * considered hung and reaped. Unlike `timeoutMs`, an actively-working\n * agent continuously resets this clock via `markActivity()`, so it never\n * trips on a long-but-productive run — only on a genuine stall.\n */\n idleTimeoutMs?: number | undefined;\n}\n\n/**\n * Controls how the budget behaves when `onThreshold` is set and a limit is hit.\n *\n * `'auto'` — emit `budget.threshold_reached` on the EventBus and wait for a\n * coordinator response (extend/stop). If no listener responds within\n * `DECISION_TIMEOUT_MS` the decision defaults to `'stop'`.\n * `'sync'` — do not emit any event; treat the threshold as a hard stop and\n * throw `BudgetExceededError` synchronously. Useful for fire-and-forget\n * subagents that have an `onThreshold` handler for logging/metrics but are\n * not wired into a coordinator.\n *\n * @default 'auto'\n */\nexport type BudgetNegotiationMode = 'auto' | 'sync';\n\nexport type BudgetSessionIdSource = string | (() => string | undefined);\n\nexport interface SubagentBudgetOptions {\n sessionId?: BudgetSessionIdSource | undefined;\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 /**\n * Direct grant/deny hooks for SYNCHRONOUS policy or recording handlers that\n * decide in-process without a wired `budget.threshold_reached` listener\n * (e.g. the coordinator watchdog). `extend` patches the limits in place;\n * `deny` records the intent to stop. Production listener-driven handlers use\n * `requestDecision()` instead and can ignore these.\n */\n extend?: (extra: Partial<BudgetLimits>) => void;\n deny?: () => void;\n}) => 'throw' | 'continue' | 'stop' | { extend: Partial<BudgetLimits> } | 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 without `onThreshold`: hard stops synchronously on every limit hit.\n *\n * Behavior with `onThreshold` and `_mode === 'auto'`: emits `budget.threshold_reached`\n * on the EventBus and throws `BudgetThresholdSignal`. The coordinator's verdict\n * (extend/stop) resolves the embedded promise. If no listener responds within\n * `DECISION_TIMEOUT_MS` the decision defaults to `'stop'`.\n *\n * Behavior with `onThreshold` and `_mode === 'sync'`: throws `BudgetExceededError`\n * synchronously regardless of EventBus state or listener presence. This is useful\n * for fire-and-forget subagents that have an `onThreshold` handler for logging/metrics\n * but are not wired into a coordinator — the `'sync'` mode makes the hard-stop\n * behavior explicit and means tests can use `expect().toThrow()` even without\n * a fully-wired EventBus.\n */\nexport class SubagentBudget {\n readonly limits: Readonly<BudgetLimits>;\n\n /** Patch one or more budget limits in-place after construction.\n * Used by the coordinator watchdog when granting an extension.\n * All fields are optional — only provided fields are updated.\n * This is the single write path for limit mutations so that future\n * validation or side-effects live in one place (M1). */\n patchLimits(ext: Partial<BudgetLimits>): void {\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 if (ext.timeoutMs !== undefined) {\n (this.limits as Record<string, unknown>).timeoutMs = ext.timeoutMs;\n }\n if (ext.idleTimeoutMs !== undefined) {\n (this.limits as Record<string, unknown>).idleTimeoutMs = ext.idleTimeoutMs;\n }\n }\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 /**\n * Timestamp of the most recent activity (iteration / tool call / token\n * usage / streamed progress). Drives the idle timeout — reset by\n * `markActivity()`. Initialised to `start()` time so a never-active agent\n * still eventually trips its idle window.\n */\n private lastActivityTime: number | null = null;\n private _onThreshold: BudgetThresholdHandler | undefined;\n private readonly _sessionId: BudgetSessionIdSource | undefined;\n /**\n * Hard cap on how long `_negotiateExtension` waits for the coordinator to\n * respond before defaulting to 'stop'. Without this fallback an absent\n * or hung listener (Director not built / event filter detached mid-run)\n * leaves the budget over-limit and never enforces anything.\n */\n private static readonly DECISION_TIMEOUT_MS = DECISION_TIMEOUT_MS;\n /**\n * Injected by the runner when wiring the budget to its EventBus.\n * Used to emit `budget.threshold_reached` events in `'auto'` mode.\n */\n _events?: EventBus | undefined;\n\n /**\n * Guard against dual-path races between the coordinator watchdog\n * (`executeWithTimeout`) and the budget's own `checkTimeout()`.\n * Both paths detect `elapsed >= timeoutMs` and can emit\n * `budget.threshold_reached` for kind `'timeout'` simultaneously.\n * Set to the current `timeoutMs` ceiling by the coordinator BEFORE\n * calling `onThreshold`, and cleared after the negotiation resolves.\n * `checkTimeout()` skips its wall-clock check while this is set so\n * the coordinator's watchdog is the sole source of wall-clock timeout\n * events — `checkTimeout()` focuses exclusively on `idle_timeout`.\n */\n private _watchdogActive: number | undefined;\n\n /** Returns the timeout ceiling currently being negotiated by the watchdog,\n * or `undefined` when no wall-clock negotiation is in flight.\n * Used by `executeWithTimeout` to detect a stale lock (M3). */\n get watchdogActive(): number | undefined { return this._watchdogActive; }\n\n /** Called by the coordinator watchdog BEFORE calling `onThreshold` so that\n * `checkTimeout()` skips its wall-clock check for this ceiling. Prevents\n * the budget's own `checkTimeout()` from emitting a second\n * `budget.threshold_reached` event while the watchdog is already\n * negotiating the same wall-clock deadline (C1). */\n setWatchdogNegotiation(timeoutMs: number): void { this._watchdogActive = timeoutMs; }\n\n /** Clears the watchdog guard after negotiation resolves. Called in the\n * `finally` block of both the pre-empt and deadline branches so it fires\n * on every exit path: grant, deny, throw, or error. */\n clearWatchdogNegotiation(): void { this._watchdogActive = undefined; }\n\n /**\n * Negotiation mode — controls whether a threshold hit tries to emit\n * `budget.threshold_reached` and wait for a coordinator decision, or\n * falls straight through to a synchronous hard stop.\n *\n * `'auto'` (default) — emit on the EventBus and wait; times out to 'stop'.\n * `'sync'` — throw `BudgetExceededError` immediately regardless of listeners.\n */\n private _mode: BudgetNegotiationMode;\n\n /**\n * Optional callback for soft-limit handling. When set, the budget will\n * invoke it rather than throw immediately. The handler decides whether to\n * throw synchronously, continue, or ask the coordinator for an extension.\n */\n get onThreshold(): BudgetThresholdHandler | undefined {\n return this._onThreshold;\n }\n set onThreshold(fn: BudgetThresholdHandler | undefined) {\n this._onThreshold = fn;\n }\n\n /** Returns the current negotiation mode. */\n get mode(): BudgetNegotiationMode {\n return this._mode;\n }\n\n constructor(\n limits: BudgetLimits = {},\n mode: BudgetNegotiationMode = 'auto',\n options: SubagentBudgetOptions = {},\n ) {\n this._mode = mode;\n this._sessionId = options.sessionId;\n // NOT frozen: `negotiateExtension` patches these limits in place when the\n // coordinator grants an auto-extension. Freezing made every granted\n // extension throw `TypeError: Cannot assign to read only property` in\n // strict mode, which the runner caught as a hard stop — so extensions\n // silently became kills. The `readonly limits: Readonly<BudgetLimits>`\n // typing still blocks external mutation at compile time.\n this.limits = { ...limits };\n }\n\n private currentSessionId(): string | undefined {\n const value = typeof this._sessionId === 'function' ? this._sessionId() : this._sessionId;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\n\n start(): void {\n this.startTime = Date.now();\n this.lastActivityTime = this.startTime;\n }\n\n /**\n * Reset the idle clock. Called on any sign of forward progress —\n * iterations, tool calls, token usage, and streamed tool/text progress —\n * so a long-but-productive subagent never trips its `idleTimeoutMs`.\n */\n markActivity(): void {\n this.lastActivityTime = Date.now();\n }\n\n /**\n * Milliseconds since the last activity signal. Returns 0 before `start()`\n * (nothing to measure yet). Used by the coordinator watchdog to decide\n * whether to re-arm (still active) or reap (genuinely idle).\n */\n idleMs(): number {\n const since = this.lastActivityTime ?? this.startTime;\n return since === null ? 0 : Date.now() - since;\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 (especially\n * test event handlers using `expect().toThrow()`) get an unhandled rejection\n * when the budget is exceeded without a handler.\n *\n * Decision table:\n * - no `onThreshold` handler → throw `BudgetExceededError` (hard stop, always)\n * - `mode === 'sync'` → throw `BudgetExceededError` (hard stop, always)\n * - `mode === 'auto'` + no listener → throw `BudgetExceededError` (hard stop; no one to ask)\n * - `mode === 'auto'` + listener → throw `BudgetThresholdSignal` with async decision promise\n */\n /**\n * Collects all exceeded budget kinds into a single NOOP-free negotiation.\n * Called by recordIteration / recordToolCall / recordUsage — each may call\n * this for its own kind. The first call starts the negotiation and stores\n * the Promise in _pendingNegotiation. Subsequent calls for DIFFERENT\n * kinds (while a negotiation is in flight) are NOOPs — they don't start\n * new conversations with the coordinator. This prevents an EventBus flood\n * when multiple budget kinds are exceeded simultaneously in one iteration.\n *\n * Returns the kinds that were found to be exceeded (for logging/debugging).\n */\n private checkLimits(elapsedMs?: number): { kind: BudgetKind; used: number; limit: number }[] {\n const exceeded: { kind: BudgetKind; used: number; limit: number }[] = [];\n\n if (this.limits.maxIterations !== undefined && this.iterations > this.limits.maxIterations) {\n exceeded.push({ kind: 'iterations', used: this.iterations, limit: this.limits.maxIterations });\n }\n if (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\n exceeded.push({ kind: 'tool_calls', used: this.toolCalls, limit: this.limits.maxToolCalls });\n }\n const totalTokens = this.tokenInput + this.tokenOutput;\n if (this.limits.maxTokens !== undefined && totalTokens > this.limits.maxTokens) {\n exceeded.push({ kind: 'tokens', used: totalTokens, limit: this.limits.maxTokens });\n }\n if (this.limits.maxCostUsd !== undefined && this.costUsd > this.limits.maxCostUsd) {\n exceeded.push({ kind: 'cost', used: this.costUsd, limit: this.limits.maxCostUsd });\n }\n // Timeout: called from checkTimeout() with elapsedMs (wall-clock) and the\n // current idle gap. Either crossing its limit trips its own kind so the\n // coordinator and auto-extend policy can distinguish them.\n // Wall-clock (`timeoutMs`) is an explicit hard cap; idle (`idleTimeoutMs`)\n // is the default guard that resets on activity. Both can be exceeded in\n // the same call — we push both entries so all violated limits are reported.\n if (elapsedMs !== undefined) {\n const idle = this.idleMs();\n if (this.limits.idleTimeoutMs !== undefined && idle > this.limits.idleTimeoutMs) {\n exceeded.push({ kind: 'idle_timeout', used: idle, limit: this.limits.idleTimeoutMs });\n }\n // Skip the wall-clock 'timeout' kind while the coordinator watchdog is\n // negotiating this exact ceiling — it owns wall-clock; checkTimeout/here\n // own idle. Only suppress in the negotiation path (a handler is set); on\n // the no-handler hard-throw path the wall-clock must still trip. (Mirrors\n // the guard in checkTimeout, which previously was NOT applied here — so\n // an idle trip that called checkLimits re-added 'timeout' and defeated the\n // watchdog dedup.)\n const wallOwnedByWatchdog =\n this._onThreshold !== undefined && this._watchdogActive === this.limits.timeoutMs;\n if (\n this.limits.timeoutMs !== undefined &&\n elapsedMs > this.limits.timeoutMs &&\n !wallOwnedByWatchdog\n ) {\n exceeded.push({ kind: 'timeout', used: elapsedMs, limit: this.limits.timeoutMs });\n }\n }\n\n if (exceeded.length === 0) return [];\n\n if (!this._onThreshold) {\n // Hard stop — throw on the first exceeded kind.\n const first = exceeded[0] ?? { kind: 'iterations', limit: 0, used: 0 };\n throw new BudgetExceededError(first.kind, first.limit, first.used);\n }\n if (this._mode === 'sync') {\n // Hard stop in sync mode.\n const first = exceeded[0] ?? { kind: 'iterations', limit: 0, used: 0 };\n throw new BudgetExceededError(first.kind, first.limit, first.used);\n }\n const bus = this._events;\n if (!bus) {\n // No EventBus wired at all → nobody to negotiate with → hard stop.\n const first = exceeded[0] ?? { kind: 'iterations', limit: 0, used: 0 };\n throw new BudgetExceededError(first.kind, first.limit, first.used);\n }\n\n const first = exceeded[0] ?? { kind: 'iterations', limit: 0, used: 0 };\n\n // LISTENER-DRIVEN PATH. A registered `budget.threshold_reached` listener\n // (director / collab / auto-extend) negotiates asynchronously. Start one\n // negotiation PER exceeded kind — each reports its OWN kind/used/limit and\n // emits a single event (no O(N^2) re-emission, no cross-kind first-wins\n // drop). Throw `BudgetThresholdSignal` for the first kind so the runner\n // awaits the decision and enforces extend/stop.\n if (bus.hasListenerFor('budget.threshold_reached')) {\n for (const entry of exceeded) {\n if (this._pendingNegotiations.has(entry.kind)) continue; // already negotiating this kind\n this._pendingNegotiations.set(entry.kind, this._negotiateExtension(entry));\n }\n const decision = this._pendingNegotiations.get(first.kind);\n if (!decision) throw new Error(`No pending negotiation for ${first.kind}`);\n throw new BudgetThresholdSignal(first.kind, first.limit, first.used, decision);\n }\n\n // NO-LISTENER PATH. Invoke the handler synchronously to let an in-process\n // policy decide. Two outcomes:\n // • SYNC handler (returns a string/decision — e.g. the coordinator\n // watchdog / recording handlers) → its decision is honored in place\n // (an `extend` patches limits); no throw. This is the path the\n // watchdog drives while it owns wall-clock enforcement.\n // • ASYNC handler (returns a Promise via `requestDecision()`) → there is\n // no listener to resolve it and `requestDecision` resolves to 'stop',\n // so this is a definite hard stop: throw `BudgetExceededError`. This is\n // the documented \"auto mode + no listener → hard stop\" invariant that\n // protects a bare `/spawn` (no director) from a runaway subagent.\n let hardStop: BudgetExceededError | null = null;\n for (const entry of exceeded) {\n // Dedup per kind across back-to-back overruns in the same tick — a still\n // exceeded kind (e.g. iterations stays over after a grant) must not\n // re-invoke the handler on every record* call. The marker clears on a\n // microtask so a genuinely fresh overrun later can re-negotiate.\n if (this._pendingNegotiations.has(entry.kind)) continue;\n const marker = Promise.resolve<BudgetThresholdDecision>('stop');\n this._pendingNegotiations.set(entry.kind, marker);\n void marker.finally(() => this._pendingNegotiations.delete(entry.kind));\n const sync = this._invokeHandlerSync(entry);\n if (!sync) hardStop ??= new BudgetExceededError(entry.kind, entry.limit, entry.used);\n }\n if (hardStop) throw hardStop;\n return exceeded;\n }\n\n /**\n * Invoke `onThreshold` once for `entry` on the NO-LISTENER path and report\n * whether it decided synchronously. Returns `true` when the handler returned\n * a synchronous decision (already honored — an `extend` patched the limits),\n * or `false` when it returned a Promise (async; the caller hard-stops, since\n * there is no listener to resolve the negotiation). The handler is given the\n * full info shape (`requestDecision` plus direct `extend`/`deny`) so both\n * recording handlers and policy handlers work without a wired listener.\n */\n private _invokeHandlerSync(entry: { kind: BudgetKind; used: number; limit: number }): boolean {\n const handler = this._onThreshold;\n if (!handler) return false;\n let extendArg: Partial<BudgetLimits> | undefined;\n const result = handler({\n kind: entry.kind,\n used: entry.used,\n limit: entry.limit,\n requestDecision: (): Promise<BudgetThresholdDecision> => this._busRequestDecision(entry),\n // Direct hooks for synchronous policy/recording handlers.\n extend: (extra: Partial<BudgetLimits>) => {\n extendArg = extra;\n },\n deny: () => {},\n } as Parameters<BudgetThresholdHandler>[0]);\n // A thenable means the handler deferred to async negotiation — but there is\n // no listener here, so it can never be granted → hard stop.\n if (result && typeof (result as { then?: unknown }).then === 'function') return false;\n if (result === 'throw') return false; // explicit hard stop\n // 'continue' / 'stop' / a returned { extend } decision — honor in place.\n if (result && typeof result === 'object' && 'extend' in result) {\n extendArg = (result as { extend: Partial<BudgetLimits> }).extend;\n }\n if (extendArg) this.patchLimits(extendArg);\n return true;\n }\n\n /**\n * Emit `budget.threshold_reached` and resolve to the listener's verdict.\n * Resolves to `'stop'` immediately when there is no listener (or no bus) so\n * no negotiation can hang and no fallback timer leaks. Mirrors the\n * coordinator watchdog's own request path so both agree on the no-listener\n * default.\n */\n private _busRequestDecision(entry: {\n kind: BudgetKind;\n used: number;\n limit: number;\n }): Promise<BudgetThresholdDecision> {\n const bus = this._events;\n if (!bus?.hasListenerFor('budget.threshold_reached')) {\n return Promise.resolve('stop');\n }\n return new Promise<BudgetThresholdDecision>((resolve) => {\n let resolved = false;\n const respond = (d: BudgetThresholdDecision) => {\n if (resolved) return;\n resolved = true;\n clearTimeout(fallback);\n resolve(d);\n };\n const fallback = setTimeout(() => respond('stop'), SubagentBudget.DECISION_TIMEOUT_MS);\n const sessionId = this.currentSessionId();\n bus.emit('budget.threshold_reached', {\n ...(sessionId ? { sessionId } : {}),\n kind: entry.kind as\n | 'iterations'\n | 'tool_calls'\n | 'tokens'\n | 'cost'\n | 'timeout'\n | 'idle_timeout',\n used: entry.used,\n limit: entry.limit,\n timeoutMs: SubagentBudget.DECISION_TIMEOUT_MS,\n // deny() wins over a same-dispatch extend(): a listener that both grants\n // and denies (or two listeners disagreeing) is resolved as a stop. The\n // grant is deferred a microtask so a synchronous deny in the same emit\n // pre-empts it; async grants still resolve normally.\n extend: (extra: Partial<BudgetLimits>) => queueMicrotask(() => respond({ extend: extra })),\n deny: () => respond('stop'),\n });\n });\n }\n\n /**\n * Per-kind in-flight negotiation Promises. Each budget kind can have its\n * own concurrent negotiation — e.g. iterations and timeout can both\n * be exceeded simultaneously without blocking each other. The same kind\n * cannot start two concurrent negotiations (dedup guard).\n * Cleared in `_negotiateExtension`'s `finally` block.\n */\n private _pendingNegotiations = new Map<BudgetKind, Promise<BudgetThresholdDecision>>();\n\n /**\n * Drive the threshold handler to a decision. Resolves with `'stop'`\n * (signal the runner to abort) or `{ extend: ... }` (limits already\n * patched in-place; the runner should not abort). Clears the\n * per-kind slot in `_pendingNegotiations` in `finally`.\n *\n * The 'continue' return from a sync handler is treated as\n * `{ extend: {} }` — keep going without patching; next overrun fires\n * a fresh signal.\n */\n private async _negotiateExtension(\n entry: { kind: BudgetKind; used: number; limit: number },\n ): Promise<BudgetThresholdDecision> {\n if (!this._onThreshold) {\n // Should never reach here — caller should have thrown already\n return 'stop';\n }\n try {\n const result = this._onThreshold({\n kind: entry.kind,\n used: entry.used,\n limit: entry.limit,\n // One event for THIS kind only — each exceeded kind has its own\n // negotiation (and its own resolve), so there is no cross-kind\n // first-wins drop and no O(N^2) re-emission.\n requestDecision: (): Promise<BudgetThresholdDecision> => this._busRequestDecision(entry),\n extend: (extra: Partial<BudgetLimits>) => {\n this.patchLimits(extra);\n },\n deny: () => {},\n } as Parameters<BudgetThresholdHandler>[0]);\n\n if (result === 'throw') return 'stop';\n if (result === 'continue') return { extend: {} };\n\n const decision = await result;\n if (decision === 'stop') return 'stop';\n\n // 'extend' — patch in-place limits BEFORE resolving (single write path).\n this.patchLimits(decision.extend);\n return decision;\n } finally {\n this._pendingNegotiations.delete(entry.kind);\n }\n }\n\n recordIteration(): void {\n this.iterations++;\n this.markActivity();\n void this.checkLimits();\n }\n\n recordToolCall(): void {\n this.toolCalls++;\n this.markActivity();\n void this.checkLimits();\n }\n\n recordUsage(usage: Usage, costUsd = 0): void {\n this.tokenInput += usage.input;\n this.tokenOutput += usage.output;\n this.costUsd += costUsd;\n this.markActivity();\n void this.checkLimits();\n }\n\n /**\n * Wall-clock / idle budget check. Delegates to `checkLimits(elapsed)`, so\n * `timeout` and `idle_timeout` follow the SAME negotiation path as the other\n * kinds — they are NOT a special-cased hard stop. This is deliberate: a\n * heartbeat-aware policy (see `attachAutoExtend` and `CollabSession`) grants\n * a timeout extension only while the agent is making progress and denies it\n * once the agent is genuinely stuck, which is safer than an unconditional\n * hard kill of a long-but-working agent. The runner translates the resulting\n * `BudgetThresholdSignal` decision (`extend` → patch limits in place,\n * `stop` → abort) just like every other kind.\n *\n * Decision table (same as `checkLimits`):\n * - no `onThreshold` handler → throw `BudgetExceededError` (hard stop)\n * - `mode === 'sync'` → throw `BudgetExceededError` (hard stop)\n * - `mode === 'auto'` + no listener → throw `BudgetExceededError` (no one to ask)\n * - `mode === 'auto'` + listener → throw `BudgetThresholdSignal` (negotiated;\n * a heartbeat-aware policy may extend the timeout)\n */\n checkTimeout(): void {\n if (this.startTime === null) return;\n const { timeoutMs, idleTimeoutMs } = this.limits;\n if (timeoutMs === undefined && idleTimeoutMs === undefined) return;\n const elapsed = Date.now() - this.startTime;\n // Skip wall-clock timeout if the coordinator watchdog is already in the middle\n // of negotiating this exact ceiling — tool.progress is too frequent and creates\n // a race where both paths emit budget.threshold_reached for the same kind.\n // The watchdog owns wall-clock; checkTimeout focuses exclusively on idle.\n const wallSkipped =\n this._onThreshold !== undefined &&\n this._watchdogActive !== undefined &&\n timeoutMs !== undefined &&\n this._watchdogActive === timeoutMs;\n const wallTripped = wallSkipped ? false : timeoutMs !== undefined && elapsed > timeoutMs;\n const idleTripped = idleTimeoutMs !== undefined && this.idleMs() > idleTimeoutMs;\n if (!wallTripped && !idleTripped) return;\n void this.checkLimits(elapsed);\n }\n\n /** Returns true if a wall-clock or idle timeout has occurred without throwing. */\n isTimedOut(): boolean {\n if (this.startTime === null) return false;\n const { timeoutMs, idleTimeoutMs } = this.limits;\n if (timeoutMs !== undefined && Date.now() - this.startTime > timeoutMs) return true;\n if (idleTimeoutMs !== undefined && this.idleMs() > idleTimeoutMs) return true;\n return false;\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}\n","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError, ERROR_CODES } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.js';\nimport { truncate } from '../utils/string.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 type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\nexport type CacheTtl = '5m' | '1h';\n\n/**\n * Provider-agnostic response-format directive.\n *\n * - `{ type: 'text' }` — free-form text (default).\n * - `{ type: 'json_object' }` — valid JSON without a schema constraint.\n * - `{ type: 'json_schema', jsonSchema: { name, schema, strict? } }` — JSON\n * constrained to the supplied JSON Schema. The `strict` flag is\n * OpenAI-specific; Gemini ignores it in favour of `responseMimeType`.\n *\n * Each provider adapter maps this into its own wire format:\n * OpenAI → `response_format`\n * Gemini → `responseMimeType` + `responseSchema`\n * Anthropic → (not yet supported; uses tools for structured output)\n */\nexport interface JsonSchemaSpec {\n name: string;\n /** OpenAI-specific: enable strict schema adherence. */\n strict?: boolean | undefined;\n /** The JSON Schema object describing the expected shape. */\n schema: Record<string, unknown>;\n /** Optional human-readable description (OpenAI). */\n description?: string | undefined;\n}\n\nexport type ResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | { type: 'json_schema'; jsonSchema: JsonSchemaSpec };\n\n/**\n * Safety category threshold pair used by Google Gemini's `safetySettings`.\n *\n * Categories: `HARM_CATEGORY_HARASSMENT`, `HARM_CATEGORY_HATE_SPEECH`,\n * `HARM_CATEGORY_SEXUALLY_EXPLICIT`, `HARM_CATEGORY_DANGEROUS_CONTENT`.\n *\n * Thresholds: `BLOCK_NONE`, `BLOCK_ONLY_HIGH`, `BLOCK_MEDIUM_AND_ABOVE`,\n * `BLOCK_LOW_AND_ABOVE`.\n */\nexport interface SafetySetting {\n category: string;\n threshold: string;\n}\n\nexport interface Usage {\n input: number;\n output: number;\n cacheRead?: number | undefined;\n /** Back-compat aggregate of all cache-write tokens. Prefer TTL-specific fields when present. */\n cacheWrite?: number | undefined;\n cacheWrite5m?: number | undefined;\n cacheWrite1h?: number | undefined;\n}\n\nexport interface ReasoningRequest {\n enabled?: boolean | undefined;\n effort?: ReasoningEffort | undefined;\n preserve?: boolean | undefined;\n display?: 'summarized' | 'omitted' | undefined;\n}\n\nexport interface RequestCacheControl {\n ttl?: CacheTtl | undefined;\n}\n\nexport interface ReasoningConfig {\n default: 'enabled' | 'disabled' | 'adaptive' | 'always_on';\n disableSupported: boolean;\n effortSupported: boolean;\n effortLevels: ReasoningEffort[];\n preserveThinking: 'unsupported' | 'optional' | 'always_on';\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 reasoning: boolean;\n maxContext: number;\n /**\n * Maximum output tokens the model can produce in a single response.\n * Used as the default for `Request.maxTokens` when the caller doesn't\n * supply an explicit value — letting subagents run up to the model's\n * native ceiling instead of a fixed 8192 cap. Omit (undefined) to fall\n * back to a conservative default; populate per family in\n * `family-capabilities.ts` once you know the spec.\n */\n maxOutput?: number | undefined;\n cacheControl: 'native' | 'auto' | 'none';\n\n // ── Extended parameter support (optional; family defaults in CAPABILITIES_BY_FAMILY) ──\n\n /** Model accepts `top_k` / `topK` sampling parameter. */\n topK?: boolean | undefined;\n /** Model accepts `frequency_penalty` / `frequencyPenalty` parameter. */\n frequencyPenalty?: boolean | undefined;\n /** Model accepts `presence_penalty` / `presencePenalty` parameter. */\n presencePenalty?: boolean | undefined;\n /** Model accepts `seed` parameter for deterministic generation. */\n seed?: boolean | undefined;\n /**\n * Model accepts JSON Schema / structured-output constraints\n * (OpenAI `response_format.json_schema`, Gemini `responseMimeType`+`responseSchema`).\n * Distinct from `jsonMode` (which is just a system-prompt hint).\n */\n structuredOutput?: boolean | undefined;\n /** Model supports log-probability output (`logprobs`, `top_logprobs`). */\n logprobs?: boolean | undefined;\n /** Model supports audio input/output modality. */\n audio?: boolean | undefined;\n /** Model supports the `n` parameter for multiple completions. */\n multipleCompletions?: boolean | undefined;\n}\n\nexport interface Request {\n model: string;\n system?: TextBlock[] | undefined;\n messages: Message[];\n tools?: Tool[] | undefined;\n /**\n * Cap on output tokens for this single response. Optional — when\n * omitted, the provider adapter falls back to its own\n * `capabilities.maxOutput` (which the catalog populates from\n * `ModelsDevModel.limit.output`). If neither is available, the\n * adapter applies a conservative 8192 safety net. Letting this stay\n * undefined at the call site means callers like Chimera can hand the\n * model its native output ceiling without hard-coding a number.\n */\n maxTokens?: number | undefined;\n temperature?: number | undefined;\n topP?: number | undefined;\n topK?: number | undefined;\n frequencyPenalty?: number | undefined;\n presencePenalty?: number | undefined;\n seed?: number | undefined;\n /**\n * End-user identifier for abuse monitoring and per-user rate limiting.\n * - Anthropic → `metadata.user_id`\n * - OpenAI → `user`\n * - Gemini → (not supported)\n */\n user?: string | undefined;\n /**\n * Number of response candidates to generate. Google Gemini supports\n * this via `generationConfig.candidateCount`. OpenAI does not have\n * an equivalent (`n` is conceptually similar but distinct).\n */\n candidateCount?: number | undefined;\n /**\n * Whether to return log probabilities for output tokens.\n * - OpenAI → `logprobs: boolean` (+ `topLogprobs: number`)\n * - Gemini → `generationConfig.logprobs: number` (how many top candidates)\n * Default undefined = no logprobs requested.\n */\n logprobs?: boolean | undefined;\n /**\n * Number of most probable tokens to return log probabilities for\n * (OpenAI `top_logprobs`). Only meaningful when `logprobs` is true.\n * Range: 0-20. Gemini ignores this (uses `logprobs` as the count).\n */\n topLogprobs?: number | undefined;\n stopSequences?: string[] | undefined;\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool' | undefined; name: string };\n reasoning?: ReasoningRequest | undefined;\n cache?: RequestCacheControl | undefined;\n /**\n * Structured-output / response-format directive.\n * When set, the provider adapter maps this to its native response-format\n * parameter (OpenAI `response_format`, Gemini `responseMimeType`, etc.).\n * The model must advertise `capabilities.structuredOutput` for this to be\n * honoured; unsupported models will likely 400 or ignore it.\n */\n responseFormat?: ResponseFormat | undefined;\n /**\n * Safety category thresholds for filtering harmful content.\n * - Gemini → top-level `safetySettings` array with `{ category, threshold }`\n * - OpenAI → not supported (uses server-side moderation)\n * - Anthropic → not supported\n */\n safetySettings?: SafetySetting[] | undefined;\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 | undefined;\n name?: string | undefined;\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 | undefined;\n /** Human-readable explanation from the provider. */\n message?: string | undefined;\n /** Provider request id, when present in the body or headers. */\n requestId?: string | undefined;\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\n retryAfterMs?: number | undefined;\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\n raw?: string | undefined;\n /** True when `raw` was truncated; check `rawLength` for the original size. */\n truncated?: boolean | undefined;\n /** Original length of the response body in bytes, when `truncated` is true. */\n rawLength?: number | undefined;\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 | undefined;\n\n constructor(\n message: string,\n status: number,\n retryable: boolean,\n providerId: string,\n opts: { body?: ProviderErrorBody | undefined; cause?: unknown | undefined } = {},\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\n/**\n * Thrown when the provider stream stops delivering data mid-response.\n * This is distinct from a network error (TCP reset, DNS failure) — the\n * connection is established and the response started, but chunks stopped\n * arriving before the stream completed.\n *\n * Status 599 is used as a sentinel to distinguish stream hangs from\n * regular HTTP errors while still flowing through ProviderError-based\n * retry and fallback infrastructure.\n */\nexport class StreamHangError extends ProviderError {\n /** Name of the provider that hung, e.g. \"zai\", \"anthropic\". */\n public readonly hungProviderId: string;\n /** Model that was being called when the hang occurred. */\n public readonly hungModel: string;\n /** How long (ms) we waited for the next chunk before declaring a hang. */\n public readonly hangTimeoutMs: number;\n /** How many bytes were received before the hang. */\n public readonly bytesReceived: number;\n /** Elapsed time (ms) from the start of the stream until the hang. */\n public readonly elapsedMs: number;\n\n constructor(opts: {\n providerId: string;\n model: string;\n hangTimeoutMs: number;\n bytesReceived: number;\n elapsedMs: number;\n cause?: unknown | undefined;\n }) {\n super(\n `Stream hang: ${opts.providerId}/${opts.model} — no data for ${opts.hangTimeoutMs}ms after ${opts.bytesReceived} bytes (${opts.elapsedMs}ms elapsed)`,\n 599,\n true, // always retryable\n opts.providerId,\n {\n body: {\n message: `Stream stalled after ${opts.elapsedMs}ms, ${opts.bytesReceived} bytes received`,\n },\n cause: opts.cause,\n },\n );\n this.name = 'StreamHangError';\n this.hungProviderId = opts.providerId;\n this.hungModel = opts.model;\n this.hangTimeoutMs = opts.hangTimeoutMs;\n this.bytesReceived = opts.bytesReceived;\n this.elapsedMs = opts.elapsedMs;\n }\n}\n\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\n if (status === 0) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (type === 'rate_limit_error' || status === 429) return ERROR_CODES.PROVIDER_RATE_LIMITED;\n if (type === 'authentication_error' || status === 401) return ERROR_CODES.PROVIDER_AUTH_FAILED;\n if (type === 'overloaded_error' || status === 529) return ERROR_CODES.PROVIDER_OVERLOADED;\n if (type === 'invalid_request_error' || status === 400) return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n if (status === 408) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (status >= 500) return ERROR_CODES.PROVIDER_SERVER_ERROR;\n return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n}\n","import type { SubagentError, SubagentErrorKind } from '../../types/multi-agent.js';\nimport { ProviderError } from '../../types/provider.js';\nimport { AgentError } from '../../types/errors.js';\nimport { BudgetExceededError } from '../subagent-budget.js';\nimport { toErrorMessage } from '../../utils/error.js';\n\n/**\n * Map any raw exception thrown out of a subagent's runner into a\n * structured `SubagentError`. This is the single point where the\n * coordinator decides \"what kind of failure was that\" — so callers\n * (delegate tool output, /agents UI, retry policies) branch on\n * `kind` instead of substring-matching `error.message`.\n *\n * Exported because tests and CLI surfaces want to assert on the\n * classification without instantiating a coordinator.\n */\nexport function classifySubagentError(\n err: unknown,\n hints: { parentAborted?: boolean | undefined } = {},\n): SubagentError {\n // Unwrap AgentError wrappers — the runner wraps non-AgentError\n // throwables (ProviderError, TypeError, etc.) in AgentError so the\n // coordinator's try/catch catches a consistent type. Recurse into the\n // inner cause so classification sees the original error kind.\n if (err instanceof AgentError && err.cause) {\n return classifySubagentError(err.cause, hints);\n }\n\n const cause = err instanceof Error\n ? { name: err.name, message: err.message, stack: err.stack }\n : undefined;\n\n if (err instanceof ProviderError) {\n const baseMessage = err.describe();\n return providerErrorToSubagentError(err, baseMessage, cause);\n }\n\n const baseMessage = toErrorMessage(err);\n\n if (err instanceof BudgetExceededError) {\n const map: Record<BudgetExceededError['kind'], SubagentErrorKind> = {\n iterations: 'budget_iterations',\n tool_calls: 'budget_tool_calls',\n tokens: 'budget_tokens',\n cost: 'budget_cost',\n timeout: 'budget_timeout',\n idle_timeout: 'budget_timeout',\n };\n return {\n kind: map[err.kind],\n message: baseMessage,\n retryable: false,\n cause,\n };\n }\n\n if (hints.parentAborted) {\n return { kind: 'aborted_by_parent', message: baseMessage, retryable: false, cause };\n }\n\n const lower = baseMessage.toLowerCase();\n if (/agent aborted$/i.test(baseMessage)) {\n return { kind: 'aborted_by_parent', message: baseMessage, retryable: false, cause };\n }\n if (/agent exhausted iteration limit$/i.test(baseMessage)) {\n return { kind: 'budget_iterations', message: baseMessage, retryable: false, cause };\n }\n if (/empty response/i.test(baseMessage)) {\n return { kind: 'empty_response', message: baseMessage, retryable: false, cause };\n }\n if (/^tool failed: /i.test(baseMessage)) {\n return { kind: 'tool_failed', message: baseMessage, retryable: false, cause };\n }\n if (lower.includes('bridge transport') || /bridge.*(closed|disconnect)/i.test(baseMessage)) {\n return { kind: 'bridge_failed', message: baseMessage, retryable: false, cause };\n }\n if (/context length|max.*tokens?.*exceeded|prompt is too long/i.test(baseMessage)) {\n return { kind: 'context_overflow', message: baseMessage, retryable: false, cause };\n }\n\n return { kind: 'unknown', message: baseMessage, retryable: false, cause };\n}\n\nfunction providerErrorToSubagentError(\n err: ProviderError,\n message: string,\n cause: SubagentError['cause'],\n): SubagentError {\n const status = err.status;\n if (status === 429 || err.body?.type === 'rate_limit_error') {\n return { kind: 'provider_rate_limit', message, retryable: true, backoffMs: 5_000, cause };\n }\n if (status === 401 || status === 403 || err.body?.type === 'authentication_error') {\n return { kind: 'provider_auth', message, retryable: false, cause };\n }\n if (status === 408 || status === 0) {\n return { kind: 'provider_timeout', message, retryable: true, cause };\n }\n if (status >= 500 && status < 600) {\n return { kind: 'provider_5xx', message, retryable: true, backoffMs: 3_000, cause };\n }\n return { kind: 'unknown', message, retryable: err.retryable, cause };\n}\n","/**\n * Catalog types for the WrongStack agent fleet.\n *\n * An `AgentDefinition` bundles the runtime `SubagentConfig` (id/name/role/\n * prompt/tools) with two things the bare config lacks:\n * - a per-role `budget` tier (consumed by FLEET_ROSTER_BUDGETS), and\n * - dispatcher `capability` metadata (keywords + summary + phase) used by\n * the smart dispatcher to route a free-form task to the best agent.\n *\n * Phase files (`phase1-discovery.ts` … `phase9-meta.ts`) each export an\n * `AgentDefinition[]`; `index.ts` aggregates them into `AGENT_CATALOG`.\n * `fleet.ts` derives `FLEET_ROSTER` + `FLEET_ROSTER_BUDGETS` from the catalog.\n */\nimport type { SubagentConfig } from '../../types/multi-agent.js';\n\n/** Lifecycle phase grouping. Drives statusline labels + dispatcher tie-breaks. */\nexport type AgentPhase =\n | 'discovery'\n | 'planning'\n | 'build'\n | 'verify'\n | 'review'\n | 'domain'\n | 'knowledge'\n | 'delivery'\n | 'meta';\n\n/** Per-role budget tier. Same shape as fleet.ts `FleetRosterBudget`. */\nexport interface AgentBudgetTier {\n timeoutMs?: number | undefined;\n maxIterations?: number | undefined;\n maxToolCalls?: number | undefined;\n maxTokens?: number | undefined;\n maxCostUsd?: number | undefined;\n}\n\n/** Dispatcher routing metadata. */\nexport interface AgentCapability {\n phase: AgentPhase;\n /**\n * One-line capability summary. Fed to the LLM dispatcher classifier as the\n * candidate's description, and shown to the user when explaining a routing\n * decision. Keep it concrete and distinct from sibling agents.\n */\n summary: string;\n /**\n * Lowercased signal words/phrases for the heuristic dispatcher. A task whose\n * description contains these scores toward this agent. Order doesn't matter;\n * prefer specific terms (\"graphql\", \"wcag\") over generic ones (\"code\").\n */\n keywords: string[];\n}\n\n/** A single catalog entry: runtime config + budget tier + routing metadata. */\nexport interface AgentDefinition {\n config: SubagentConfig;\n budget: AgentBudgetTier;\n capability: AgentCapability;\n}\n\nconst HOUR = 60 * 60 * 1000;\n\n/**\n * Budget tiers by workload weight. Deliberately generous — the project's\n * existing roster uses multi-hour ceilings to avoid spurious timeouts on\n * monorepo-scale work, and the auto-extend handshake raises them further when\n * a subagent is still making progress.\n */\nexport const LIGHT_BUDGET: AgentBudgetTier = {\n timeoutMs: 3 * HOUR,\n maxIterations: 3000,\n maxToolCalls: 8000,\n};\nexport const MEDIUM_BUDGET: AgentBudgetTier = {\n timeoutMs: 5 * HOUR,\n maxIterations: 5000,\n maxToolCalls: 14000,\n};\nexport const HEAVY_BUDGET: AgentBudgetTier = {\n timeoutMs: 10 * HOUR,\n maxIterations: 8000,\n maxToolCalls: 20000,\n};\n\n/**\n * Tool allowlist presets. Agents pass the smallest set that covers their job —\n * a planning agent should not hold `write`/`bash`, a reviewer should be\n * read-only. Spread + extend per-agent where a role needs one extra tool.\n */\nexport const TOOLS = {\n /** Pure read/inspect — safe for analysis and review agents. */\n read: ['read', 'grep', 'glob', 'search', 'tree', 'mailbox'],\n /** Read + structured inspection (logs, diffs, json, dependency audit). */\n inspect: ['read', 'grep', 'glob', 'search', 'tree', 'json', 'diff', 'logs', 'audit', 'mailbox'],\n /** Read + edit (no shell). For agents that write code/docs but don't run it. */\n write: ['read', 'grep', 'glob', 'search', 'tree', 'write', 'edit', 'replace', 'patch', 'mailbox'],\n /** Full build loop: edit + run (lint/format/typecheck/test/bash). */\n build: [\n 'read',\n 'grep',\n 'glob',\n 'search',\n 'tree',\n 'write',\n 'edit',\n 'replace',\n 'patch',\n 'bash',\n 'exec',\n 'lint',\n 'format',\n 'typecheck',\n 'test',\n 'mailbox',\n ],\n /** Version control. */\n vcs: ['read', 'grep', 'glob', 'git', 'diff'],\n /** Dependency management + CVE audit. */\n deps: ['read', 'grep', 'glob', 'install', 'outdated', 'audit', 'json', 'mailbox'],\n /** Documentation authoring. */\n docs: ['read', 'grep', 'glob', 'search', 'tree', 'write', 'edit', 'document', 'mailbox'],\n /** Web research. */\n research: ['read', 'grep', 'glob', 'search', 'fetch', 'mailbox'],\n} as const satisfies Record<string, readonly string[]>;\n","import { readFileSync, statSync } from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function agentPrompt(id: string): string {\n const fileName = `${id}.md`;\n for (const dir of agentPromptDirCandidates()) {\n try {\n return readFileSync(path.join(dir, fileName), 'utf8').trimEnd();\n } catch {\n // try next candidate\n }\n }\n return '';\n}\n\nfunction agentPromptDirCandidates(): string[] {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const explicitDir = process.env['WRONGSTACK_AGENT_INSTRUCTIONS_DIR'];\n const globalRoot = process.env['WRONGSTACK_HOME'] || path.join(os.homedir(), '.wrongstack');\n const candidates = [\n ...(explicitDir ? [path.resolve(explicitDir)] : []),\n path.join(globalRoot, 'instructions', 'agents'),\n path.resolve(here, '../../../../instructions/agents'),\n path.resolve(here, '../../../instructions/agents'),\n path.resolve(here, '../../instructions/agents'),\n path.resolve(here, '../instructions/agents'),\n path.resolve(here, 'instructions/agents'),\n ];\n return candidates.sort((a, b) => Number(!isDirectory(a)) - Number(!isDirectory(b)));\n}\n\nfunction isDirectory(candidate: string): boolean {\n try {\n return statSync(candidate).isDirectory();\n } catch {\n return false;\n }\n}\n","import { type AgentDefinition, LIGHT_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 1 · Discovery — map the territory before any work begins. */\nexport const DISCOVERY_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'explore',\n name: 'Explore',\n role: 'explore',\n tools: [...TOOLS.read],\n prompt: agentPrompt('explore'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'discovery',\n summary: 'Maps unfamiliar codebases: entry points, structure, architecture, feature flow (read-only).',\n keywords: [\n 'explore',\n 'map',\n 'understand',\n 'where is',\n 'how does',\n 'codebase',\n 'architecture',\n 'structure',\n 'overview',\n 'find file',\n 'entry point',\n 'orient',\n ],\n },\n },\n {\n config: {\n id: 'search',\n name: 'Search',\n role: 'search',\n tools: [...TOOLS.read],\n prompt: agentPrompt('search'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'discovery',\n summary: 'Semantic + lexical code search across repos; finds definitions, references, duplicates, ranks by relevance.',\n keywords: [\n 'search',\n 'find all',\n 'references',\n 'usages',\n 'call sites',\n 'grep',\n 'locate symbol',\n 'duplicate',\n 'where used',\n 'occurrences',\n 'cross-repo',\n ],\n },\n },\n {\n config: {\n id: 'research',\n name: 'Research',\n role: 'research',\n tools: [...TOOLS.research],\n prompt: agentPrompt('research'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'discovery',\n summary: 'Technical research and feasibility: compares libraries/approaches, recommends a path with evidence and tradeoffs.',\n keywords: [\n 'research',\n 'feasibility',\n 'compare libraries',\n 'which library',\n 'best practice',\n 'tradeoff',\n 'investigate',\n 'evaluate approach',\n 'should we use',\n 'pros and cons',\n ],\n },\n },\n];\n","import { type AgentDefinition, HEAVY_BUDGET, LIGHT_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\nconst PLAN_TOOLS = [...TOOLS.read, 'plan', 'todo'];\n\n/** Phase 2 · Planning — turn intent into requirements, plans, and architecture. */\nexport const PLANNING_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'analyst',\n name: 'Analyst',\n role: 'analyst',\n tools: [...PLAN_TOOLS],\n prompt: agentPrompt('analyst'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'planning',\n summary: 'Requirement analysis: turns vague requests into testable specs with acceptance criteria and open questions.',\n keywords: [\n 'requirements',\n 'analyze requirement',\n 'acceptance criteria',\n 'spec',\n 'specification',\n 'clarify',\n 'scope',\n 'user story',\n 'what should it do',\n ],\n },\n },\n {\n config: {\n id: 'planner',\n name: 'Planner',\n role: 'planner',\n tools: [...PLAN_TOOLS],\n prompt: agentPrompt('planner'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'planning',\n summary: 'Execution planning: decomposes a goal into ordered, dependency-aware, parallelizable steps with checkpoints.',\n keywords: [\n 'plan',\n 'execution plan',\n 'break down',\n 'decompose',\n 'steps',\n 'sequence',\n 'roadmap',\n 'task breakdown',\n 'order of work',\n 'milestones',\n ],\n },\n },\n {\n config: {\n id: 'architect',\n name: 'Architect',\n role: 'architect',\n tools: [...PLAN_TOOLS],\n prompt: agentPrompt('architect'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'planning',\n summary: 'System architecture: designs module boundaries, interfaces, data flow, and records key decisions.',\n keywords: [\n 'architecture',\n 'design system',\n 'module boundaries',\n 'interfaces',\n 'data flow',\n 'component design',\n 'system design',\n 'decision record',\n 'adr',\n 'structure the',\n ],\n },\n },\n {\n config: {\n id: 'critic',\n name: 'Critic',\n role: 'critic',\n tools: [...TOOLS.read],\n prompt: agentPrompt('critic'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'planning',\n summary: 'Adversarial review of plans/designs: finds gaps, risks, and unstated assumptions with ranked fixes.',\n keywords: [\n 'critique',\n 'review plan',\n 'review design',\n 'red team',\n 'poke holes',\n 'risks',\n 'what could go wrong',\n 'second opinion',\n 'challenge',\n 'flaws',\n ],\n },\n },\n {\n config: {\n id: 'refactor-planner',\n name: 'Refactor Planner',\n role: 'refactor-planner',\n tools: [...PLAN_TOOLS, 'diff'],\n prompt: agentPrompt('refactor-planner'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'planning',\n summary: 'Refactoring planner: analyzes code structure, maps dependencies, produces risk-scored phased plans with rollback strategy.',\n keywords: [\n 'refactor',\n 'refactoring',\n 'restructure',\n 'debt',\n 'technical debt',\n 'clean up',\n 'modularize',\n 'decouple',\n 'dependency graph',\n 'code structure',\n ],\n },\n },\n];\n","import { type AgentDefinition, HEAVY_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 3 · Build — write, refactor, migrate, and fix code. */\nexport const BUILD_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'executor',\n name: 'Executor',\n role: 'executor',\n tools: [...TOOLS.build],\n prompt: agentPrompt('executor'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Implements well-specified tasks: writes code, runs checks, leaves the tree green.',\n keywords: [\n 'implement',\n 'build',\n 'write code',\n 'add feature',\n 'create',\n 'code up',\n 'develop',\n 'apply change',\n 'make it work',\n ],\n },\n },\n {\n config: {\n id: 'refactor',\n name: 'Refactor',\n role: 'refactor',\n tools: [...TOOLS.build],\n prompt: agentPrompt('refactor'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Structural refactoring: extract/split/move/rename/decouple without changing observable behavior.',\n keywords: [\n 'refactor',\n 'restructure',\n 'extract',\n 'split module',\n 'decouple',\n 'rename',\n 'move code',\n 'break dependency',\n 'reorganize',\n ],\n },\n },\n {\n config: {\n id: 'simplifier',\n name: 'Simplifier',\n role: 'simplifier',\n tools: [...TOOLS.build],\n prompt: agentPrompt('simplifier'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Reduces complexity: deletes dead code, collapses needless abstractions, shortens and clarifies code.',\n keywords: [\n 'simplify',\n 'dead code',\n 'remove unused',\n 'reduce complexity',\n 'clean up',\n 'denest',\n 'shorten',\n 'over-engineered',\n 'too complex',\n ],\n },\n },\n {\n config: {\n id: 'migration',\n name: 'Migration',\n role: 'migration',\n tools: [...TOOLS.build, 'install', 'outdated'],\n prompt: agentPrompt('migration'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Framework/language/version upgrades: applies codemods across call sites, staged and verified.',\n keywords: [\n 'migrate',\n 'upgrade',\n 'codemod',\n 'breaking change',\n 'major version',\n 'port to',\n 'convert to',\n 'esm',\n 'modernize',\n ],\n },\n },\n {\n config: {\n id: 'vision',\n name: 'Vision',\n role: 'vision',\n tools: [...TOOLS.write, 'fetch'],\n prompt: agentPrompt('vision'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Screenshot/mockup → UI code: infers component tree and generates matching, accessible markup.',\n keywords: [\n 'screenshot',\n 'mockup',\n 'design to code',\n 'image to ui',\n 'figma',\n 'replicate this ui',\n 'from this picture',\n 'vision',\n 'clone ui',\n ],\n },\n },\n {\n config: {\n id: 'debugger',\n name: 'Debugger',\n role: 'debugger',\n tools: [...TOOLS.build, 'logs'],\n prompt: agentPrompt('debugger'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Root-cause bug fixing: reproduces, bisects to the true cause, applies a minimal fix with a regression test.',\n keywords: [\n 'bug',\n 'fix',\n 'debug',\n 'broken',\n 'error',\n 'crash',\n 'root cause',\n 'not working',\n 'failing',\n 'reproduce',\n 'why does',\n ],\n },\n },\n {\n config: {\n id: 'tracer',\n name: 'Tracer',\n role: 'tracer',\n tools: [...TOOLS.build, 'logs'],\n prompt: agentPrompt('tracer'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Runtime tracing: instruments and runs code to observe call order, values, and timing, then cleans up.',\n keywords: [\n 'trace',\n 'runtime',\n 'instrument',\n 'execution path',\n 'what happens at runtime',\n 'call order',\n 'profile execution',\n 'observe behavior',\n 'stack trace',\n ],\n },\n },\n];\n","import { type AgentDefinition, HEAVY_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 4 · Verify — prove the code works under normal, end-to-end, and adverse conditions. */\nexport const VERIFY_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'test',\n name: 'Test',\n role: 'test',\n tools: [...TOOLS.build],\n prompt: agentPrompt('test'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Unit + integration testing: writes meaningful tests covering golden path and edge cases, runs the suite.',\n keywords: [\n 'test',\n 'unit test',\n 'integration test',\n 'write tests',\n 'coverage',\n 'test suite',\n 'vitest',\n 'jest',\n 'add tests',\n 'spec',\n ],\n },\n },\n {\n config: {\n id: 'e2e',\n name: 'E2E',\n role: 'e2e',\n tools: [\n ...TOOLS.build,\n 'fetch',\n 'playwright_navigate',\n 'playwright_screenshot',\n 'playwright_click',\n 'playwright_type',\n 'playwright_evaluate',\n 'playwright_select_option',\n 'playwright_hover',\n 'playwright_fill_form',\n 'playwright_wait_for',\n 'playwright_press_key',\n 'playwright_drag',\n ],\n prompt: agentPrompt('e2e'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'End-to-end testing: drives full user journeys across UI/CLI/API boundaries with reproducible failures.',\n keywords: [\n 'e2e',\n 'end to end',\n 'end-to-end',\n 'user journey',\n 'smoke test',\n 'playwright',\n 'browser',\n 'screenshot',\n 'web ui',\n 'headless',\n 'cypress',\n 'full flow',\n 'browser test',\n 'acceptance test',\n 'navigate',\n 'click',\n 'form fill',\n 'dom',\n 'page load',\n ],\n },\n },\n {\n config: {\n id: 'browser',\n name: 'Browser',\n role: 'browser',\n tools: [\n ...TOOLS.read,\n 'fetch',\n 'playwright_navigate',\n 'playwright_screenshot',\n 'playwright_click',\n 'playwright_type',\n 'playwright_evaluate',\n 'playwright_select_option',\n 'playwright_hover',\n 'playwright_fill_form',\n 'playwright_wait_for',\n 'playwright_press_key',\n 'playwright_drag',\n ],\n prompt: agentPrompt('browser'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Browser automation: opens pages, clicks, types, screenshots, extracts data via Playwright headless Chromium.',\n keywords: [\n 'browser',\n 'screenshot',\n 'navigate',\n 'web page',\n 'scrape',\n 'crawl',\n 'headless',\n 'chrome',\n 'open url',\n 'capture',\n 'page title',\n 'extract data',\n 'fill form',\n 'click button',\n 'take screenshot',\n ],\n },\n },\n {\n config: {\n id: 'performance',\n name: 'Performance',\n role: 'performance',\n tools: [...TOOLS.build, 'logs'],\n prompt: agentPrompt('performance'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Performance analysis: benchmarks/profiles to find the real bottleneck, optimizes, proves speedup with numbers.',\n keywords: [\n 'performance',\n 'slow',\n 'optimize',\n 'bottleneck',\n 'profile',\n 'benchmark',\n 'latency',\n 'throughput',\n 'memory',\n 'speed up',\n 'too slow',\n ],\n },\n },\n {\n config: {\n id: 'chaos',\n name: 'Chaos',\n role: 'chaos',\n tools: [...TOOLS.build, 'logs'],\n prompt: agentPrompt('chaos'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Resilience testing via fault injection: breaks network/disk/timing to find ungraceful failures and recovery gaps.',\n keywords: [\n 'chaos',\n 'resilience',\n 'fault injection',\n 'failure mode',\n 'fail safe',\n 'retry',\n 'circuit breaker',\n 'graceful degradation',\n 'inject failure',\n 'robustness',\n ],\n },\n },\n {\n config: {\n id: 'security-scanner',\n name: 'Security Scanner',\n role: 'security-scanner',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('security-scanner'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Security scanner: detects hardcoded secrets, injection vectors, insecure patterns, and supply-chain risks with remediation.',\n keywords: [\n 'security',\n 'scan',\n 'vulnerability',\n 'secret',\n 'api key',\n 'hardcoded',\n 'injection',\n 'cve',\n 'audit dependencies',\n 'supply chain',\n 'xss',\n 'sqli',\n 'shell injection',\n 'sensitive data',\n 'credential',\n ],\n },\n },\n {\n config: {\n id: 'bug-hunter',\n name: 'Bug Hunter',\n role: 'bug-hunter',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('bug-hunter'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Bug hunter: scans source code for bugs, anti-patterns, and code smells, producing a file:line-ranked hit list with fixes.',\n keywords: [\n 'bug',\n 'hunt',\n 'scan',\n 'code smell',\n 'anti-pattern',\n 'race condition',\n 'memory leak',\n 'null deref',\n 'type safety',\n 'unhandled error',\n 'find bugs',\n 'audit code',\n 'code quality',\n ],\n },\n },\n {\n config: {\n id: 'audit-log',\n name: 'Audit Log',\n role: 'audit-log',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('audit-log'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Audit log analyzer: parses session JSONL, detects failure patterns, tool anomalies, and cost trends with structured reports.',\n keywords: [\n 'audit',\n 'log',\n 'logs',\n 'session',\n 'trace',\n 'analyze logs',\n 'error patterns',\n 'cost analysis',\n 'tool usage',\n 'token usage',\n 'post-mortem',\n 'trend',\n 'anomaly',\n ],\n },\n },\n];\n","import { type AgentDefinition, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 5 · Review — read-only quality, security, a11y, and compliance gates. */\nexport const REVIEW_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'code-reviewer',\n name: 'Code Reviewer',\n role: 'code-reviewer',\n tools: [...TOOLS.inspect, 'git'],\n prompt: agentPrompt('code-reviewer'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'review',\n summary: 'Correctness-first code review of diffs/PRs: finds bugs, edge cases, and convention violations with fixes.',\n keywords: [\n 'review',\n 'code review',\n 'review pr',\n 'review diff',\n 'look over',\n 'feedback on code',\n 'quality',\n 'is this correct',\n 'check my code',\n ],\n },\n },\n {\n config: {\n id: 'security-reviewer',\n name: 'Security Reviewer',\n role: 'security-reviewer',\n tools: [...TOOLS.inspect, 'git'],\n prompt: agentPrompt('security-reviewer'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'review',\n summary: 'Security review: finds injection/authz/secret/crypto issues mapped to OWASP severity with remediation.',\n keywords: [\n 'security review',\n 'security',\n 'vulnerability',\n 'vulnerabilities',\n 'owasp',\n 'injection',\n 'sql injection',\n 'xss',\n 'ssrf',\n 'authz',\n 'secrets',\n 'security audit',\n 'threat',\n 'unsafe',\n ],\n },\n },\n {\n config: {\n id: 'accessibility',\n name: 'Accessibility',\n role: 'accessibility',\n tools: [...TOOLS.read],\n prompt: agentPrompt('accessibility'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'review',\n summary: 'WCAG/a11y review of UI: checks semantics, ARIA, keyboard, contrast; maps findings to success criteria.',\n keywords: [\n 'accessibility',\n 'a11y',\n 'wcag',\n 'aria',\n 'screen reader',\n 'keyboard navigation',\n 'contrast',\n 'disabled users',\n 'accessible',\n ],\n },\n },\n {\n config: {\n id: 'compliance',\n name: 'Compliance',\n role: 'compliance',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('compliance'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'review',\n summary: 'License/privacy/regulatory review: audits licenses, PII handling, and controls vs GDPR/SOC2.',\n keywords: [\n 'compliance',\n 'license',\n 'gdpr',\n 'soc2',\n 'privacy',\n 'pii',\n 'data retention',\n 'regulatory',\n 'audit log',\n 'legal review',\n ],\n },\n },\n];\n","import { type AgentDefinition, HEAVY_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 6 · Domain — specialists for the major slices of a system. */\nexport const DOMAIN_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'database',\n name: 'Database',\n role: 'database',\n tools: [...TOOLS.build],\n prompt: agentPrompt('database'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'Schema design, query optimization, and safe reversible migrations for SQL databases.',\n keywords: [\n 'database',\n 'schema',\n 'sql',\n 'migration',\n 'query',\n 'index',\n 'postgres',\n 'mysql',\n 'table',\n 'orm',\n 'slow query',\n ],\n },\n },\n {\n config: {\n id: 'api',\n name: 'API',\n role: 'api',\n tools: [...TOOLS.build, 'fetch'],\n prompt: agentPrompt('api'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'REST + GraphQL API design and implementation: contracts, HTTP/GraphQL semantics, versioning.',\n keywords: [\n 'api',\n 'rest',\n 'graphql',\n 'endpoint',\n 'resolver',\n 'http',\n 'openapi',\n 'swagger',\n 'route',\n 'contract',\n 'webhook',\n ],\n },\n },\n {\n config: {\n id: 'auth',\n name: 'Auth',\n role: 'auth',\n tools: [...TOOLS.build],\n prompt: agentPrompt('auth'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'Authentication and authorization: identity, sessions/tokens, RBAC/ABAC, OAuth/OIDC, done securely.',\n keywords: [\n 'auth',\n 'authentication',\n 'authorization',\n 'login',\n 'session',\n 'jwt',\n 'oauth',\n 'oidc',\n 'rbac',\n 'permissions',\n 'token',\n 'sso',\n ],\n },\n },\n {\n config: {\n id: 'data',\n name: 'Data',\n role: 'data',\n tools: [...TOOLS.build],\n prompt: agentPrompt('data'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'Data engineering: ETL/ELT pipelines, data-quality validation, idempotent transforms, reconciliation.',\n keywords: [\n 'etl',\n 'elt',\n 'pipeline',\n 'data quality',\n 'data engineering',\n 'transform',\n 'ingestion',\n 'batch',\n 'stream',\n 'reconcile',\n 'dataset',\n ],\n },\n },\n {\n config: {\n id: 'frontend',\n name: 'Frontend',\n role: 'frontend',\n tools: [...TOOLS.build, 'fetch'],\n prompt: agentPrompt('frontend'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'UI implementation: components, client state, data fetching, responsive and accessible by default.',\n keywords: [\n 'frontend',\n 'component',\n 'react',\n 'vue',\n 'svelte',\n 'client state',\n 'ui implementation',\n 'css',\n 'responsive',\n 'hook',\n 'render',\n ],\n },\n },\n {\n config: {\n id: 'backend',\n name: 'Backend',\n role: 'backend',\n tools: [...TOOLS.build],\n prompt: agentPrompt('backend'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'Server-side logic: services, business rules, persistence/queue wiring, concurrency and transactions.',\n keywords: [\n 'backend',\n 'server',\n 'service',\n 'business logic',\n 'controller',\n 'handler',\n 'queue',\n 'cache',\n 'transaction',\n 'microservice',\n 'server-side',\n ],\n },\n },\n {\n config: {\n id: 'designer',\n name: 'Designer',\n role: 'designer',\n tools: [...TOOLS.docs],\n prompt: agentPrompt('designer'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'UI/UX design: user flows, layout/wireframes, interaction states, and design-system decisions.',\n keywords: [\n 'design',\n 'ux',\n 'ui design',\n 'wireframe',\n 'user flow',\n 'layout',\n 'design system',\n 'interaction',\n 'mockup design',\n 'information architecture',\n ],\n },\n },\n];\n","import { type AgentDefinition, LIGHT_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 7 · Knowledge — documentation, diagrams, localization, and prompts. */\nexport const KNOWLEDGE_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'document',\n name: 'Document',\n role: 'document',\n tools: [...TOOLS.docs],\n prompt: agentPrompt('document'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'knowledge',\n summary: 'Technical documentation: READMEs, API/reference docs, guides, and verified examples grounded in code.',\n keywords: [\n 'document',\n 'documentation',\n 'readme',\n 'docs',\n 'write up',\n 'guide',\n 'api docs',\n 'explain in writing',\n 'reference',\n 'changelog notes',\n ],\n },\n },\n {\n config: {\n id: 'uml',\n name: 'UML',\n role: 'uml',\n tools: [...TOOLS.read, 'write', 'edit'],\n prompt: agentPrompt('uml'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'knowledge',\n summary: 'Diagram generation from code: class/sequence/component/ER diagrams as Mermaid/PlantUML.',\n keywords: [\n 'uml',\n 'diagram',\n 'mermaid',\n 'plantuml',\n 'sequence diagram',\n 'class diagram',\n 'er diagram',\n 'visualize',\n 'flowchart',\n 'architecture diagram',\n ],\n },\n },\n {\n config: {\n id: 'i18n',\n name: 'I18n',\n role: 'i18n',\n tools: [...TOOLS.write],\n prompt: agentPrompt('i18n'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'knowledge',\n summary: 'Internationalization/localization: string extraction, catalog management, plurals/RTL/format handling.',\n keywords: [\n 'i18n',\n 'internationalization',\n 'localization',\n 'l10n',\n 'translation',\n 'translate ui',\n 'locale',\n 'rtl',\n 'message catalog',\n 'multilingual',\n ],\n },\n },\n {\n config: {\n id: 'prompt',\n name: 'Prompt',\n role: 'prompt',\n tools: [...TOOLS.write],\n prompt: agentPrompt('prompt'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'knowledge',\n summary: 'Prompt engineering: designs/refines/evaluates LLM system prompts and agent instructions.',\n keywords: [\n 'prompt',\n 'prompt engineering',\n 'system prompt',\n 'llm instructions',\n 'few-shot',\n 'refine prompt',\n 'agent instructions',\n 'prompt template',\n ],\n },\n },\n];\n","import { type AgentDefinition, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 8 · Delivery & Ops — ship it, run it, keep it healthy. */\nexport const DELIVERY_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'git',\n name: 'Git',\n role: 'git',\n tools: [...TOOLS.vcs, 'bash'],\n prompt: agentPrompt('git'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'delivery',\n summary: 'Git automation: focused commits, branch/rebase/conflict handling, PR prep, history investigation.',\n keywords: [\n 'git',\n 'commit',\n 'branch',\n 'rebase',\n 'merge',\n 'pull request',\n 'pr',\n 'conflict',\n 'blame',\n 'bisect',\n 'cherry-pick',\n 'stash',\n ],\n },\n },\n {\n config: {\n id: 'release',\n name: 'Release',\n role: 'release',\n tools: [...TOOLS.vcs, 'bash', 'json'],\n prompt: agentPrompt('release'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'delivery',\n summary: 'Release management: semver bumps, changelogs, and release notes derived from real history.',\n keywords: [\n 'release',\n 'version',\n 'semver',\n 'changelog',\n 'release notes',\n 'tag',\n 'bump version',\n 'publish',\n 'versioning',\n ],\n },\n },\n {\n config: {\n id: 'devops',\n name: 'DevOps',\n role: 'devops',\n tools: [\n ...TOOLS.build,\n 'mcp__ssh__ssh_list_servers',\n 'mcp__ssh__ssh_connection_status',\n 'mcp__ssh__ssh_execute',\n 'mcp__ssh__ssh_execute_sudo',\n 'mcp__ssh__ssh_upload',\n 'mcp__ssh__ssh_download',\n 'mcp__ssh__ssh_sync',\n 'mcp__ssh__ssh_deploy',\n 'mcp__ssh__ssh_health_check',\n 'mcp__ssh__ssh_service_status',\n 'mcp__ssh__ssh_process_manager',\n 'mcp__ssh__ssh_tunnel',\n 'mcp__ssh__ssh_backup_create',\n 'mcp__ssh__ssh_backup_list',\n 'mcp__ssh__ssh_backup_restore',\n 'mcp__ssh__ssh_db_list',\n 'mcp__ssh__ssh_db_query',\n 'mcp__ssh__ssh_profile',\n ],\n prompt: agentPrompt('devops'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'delivery',\n summary: 'CI/CD, containerization, and deployment config: reproducible builds and safe deploys with rollback.',\n keywords: [\n 'devops',\n 'ci',\n 'cd',\n 'ci/cd',\n 'pipeline',\n 'docker',\n 'dockerfile',\n 'kubernetes',\n 'k8s',\n 'deploy',\n 'ssh',\n 'remote ssh',\n 'remote server',\n 'sftp',\n 'tunnel',\n 'bastion',\n 'jump host',\n 'github actions',\n 'container',\n ],\n },\n },\n {\n config: {\n id: 'observability',\n name: 'Observability',\n role: 'observability',\n tools: [...TOOLS.build, 'logs'],\n prompt: agentPrompt('observability'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'delivery',\n summary: 'Observability: structured logging, metrics, distributed tracing, and alerts/dashboards.',\n keywords: [\n 'observability',\n 'logging',\n 'metrics',\n 'tracing',\n 'telemetry',\n 'opentelemetry',\n 'otel',\n 'prometheus',\n 'monitoring',\n 'alert',\n 'dashboard',\n 'instrument',\n ],\n },\n },\n {\n config: {\n id: 'dependency',\n name: 'Dependency',\n role: 'dependency',\n tools: [...TOOLS.deps, 'bash'],\n prompt: agentPrompt('dependency'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'delivery',\n summary: 'Package management + supply-chain safety: CVE audit, safe upgrades, pruning, install-script review.',\n keywords: [\n 'dependency',\n 'dependencies',\n 'package',\n 'npm',\n 'pnpm',\n 'cve',\n 'vulnerability scan',\n 'upgrade deps',\n 'audit',\n 'supply chain',\n 'outdated',\n 'lockfile',\n ],\n },\n },\n];\n","import { type AgentDefinition, LIGHT_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 9 · Meta — agents that improve the agent system itself. */\nexport const META_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'skill-manage',\n name: 'Skill Manager',\n role: 'skill-manage',\n tools: [...TOOLS.write],\n prompt: agentPrompt('skill-manage'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'meta',\n summary: 'Skill curation: audits, refines descriptions/triggers, scaffolds, and retires skills.',\n keywords: [\n 'skill',\n 'skills',\n 'curate skill',\n 'skill description',\n 'create skill',\n 'skill library',\n 'skill trigger',\n 'manage skills',\n ],\n },\n },\n {\n config: {\n id: 'self-improving',\n name: 'Self-Improving',\n role: 'self-improving',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('self-improving'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'meta',\n summary: 'Learns from execution logs: mines recurring failures/inefficiencies and proposes evidence-based improvements.',\n keywords: [\n 'self-improving',\n 'learn from',\n 'session logs',\n 'execution analysis',\n 'recurring failure',\n 'improve agents',\n 'post-mortem',\n 'retrospective',\n 'meta-analysis',\n ],\n },\n },\n {\n config: {\n id: 'context',\n name: 'Context',\n role: 'context',\n tools: [...TOOLS.inspect, 'remember', 'forget'],\n prompt: agentPrompt('context'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'meta',\n summary: 'Memory + context-window management: compaction, recall, and curation within a token budget.',\n keywords: [\n 'context',\n 'context window',\n 'memory',\n 'compact',\n 'summarize history',\n 'recall',\n 'token budget',\n 'prune context',\n 'remember',\n 'dfmt',\n ],\n },\n },\n {\n config: {\n id: 'cost',\n name: 'Cost',\n role: 'cost',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('cost'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'meta',\n summary: 'Token/cloud cost optimization: finds spend waste, recommends model routing and trimming with $ estimates.',\n keywords: [\n 'cost',\n 'token cost',\n 'optimize cost',\n 'spend',\n 'cheaper',\n 'model routing',\n 'budget',\n 'expensive',\n 'reduce tokens',\n 'pricing',\n 'cloud cost',\n ],\n },\n },\n {\n config: {\n id: 'tech-stack',\n name: 'Tech Stack Validator',\n role: 'tech-stack',\n tools: ['search', 'fetch', 'read', 'grep', 'glob', 'outdated', 'audit', 'json', 'mailbox'],\n prompt: agentPrompt('tech-stack'),\n },\n budget: {\n timeoutMs: 120_000,\n maxIterations: 10,\n maxToolCalls: 40,\n maxTokens: 60_000,\n maxCostUsd: 0.25,\n },\n capability: {\n phase: 'meta',\n summary: 'Single-shot tech stack validator: checks npm for latest versions, rejects dead/obsolete packages, enforces modern alternatives.',\n keywords: [\n 'tech stack',\n 'version',\n 'package',\n 'library',\n 'framework',\n 'dependency',\n 'install',\n 'upgrade',\n 'latest',\n 'npm',\n 'pnpm add',\n 'outdated',\n 'obsolete',\n 'deprecated',\n 'what version',\n 'which package',\n 'check version',\n 'verify version',\n 'is this current',\n ],\n },\n },\n];\n","/**\n * Agent catalog aggregator.\n *\n * Collects every phase's `AgentDefinition[]` into:\n * - `ALL_AGENT_DEFINITIONS` — flat list, catalog order (phase 1 → 9)\n * - `AGENT_CATALOG` — keyed by role for O(1) lookup\n * - `AGENTS_BY_PHASE` — grouped for statusline / dispatcher tie-breaks\n *\n * `fleet.ts` derives `FLEET_ROSTER` + `FLEET_ROSTER_BUDGETS` from this, and the\n * dispatcher routes free-form tasks against `capability` metadata here.\n */\nimport type { AgentDefinition, AgentPhase } from './types.js';\nimport { DISCOVERY_AGENTS } from './phase1-discovery.js';\nimport { PLANNING_AGENTS } from './phase2-planning.js';\nimport { BUILD_AGENTS } from './phase3-build.js';\nimport { VERIFY_AGENTS } from './phase4-verify.js';\nimport { REVIEW_AGENTS } from './phase5-review.js';\nimport { DOMAIN_AGENTS } from './phase6-domain.js';\nimport { KNOWLEDGE_AGENTS } from './phase7-knowledge.js';\nimport { DELIVERY_AGENTS } from './phase8-delivery.js';\nimport { META_AGENTS } from './phase9-meta.js';\n\nexport * from './types.js';\nexport {\n DISCOVERY_AGENTS,\n PLANNING_AGENTS,\n BUILD_AGENTS,\n VERIFY_AGENTS,\n REVIEW_AGENTS,\n DOMAIN_AGENTS,\n KNOWLEDGE_AGENTS,\n DELIVERY_AGENTS,\n META_AGENTS,\n};\n\n/** Every catalog agent, in phase order. */\nexport const ALL_AGENT_DEFINITIONS: AgentDefinition[] = [\n ...DISCOVERY_AGENTS,\n ...PLANNING_AGENTS,\n ...BUILD_AGENTS,\n ...VERIFY_AGENTS,\n ...REVIEW_AGENTS,\n ...DOMAIN_AGENTS,\n ...KNOWLEDGE_AGENTS,\n ...DELIVERY_AGENTS,\n ...META_AGENTS,\n];\n\n/** Phase → its agents, for grouped display and dispatcher fallbacks. */\nexport const AGENTS_BY_PHASE: Record<AgentPhase, AgentDefinition[]> = {\n discovery: DISCOVERY_AGENTS,\n planning: PLANNING_AGENTS,\n build: BUILD_AGENTS,\n verify: VERIFY_AGENTS,\n review: REVIEW_AGENTS,\n domain: DOMAIN_AGENTS,\n knowledge: KNOWLEDGE_AGENTS,\n delivery: DELIVERY_AGENTS,\n meta: META_AGENTS,\n};\n\n/**\n * Role → definition. Built once at module load. Throws on a duplicate role so\n * a copy-paste collision fails loudly at startup instead of silently shadowing.\n */\nexport const AGENT_CATALOG: Record<string, AgentDefinition> = (() => {\n const map: Record<string, AgentDefinition> = {};\n for (const def of ALL_AGENT_DEFINITIONS) {\n const role = def.config.role;\n if (!role) {\n throw new Error(`Agent \"${def.config.name}\" is missing a role`);\n }\n if (map[role]) {\n throw new Error(`Duplicate agent role in catalog: \"${role}\"`);\n }\n map[role] = def;\n }\n return map;\n})();\n\n/** Role lookup helper. Returns undefined for unknown roles. */\nexport function getAgentDefinition(role: string): AgentDefinition | undefined {\n return AGENT_CATALOG[role];\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';\nimport { ALL_AGENT_DEFINITIONS } from './agents/index.js';\nimport { agentPrompt } from './agents/agent-prompts.js';\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 = {\n id: 'audit-log',\n name: 'Audit Log',\n role: 'audit-log',\n prompt: agentPrompt('audit-log'),\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 = {\n id: 'bug-hunter',\n name: 'Bug Hunter',\n role: 'bug-hunter',\n prompt: agentPrompt('bug-hunter'),\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 = {\n id: 'refactor-planner',\n name: 'Refactor Planner',\n role: 'refactor-planner',\n prompt: agentPrompt('refactor-planner'),\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 = {\n id: 'security-scanner',\n name: 'Security Scanner',\n role: 'security-scanner',\n prompt: agentPrompt('security-scanner'),\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * Shadow Agent — one-shot fleet monitoring and intervention.\n * Use for: quiet anomaly checks and on-demand intervention.\n */\r\nexport const SHADOW_AGENT: SubagentConfig = {\n id: 'shadow-agent',\n name: 'Shadow',\n role: 'shadow-agent',\n prompt: agentPrompt('shadow-agent'),\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * Critic Agent — evaluates code quality, architecture decisions, and\r\n * refactoring plans against project conventions and engineering standards.\r\n * Use for: real-time evaluation of bug reports, refactor plans, and\r\n * architectural proposals during collaborative debugging sessions.\r\n */\r\nexport const CRITIC_AGENT: SubagentConfig = {\n id: 'critic',\n name: 'Critic',\n role: 'critic',\n prompt: agentPrompt('critic'),\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * All agents in a map for easy lookup by role. The four legacy pre-built\r\n * agents plus the phase 1-9 catalog (`ALL_AGENT_DEFINITIONS`). Catalog roles\r\n * are guaranteed collision-free by the catalog builder; none overlap the\r\n * legacy four.\r\n */\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 'critic': CRITIC_AGENT,\r\n 'shadow-agent': SHADOW_AGENT,\r\n ...Object.fromEntries(\r\n ALL_AGENT_DEFINITIONS.map((d) => [d.config.role as string, d.config] as const),\r\n ),\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Default per-role budgets.\r\n//\r\n// MASSIVELY RAISED from earlier values. User requested x5–x10 multiplier\r\n// to prevent any timeout or budget exhaustion on long-running tasks\r\n// like monorepo audits, deep refactors, and security scans.\r\n//\r\n// x10 values (realistic upper bound for a single subagent task):\r\n// audit-log: 7.5 hours, 5000 iterations, 15000 tool calls\r\n// bug-hunter: 10 hours, 8000 iterations, 20000 tool calls\r\n// refactor-planner: 7.5 hours, 6000 iterations, 18000 tool calls\r\n// security-scanner: 10 hours, 8000 iterations, 20000 tool calls\r\n//\r\n// These can be overridden per-call via delegate tool parameters.\r\n// ---------------------------------------------------------------------------\r\nexport interface FleetRosterBudget {\r\n timeoutMs?: number | undefined;\r\n /** Idle reap window (ms). Resets on activity — see `applyRosterBudget`. */\r\n idleTimeoutMs?: number | undefined;\r\n maxIterations?: number | undefined;\r\n maxToolCalls?: number | undefined;\r\n maxTokens?: number | undefined;\r\n maxCostUsd?: number | undefined;\r\n}\r\n\r\n/**\r\n * Default idle window for delegated subagents: reap only after this long with\r\n * NO activity (no iteration / tool call / streamed progress). An actively-\r\n * working agent resets this clock continuously, so it runs until its task\r\n * naturally ends — no more wall-clock kills of productive runs. Power users\r\n * can still impose a hard `timeoutMs` per delegate.\r\n */\r\nexport const DEFAULT_IDLE_TIMEOUT_MS = 15 * 60 * 1000;\r\n\r\nexport const FLEET_ROSTER_BUDGETS: Record<string, FleetRosterBudget> = {\r\n 'audit-log': { timeoutMs: 7.5 * 60 * 60 * 1000, maxIterations: 5000, maxToolCalls: 15000 },\r\n 'bug-hunter': { timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000 },\r\n 'refactor-planner': { timeoutMs: 7.5 * 60 * 60 * 1000, maxIterations: 6000, maxToolCalls: 18000 },\r\n 'security-scanner': { timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000 },\r\n 'critic': { timeoutMs: 5 * 60 * 60 * 1000, maxIterations: 4000, maxToolCalls: 12000 },\n 'shadow-agent': {\n idleTimeoutMs: DEFAULT_IDLE_TIMEOUT_MS,\n maxIterations: 2000,\n maxToolCalls: 5000,\n maxTokens: 60_000,\n maxCostUsd: 1,\n },\n ...Object.fromEntries(\r\n ALL_AGENT_DEFINITIONS.map((d) => [d.config.role as string, d.budget] as const),\r\n ),\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\n// Generic default budget applied when no role matches and no explicit budget\r\n// fields are set. Used for `name` / free-form delegates. There is no default\r\n// wall-clock timeout — a delegated agent runs until its task naturally ends\r\n// (`end_turn`) or it stalls past the idle window. Iteration / tool-call ceilings\r\n// remain as a runaway backstop.\r\nconst GENERIC_SUBAGENT_BUDGET: FleetRosterBudget = {\r\n idleTimeoutMs: DEFAULT_IDLE_TIMEOUT_MS,\r\n maxIterations: 5000,\r\n maxToolCalls: 15000,\r\n};\r\n\r\nexport function applyRosterBudget(cfg: SubagentConfig): SubagentConfig {\r\n // First try role-specific budget; fall back to generic for name-only delegates.\r\n const roleBudget = cfg.role ? FLEET_ROSTER_BUDGETS[cfg.role] : undefined;\r\n const defaultBudget = roleBudget ?? (cfg.name ? GENERIC_SUBAGENT_BUDGET : undefined);\r\n if (!defaultBudget) return cfg;\r\n return {\r\n ...cfg,\r\n // Wall-clock cap is opt-in only: forward an explicit `cfg.timeoutMs`, but\r\n // do NOT impose the roster's historical multi-hour wall-clock default — it\r\n // killed agents that were still actively working. Reaping is idle-based.\r\n timeoutMs: cfg.timeoutMs,\r\n // Idle window is the default reaper. Resets on activity, so a long-but-\r\n // productive run is never killed; only a genuine stall is reaped.\r\n idleTimeoutMs: cfg.idleTimeoutMs ?? defaultBudget.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS,\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\r\n// ---------------------------------------------------------------------------\r\n// ACP external agents — WrongStack spawns these as subagents via ACP protocol.\r\n// Each agent runs its own loop; WrongStack sends tasks as ACP messages and\r\n// receives results. These don't go through makeAgentSubagentRunner — they\r\n// are handled by makeACPSubagentRunner in the CLI multi-agent layer.\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Cline — ACP-compatible coding agent by @asonix.\r\n * Spawned as: `npx @agentify/cline`\r\n */\r\nexport const CLINE_AGENT: SubagentConfig = {\n id: 'cline',\n name: 'Cline',\n role: 'cline',\n prompt: agentPrompt('acp-cline'),\n provider: 'acp',\n};\n\r\n/**\r\n * Gemini CLI — Google's ACP-compatible command-line agent.\r\n * Spawned as: `gemini` (when gemini CLI is installed and in PATH)\r\n */\r\nexport const GEMINI_CLI_AGENT: SubagentConfig = {\n id: 'gemini-cli',\n name: 'Gemini CLI',\n role: 'gemini-cli',\n prompt: agentPrompt('acp-gemini-cli'),\n provider: 'acp',\n};\n\r\n/**\r\n * GitHub Copilot (public preview) — ACP-compatible Copilot CLI agent.\r\n * Spawned as: `gh copilot` (when gh CLI with copilot extension is installed)\r\n */\r\nexport const COPILOT_AGENT: SubagentConfig = {\n id: 'copilot',\n name: 'GitHub Copilot',\n role: 'copilot',\n prompt: agentPrompt('acp-copilot'),\n provider: 'acp',\n};\n\r\n/**\r\n * OpenHands — AI coding agent by all-in.ai, ACP-compatible.\r\n * Spawned as: `openhands` (when installed)\r\n */\r\nexport const OPENHANDS_AGENT: SubagentConfig = {\n id: 'openhands',\n name: 'OpenHands',\n role: 'openhands',\n prompt: agentPrompt('acp-openhands'),\n provider: 'acp',\n};\n\r\n/**\r\n * Goose — IDE agent by ExoRL, ACP-compatible.\r\n * Spawned as: `goose` (when goose CLI is installed)\r\n */\r\nexport const GOOSE_AGENT: SubagentConfig = {\n id: 'goose',\n name: 'Goose',\n role: 'goose',\n prompt: agentPrompt('acp-goose'),\n provider: 'acp',\n};\n\r\n/** All ACP external agents. */\r\nexport const ACP_AGENTS: SubagentConfig[] = [\r\n CLINE_AGENT,\r\n GEMINI_CLI_AGENT,\r\n COPILOT_AGENT,\r\n OPENHANDS_AGENT,\r\n GOOSE_AGENT,\r\n];\r\n\r\n// ACP agents share the same generous budgets as the built-in fleet agents.\r\n// External ACP agents may need more time than typical in-process subagents\r\n// since they run their own loops and may do tool-call round-trips.\r\nFLEET_ROSTER_BUDGETS['cline'] = {timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000};\r\nFLEET_ROSTER_BUDGETS['gemini-cli'] = {timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000};\r\nFLEET_ROSTER_BUDGETS['copilot'] = {timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000};\r\nFLEET_ROSTER_BUDGETS['openhands'] = {timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000};\r\nFLEET_ROSTER_BUDGETS['goose'] = {timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000};\r\n\r\n/** Extended roster including ACP agents. */\r\nexport const FLEET_ROSTER_WITHACP: Record<string, SubagentConfig> = {\r\n ...FLEET_ROSTER,\r\n ...Object.fromEntries(ACP_AGENTS.map((a) => [a.role as string, a])),\r\n};\r\n","/**\n * Subagent nickname pool — famous scientists, mathematicians, and computing pioneers.\n * Names are grouped by domain affinity so the nickname hints at the agent's role.\n */\n\nconst NICKNAME_POOL = {\n // Physics & fundamental sciences\n 'einstein': { name: 'Einstein', domain: 'physics' },\n 'newton': { name: 'Newton', domain: 'physics' },\n 'feynman': { name: 'Feynman', domain: 'physics' },\n 'dirac': { name: 'Dirac', domain: 'physics' },\n 'bohr': { name: 'Bohr', domain: 'physics' },\n 'planck': { name: 'Planck', domain: 'physics' },\n 'curie': { name: 'Curie', domain: 'physics' },\n 'fermi': { name: 'Fermi', domain: 'physics' },\n 'heisenberg': { name: 'Heisenberg', domain: 'physics' },\n 'schrodinger': { name: 'Schrödinger', domain: 'physics' },\n\n // Mathematics\n 'euclid': { name: 'Euclid', domain: 'math' },\n 'gauss': { name: 'Gauss', domain: 'math' },\n 'turing': { name: 'Turing', domain: 'math' },\n 'poincare': { name: 'Poincaré', domain: 'math' },\n 'riemann': { name: 'Riemann', domain: 'math' },\n 'hilbert': { name: 'Hilbert', domain: 'math' },\n 'pythagoras': { name: 'Pythagoras', domain: 'math' },\n\n // Computing & information theory\n 'von-neumann': { name: 'Von Neumann', domain: 'computing' },\n 'shannon': { name: 'Shannon', domain: 'computing' },\n 'hopper': { name: 'Hopper', domain: 'computing' },\n 'backus': { name: 'Backus', domain: 'computing' },\n 'knuth': { name: 'Knuth', domain: 'computing' },\n 'torvalds': { name: 'Torvalds', domain: 'computing' },\n 'stallman': { name: 'Stallman', domain: 'computing' },\n 'berners-lee': { name: 'Berners-Lee', domain: 'computing' },\n 'babbage': { name: 'Babbage', domain: 'computing' },\n 'lovelace': { name: 'Lovelace', domain: 'computing' },\n 'klein': { name: 'Klein', domain: 'computing' },\n\n // Electronics & electrical engineering\n 'edison': { name: 'Edison', domain: 'ee' },\n 'tesla': { name: 'Tesla', domain: 'ee' },\n 'faraday': { name: 'Faraday', domain: 'ee' },\n 'maxwell': { name: 'Maxwell', domain: 'ee' },\n 'ohm': { name: 'Ohm', domain: 'ee' },\n 'bell': { name: 'Bell', domain: 'ee' },\n 'marconi': { name: 'Marconi', domain: 'ee' },\n 'lamarr': { name: 'Lamarr', domain: 'ee' },\n\n // General science / multi-disciplinary\n 'darwin': { name: 'Darwin', domain: 'biology' },\n 'mendel': { name: 'Mendel', domain: 'biology' },\n 'pasteur': { name: 'Pasteur', domain: 'biology' },\n 'hawking': { name: 'Hawking', domain: 'cosmology' },\n 'sagan': { name: 'Sagan', domain: 'cosmology' },\n\n // Exploration & navigation\n 'columbus': { name: 'Columbus', domain: 'exploration' },\n 'polo': { name: 'Polo', domain: 'exploration' },\n 'magellan': { name: 'Magellan', domain: 'exploration' },\n\n // Chemistry / materials\n 'lavoisier': { name: 'Lavoisier', domain: 'chemistry' },\n 'mendeleev': { name: 'Mendeleev', domain: 'chemistry' },\n} as const;\n\n/** Flat ordered list of all available nicknames — used for round-robin. */\nconst ALL_NICKNAMES = Object.entries(NICKNAME_POOL) as [NicknameKey, { name: string; domain: string }][];\n\n/** Reverse index: display name (e.g. \"Von Neumann\") → canonical pool key. */\nconst NAME_TO_KEY: Record<string, string> = Object.fromEntries(\n ALL_NICKNAMES.map(([key, entry]) => [entry.name, key]),\n);\n\n/** Domain → preferred nickname keys (fallback chain). */\nconst DOMAIN_PREFERENCES: Record<string, string[]> = {\n 'security': ['shannon', 'turing', 'lamarr', 'stallman'],\n 'bug-hunter': ['darwin', 'curie', 'feynman', 'fermi'],\n 'refactor': ['gauss', 'hilbert', 'euclid', 'planck'],\n 'audit-log': ['sagan', 'hawking', 'poincare', 'newton'],\n 'planner': ['hilbert', 'gauss', 'turing', 'euclid'],\n 'researcher': ['sagan', 'hawking', 'darwin', 'pasteur'],\n 'explorer': ['marconi', 'bell', 'columbus', 'polo'],\n 'testing': ['pasteur', 'curie', 'fermi', 'bohr'],\n 'frontend': ['lovelace', 'hopper', 'babbage', 'backus'],\n 'backend': ['torvalds', 'stallman', 'von-neumann', 'backus'],\n 'database': ['turing', 'shannon', 'backus', 'knuth'],\n 'devops': ['tesla', 'edison', 'faraday', 'bell'],\n 'security-scanner': ['shannon', 'turing', 'lamarr', 'stallman'],\n 'refactor-planner': ['gauss', 'hilbert', 'planck', 'newton'],\n 'architect': ['von-neumann', 'turing', 'gauss', 'hilbert'],\n 'critic': ['einstein', 'feynman', 'dirac', 'bohr'],\n 'e2e': ['hopper', 'bell', 'marconi', 'tesla'],\n 'performance': ['knuth', 'gauss', 'planck', 'feynman'],\n 'chaos': ['tesla', 'edison', 'curie', 'fermi'],\n 'cost': ['ohm', 'bell', 'marconi', 'tesla'],\n // default fallback\n 'default': ['einstein', 'newton', 'curie', 'tesla', 'edison', 'turing', 'shannon', 'hopper', 'knuth', 'stallman'],\n};\n\ntype NicknameKey = keyof typeof NICKNAME_POOL;\n\n/** Result of a nickname assignment. */\nexport interface NicknameAssignment {\n /**\n * Canonical pool key (e.g. `von-neumann`). This — NOT the display string — is\n * what callers must add to their `used` set and later remove on release.\n * Deriving the key by parsing the display string is unsafe: multi-word names\n * like \"Von Neumann\" would be truncated to \"von\" and never dedupe correctly.\n */\n key: string;\n /** Human display string, e.g. `Von Neumann (Backend)`. */\n display: string;\n}\n\n/**\n * Assign a unique nickname to a subagent based on its role.\n *\n * Returns both the canonical pool `key` (for the `used` set) and the formatted\n * `display` string (`Name (Role)`, e.g. `Einstein (Bug Hunter)`).\n *\n * @param role - The subagent's role id (e.g. 'bug-hunter', 'security-scanner')\n * @param used - Set of nickname KEYS already assigned in this fleet\n * (so no two subagents share the same base name)\n */\nexport function assignNickname(role: string, used: ReadonlySet<string>): NicknameAssignment {\n // 1. Build preference list: role-specific → default fallback\n const preferences = [\n ...(DOMAIN_PREFERENCES[role] ?? []),\n ...(DOMAIN_PREFERENCES['default'] ?? []),\n ];\n\n // 2. Find the first unassigned nickname from preferences. Skip keys that are\n // not in the pool — preference lists can drift out of sync with the pool\n // (typos, removed names), and an unknown key must not crash assignment.\n for (const key of preferences) {\n const entry = NICKNAME_POOL[key as NicknameKey];\n if (entry && !used.has(key)) {\n return { key, display: `${entry.name} (${formatRole(role)})` };\n }\n }\n\n // 3. Exhausted preferences — pick the first unused name round-robin style.\n for (const [key, entry] of ALL_NICKNAMES) {\n if (!used.has(key)) {\n return { key, display: `${entry.name} (${formatRole(role)})` };\n }\n }\n\n // 4. Pool exhausted — synthesize a stable, unique key/display pair.\n const counter = used.size + 1;\n return { key: `scientist-${counter}`, display: `Scientist #${counter} (${formatRole(role)})` };\n}\n\n/**\n * Resolve a previously-assigned display string back to its canonical pool key,\n * for release paths that only retained the formatted name (e.g. a manifest\n * entry). Strips the trailing ` (Role)` suffix, then matches the base name\n * against the pool. Returns `undefined` when the name is not a known nickname.\n *\n * Use this instead of `name.split(' ')[0]` — the latter mangles multi-word\n * names like \"Von Neumann\" and \"Berners-Lee\".\n */\nexport function nicknameKeyFromDisplay(display: string): string | undefined {\n const base = display.replace(/\\s*\\([^)]*\\)\\s*$/, '').trim();\n const key = NAME_TO_KEY[base];\n if (key) return key;\n const synthesized = base.match(/^Scientist #(\\d+)$/);\n return synthesized ? `scientist-${synthesized[1]}` : undefined;\n}\n\n/** Format role id into human-readable title-case. */\nfunction formatRole(role: string): string {\n return role\n .split(/[-_]/)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\n/**\n * Returns all available nickname keys. Useful for testing or reset logic.\n */\nexport function getAllNicknameKeys(): string[] {\n return Object.keys(NICKNAME_POOL);\n}\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 SubagentRunContext,\r\n SubagentRunner,\r\n TaskResult,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport {\n type BudgetSessionIdSource,\n BudgetExceededError,\n DECISION_TIMEOUT_MS,\n SubagentBudget,\n TIMEOUT_PREEMPT_FRACTION as _preemptFraction,\r\n} from './subagent-budget.js';\r\nimport { classifySubagentError } from './coordinator/error-classifier.js';\r\nimport { applyRosterBudget } from './fleet.js';\r\nimport { assignNickname } from './subagent-nicknames.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 | undefined;\r\n abortController: AbortController;\r\n /** Lazily created on first dispatch — budget is per-task, not per-subagent. */\r\n activeBudget?: SubagentBudget | undefined;\r\n}\r\n\r\nexport interface MultiAgentCoordinatorOptions {\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 | undefined;\n /**\n * Session id for EventBus/FleetBus emissions produced by this coordinator.\n * Accepts a getter so a long-lived coordinator follows session resume/new.\n */\n sessionId?: BudgetSessionIdSource | undefined;\n}\n\r\nexport class DefaultMultiAgentCoordinator extends EventEmitter implements MultiAgentCoordinator {\r\n readonly coordinatorId: string;\r\n readonly config: MultiAgentConfig;\r\n private runner?: SubagentRunner | undefined;\n private readonly sessionId: BudgetSessionIdSource | undefined;\n private fleetBus?: import('./fleet-bus.js').FleetBus | undefined;\n\r\n private readonly subagents = new Map<string, SubagentEntry>();\r\n\r\n /**\r\n * Base nickname keys already handed out this run (e.g. `einstein`, `tesla`).\r\n * Prevents two workers sharing a name. Direct `coordinator.spawn()` callers\r\n * (parallel/eternal engine, SDD parallel run) don't go through\r\n * `Director.spawn()` where nicknames are normally assigned, so the\r\n * coordinator upgrades placeholder names (\"Executor\", \"slot-ab12cd\", role\r\n * names) to memorable ones here — that's what surfaces in the fleet monitor.\r\n */\r\n private readonly usedNicknames = new Set<string>();\r\n /** Maps subagentId → nickname key (e.g. 'einstein'). Used to free the slot on remove(). */\r\n private readonly subagentNicknames = new Map<string, string>();\r\n\r\n private pendingTasks: TaskSpec[] = [];\r\n private completedResults: TaskResult[] = [];\r\n /** Prevents completedResults from growing unbounded in long-running coordinators. */\r\n private static readonly MAX_COMPLETED_RESULTS = 10_000;\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 // awaitTasks() registers one short-lived 'task.completed' listener per\r\n // awaited id; a single call awaiting >10 ids (or several concurrent\r\n // callers) crosses Node's default 10-listener cap and prints a spurious\r\n // MaxListenersExceededWarning that also masks genuine leaks. These waiters\r\n // are bounded and self-removing, so lift the cap.\r\n this.setMaxListeners(0);\r\n this.coordinatorId = config.coordinatorId;\n this.config = config;\n this.runner = options.runner;\n this.sessionId = options.sessionId;\n }\n\n private currentSessionId(): string | undefined {\n const value = typeof this.sessionId === 'function' ? this.sessionId() : this.sessionId;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\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 * Wire a FleetBus for director-mode event emission. Call after the\r\n * FleetManager is constructed so the coordinator can emit lifecycle\r\n * events the TUI and monitoring tools subscribe to.\r\n */\r\n setFleetBus(fleet: import('./fleet-bus.js').FleetBus): void {\r\n this.fleetBus = fleet;\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 /**\r\n * Upgrade a placeholder/role-derived name to a memorable scientist nickname\r\n * (e.g. \"Einstein (Executor)\"). A name is treated as a placeholder when it is\r\n * empty, equals the role (case-insensitive), is a generic default\r\n * (\"subagent\"/\"adhoc\"/\"generic\"), or is an auto-generated `slot-…` id.\r\n * Explicit, human-chosen names — including nicknames already assigned by\r\n * `Director.spawn()` — are left untouched, so this never double-assigns.\r\n */\r\n private withNickname(subagent: SubagentConfig, subagentId: string): SubagentConfig {\r\n const role = subagent.role ?? 'subagent';\r\n const name = subagent.name?.trim() ?? '';\r\n const isPlaceholder =\r\n name === '' ||\r\n name.toLowerCase() === role.toLowerCase() ||\r\n name === 'subagent' ||\r\n name === 'adhoc' ||\r\n name === 'generic' ||\r\n /^slot-/.test(name);\r\n if (!isPlaceholder) return subagent;\r\n const { key, display } = assignNickname(role, this.usedNicknames);\r\n this.usedNicknames.add(key);\r\n this.subagentNicknames.set(subagentId, key);\r\n return { ...subagent, name: display };\r\n }\r\n\r\n async spawn(subagent: SubagentConfig): Promise<SpawnResult> {\r\n const id = subagent.id || randomUUID();\r\n const cfg = this.withNickname(subagent, id);\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 ?? 16,\r\n };\r\n\r\n this.subagents.set(id, {\r\n config: { ...cfg, id },\r\n context,\r\n status: 'idle',\r\n abortController: new AbortController(),\r\n });\r\n\r\n this.emit('subagent.started', { subagent: { ...cfg, id } });\r\n\r\n this.fleetBus?.emit({\r\n subagentId: id,\r\n ts: Date.now(),\r\n type: 'subagent.assigned',\r\n payload: {\r\n subagentId: id,\r\n name: subagent.name,\r\n provider: subagent.provider,\r\n model: subagent.model,\r\n },\r\n });\r\n\r\n this.emitCoordinatorStats();\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 this.fleetBus?.emit({\r\n subagentId,\r\n ts: Date.now(),\r\n type: 'subagent.stopped',\r\n payload: { subagentId, reason: 'stopped by coordinator' },\r\n });\r\n\r\n this.emitCoordinatorStats();\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 /**\r\n * Get current coordinator stats for monitoring/debugging.\r\n */\r\n getStats(): {\r\n total: number;\r\n running: number;\r\n idle: number;\r\n stopped: number;\r\n inFlight: number;\r\n pending: number;\r\n completed: number;\r\n } {\r\n let running = 0;\r\n let idle = 0;\r\n let stopped = 0;\r\n for (const [, entry] of this.subagents) {\r\n if (entry.status === 'running') running++;\r\n else if (entry.status === 'idle') idle++;\r\n else stopped++;\r\n }\r\n return {\r\n total: this.subagents.size,\r\n running,\r\n idle,\r\n stopped,\r\n inFlight: this.inFlight,\r\n pending: this.pendingTasks.length,\r\n completed: this.completedResults.length,\r\n };\r\n }\r\n\r\n /** Emit a reactive coordinator.stats event on FleetBus so the TUI can subscribe. */\r\n private emitCoordinatorStats(): void {\r\n const stats = this.getStats();\r\n const subagentStatuses = Array.from(this.subagents.entries()).map(([id, s]) => ({\n subagentId: id,\n taskId: s.currentTask ?? '',\n status: s.status,\n assigned: s.context.parentBridge !== null,\n }));\n const sessionId = this.currentSessionId();\n this.fleetBus?.emit({\n subagentId: this.coordinatorId,\n ts: Date.now(),\n type: 'coordinator.stats',\n payload: {\n ...(sessionId ? { sessionId } : {}),\n ...stats,\n subagentStatuses,\n },\n });\n }\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 * Wait for one or more tasks to complete and return their results.\r\n * If a task is already done when called, returns immediately.\r\n * Resolves to an array in the same order as `taskIds`.\r\n */\r\n async awaitTasks(taskIds: string[]): Promise<TaskResult[]> {\r\n return Promise.all(\r\n taskIds.map((id) => {\r\n const cached = this.completedResults.find((r) => r.taskId === id);\r\n if (cached) return cached;\r\n // Fallback: poll until the task completes (up to timeoutMs).\r\n // The coordinator fires 'task.completed' on every result, so\r\n // we use a promise-based waiter tied to that event.\r\n return new Promise<TaskResult>((resolve, reject) => {\r\n const timeout = setTimeout(() => {\r\n this.off('task.completed', handler);\r\n reject(new Error(`awaitTasks timed out waiting for task \"${id}\"`));\r\n }, this.config.timeoutMs ?? 300_000);\r\n const handler = ({ result }: { task: TaskSpec; result: TaskResult }) => {\r\n if (result.taskId === id) {\r\n clearTimeout(timeout);\r\n this.off('task.completed', handler);\r\n resolve(result);\r\n }\r\n };\r\n this.on('task.completed', handler);\r\n });\r\n }),\r\n );\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 ?? 16;\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 if (!task) continue;\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) this.emitPendingAborted(t, message);\r\n }\r\n\r\n /**\r\n * Emit a synthetic `stopped`/`aborted_by_parent` completion for a single\r\n * PENDING task — one that was never counted in `inFlight`. This MUST bypass\r\n * `recordCompletion`: that path does `inFlight--`, which for a pending task\r\n * steals a decrement from a genuinely in-flight task and trips the underflow\r\n * guard — suppressing that real task's `task.completed` and hanging its\r\n * `awaitTasks()` caller. Pushes the result and fires the event directly.\r\n */\r\n private emitPendingAborted(task: TaskSpec, message: string): void {\r\n const synthetic: TaskResult = {\r\n subagentId: task.subagentId ?? 'unassigned',\r\n taskId: task.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, result: synthetic });\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.fleetBus?.emit({\r\n subagentId,\r\n taskId: task.id,\r\n ts: Date.now(),\r\n type: 'subagent.running',\r\n payload: { subagentId, taskId: task.id },\r\n });\r\n\r\n this.emit('task.assigned', { task, subagentId });\r\n this.emitCoordinatorStats();\r\n\r\n // Budget combines coordinator defaults with per-subagent and per-task overrides.\r\n // Precedence: task > subagent (raw, no roster fills) > coordinator default > roster default.\r\n // We intentionally call applyRosterBudget LATE — only as a final fallback after\r\n // the coordinator's defaultBudget has had a chance to apply. This prevents\r\n // GENERIC_SUBAGENT_BUDGET (5000 iter) from shadowing the coordinator's explicit default.\r\n const rawMaxIterations = subagent.config.maxIterations;\r\n const rawMaxToolCalls = subagent.config.maxToolCalls;\r\n const rawMaxTokens = subagent.config.maxTokens;\r\n const rawMaxCostUsd = subagent.config.maxCostUsd;\r\n const rawTimeoutMs = subagent.config.timeoutMs;\r\n const rawIdleTimeoutMs = subagent.config.idleTimeoutMs;\r\n const configWithRosterDefaults = applyRosterBudget(subagent.config);\r\n const budget = new SubagentBudget(\n {\n maxIterations:\n rawMaxIterations ?? this.config.defaultBudget?.maxIterations ?? configWithRosterDefaults.maxIterations,\n maxToolCalls:\n rawMaxToolCalls ??\n this.config.defaultBudget?.maxToolCalls ??\n configWithRosterDefaults.maxToolCalls,\n maxTokens:\n rawMaxTokens ?? this.config.defaultBudget?.maxTokens ?? configWithRosterDefaults.maxTokens,\n maxCostUsd:\n rawMaxCostUsd ?? this.config.defaultBudget?.maxCostUsd ?? configWithRosterDefaults.maxCostUsd,\n // Wall-clock cap is opt-in (explicit config / defaultBudget only); the\n // roster no longer supplies one. Idle is the default reaper.\n timeoutMs:\n rawTimeoutMs ?? this.config.defaultBudget?.timeoutMs ?? configWithRosterDefaults.timeoutMs,\n idleTimeoutMs:\n rawIdleTimeoutMs ??\n this.config.defaultBudget?.idleTimeoutMs ??\n configWithRosterDefaults.idleTimeoutMs,\n },\n 'auto',\n { sessionId: () => this.currentSessionId() },\n );\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(\r\n this.runner,\r\n task,\r\n runCtx,\r\n budget,\r\n subagent.config.preemptFraction,\r\n );\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' || err.kind === 'idle_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 preemptFraction: number = _preemptFraction,\r\n ) {\r\n const initialTimeoutMs = budget.limits.timeoutMs;\r\n const idleLimitMs = budget.limits.idleTimeoutMs;\r\n if (initialTimeoutMs === undefined && idleLimitMs === undefined) {\r\n return runner(task, ctx);\r\n }\r\n\r\n // Re-armable watchdog. The default guard is IDLE-based: while the agent\r\n // keeps producing activity (iterations / tool calls / streamed progress),\r\n // `budget.idleMs()` stays below the window and we simply re-arm — an\r\n // actively-working subagent is never killed by the clock. Only a genuine\r\n // stall (no activity for `idleTimeoutMs`) reaps it. An explicit wall-clock\r\n // `timeoutMs` (rare, opt-in) keeps the original soft-warning behaviour: it\r\n // negotiates an extension via the Director's auto-extend listener and\r\n // re-arms rather than hard-killing a task solely for running long.\r\n const start = Date.now();\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n // Pre-empt arm state machine:\r\n // ACTIVE — pre-empt can fire for the current ceiling window\r\n // LOCKED — pre-empt is locked; cannot fire until ceiling changes\r\n enum PreemptState {\r\n ACTIVE = 'active',\r\n LOCKED = 'locked',\r\n }\r\n // The wall-clock ceiling value at the moment the state was locked.\r\n // Compared against the current wallLimit to detect stale locks caused by\r\n // external calls to budget.patchLimits().\r\n let preemptedCeiling: number | null = null;\r\n let preemptState: PreemptState = PreemptState.ACTIVE;\r\n // Heartbeat gate for the proactive pre-empt: the timestamp of the subagent's\r\n // last activity at the moment of the most recent grant. A later pre-empt is\r\n // only negotiated if there has been NEW activity since then — a stalled\r\n // agent (no progress since its last grant) gets no further extension and is\r\n // left to the real deadline. `-1` until the first grant so the first\r\n // pre-empt always fires. Activity time is derived from `budget.idleMs()`\r\n // (reset by tool calls / iterations / streamed progress), so it works even\r\n // for runners that don't increment the budget's usage counters directly.\r\n let lastGrantActivityTs = -1;\r\n\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n // Terminate the subagent, classifying by whether a negotiation listener\r\n // is wired. A listener-observed stop (explicit deny at the deadline, or an\r\n // idle reap while observed) surfaces as 'stopped' — reject with a\r\n // non-budget error so the coordinator's catch falls to `signal.aborted →\r\n // 'stopped'`. With no listener it is an unattended budget breach →\r\n // BudgetExceededError → 'timeout'. This keeps a bare /spawn reporting\r\n // 'timeout' while a director/observer-driven stop reads as 'stopped'.\r\n const terminate = (kind: 'timeout' | 'idle_timeout', limit: number, used: number) => {\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(\r\n budget._events?.hasListenerFor('budget.threshold_reached')\r\n ? new Error(`subagent stopped: budget ${kind} (limit=${limit}, used=${used})`)\r\n : new BudgetExceededError(kind, limit, used),\r\n );\r\n };\r\n const armFor = (ms: number) => {\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(onTick, Math.max(0, ms));\r\n };\r\n // Re-arm for whichever deadline is sooner — the idle window (counted\r\n // from last activity), the explicit wall-clock cap, or the PROACTIVE\r\n // pre-empt point (a fraction of the wall cap, see TIMEOUT_PREEMPT_FRACTION)\r\n // at which we negotiate an extension BEFORE the deadline is crossed. Any\r\n // being unset/already-asked drops out of the min, so single-limit configs\r\n // behave exactly as that limit alone.\r\n const scheduleNext = () => {\r\n const wallLimit = budget.limits.timeoutMs ?? initialTimeoutMs;\r\n const wallRemaining =\r\n initialTimeoutMs === undefined\r\n ? Number.POSITIVE_INFINITY\r\n : (wallLimit as number) - (Date.now() - start);\r\n const idleRemaining =\r\n idleLimitMs === undefined\r\n ? Number.POSITIVE_INFINITY\r\n : (budget.limits.idleTimeoutMs ?? idleLimitMs) - budget.idleMs();\r\n const preemptRemaining =\r\n initialTimeoutMs === undefined || preemptedCeiling === wallLimit\r\n ? Number.POSITIVE_INFINITY\r\n : (wallLimit as number) * preemptFraction - (Date.now() - start);\r\n // Floor at a small positive so a near-zero remainder can't busy-loop.\r\n armFor(Math.max(25, Math.min(wallRemaining, idleRemaining, preemptRemaining)));\r\n };\r\n\r\n // Drive a timeout extension negotiation (used by BOTH the proactive\r\n // pre-empt and the at-deadline path). Resolves to the coordinator's\r\n // verdict: `{ extend: { timeoutMs } }` to grant, or a string to decline.\r\n // The budget's requestDecision falls back to 'stop' on no response, so\r\n // this never hangs.\r\n // Safety net: if no listener responds to the budget.threshold_reached event\r\n // within DECISION_TIMEOUT_MS (60 s), default to 'stop' so the watchdog\r\n // never hangs. Uses the exported DECISION_TIMEOUT_MS so both paths share\r\n // the same value — coordinator and budget agree on the ceiling.\r\n const negotiateTimeout = async (\r\n used: number,\r\n limit: number,\r\n ): Promise<'stop' | 'continue' | 'throw' | { extend: { timeoutMs?: number | undefined } }> => {\r\n const handler = budget.onThreshold;\r\n if (!handler) return 'stop';\r\n const result = handler({\r\n kind: 'timeout',\r\n used,\r\n limit,\r\n requestDecision: () => {\r\n // No listener wired (bare /spawn, no director) → nobody can grant an\r\n // extension, so resolve to 'stop' immediately. Without this the emit\r\n // below goes unanswered and the run parks on the 60 s fallback timer\r\n // before stopping — the deadline must reap promptly instead. Mirrors\r\n // SubagentBudget._busRequestDecision so both agree on the default.\r\n if (!budget._events?.hasListenerFor('budget.threshold_reached')) {\r\n return Promise.resolve<'stop' | { extend: { timeoutMs?: number | undefined } }>('stop');\r\n }\r\n return new Promise<'stop' | { extend: { timeoutMs?: number | undefined } }>((resolveDecision) => {\r\n let settled = false;\r\n const resolve = (d: 'stop' | { extend: { timeoutMs?: number | undefined } }) => {\r\n if (settled) return;\r\n settled = true;\r\n resolveDecision(d);\r\n };\r\n const fallback = setTimeout(() => resolve('stop'), DECISION_TIMEOUT_MS);\r\n const sessionId = this.currentSessionId();\n budget._events?.emit('budget.threshold_reached', {\n ...(sessionId ? { sessionId } : {}),\n kind: 'timeout',\n used,\n limit,\n // Informational: the budget's own decision deadline. Listeners may use\r\n // this to display a countdown. The coordinator does NOT enforce it —\r\n // it is the budget's own `setTimeout(fallback)` that races against\r\n // the listener's `extend()`/`deny()` call to guarantee progress.\r\n timeoutMs: DECISION_TIMEOUT_MS,\r\n // deny() wins over a same-dispatch extend(): defer the grant a\r\n // microtask so a synchronous deny in the same emit pre-empts it\r\n // (a listener that both grants and denies, or two listeners\r\n // disagreeing, resolves as a stop). Async grants still resolve.\r\n extend: (extra) => {\r\n clearTimeout(fallback);\r\n queueMicrotask(() => resolve({ extend: extra }));\r\n },\r\n deny: () => {\r\n clearTimeout(fallback);\r\n resolve('stop');\r\n },\r\n });\r\n });\r\n },\r\n });\r\n return typeof result === 'string' ? result : await result;\r\n };\r\n\r\n const onTick = async () => {\r\n const elapsed = Date.now() - start;\r\n const wallLimit =\r\n initialTimeoutMs === undefined ? undefined : budget.limits.timeoutMs ?? initialTimeoutMs;\r\n const idleLimit =\r\n idleLimitMs === undefined ? undefined : budget.limits.idleTimeoutMs ?? idleLimitMs;\r\n const wallExceeded = wallLimit !== undefined && elapsed >= wallLimit;\r\n const idleExceeded = idleLimit !== undefined && budget.idleMs() >= idleLimit;\r\n\r\n // Idle stall with no wall-clock cap also due: a genuinely hung agent\r\n // (no activity for the whole window). Reap it directly — idle is NOT\r\n // negotiable; the point of the default is to free a stuck slot. We still\r\n // emit the threshold event first so observers (director / monitor) can\r\n // record the reap, but any extension a listener offers is ignored.\r\n if (idleExceeded && !wallExceeded) {\n const sessionId = this.currentSessionId();\n budget._events?.emit('budget.threshold_reached', {\n ...(sessionId ? { sessionId } : {}),\n kind: 'idle_timeout',\n used: budget.idleMs(),\n limit: idleLimit ?? 0,\r\n timeoutMs: DECISION_TIMEOUT_MS,\r\n extend: () => {},\r\n deny: () => {},\r\n });\r\n // An idle stall is a passive TIMEOUT (the agent hung), not an explicit\r\n // coordinator stop — surface it as 'timeout' regardless of any\r\n // listener. (Contrast the wall-clock deadline below, where an explicit\r\n // listener deny is a deliberate stop → 'stopped'.)\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('idle_timeout', idleLimit ?? 0, budget.idleMs()));\r\n return;\r\n }\r\n\r\n // PROACTIVE pre-empt: we've passed TIMEOUT_PREEMPT_FRACTION of the wall\r\n // window but NOT the deadline itself. Negotiate an extension now, while\r\n // the agent is still under its limit, so a progressing subagent gets its\r\n // ceiling raised and never enters a timed-out state. Heartbeat-gated on\r\n // the granting side (director / attachAutoExtend): no progress ⇒ decline,\r\n // and we fall through to the real-deadline behaviour below at the cap.\r\n // Asked at most once per window (preemptState === ACTIVE).\r\n if (\r\n wallLimit !== undefined &&\r\n !wallExceeded &&\r\n budget.onThreshold &&\r\n preemptState === PreemptState.ACTIVE &&\r\n elapsed >= wallLimit * preemptFraction\r\n ) {\r\n // Heartbeat gate: only negotiate a pre-empt extension if the agent has\r\n // made progress (a tool call / iteration / streamed output) SINCE the\r\n // last grant. A stalled agent — no new activity since its last\r\n // extension — gets no further pre-empt; we lock and let the real\r\n // deadline reap it. `activityTs` is the wall-clock time of the last\r\n // activity (now − idleMs). Without this gate an always-granting\r\n // listener would extend a wedged agent forever and the deadline would\r\n // never fire (T1).\r\n const activityTs = Date.now() - budget.idleMs();\r\n if (activityTs <= lastGrantActivityTs) {\r\n preemptState = PreemptState.LOCKED;\r\n preemptedCeiling = wallLimit;\r\n scheduleNext();\r\n return;\r\n }\r\n // C1 fix: register the watchdog as active BEFORE calling onThreshold so\r\n // that any concurrent tool.progress → checkTimeout() path sees the flag\r\n // and skips its own wall-clock emission. Cleared on every exit path so\r\n // checkTimeout() resumes normal operation after negotiation completes.\r\n budget.setWatchdogNegotiation(wallLimit);\r\n try {\r\n const decision = await negotiateTimeout(elapsed, wallLimit);\r\n if (typeof decision !== 'string' && decision.extend.timeoutMs !== undefined) {\r\n // Granted ahead of the deadline — raise the ceiling and open a\r\n // fresh window (a later pre-empt becomes eligible again, but only\r\n // if there is fresh activity by then — see the heartbeat gate).\r\n budget.patchLimits({ timeoutMs: decision.extend.timeoutMs });\r\n lastGrantActivityTs = Date.now() - budget.idleMs();\r\n preemptState = PreemptState.ACTIVE;\r\n preemptedCeiling = null;\r\n } else {\r\n // Declined proactively (no progress / no listener). Don't re-ask\r\n // until the real deadline — the wallExceeded path below handles the\r\n // at-cap behaviour (warn+continue or hard stop).\r\n preemptState = PreemptState.LOCKED;\r\n preemptedCeiling = wallLimit;\r\n }\r\n } catch {\r\n preemptState = PreemptState.LOCKED;\r\n preemptedCeiling = wallLimit;\r\n } finally {\r\n budget.clearWatchdogNegotiation();\r\n }\r\n scheduleNext();\r\n return;\r\n }\r\n\r\n // Neither deadline actually tripped — we woke early because activity\r\n // pushed the idle deadline out (or a pre-empt was just resolved).\r\n // Re-arm for the new soonest deadline.\r\n if (!wallExceeded) {\r\n scheduleNext();\r\n return;\r\n }\r\n\r\n // Wall-clock cap hit. This is opt-in and keeps the original\r\n // soft-warning behaviour: negotiate an extension rather than\r\n // hard-killing a task solely for running long.\r\n const limit = wallLimit ?? 0;\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 // C1 fix: same guard as the pre-empt branch — register before onThreshold\r\n // so concurrent tool.progress → checkTimeout() skips its wall-clock emission.\r\n budget.setWatchdogNegotiation(limit);\r\n try {\r\n const decision = await negotiateTimeout(elapsed, limit);\r\n if (decision === 'throw') {\r\n // 'throw' is an explicit signal from the handler: end now rather\r\n // than silently keeping the subagent alive past its deadline.\r\n terminate('timeout', limit, elapsed);\r\n return;\r\n }\r\n if (decision === 'continue') {\r\n // 'continue' — timeout denied but coordinator wants the agent to keep\r\n // running. Re-arm for a full wall window so we ask again later.\r\n // This makes wall-clock timeout a pure warning event: the subagent\r\n // keeps running until it naturally finishes, the next deadline fires,\r\n // or the user stops it.\r\n //\r\n // IMPORTANT: we must lock the pre-empt arm (set preemptState =\r\n // LOCKED) so it does NOT fire again until the ceiling changes.\r\n // The ceiling only changes if a future negotiation returns 'extend'\r\n // and patches budget.limits.timeoutMs. Without the lock, the\r\n // pre-empt would re-arm for ~1 s (Math.max(1_000, limit)) and\r\n // immediately fire again at elapsed > wallLimit × 0.85, creating\r\n // a ping-pong loop of spurious budget.threshold_reached events.\r\n preemptState = PreemptState.LOCKED;\r\n preemptedCeiling = wallLimit;\r\n armFor(Math.max(1_000, limit));\r\n return;\r\n }\r\n if (decision === 'stop') {\r\n // 'stop' — coordinator explicitly denied the extension and wants\r\n // the agent to end. This is a terminal decision: end now.\r\n terminate('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.patchLimits({ timeoutMs: decision.extend.timeoutMs });\r\n lastGrantActivityTs = Date.now() - budget.idleMs();\r\n preemptState = PreemptState.ACTIVE;\r\n preemptedCeiling = null;\r\n scheduleNext();\r\n return;\r\n }\r\n // No timeoutMs in extend — nothing to grant → end.\r\n terminate('timeout', limit, elapsed);\r\n return;\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 return;\r\n } finally {\r\n // Always clear the watchdog flag so checkTimeout() resumes wall-clock\r\n // checking on the next tool.progress event.\r\n budget.clearWatchdogNegotiation();\r\n }\r\n };\r\n // First arm: whichever of the idle window / pre-empt point / wall cap is sooner.\r\n scheduleNext();\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 // Trim oldest entries when the cap is exceeded — keep the most recent\r\n // results so /fleet and roll_up still have data to work with.\r\n if (this.completedResults.length > DefaultMultiAgentCoordinator.MAX_COMPLETED_RESULTS) {\r\n this.completedResults.splice(\r\n 0,\r\n this.completedResults.length - DefaultMultiAgentCoordinator.MAX_COMPLETED_RESULTS,\r\n );\r\n }\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 this.fleetBus?.emit({\r\n subagentId: result.subagentId,\r\n ts: Date.now(),\r\n type: 'subagent.idle',\r\n payload: { subagentId: result.subagentId },\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.fleetBus?.emit({\r\n subagentId: result.subagentId,\r\n taskId: result.taskId,\r\n ts: Date.now(),\r\n type: 'subagent.completed',\r\n payload: {\r\n subagentId: result.subagentId,\r\n taskId: result.taskId,\r\n status: result.status,\r\n result: result.result,\r\n iterations: result.iterations,\r\n toolCalls: result.toolCalls,\r\n durationMs: result.durationMs,\r\n },\r\n });\r\n\r\n this.tryDispatchNext();\r\n\r\n // Emit after tryDispatchNext so the stats reflect the post-dispatch\r\n // state (either a new running subagent, or idle if the queue is drained).\r\n this.emitCoordinatorStats();\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 /**\r\n * Stop a subagent and remove it from the coordinator. Releases all\r\n * associated resources (AbortController, context, budget state).\r\n * The subagent entry is deleted so the id can be reused in a future spawn.\r\n */\r\n async remove(subagentId: string): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n\r\n // Gracefully stop first — same logic as stop() but don't block on it.\r\n if (subagent.status === 'running' || subagent.status === 'idle') {\r\n this.terminating.add(subagentId);\r\n subagent.abortController.abort();\r\n subagent.status = 'stopped';\r\n }\r\n\r\n // Release all resources associated with this subagent.\r\n this.subagents.delete(subagentId);\r\n this.terminating.delete(subagentId);\r\n // Free the nickname slot so the same name can be reused by a future spawn.\r\n const nicknameKey = this.subagentNicknames.get(subagentId);\r\n if (nicknameKey) {\r\n this.usedNicknames.delete(nicknameKey);\r\n this.subagentNicknames.delete(subagentId);\r\n }\r\n\r\n // Clean up any pending tasks assigned to this subagent — emit synthetic\r\n // 'stopped' completions so callers awaiting them via awaitTasks() unblock\r\n // instead of hanging forever. Without this, a task queued for a removed\r\n // subagent would leave its waiter permanently unresolved.\r\n const orphaned = this.pendingTasks.filter((t) => t.subagentId === subagentId);\r\n this.pendingTasks = this.pendingTasks.filter((t) => t.subagentId !== subagentId);\r\n for (const t of orphaned) {\r\n // Inline-emit, NOT recordCompletion: these are PENDING tasks that were\r\n // never counted in inFlight. Routing them through recordCompletion would\r\n // decrement inFlight on behalf of a still-running task and suppress that\r\n // task's own completion via the underflow guard, hanging its awaiter.\r\n this.emitPendingAborted(\r\n t,\r\n `Subagent \"${subagentId}\" was removed while task \"${t.id}\" was pending`,\r\n );\r\n }\r\n\r\n this.fleetBus?.emit({\r\n subagentId,\r\n ts: Date.now(),\r\n type: 'subagent.removed',\r\n payload: { subagentId },\r\n });\r\n\r\n this.emitCoordinatorStats();\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`. Delegates to the shared classifier.\r\n * Re-exported for backward compatibility.\r\n */\r\nexport { classifySubagentError } from './coordinator/error-classifier.js';\r\n","/**\n * SddTaskDecomposer\n *\n * Converts a TaskGraph (from SDD's TaskGenerator) into a dependency-aware\n * sequence of batches for ParallelEternalEngine.\n *\n * Key behaviour:\n * - Each `nextBatch()` call returns up to `parallelSlots` ready tasks\n * (all blockers completed, sorted by priority).\n * - Tasks that are blocked by an in-progress task are NOT included\n * in the batch — they wait for the blocker to complete.\n * - When `isDone()` returns true the whole graph is either completed\n * or deadlocked (all remaining tasks are blocked by failed tasks).\n *\n * Usage:\n * ```\n * const decomposer = new SddTaskDecomposer(tracker, graph, { parallelSlots: 4 });\n * while (!decomposer.isDone()) {\n * const batch = decomposer.nextBatch();\n * if (batch.length === 0) break; // deadlock\n * await fanOut(batch);\n * decomposer.acknowledgeBatch(batch.map(t => t.id));\n * }\n * ```\n */\n\nimport type { TaskNode, TaskGraph } from '../types/task-graph.js';\nimport type { TaskTracker } from './task-tracker.js';\n\nexport interface SddTaskDecomposerOptions {\n /** Max tasks per batch. Default: 4. Range 1–16. */\n parallelSlots?: number | undefined;\n}\n\nexport interface TaskBatch {\n /** Tasks ready to execute in this wave. */\n tasks: TaskNode[];\n /** 0-based wave number since the decomposer was constructed. */\n wave: number;\n /** True when every node in the graph is either completed or failed. */\n allDone: boolean;\n /** True when no batch was produced because remaining tasks are all blocked by failed nodes. */\n deadlocked: boolean;\n}\n\nexport class SddTaskDecomposer {\n private readonly slots: number;\n private wave = 0;\n\n constructor(\n private readonly tracker: TaskTracker,\n _graph: TaskGraph,\n opts: SddTaskDecomposerOptions = {},\n ) {\n this.slots = Math.min(16, Math.max(1, opts.parallelSlots ?? 4));\n }\n\n // -------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------\n\n /**\n * Return the next batch of runnable tasks.\n * Returns `allDone: true` when every node is completed.\n * Returns `deadlocked: true` when no batch can be produced because\n * all remaining tasks are blocked by failed nodes.\n */\n nextBatch(): TaskBatch {\n if (this.isDone()) {\n return { tasks: [], wave: this.wave, allDone: true, deadlocked: false };\n }\n\n const pending = this.pendingReadyNodes();\n\n if (pending.length === 0) {\n // No runnable tasks — check for deadlock\n const hasBlockedTasks = this.hasAnyBlockedTasks();\n return { tasks: [], wave: this.wave, allDone: false, deadlocked: hasBlockedTasks };\n }\n\n const batch = pending.slice(0, this.slots);\n return { tasks: batch, wave: this.wave, allDone: false, deadlocked: false };\n }\n\n /**\n * Advance the wave counter after a batch completes.\n * Call this once per `nextBatch()` result that was fan-out.\n */\n acknowledgeBatch(_completedTaskIds: string[]): void {\n this.wave++;\n }\n\n /**\n * True when every node in the graph is completed.\n * Use this to exit the fan-out loop after `isDone() || deadlocked`.\n */\n isDone(): boolean {\n const progress = this.tracker.getProgress();\n return progress.total > 0 && progress.completed === progress.total;\n }\n\n /**\n * Total waves produced so far.\n */\n getWaveCount(): number {\n return this.wave;\n }\n\n /**\n * All ready (dependency-satisfied) pending tasks, priority-sorted — UNSLICED.\n * The continuous scheduler fills its own free slots from this list, so unlike\n * `nextBatch()` it does not cap at `slots`.\n */\n readyNodes(): TaskNode[] {\n return this.pendingReadyNodes();\n }\n\n /**\n * True when every node has reached a terminal state (completed or failed).\n * This — not `isDone()` (which requires ALL completed) — is the correct loop\n * exit for the continuous scheduler: a terminally-failed task must not keep\n * the run spinning to its backstop.\n */\n isSettled(): boolean {\n const nodes = this.tracker.getAllNodes();\n return nodes.length > 0 && nodes.every((n) => n.status === 'completed' || n.status === 'failed');\n }\n\n // -------------------------------------------------------------------\n // Internal helpers\n // -------------------------------------------------------------------\n\n /**\n * Return pending nodes whose blockers are all completed.\n * Sorted by priority (critical first), then by creation time.\n */\n private pendingReadyNodes(): TaskNode[] {\n const allPending = this.tracker.getAllNodes({ status: ['pending'] });\n const ready: TaskNode[] = [];\n\n for (const node of allPending) {\n if (this.tracker.canStart(node.id)) {\n ready.push(node);\n }\n }\n\n // Sort by priority first, then by createdAt\n const priorityRank: Record<TaskNode['priority'], number> = {\n critical: 0,\n high: 1,\n medium: 2,\n low: 3,\n };\n\n ready.sort((a, b) => {\n const pr = priorityRank[a.priority] - priorityRank[b.priority];\n if (pr !== 0) return pr;\n return a.createdAt - b.createdAt;\n });\n\n return ready;\n }\n\n /** True when at least one non-completed, non-failed task is blocked. */\n private hasAnyBlockedTasks(): boolean {\n const nodes = this.tracker.getAllNodes({\n status: ['pending', 'in_progress', 'blocked'],\n });\n return nodes.some((n) => n.status === 'blocked');\n }\n}","// startSddRun — the shared run-setup core for a multi-agent SDD parallel run.\n//\n// Extracted from the CLI `/sdd execute` handler so every surface (CLI slash\n// command + both WebUI servers) starts a run identically: orphan reset →\n// SddParallelRun → live board projector → run registry → cross-process control\n// drain → run, with deterministic cleanup. The only thing that differs per\n// surface is the `subagentFactory` (CLI's director-backed factory vs the\n// runtime light factory) and whether git worktrees are available — both are\n// passed in, keeping this helper free of CLI/host coupling.\n\nimport type { Agent } from '../core/agent.js';\nimport type { AgentFactory } from '../coordination/agent-subagent-runner.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { TaskGraph } from '../types/task-graph.js';\nimport type { TaskTracker } from './task-tracker.js';\nimport type { WorktreeManager } from '../worktree/worktree-manager.js';\nimport { SddBoardProjector } from './sdd-board-projector.js';\nimport type { SddBoardStore } from './sdd-board-store.js';\nimport type { SddRunRegistry } from './sdd-run-registry.js';\nimport {\n SddParallelRun,\n type RunResult,\n type SddProgress,\n type SddParallelRunOptions,\n} from './sdd-parallel-run.js';\n\nexport interface StartSddRunOptions {\n tracker: TaskTracker;\n graph: TaskGraph;\n /** Leader agent — seeds the default factory and the run's project context. */\n agent: Agent;\n projectRoot: string;\n events: EventBus;\n /** Parent session id for all SDD EventBus emissions. */\n sessionId?: string | (() => string | undefined) | undefined;\n /** Per-task agent factory. Omit to run every task on the leader agent. */\n subagentFactory?: AgentFactory | undefined;\n /** Board snapshot/event persistence (also drained for cross-process control). */\n boardStore: SddBoardStore;\n /** Registry the run is registered with for in-process control. */\n registry?: SddRunRegistry | undefined;\n parallelSlots?: number | undefined;\n /** Opt-in hard wall-clock cap per task (ms). Omit → no cap (idle reaper guards). */\n taskTimeoutMs?: number | undefined;\n /** Idle reaper per task (ms); resets on activity. Default 600_000 (10 min). */\n taskIdleTimeoutMs?: number | undefined;\n /** End-of-run failed-task auto-retry sweeps (bounded). Default 2. */\n maxFailedRetrySweeps?: number | undefined;\n /** Post-task verification gate (forwarded to SddParallelRun). Omit → no gate. */\n verifyTask?: SddParallelRunOptions['verifyTask'];\n /** Merge-conflict resolver (forwarded to SddParallelRun). Omit → retry-on-fresh-base then fail. */\n conflictResolver?: SddParallelRunOptions['conflictResolver'];\n /** Failure supervisor (forwarded to SddParallelRun). Omit → no rescue, plain terminal-fail. */\n superviseFailure?: SddParallelRunOptions['superviseFailure'];\n /** Run-level default worker model / provider / fallback chain (task overrides win). */\n defaultModel?: string | undefined;\n defaultProvider?: string | undefined;\n fallbackModels?: string[] | undefined;\n /** Per-task git worktree isolation. Omit → tasks share the working tree. */\n worktrees?: WorktreeManager | undefined;\n /** Bounded deadlock recovery rounds (default 1). */\n maxRecoveryRounds?: number | undefined;\n /** Progress callback (e.g. CLI renderer line). */\n onProgress?: ((p: SddProgress) => void) | undefined;\n /** Control-file drain interval in ms (default 500). */\n controlDrainMs?: number | undefined;\n}\n\nexport interface SddRunHandle {\n run: SddParallelRun;\n runId: string;\n projector: SddBoardProjector;\n /** Resolves when the run finishes AND all teardown (drain/dispose/clear) is done. */\n completion: Promise<RunResult>;\n /** Request a clean stop (idempotent). */\n stop(): void;\n}\n\n/**\n * Wire up and start an SDD parallel run. Returns immediately with a handle whose\n * `completion` promise resolves once the run finishes and teardown is complete.\n * Orphaned in_progress tasks are reset up-front so a crashed prior run re-executes.\n */\nexport function startSddRun(opts: StartSddRunOptions): SddRunHandle {\n // Resume safety: orphaned in_progress tasks (from a prior crash, no agent\n // running them) are reset to pending so the run re-executes them.\n SddParallelRun.resetOrphans(opts.tracker);\n\n const run = new SddParallelRun({\n tracker: opts.tracker,\n graph: opts.graph,\n agent: opts.agent,\n projectRoot: opts.projectRoot,\n sessionId: opts.sessionId,\n parallelSlots: opts.parallelSlots,\n taskTimeoutMs: opts.taskTimeoutMs,\n taskIdleTimeoutMs: opts.taskIdleTimeoutMs,\n maxFailedRetrySweeps: opts.maxFailedRetrySweeps,\n verifyTask: opts.verifyTask,\n conflictResolver: opts.conflictResolver,\n superviseFailure: opts.superviseFailure,\n subagentFactory: opts.subagentFactory,\n events: opts.events,\n worktrees: opts.worktrees,\n maxRecoveryRounds: opts.maxRecoveryRounds ?? 1,\n onProgress: opts.onProgress,\n defaultModel: opts.defaultModel,\n defaultProvider: opts.defaultProvider,\n fallbackModels: opts.fallbackModels,\n });\n\n // Live board projector: streams sdd.board.snapshot + persists JSON/JSONL.\n const projector = new SddBoardProjector({\n runId: run.runId,\n graph: opts.graph,\n tracker: opts.tracker,\n events: opts.events,\n store: opts.boardStore,\n sessionId: opts.sessionId,\n specId: opts.graph.specId,\n defaultModel: opts.defaultModel,\n defaultProvider: opts.defaultProvider,\n fallbackModels: opts.fallbackModels,\n });\n\n opts.registry?.register({\n runId: run.runId,\n specId: opts.graph.specId,\n pause: () => run.pause(),\n resume: () => run.resume(),\n stop: () => run.stop(),\n retryTask: (id) => run.retryTask(id),\n retryAllFailed: () => run.retryAllFailed(),\n reassignTask: (id, name) => run.reassignTask(id, name),\n setTaskModel: (id, model, provider) => run.setTaskModel(id, model, provider),\n setTaskFallbacks: (id, fb) => run.setTaskFallbacks(id, fb),\n setTaskVerification: (id, cmd) => run.setTaskVerification(id, cmd),\n cancelTask: (id) => run.cancelTask(id),\n deleteTask: (id) => run.deleteTask(id),\n splitTask: (id, subtasks) => run.splitTask(id, subtasks),\n cleanupWorktrees: () => run.cleanupWorktrees(),\n rollback: () => run.rollback(),\n getBaseBranch: () => run.getBaseBranch(),\n getMergedCommits: () => run.getMergedCommits(),\n snapshot: () => projector.snapshot(),\n isRunning: () => run.isRunning(),\n });\n\n // Cross-process control channel: any board surface (e.g. the standalone WebUI\n // in another process) appends a command to <runId>.control.jsonl; we drain +\n // apply it here so this run stays the single driver.\n const drainMs = opts.controlDrainMs ?? 500;\n const controlTimer = setInterval(() => {\n void opts.boardStore.drainControl(run.runId).then((cmds) => {\n for (const c of cmds) {\n const p = (c.payload ?? {}) as {\n taskId?: string;\n agentName?: string;\n model?: string;\n provider?: string;\n fallbackModels?: string[];\n verificationCommand?: string;\n subtasks?: import('./sdd-parallel-run.js').SddSubtaskSpec[];\n };\n if (c.type === 'pause') run.pause();\n else if (c.type === 'resume') run.resume();\n else if (c.type === 'stop') run.stop();\n else if (c.type === 'retry' && p.taskId) run.retryTask(p.taskId);\n else if (c.type === 'retry_all_failed') run.retryAllFailed();\n else if (c.type === 'reassign' && p.taskId) run.reassignTask(p.taskId, p.agentName ?? '');\n else if (c.type === 'set_task_model' && p.taskId) run.setTaskModel(p.taskId, p.model, p.provider);\n else if (c.type === 'set_task_fallbacks' && p.taskId) run.setTaskFallbacks(p.taskId, p.fallbackModels);\n else if (c.type === 'set_task_verification' && p.taskId)\n run.setTaskVerification(p.taskId, p.verificationCommand);\n else if (c.type === 'cancel_task' && p.taskId) void run.cancelTask(p.taskId).catch(() => {});\n else if (c.type === 'delete_task' && p.taskId) run.deleteTask(p.taskId);\n else if (c.type === 'split_task' && p.taskId && p.subtasks?.length) run.splitTask(p.taskId, p.subtasks);\n // Lifecycle: stop the run first, then sweep worktrees / revert commits.\n // (Both are no-ops while the run is still live — the user pairs them with\n // a prior `stop`.)\n else if (c.type === 'cleanup_worktrees') void run.cleanupWorktrees().catch(() => {});\n else if (c.type === 'rollback') void run.rollback().catch(() => {});\n }\n }).catch(() => {});\n }, drainMs);\n // Best-effort: don't keep the event loop alive solely for the drain timer.\n (controlTimer as { unref?: () => void }).unref?.();\n\n const completion = (async (): Promise<RunResult> => {\n try {\n return await run.run();\n } finally {\n clearInterval(controlTimer);\n await projector.drain().catch(() => {});\n projector.dispose();\n opts.registry?.clear(run.runId);\n }\n })();\n\n return {\n run,\n runId: run.runId,\n projector,\n completion,\n stop: () => run.stop(),\n };\n}\n","import { spawn } from 'node:child_process';\nimport { mkdir } from 'node:fs/promises';\nimport { join, resolve, sep } from 'node:path';\nimport type { EventBus } from '../kernel/events.js';\nimport { buildChildEnv } from '../utils/child-env.js';\nimport { toErrorMessage } from '../utils/error.js';\n\n/**\n * Lifecycle of a single worktree handle.\n *\n * allocating → active → committing → merging → merged\n * └─→ needs-review (conflict, kept)\n * (any) → failed\n */\nexport type WorktreeStatus =\n | 'allocating'\n | 'active'\n | 'committing'\n | 'merging'\n | 'merged'\n | 'needs-review'\n | 'failed';\n\nexport interface WorktreeHandle {\n /** Stable id (== slug). Used as the event `handleId`. */\n id: string;\n /** Caller-supplied owner (a phase id in AutoPhase). */\n ownerId: string;\n /** Human label for the owner (phase name). */\n ownerLabel: string;\n slug: string;\n /** Absolute path to the worktree checkout. */\n dir: string;\n /** Branch checked out in the worktree (`wstack/ap/<slug>`). */\n branch: string;\n /** Branch the worktree was forked from and merges back into. */\n baseBranch: string;\n status: WorktreeStatus;\n createdAt: number;\n updatedAt: number;\n /** Diff stats from the last commit. */\n insertions: number;\n deletions: number;\n files: number;\n sha?: string | undefined;\n lastError?: string | undefined;\n conflictFiles?: string[] | undefined;\n}\n\nexport interface AllocateOpts {\n /** Friendly basis for the slug/branch (e.g. the phase name). */\n slugHint?: string | undefined;\n ownerLabel?: string | undefined;\n /** Override the detected base branch. */\n baseBranch?: string | undefined;\n}\n\nexport interface MergeOpts {\n squash?: boolean | undefined;\n message?: string | undefined;\n /**\n * Optional conflict resolver. Invoked when the squash-merge conflicts, with\n * the conflicted paths and the base working tree (`cwd`). It must resolve the\n * conflict markers in place and return `true` when done. If it returns `true`\n * and no conflict markers remain, the merge is committed and `merge()` returns\n * `{ ok: true, resolved: true }`. Otherwise the merge is aborted (hard reset)\n * and the handle is parked `needs-review` — exactly as if no resolver were\n * provided, so the base tree is never left dirty.\n */\n resolve?: (info: { conflictFiles: string[]; cwd: string }) => Promise<boolean>;\n}\n\nexport interface MergeResult {\n ok: boolean;\n conflict?: boolean | undefined;\n conflictFiles?: string[] | undefined;\n stderr?: string | undefined;\n /** True when an initial conflict was successfully resolved by `opts.resolve`. */\n resolved?: boolean | undefined;\n}\n\nexport interface RunResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface WorktreeManagerOptions {\n projectRoot: string;\n events?: EventBus | undefined;\n sessionId?: string | (() => string | undefined) | undefined;\n gitBin?: string | undefined;\n /**\n * Test seam. When provided, replaces the real `git` spawn so the manager's\n * sequencing/arg vectors can be asserted without touching a repo.\n */\n run?: (args: string[], cwd: string) => Promise<RunResult>;\n}\n\nconst MAX_SLUG = 40;\n\n/**\n * Owns the git-worktree lifecycle for isolated, parallel work units. Shells out\n * to `git` directly (never via the `git` *tool*) so it can target arbitrary\n * worktree directories without the tool's permission gate or `findGitDir`\n * resolution, and so `@wrongstack/core` keeps no dependency on `@wrongstack/tools`.\n */\nexport class WorktreeManager {\n private readonly projectRoot: string;\n private readonly events?: EventBus | undefined;\n private readonly sessionIdSource: string | (() => string | undefined) | undefined;\n private readonly gitBin: string;\n private readonly runGit: (args: string[], cwd: string) => Promise<RunResult>;\n /** Keyed by ownerId. */\n private readonly handles = new Map<string, WorktreeHandle>();\n private readonly usedSlugs = new Set<string>();\n\n constructor(opts: WorktreeManagerOptions) {\n this.projectRoot = resolve(opts.projectRoot);\n this.events = opts.events;\n this.sessionIdSource = opts.sessionId;\n this.gitBin = opts.gitBin ?? 'git';\n this.runGit = opts.run ?? ((args, cwd) => this.defaultRun(args, cwd));\n }\n\n /** Create a fresh worktree + branch forked from the current base branch. */\n async allocate(ownerId: string, opts: AllocateOpts = {}): Promise<WorktreeHandle> {\n const existing = this.handles.get(ownerId);\n if (existing && (existing.status === 'allocating' || existing.status === 'active')) {\n return existing;\n }\n\n const slug = this.makeSlug(opts.slugHint ?? ownerId);\n const branch = `wstack/ap/${slug}`;\n const dir = join(this.worktreesRoot(), slug);\n // Guard: slug is generated by makeSlug() which strips non-alphanumeric\n // chars, but double-check the dir resolves inside projectRoot so a\n // malicious slugHint with path traversal can't escape the worktrees dir.\n const absDir = resolve(dir);\n const absRoot = resolve(this.projectRoot);\n if (!absDir.startsWith(absRoot + sep)) {\n throw new Error(`Worktree dir \"${absDir}\" resolves outside project root`);\n }\n\n const baseBranch = opts.baseBranch ?? (await this.detectBaseBranch());\n\n const handle: WorktreeHandle = {\n id: slug,\n ownerId,\n ownerLabel: opts.ownerLabel ?? opts.slugHint ?? ownerId,\n slug,\n dir,\n branch,\n baseBranch,\n status: 'allocating',\n createdAt: Date.now(),\n updatedAt: Date.now(),\n insertions: 0,\n deletions: 0,\n files: 0,\n };\n this.handles.set(ownerId, handle);\n\n try {\n await mkdir(this.worktreesRoot(), { recursive: true });\n // git worktree add -b <branch> <path> <base> — path before commit-ish.\n const res = await this.runGit(\n ['worktree', 'add', '-b', branch, dir, baseBranch],\n this.projectRoot,\n );\n if (res.code !== 0) {\n return this.fail(handle, res.stderr || 'git worktree add failed');\n }\n } catch (err) {\n return this.fail(handle, toErrorMessage(err));\n }\n\n this.setStatus(handle, 'active');\n this.emit('worktree.allocated', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n ownerLabel: handle.ownerLabel,\n slug: handle.slug,\n dir: handle.dir,\n branch: handle.branch,\n baseBranch: handle.baseBranch,\n });\n return handle;\n }\n\n /** Stage everything and commit inside the worktree. */\n async commitAll(handle: WorktreeHandle, message: string): Promise<{ committed: boolean }> {\n this.setStatus(handle, 'committing');\n await this.runGit(['add', '-A'], handle.dir);\n\n // `diff --cached --quiet` exits 1 when there are staged changes, 0 when none.\n const staged = await this.runGit(['diff', '--cached', '--quiet'], handle.dir);\n if (staged.code === 0) {\n this.emitCommitted(handle, false);\n return { committed: false };\n }\n\n const idArgs = await this.identityArgs(handle.dir);\n const committed = await this.runGit([...idArgs, 'commit', '-m', message], handle.dir);\n if (committed.code !== 0) {\n this.fail(handle, committed.stderr || 'git commit failed');\n return { committed: false };\n }\n\n const stats = await this.collectStats(handle.dir);\n handle.insertions = stats.insertions;\n handle.deletions = stats.deletions;\n handle.files = stats.files;\n handle.sha = stats.sha;\n handle.updatedAt = Date.now();\n this.emitCommitted(handle, true);\n return { committed: true };\n }\n\n /** Merge the worktree branch back into the base branch (squash by default). */\n async merge(handle: WorktreeHandle, opts: MergeOpts = {}): Promise<MergeResult> {\n const squash = opts.squash ?? true;\n this.setStatus(handle, 'merging');\n\n const checkout = await this.runGit(['checkout', handle.baseBranch], this.projectRoot);\n if (checkout.code !== 0) {\n this.fail(handle, checkout.stderr || `checkout ${handle.baseBranch} failed`);\n return { ok: false, stderr: checkout.stderr };\n }\n\n const mergeArgs = squash\n ? ['merge', '--squash', handle.branch]\n : ['merge', '--no-ff', handle.branch];\n const merged = await this.runGit(mergeArgs, this.projectRoot);\n\n if (merged.code !== 0) {\n // Prefer the conflicted paths git prints to stdout (\"CONFLICT (...):\n // Merge conflict in <path>\") — deterministic across platforms — and\n // union with the index probe, since `git diff --diff-filter=U` can come\n // back empty on some runners after a `--squash` conflict.\n const fromOutput = parseConflictPaths(`${merged.stdout}\\n${merged.stderr}`);\n const fromIndex = await this.unmergedFiles();\n const conflictFiles = [...new Set([...fromOutput, ...fromIndex])];\n\n // Caller-driven resolution: leave the conflicted tree in place, hand the\n // marked files to the resolver, and finalize the merge commit only if it\n // cleared every marker. Any failure falls through to the safe reset below,\n // so the base tree is never left dirty.\n if (opts.resolve) {\n const finalized = await this.tryResolveConflict(handle, conflictFiles, opts);\n if (finalized) return finalized;\n }\n\n // `merge --squash` leaves no MERGE_HEAD, so `merge --abort` won't work;\n // hard-reset the base tree — the work is safe on the branch.\n await this.runGit(['reset', '--hard', 'HEAD'], this.projectRoot);\n handle.conflictFiles = conflictFiles;\n this.setStatus(handle, 'needs-review', { lastError: merged.stderr });\n this.emit('worktree.conflict', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n conflictFiles,\n });\n return { ok: false, conflict: true, conflictFiles, stderr: merged.stderr };\n }\n\n if (squash) {\n // --squash stages the changes but does not commit; finish the commit.\n const msg = opts.message ?? `merge ${handle.branch} (squash)`;\n const idArgs = await this.identityArgs(this.projectRoot);\n const commit = await this.runGit([...idArgs, 'commit', '-m', msg], this.projectRoot);\n // A no-op squash (empty diff) returns nonzero \"nothing to commit\" — fine.\n if (commit.code !== 0 && !/nothing to commit/i.test(commit.stdout + commit.stderr)) {\n this.fail(handle, commit.stderr || 'squash commit failed');\n return { ok: false, stderr: commit.stderr };\n }\n }\n\n this.setStatus(handle, 'merged');\n this.emit('worktree.merged', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n baseBranch: handle.baseBranch,\n squash,\n });\n return { ok: true };\n }\n\n /**\n * Current tip SHA of a handle's base branch (without checking it out). Capture\n * this before a merge so a regressed merge can be reverted to exactly this\n * commit — unambiguous even when a squash produced no diff. Returns null on\n * failure (caller then skips the revert).\n */\n async baseHead(handle: WorktreeHandle): Promise<string | null> {\n const res = await this.runGit(['rev-parse', handle.baseBranch], this.projectRoot);\n const sha = res.stdout.trim();\n return res.code === 0 && sha ? sha : null;\n }\n\n /**\n * Hard-reset the base branch back to `sha` (a value previously returned by\n * {@link baseHead}). Used to undo a squash-merge whose integrated result failed\n * re-verification, so an auto-resolved-but-broken merge never sticks on base.\n * Safe because SDD merges are serialized — no other commit lands in between.\n */\n async revertBaseTo(handle: WorktreeHandle, sha: string): Promise<boolean> {\n const co = await this.runGit(['checkout', handle.baseBranch], this.projectRoot);\n if (co.code !== 0) return false;\n const reset = await this.runGit(['reset', '--hard', sha], this.projectRoot);\n return reset.code === 0;\n }\n\n /**\n * Current base branch + tip SHA, captured WITHOUT a handle. The SDD run calls\n * this once at start so a later rollback knows which branch the run's squash\n * commits landed on. Returns null when not in a usable git state.\n */\n async currentBase(): Promise<{ branch: string; sha: string } | null> {\n const branch = await this.detectBaseBranch();\n const head = await this.runGit(['rev-parse', 'HEAD'], this.projectRoot);\n const sha = head.stdout.trim();\n return head.code === 0 && sha ? { branch, sha } : null;\n }\n\n /**\n * Force-remove EVERY managed worktree + branch this project owns, without\n * relying on the in-memory `handles` map — so it works post-run (a fresh\n * manager can clean up a previous run's leftovers). Enumerates\n * `git worktree list --porcelain`, removes every checkout living under the\n * `.wrongstack/worktrees` root, deletes every `wstack/ap/*` branch, then prunes.\n * Returns the number of worktrees removed. Never throws — best-effort cleanup.\n */\n async cleanupAllManaged(): Promise<{ removed: number }> {\n const root = resolve(this.worktreesRoot());\n let removed = 0;\n try {\n const listed = await this.runGit(['worktree', 'list', '--porcelain'], this.projectRoot);\n // Porcelain emits a `worktree <abs-path>` line per checkout (blank-line\n // separated records). Match the ones under our worktrees root.\n for (const line of listed.stdout.split('\\n')) {\n const m = line.match(/^worktree\\s+(.+?)\\s*$/);\n if (!m?.[1]) continue;\n const dir = resolve(m[1]);\n if (dir !== root && (dir === root || dir.startsWith(root + sep))) {\n const rm = await this.runGit(['worktree', 'remove', '--force', dir], this.projectRoot);\n if (rm.code === 0) removed++;\n }\n }\n } catch {\n // best-effort\n }\n // Delete every wstack/ap/* branch (covers branches whose worktree was already\n // gone, e.g. a merged task whose checkout was released but branch lingered).\n try {\n const branches = await this.runGit(\n ['branch', '--list', '--format=%(refname:short)', 'wstack/ap/*'],\n this.projectRoot,\n );\n for (const b of branches.stdout.split('\\n').map((s) => s.trim()).filter(Boolean)) {\n await this.runGit(['branch', '-D', b], this.projectRoot);\n }\n } catch {\n // best-effort\n }\n await this.runGit(['worktree', 'prune'], this.projectRoot).catch(() => undefined);\n // Drop any in-memory handles too, so a still-live manager forgets them.\n this.handles.clear();\n this.usedSlugs.clear();\n this.emit('worktree.released', {\n handleId: 'cleanup-all',\n ownerId: 'cleanup-all',\n branch: 'wstack/ap/*',\n kept: false,\n });\n return { removed };\n }\n\n /**\n * Read-only inventory of this project's managed git artifacts: every worktree\n * checkout under the `.wrongstack/worktrees` root (with its branch, when the\n * checkout has one) plus every `wstack/ap/*` branch. Unlike `cleanupStale` /\n * `cleanupAllManaged` this removes nothing — it powers the WebUI worktree panel\n * so the user can SEE orphans before deciding to clean them. Never throws.\n */\n async listManaged(): Promise<{\n worktrees: Array<{ dir: string; branch?: string | undefined }>;\n branches: string[];\n }> {\n const root = resolve(this.worktreesRoot());\n const worktrees: Array<{ dir: string; branch?: string | undefined }> = [];\n try {\n const listed = await this.runGit(['worktree', 'list', '--porcelain'], this.projectRoot);\n // Porcelain emits blank-line-separated records: `worktree <dir>` then\n // optional `HEAD <sha>` / `branch refs/heads/<name>` lines.\n let curDir: string | null = null;\n let curBranch: string | undefined;\n const flush = (): void => {\n if (curDir) {\n const d = resolve(curDir);\n if (d !== root && d.startsWith(root + sep)) {\n worktrees.push({ dir: curDir, branch: curBranch });\n }\n }\n curDir = null;\n curBranch = undefined;\n };\n for (const line of listed.stdout.split('\\n')) {\n if (line.startsWith('worktree ')) {\n flush();\n curDir = line.slice('worktree '.length).trim();\n } else if (line.startsWith('branch ')) {\n curBranch = line.slice('branch '.length).trim().replace(/^refs\\/heads\\//, '');\n } else if (line.trim() === '') {\n flush();\n }\n }\n flush();\n } catch {\n // best-effort\n }\n let branches: string[] = [];\n try {\n const b = await this.runGit(\n ['branch', '--list', '--format=%(refname:short)', 'wstack/ap/*'],\n this.projectRoot,\n );\n branches = b.stdout.split('\\n').map((s) => s.trim()).filter(Boolean);\n } catch {\n // best-effort\n }\n return { worktrees, branches };\n }\n\n /**\n * Force-remove ONE managed worktree + (optionally) its branch — the targeted\n * counterpart to `cleanupAllManaged`. Used by the WebUI worktree panel's\n * per-row Remove/Discard. Path-guarded so only checkouts under the project's\n * worktrees root can be removed. Best-effort; never throws.\n */\n async removeOne(dir: string, branch?: string | undefined): Promise<{ removed: boolean }> {\n const root = resolve(this.worktreesRoot());\n const abs = resolve(dir);\n // Refuse anything outside the managed worktrees root (never the main checkout).\n if (abs === root || !abs.startsWith(root + sep)) {\n return { removed: false };\n }\n let removed = false;\n try {\n const rm = await this.runGit(['worktree', 'remove', '--force', abs], this.projectRoot);\n removed = rm.code === 0;\n } catch {\n // best-effort\n }\n // Defense-in-depth: never let a branch that could be parsed as a git flag\n // through (a leading `-`). `branch -D --` terminates option parsing.\n if (branch && !branch.startsWith('-')) {\n await this.runGit(['branch', '-D', '--', branch], this.projectRoot).catch(() => undefined);\n }\n await this.runGit(['worktree', 'prune'], this.projectRoot).catch(() => undefined);\n // Drop any in-memory handle pointing at this dir.\n for (const [ownerId, h] of [...this.handles]) {\n if (resolve(h.dir) === abs) this.handles.delete(ownerId);\n }\n return { removed };\n }\n\n /**\n * Squash-merge an arbitrary `wstack/ap/*` branch into the base branch from the\n * main checkout — the handle-free counterpart to {@link merge}, used by the\n * WebUI worktree panel's per-row \"Merge to base\". On conflict it hard-resets\n * the base tree (never leaves it dirty) and reports the conflicted paths.\n * Refuses on a dirty base tree so uncommitted work is never clobbered.\n */\n async mergeBranch(\n branch: string,\n baseBranch?: string | undefined,\n ): Promise<{ ok: boolean; conflict?: boolean; conflictFiles?: string[]; reason?: string }> {\n const base = baseBranch ?? (await this.detectBaseBranch());\n // Defense-in-depth: a ref that begins with `-` could be parsed as a git\n // flag (argv smuggling). The WebUI boundary already restricts to managed\n // branches; this guards every other caller too.\n if (branch.startsWith('-') || base.startsWith('-')) {\n return { ok: false, reason: 'invalid ref' };\n }\n\n const status = await this.runGit(['status', '--porcelain'], this.projectRoot);\n if (status.stdout.trim().length > 0) {\n return { ok: false, reason: 'working tree has uncommitted changes — commit or stash first' };\n }\n const co = await this.runGit(['checkout', base], this.projectRoot);\n if (co.code !== 0) {\n return { ok: false, reason: co.stderr || `checkout ${base} failed` };\n }\n const merged = await this.runGit(['merge', '--squash', branch], this.projectRoot);\n if (merged.code !== 0) {\n const fromOutput = parseConflictPaths(`${merged.stdout}\\n${merged.stderr}`);\n const fromIndex = await this.unmergedFiles();\n const conflictFiles = [...new Set([...fromOutput, ...fromIndex])];\n // `merge --squash` leaves no MERGE_HEAD — hard-reset to undo cleanly.\n await this.runGit(['reset', '--hard', 'HEAD'], this.projectRoot).catch(() => undefined);\n return { ok: false, conflict: true, conflictFiles, reason: merged.stderr || 'merge conflict' };\n }\n const idArgs = await this.identityArgs(this.projectRoot);\n const commit = await this.runGit(\n [...idArgs, 'commit', '-m', `merge ${branch} (squash)`],\n this.projectRoot,\n );\n if (commit.code !== 0 && !/nothing to commit/i.test(commit.stdout + commit.stderr)) {\n return { ok: false, reason: commit.stderr || 'squash commit failed' };\n }\n return { ok: true };\n }\n\n /**\n * Compact change summary for a worktree checkout: working-tree edits\n * (numstat vs HEAD) + commit count ahead of `baseBranch`. Powers the panel's\n * \"View changes\" without streaming a full diff. Never throws.\n */\n async diffSummary(\n dir: string,\n baseBranch?: string | undefined,\n ): Promise<{\n files: Array<{ path: string; insertions: number; deletions: number }>;\n insertions: number;\n deletions: number;\n commits: number;\n }> {\n const files: Array<{ path: string; insertions: number; deletions: number }> = [];\n let insertions = 0;\n let deletions = 0;\n let commits = 0;\n try {\n const numstat = await this.runGit(['diff', '--numstat', 'HEAD'], dir);\n for (const line of numstat.stdout.split('\\n')) {\n const m = line.trim().match(/^(\\d+|-)\\t(\\d+|-)\\t(.+)$/);\n if (!m) continue;\n const ins = m[1] === '-' ? 0 : Number(m[1]);\n const del = m[2] === '-' ? 0 : Number(m[2]);\n files.push({ path: m[3]!, insertions: ins, deletions: del });\n insertions += ins;\n deletions += del;\n }\n } catch {\n // best-effort\n }\n try {\n const base = baseBranch ?? (await this.detectBaseBranch());\n const count = await this.runGit(['rev-list', '--count', `${base}..HEAD`], dir);\n commits = Number(count.stdout.trim()) || 0;\n } catch {\n // best-effort\n }\n return { files, insertions, deletions, commits };\n }\n\n /**\n * Detect and clean up stale worktrees left behind by crashed subagents.\n *\n * P2 #B6 (sprint2 audit): when a subagent crashes (OOM, SIGKILL), its\n * worktree checkout and branch remain on disk. `cleanupAllManaged()`\n * sweeps everything, but is never called automatically — only via\n * `/worktree clean`. This method runs on Director boot (or any other\n * entry point) to clean up leftovers from a previous crashed run.\n *\n * Unlike `cleanupAllManaged()`, this method is a no-op when no stale\n * worktrees are detected — it doesn't clear in-memory handles or emit\n * events unnecessarily. When stale worktrees ARE found, it delegates\n * to `cleanupAllManaged()` for the actual removal.\n *\n * Returns the number of stale worktrees removed (0 = clean).\n */\n async cleanupStale(): Promise<{ removed: number; detected: number }> {\n const root = resolve(this.worktreesRoot());\n let detected = 0;\n try {\n const listed = await this.runGit(['worktree', 'list', '--porcelain'], this.projectRoot);\n for (const line of listed.stdout.split('\\n')) {\n const m = line.match(/^worktree\\s+(.+?)\\s*$/);\n if (!m?.[1]) continue;\n const dir = resolve(m[1]);\n if (dir !== root && (dir === root || dir.startsWith(root + sep))) {\n detected++;\n }\n }\n } catch {\n // git not available or not a repo — nothing to clean\n return { removed: 0, detected: 0 };\n }\n // Also catch dangling `wstack/ap/*` branches whose worktree checkout is\n // already gone (e.g. a crash between `worktree remove` and `branch -D`, or a\n // merged task whose checkout was released but the branch lingered). These\n // are orphans too — without this the worktree-dir-only probe would report\n // \"clean\" and the branch would accumulate across runs.\n if (detected === 0) {\n try {\n const branches = await this.runGit(\n ['branch', '--list', '--format=%(refname:short)', 'wstack/ap/*'],\n this.projectRoot,\n );\n detected += branches.stdout.split('\\n').map((s) => s.trim()).filter(Boolean).length;\n } catch {\n // best-effort\n }\n }\n if (detected === 0) {\n return { removed: 0, detected: 0 };\n }\n // Stale worktrees / branches found — delegate to the full sweep.\n const { removed } = await this.cleanupAllManaged();\n return { removed, detected };\n }\n\n /**\n * Undo a run's squash commits by reverting each (newest → oldest) on the base\n * branch — history-preserving, never a destructive reset. Refuses on a dirty\n * working tree (so uncommitted work is never clobbered) and aborts cleanly if a\n * revert conflicts, reporting which SHA. `shas` are the run commit SHAs in the\n * order they landed; this reverses them. Returns the count reverted.\n */\n async revertCommits(\n baseBranch: string,\n shas: string[],\n ): Promise<{ ok: boolean; reverted: number; reason?: string }> {\n if (shas.length === 0) return { ok: true, reverted: 0, reason: 'nothing to revert' };\n\n const status = await this.runGit(['status', '--porcelain'], this.projectRoot);\n if (status.stdout.trim().length > 0) {\n return { ok: false, reverted: 0, reason: 'working tree has uncommitted changes — commit or stash first' };\n }\n\n const co = await this.runGit(['checkout', baseBranch], this.projectRoot);\n if (co.code !== 0) {\n return { ok: false, reverted: 0, reason: co.stderr || `checkout ${baseBranch} failed` };\n }\n\n const idArgs = await this.identityArgs(this.projectRoot);\n let reverted = 0;\n // Newest commit first so each revert applies cleanly on top of the prior one.\n for (const sha of [...shas].reverse()) {\n const res = await this.runGit([...idArgs, 'revert', '--no-edit', sha], this.projectRoot);\n if (res.code !== 0) {\n // Conflict or bad ref — abort the in-progress revert so the tree is clean.\n await this.runGit(['revert', '--abort'], this.projectRoot).catch(() => undefined);\n return {\n ok: false,\n reverted,\n reason: `revert of ${sha.slice(0, 8)} failed: ${(res.stderr || res.stdout).trim().split('\\n')[0] ?? 'conflict'}`,\n };\n }\n reverted++;\n }\n return { ok: true, reverted };\n }\n\n /**\n * Run the caller-supplied resolver against a conflicted squash-merge, then\n * commit if it cleared every marker. Returns a successful `MergeResult` on a\n * clean resolution, or `null` to signal the caller should fall back to the\n * abort path. Never leaves the base tree committed-but-dirty: a partial or\n * failed resolution returns `null` and the caller hard-resets.\n */\n private async tryResolveConflict(\n handle: WorktreeHandle,\n conflictFiles: string[],\n opts: MergeOpts,\n ): Promise<MergeResult | null> {\n let resolved = false;\n try {\n resolved = opts.resolve ? await opts.resolve({ conflictFiles, cwd: this.projectRoot }) : false;\n } catch {\n resolved = false;\n }\n if (!resolved) return null;\n\n // Stage the resolver's edits, then refuse to commit if any conflict marker\n // survived (a half-resolved file is worse than a clean abort).\n await this.runGit(['add', '-A'], this.projectRoot);\n if (await this.hasConflictMarkers()) return null;\n\n const idArgs = await this.identityArgs(this.projectRoot);\n const msg = opts.message ?? `merge ${handle.branch} (squash, conflict resolved)`;\n const commit = await this.runGit([...idArgs, 'commit', '-m', msg], this.projectRoot);\n if (commit.code !== 0 && !/nothing to commit/i.test(commit.stdout + commit.stderr)) {\n return null;\n }\n\n handle.conflictFiles = conflictFiles;\n this.setStatus(handle, 'merged');\n this.emit('worktree.merged', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n baseBranch: handle.baseBranch,\n squash: true,\n });\n return { ok: true, resolved: true, conflictFiles };\n }\n\n /**\n * True when staged content still carries conflict markers. `git diff --cached\n * --check` exits nonzero and prints a \"leftover conflict marker\" line for each\n * survivor; whitespace-only errors (also flagged by --check) are ignored so a\n * clean resolution with unrelated whitespace is not rejected.\n */\n private async hasConflictMarkers(): Promise<boolean> {\n const check = await this.runGit(['diff', '--cached', '--check'], this.projectRoot);\n if (check.code === 0) return false;\n return /conflict marker/i.test(`${check.stdout}\\n${check.stderr}`);\n }\n\n /**\n * Remove the worktree + branch. Conflicted/failed handles (or `keep:true`)\n * are left on disk for inspection.\n */\n async release(handle: WorktreeHandle, opts: { keep?: boolean | undefined } = {}): Promise<void> {\n const keep = opts.keep || handle.status === 'needs-review' || handle.status === 'failed';\n if (!keep) {\n await this.runGit(['worktree', 'remove', '--force', handle.dir], this.projectRoot);\n await this.runGit(['branch', '-D', handle.branch], this.projectRoot);\n await this.runGit(['worktree', 'prune'], this.projectRoot);\n this.handles.delete(handle.ownerId);\n }\n this.emit('worktree.released', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n kept: keep,\n });\n }\n\n get(ownerId: string): WorktreeHandle | undefined {\n return this.handles.get(ownerId);\n }\n\n list(): WorktreeHandle[] {\n return [...this.handles.values()];\n }\n\n // ── internals ────────────────────────────────────────────────────────────\n\n private worktreesRoot(): string {\n return join(this.projectRoot, '.wrongstack', 'worktrees');\n }\n\n private async detectBaseBranch(): Promise<string> {\n const head = await this.runGit(['rev-parse', '--abbrev-ref', 'HEAD'], this.projectRoot);\n const name = head.stdout.trim();\n if (name && name !== 'HEAD') return name;\n // Detached HEAD — fall back to the commit SHA.\n const sha = await this.runGit(['rev-parse', 'HEAD'], this.projectRoot);\n return sha.stdout.trim() || 'HEAD';\n }\n\n private makeSlug(hint: string): string {\n let base = hint\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^[-.]+/, '')\n .replace(/[-.]+$/, '')\n .slice(0, MAX_SLUG)\n .replace(/[-.]+$/, '');\n if (!base) base = 'wt';\n let slug = `${base}-${crypto.randomUUID().slice(0, 6)}`;\n while (this.usedSlugs.has(slug)) slug = `${base}-${crypto.randomUUID().slice(0, 6)}`;\n this.usedSlugs.add(slug);\n return slug;\n }\n\n private async collectStats(\n dir: string,\n ): Promise<{ insertions: number; deletions: number; files: number; sha: string }> {\n const sha = (await this.runGit(['rev-parse', 'HEAD'], dir)).stdout.trim();\n const numstat = await this.runGit(['show', '--numstat', '--format=', 'HEAD'], dir);\n let insertions = 0;\n let deletions = 0;\n let files = 0;\n for (const line of numstat.stdout.split('\\n')) {\n const m = line.trim().match(/^(\\d+|-)\\t(\\d+|-)\\t(.+)$/);\n if (!m) continue;\n files++;\n if (m[1] !== '-') insertions += Number(m[1]);\n if (m[2] !== '-') deletions += Number(m[2]);\n }\n return { insertions, deletions, files, sha };\n }\n\n /**\n * `git -c user.*` fallback so commits succeed on machines and CI runners\n * that have no global git identity configured. Returns `[]` when both\n * `user.name` and `user.email` are already set (the common case), so a real\n * user's identity is never overridden. The worktree branch commits are\n * squashed away on merge, so the fallback identity never reaches the base\n * branch history.\n */\n private async identityArgs(cwd: string): Promise<string[]> {\n const name = (await this.runGit(['config', 'user.name'], cwd)).stdout.trim();\n const email = (await this.runGit(['config', 'user.email'], cwd)).stdout.trim();\n if (name && email) return [];\n return [\n '-c',\n `user.name=${name || 'AutoPhase'}`,\n '-c',\n `user.email=${email || 'autophase@agent.local'}`,\n ];\n }\n\n private async unmergedFiles(): Promise<string[]> {\n const res = await this.runGit(['diff', '--name-only', '--diff-filter=U'], this.projectRoot);\n return res.stdout\n .split('\\n')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n\n private emitCommitted(handle: WorktreeHandle, committed: boolean): void {\n this.emit('worktree.committed', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n committed,\n insertions: handle.insertions,\n deletions: handle.deletions,\n files: handle.files,\n sha: handle.sha,\n });\n }\n\n private fail(handle: WorktreeHandle, error: string): WorktreeHandle {\n this.setStatus(handle, 'failed', { lastError: error });\n this.emit('worktree.failed', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n error,\n });\n return handle;\n }\n\n private setStatus(\n handle: WorktreeHandle,\n status: WorktreeStatus,\n patch?: Partial<WorktreeHandle> | undefined,\n ): void {\n handle.status = status;\n handle.updatedAt = Date.now();\n if (patch) Object.assign(handle, patch);\n }\n\n private emit<E extends Parameters<EventBus['emit']>[0]>(\n event: E,\n payload: Parameters<EventBus['emit']>[1],\n ): void {\n const sessionId = this.currentSessionId();\n this.events?.emit(\n event,\n (sessionId && payload && typeof payload === 'object'\n ? { ...(payload as Record<string, unknown>), sessionId }\n : payload) as never,\n );\n }\n\n private currentSessionId(): string | undefined {\n const value =\n typeof this.sessionIdSource === 'function'\n ? this.sessionIdSource()\n : this.sessionIdSource;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\n\n private defaultRun(args: string[], cwd: string): Promise<RunResult> {\n return new Promise((res) => {\n let stdout = '';\n let stderr = '';\n // Bound the captured output — a merge/status against a huge worktree\n // can emit MBs that nothing reads in full (parseConflictPaths only\n // scans for CONFLICT lines). 1 MB matches grep.ts's buffer cap.\n const MAX_GIT_OUTPUT = 1_000_000;\n const child = spawn(this.gitBin, args, {\n cwd,\n env: buildChildEnv(),\n stdio: ['ignore', 'pipe', 'pipe'],\n signal: AbortSignal.timeout(30_000),\n windowsHide: true,\n });\n child.stdout?.on('data', (c: Buffer) => {\n if (stdout.length < MAX_GIT_OUTPUT) stdout += c.toString();\n });\n child.stderr?.on('data', (c: Buffer) => {\n if (stderr.length < MAX_GIT_OUTPUT) stderr += c.toString();\n });\n child.on('error', (err) => res({ code: 1, stdout, stderr: err.message }));\n child.on('close', (code) => res({ code: code ?? 1, stdout, stderr }));\n });\n }\n}\n\n/**\n * Extract conflicted paths from git merge output. Git prints one\n * `CONFLICT (<kind>): Merge conflict in <path>` line per conflicted file to\n * stdout — a portable signal that doesn't depend on the post-merge index\n * state (which `git diff --diff-filter=U` can report as empty on some runners\n * after a `--squash` conflict).\n */\nexport function parseConflictPaths(output: string): string[] {\n const paths = new Set<string>();\n for (const line of output.split('\\n')) {\n const m = line.match(/^CONFLICT \\([^)]*\\): Merge conflict in (.+?)\\s*$/);\n if (m?.[1]) paths.add(m[1]);\n }\n return [...paths];\n}\n\n/** Throw if `dir` resolves outside `projectRoot`. */\nexport function assertSafePath(dir: string, projectRoot: string): void {\n const root = resolve(projectRoot);\n const abs = resolve(dir);\n if (abs !== root && !abs.startsWith(root + sep)) {\n throw new Error(`worktree path escapes project root: ${dir}`);\n }\n}\n","// SDD run lifecycle — post-run, disk-level operations.\n//\n// While a run is live, the in-process `SddRunControl` (registered in\n// `SddRunRegistry`) owns stop / cleanup / rollback. Once a run finishes the\n// registry is cleared and its `WorktreeManager` is gone, so these helpers\n// re-derive everything from disk: a fresh `WorktreeManager` for git surgery and\n// the persisted board snapshot for the run's base branch + merged commits.\n//\n// Used by the CLI/WebUI when there is no active run (e.g. `/sdd rollback` after\n// the run already settled, or `/sdd destroy` to wipe the project).\n\nimport * as fsp from 'node:fs/promises';\nimport { WorktreeManager } from '../worktree/worktree-manager.js';\nimport { SddBoardStore } from './sdd-board-store.js';\n\n/** Force-remove every git worktree + branch a previous run left behind. */\nexport async function cleanupSddWorktrees(projectRoot: string): Promise<{ removed: number }> {\n const wt = new WorktreeManager({ projectRoot });\n return wt.cleanupAllManaged();\n}\n\n/**\n * Detect and clean up stale worktrees from a crashed previous run.\n * No-op when the project is clean. Called on SDD/Director boot to\n * prevent orphaned worktrees from conflicting with the next run's\n * `allocate()`.\n *\n * P2 #B6 (sprint2 audit).\n */\nexport async function cleanupStaleWorktrees(projectRoot: string): Promise<{ removed: number; detected: number }> {\n const wt = new WorktreeManager({ projectRoot });\n return wt.cleanupStale();\n}\n\nexport interface CleanupStaleSddOptions {\n projectRoot: string;\n /** Board snapshot dir (`wpaths.projectSddBoards`) — read for the liveness guard. */\n boardsDir: string;\n /** A `running` board updated within this window is treated as live → skip. Default 120_000 (2 min). */\n runningLiveMs?: number | undefined;\n /** A `paused` board updated within this window is treated as live → skip. Default 1_800_000 (30 min). */\n pausedLiveMs?: number | undefined;\n /** Injectable clock for tests. */\n now?: (() => number) | undefined;\n}\n\nexport interface CleanupStaleSddResult {\n /** True when a sweep ran (orphans were found and removed). */\n swept: boolean;\n removed: number;\n detected: number;\n /** Set when the sweep was skipped because a run appears live. */\n skippedReason?: string | undefined;\n}\n\n/**\n * Liveness-guarded stale-worktree sweep for boot + run-start. Worktrees live\n * under `<projectRoot>/.wrongstack/worktrees` and a sweep force-removes ALL of\n * them — so it must NEVER run under a genuinely live run (possibly in another\n * process). The guard reads the latest board: a `running` board updated within\n * `runningLiveMs`, or a `paused` one within `pausedLiveMs`, is treated as live\n * and the sweep is skipped. A crashed run leaves its board frozen as `running`\n * → once it ages past the window it is correctly swept. Any other status\n * (completed / failed / stopped / deadlocked / idle) is always sweepable.\n * Never throws — best-effort cleanup.\n */\nexport async function cleanupStaleSddWorktrees(\n opts: CleanupStaleSddOptions,\n): Promise<CleanupStaleSddResult> {\n const now = opts.now?.() ?? Date.now();\n try {\n const store = new SddBoardStore({ baseDir: opts.boardsDir });\n const latest = (await store.list())[0];\n if (latest) {\n const age = now - latest.updatedAt;\n if (latest.status === 'running' && age < (opts.runningLiveMs ?? 120_000)) {\n return { swept: false, removed: 0, detected: 0, skippedReason: 'a run appears live (running)' };\n }\n if (latest.status === 'paused' && age < (opts.pausedLiveMs ?? 1_800_000)) {\n return { swept: false, removed: 0, detected: 0, skippedReason: 'a run is paused' };\n }\n }\n } catch {\n // No/unreadable board → nothing claims the worktrees; safe to sweep.\n }\n try {\n const wt = new WorktreeManager({ projectRoot: opts.projectRoot });\n const { removed, detected } = await wt.cleanupStale();\n return { swept: detected > 0, removed, detected };\n } catch {\n return { swept: false, removed: 0, detected: 0 };\n }\n}\n\nexport interface RollbackFromDiskOptions {\n projectRoot: string;\n /** Directory holding persisted board snapshots (`wpaths.projectSddBoards`). */\n boardsDir: string;\n /** Specific run to roll back. Omit → the most recently updated board. */\n runId?: string | undefined;\n}\n\n/**\n * Roll back a finished run's merged commits by reading its persisted board\n * snapshot (base branch + commit SHAs) and reverting each. History-preserving;\n * refuses on a dirty tree or revert conflict (surfaced in `reason`). Returns\n * `ok:false` with a reason when there is no board, no base branch, or nothing to\n * revert.\n */\nexport async function rollbackSddRunFromDisk(\n opts: RollbackFromDiskOptions,\n): Promise<{ ok: boolean; reverted: number; reason?: string }> {\n const store = new SddBoardStore({ baseDir: opts.boardsDir });\n const runId = opts.runId ?? (await store.list())[0]?.runId;\n if (!runId) return { ok: false, reverted: 0, reason: 'no SDD board found to roll back' };\n\n const snap = await store.load(runId);\n if (!snap) return { ok: false, reverted: 0, reason: `board \"${runId}\" not found` };\n if (!snap.baseBranch) {\n return { ok: false, reverted: 0, reason: 'this run did not record a base branch (no worktree run)' };\n }\n const shas = (snap.mergedCommits ?? []).map((c) => c.sha);\n if (shas.length === 0) {\n return { ok: false, reverted: 0, reason: 'no merged commits recorded for this run' };\n }\n\n const wt = new WorktreeManager({ projectRoot: opts.projectRoot });\n return wt.revertCommits(snap.baseBranch, shas);\n}\n\nexport interface DestroySddProjectOptions {\n projectRoot: string;\n /** Resolved wstack paths to delete. */\n paths: {\n projectSpecs: string;\n projectTaskGraphs: string;\n projectSddSession: string;\n projectSddBoards: string;\n };\n /**\n * Also revert this run's already-merged squash commits (history-preserving\n * `git revert`) BEFORE deleting the board that records them. Off by default —\n * a plain destroy wipes worktrees + artifacts but leaves merged commits on the\n * base branch (un-merged worktree work is destroyed regardless, since its\n * branch is force-removed). When on and the working tree is dirty, the revert\n * is refused and surfaced in `revertReason` (the destroy still proceeds).\n */\n revertMerged?: boolean | undefined;\n /** Which run's merged commits to revert. Omit → the most recently updated board. */\n runId?: string | undefined;\n}\n\nexport interface DestroySddProjectResult {\n worktreesRemoved: number;\n /** Human labels of the artifacts that were deleted. */\n deleted: string[];\n /** Number of merged commits reverted (only when `revertMerged` was set). */\n reverted: number;\n /** Whether the optional merged-commit revert succeeded (undefined → not requested). */\n revertOk?: boolean | undefined;\n /** Why the revert did not fully apply (dirty tree, conflict, nothing to revert). */\n revertReason?: string | undefined;\n}\n\n/**\n * Destroy an SDD project: optionally revert its merged commits, then clean every\n * worktree + branch, then delete the on-disk artifacts (specs, task-graphs,\n * session, boards). The revert is opt-in (`revertMerged`) and runs FIRST — it\n * reads the board snapshot that the artifact deletion removes. Best-effort: a\n * missing path is simply skipped. The caller is responsible for stopping any\n * active run first.\n */\nexport async function destroySddProject(\n opts: DestroySddProjectOptions,\n): Promise<DestroySddProjectResult> {\n // 1. Optional merged-commit revert — must read the board before we delete it.\n let reverted = 0;\n let revertOk: boolean | undefined;\n let revertReason: string | undefined;\n if (opts.revertMerged) {\n const r = await rollbackSddRunFromDisk({\n projectRoot: opts.projectRoot,\n boardsDir: opts.paths.projectSddBoards,\n runId: opts.runId,\n }).catch((err) => ({ ok: false, reverted: 0, reason: toReason(err) }));\n reverted = r.reverted;\n revertOk = r.ok;\n revertReason = r.reason;\n }\n\n // 2. Force-remove every worktree + branch (incl. un-merged work).\n const { removed } = await cleanupSddWorktrees(opts.projectRoot).catch(() => ({ removed: 0 }));\n\n // 3. Delete the on-disk artifacts.\n const deleted: string[] = [];\n const rmDir = async (dir: string, label: string) => {\n try {\n await fsp.rm(dir, { recursive: true, force: true });\n deleted.push(label);\n } catch {\n // already gone\n }\n };\n const rmFile = async (file: string, label: string) => {\n try {\n await fsp.unlink(file);\n deleted.push(label);\n } catch {\n // already gone\n }\n };\n\n await rmFile(opts.paths.projectSddSession, 'session');\n await rmDir(opts.paths.projectSpecs, 'specs');\n await rmDir(opts.paths.projectTaskGraphs, 'task-graphs');\n await rmDir(opts.paths.projectSddBoards, 'boards');\n\n return { worktreesRemoved: removed, deleted, reverted, revertOk, revertReason };\n}\n\nfunction toReason(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/** Lifecycle operation kinds shared by every surface (WebUI / TUI / CLI). */\nexport type SddLifecycleOp = 'cleanup_worktrees' | 'rollback' | 'destroy';\n\nexport interface SddLifecycleOptions {\n projectRoot: string;\n /** Resolved wstack paths (required for `destroy`; boards dir is enough for `rollback`). */\n paths: {\n projectSpecs: string;\n projectTaskGraphs: string;\n projectSddSession: string;\n projectSddBoards: string;\n };\n /** Target a specific run (rollback / destroy). Omit → most recently updated board. */\n runId?: string | undefined;\n /** `destroy` only: also revert merged commits before wiping. */\n revertMerged?: boolean | undefined;\n}\n\n/** Uniform result for any lifecycle op — drives identical UI wording everywhere. */\nexport interface SddLifecycleResult {\n op: SddLifecycleOp;\n ok: boolean;\n /** Worktrees removed (cleanup_worktrees / destroy). */\n removed?: number | undefined;\n /** Merged commits reverted (rollback / destroy with revertMerged). */\n reverted?: number | undefined;\n /** Artifact labels deleted (destroy). */\n deleted?: string[] | undefined;\n /** Failure / partial reason, surfaced verbatim in the UI. */\n reason?: string | undefined;\n}\n\n/**\n * Apply a post-run SDD lifecycle operation from disk and return a uniform result.\n * The single entry point shared by the WebUI board handler, the TUI overlay, and\n * the CLI `/sdd` host so every surface reports the same thing. The caller must\n * ensure no run is active (these operate on git + on-disk state, not the live\n * run) — `cleanup`/`destroy` force-remove worktrees, `rollback` refuses on a\n * dirty tree. Never throws.\n */\nexport async function applySddLifecycle(\n op: SddLifecycleOp,\n opts: SddLifecycleOptions,\n): Promise<SddLifecycleResult> {\n try {\n if (op === 'cleanup_worktrees') {\n const { removed } = await cleanupSddWorktrees(opts.projectRoot);\n return { op, ok: true, removed };\n }\n if (op === 'rollback') {\n const r = await rollbackSddRunFromDisk({\n projectRoot: opts.projectRoot,\n boardsDir: opts.paths.projectSddBoards,\n runId: opts.runId,\n });\n return { op, ok: r.ok, reverted: r.reverted, reason: r.reason };\n }\n // destroy\n const r = await destroySddProject({\n projectRoot: opts.projectRoot,\n paths: opts.paths,\n revertMerged: opts.revertMerged,\n runId: opts.runId,\n });\n return {\n op,\n // The wipe itself is best-effort and always \"ok\"; a requested-but-refused\n // revert is surfaced via reason without failing the destroy.\n ok: true,\n removed: r.worktreesRemoved,\n reverted: r.reverted,\n deleted: r.deleted,\n reason: r.revertOk === false ? r.revertReason : undefined,\n };\n } catch (err) {\n return { op, ok: false, reason: toReason(err) };\n }\n}\n","import type { SpecTemplate } from '../types/spec.js';\n\n/**\n * Built-in spec templates for common development scenarios.\n */\nexport const SPEC_TEMPLATES: SpecTemplate[] = [\n {\n id: 'feature',\n name: 'New Feature',\n description: 'Template for new feature development',\n sections: [\n { type: 'overview', title: 'Overview', level: 2 },\n { type: 'requirements', title: 'Requirements', level: 2 },\n { type: 'architecture', title: 'Architecture', level: 2 },\n { type: 'api', title: 'API Design', level: 2 },\n { type: 'data', title: 'Data Model', level: 2 },\n { type: 'security', title: 'Security', level: 2 },\n { type: 'acceptance', title: 'Acceptance Criteria', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'non-functional', priority: 'medium', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'bugfix',\n name: 'Bug Fix',\n description: 'Template for bug fix specifications',\n sections: [\n { type: 'overview', title: 'Bug Description', level: 2 },\n { type: 'requirements', title: 'Root Cause Analysis', level: 2 },\n { type: 'acceptance', title: 'Fix Verification', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'critical', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'refactor',\n name: 'Refactor',\n description: 'Template for code refactoring',\n sections: [\n { type: 'overview', title: 'Current State', level: 2 },\n { type: 'requirements', title: 'Refactoring Goals', level: 2 },\n { type: 'architecture', title: 'Target Architecture', level: 2 },\n { type: 'acceptance', title: 'Verification', level: 2 },\n ],\n defaultRequirements: [\n { type: 'non-functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'infra',\n name: 'Infrastructure',\n description: 'Template for infrastructure/tooling changes',\n sections: [\n { type: 'overview', title: 'What and Why', level: 2 },\n { type: 'requirements', title: 'Requirements', level: 2 },\n { type: 'architecture', title: 'Design', level: 2 },\n { type: 'security', title: 'Security Impact', level: 2 },\n { type: 'acceptance', title: 'Rollout Plan', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'security', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'integration',\n name: 'Integration',\n description: 'Template for integrating external services or APIs',\n sections: [\n { type: 'overview', title: 'Integration Overview', level: 2 },\n { type: 'requirements', title: 'Integration Requirements', level: 2 },\n { type: 'api', title: 'API Contract', level: 2 },\n { type: 'architecture', title: 'Architecture', level: 2 },\n { type: 'security', title: 'Auth & Security', level: 2 },\n { type: 'acceptance', title: 'Testing Strategy', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'security', priority: 'critical', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'performance', priority: 'medium', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'cli-command',\n name: 'CLI Command',\n description: 'Template for new CLI commands/slash commands',\n sections: [\n { type: 'overview', title: 'Command Overview', level: 2 },\n { type: 'requirements', title: 'Command Requirements', level: 2 },\n { type: 'api', title: 'Command Interface', level: 2 },\n { type: 'acceptance', title: 'Usage Examples', level: 2 },\n ],\n defaultRequirements: [\n { type: 'ux', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n];\n\n/**\n * Get a template by ID.\n */\nexport function getTemplate(id: string): SpecTemplate | undefined {\n return SPEC_TEMPLATES.find((t) => t.id === id);\n}\n\n/**\n * List all available templates.\n */\nexport function listTemplates(): Array<{ id: string; name: string; description: string }> {\n return SPEC_TEMPLATES.map((t) => ({ id: t.id, name: t.name, description: t.description }));\n}\n\n/**\n * Generate a markdown skeleton from a template.\n */\nexport function templateToMarkdown(template: SpecTemplate, title?: string): string {\n const lines: string[] = [];\n lines.push(`# ${title ?? 'Untitled Specification'}`);\n lines.push('Version: 0.1.0');\n lines.push('');\n\n for (const section of template.sections) {\n lines.push(`${'#'.repeat(section.level + 1)} ${section.title}`);\n lines.push(`_<!-- ${section.type} section content -->_`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import type { TaskGraph, TaskNode, TaskProgress } from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\nimport type { Specification } from '../types/spec.js';\nimport { truncate } from '../utils/string.js';\n\nconst STATUS_ICON: Record<TaskNode['status'], string> = {\n pending: '○',\n in_progress: '◐',\n blocked: '⊘',\n failed: '✗',\n review: '◑',\n completed: '●',\n};\n\nconst PRIORITY_ICON: Record<TaskNode['priority'], string> = {\n critical: '🔴',\n high: '🟠',\n medium: '🟡',\n low: '🟢',\n};\n\nconst TYPE_ICON: Record<TaskNode['type'], string> = {\n feature: '⚡',\n bugfix: '🐛',\n refactor: '♻️',\n docs: '📝',\n test: '🧪',\n chore: '🔧',\n};\n\n/**\n * Render a task graph as ASCII art for terminal display.\n */\nexport function renderTaskGraph(graph: TaskGraph, opts?: { compact?: boolean | undefined }): string {\n const lines: string[] = [];\n const compact = opts?.compact ?? false;\n\n // Header\n lines.push(`╭─ Task Graph: ${graph.title} ─╮`);\n lines.push(`│ Spec: ${graph.specId.slice(0, 8)}... │ Nodes: ${graph.nodes.size} │ Edges: ${graph.edges.length} │`);\n lines.push('╰' + '─'.repeat(Math.max(50, graph.title.length + 30)) + '╯');\n lines.push('');\n\n // Progress bar\n const progress = computeTaskProgress(graph);\n lines.push(renderProgress(progress));\n lines.push('');\n\n // Build adjacency for display\n const childrenMap = new Map<string, string[]>();\n for (const edge of graph.edges) {\n if (edge.type === 'depends_on') {\n // edge.from depends on edge.to → edge.to is a blocker\n const deps = childrenMap.get(edge.from) ?? [];\n deps.push(edge.to);\n childrenMap.set(edge.from, deps);\n }\n }\n\n // Render root nodes and their dependents\n const rendered = new Set<string>();\n const rootNodes = graph.rootNodes.filter((id) => graph.nodes.has(id));\n\n // If no root nodes, use all nodes\n const startNodes = rootNodes.length > 0\n ? rootNodes\n : Array.from(graph.nodes.keys()).filter((id) => {\n const deps = childrenMap.get(id);\n return !deps || deps.length === 0;\n });\n\n for (const rootId of startNodes) {\n renderNode(graph, rootId, lines, rendered, childrenMap, compact, '');\n }\n\n // Render any orphan nodes\n for (const [id] of graph.nodes) {\n if (!rendered.has(id)) {\n renderNode(graph, id, lines, rendered, childrenMap, compact, '');\n }\n }\n\n // Legend\n lines.push('');\n lines.push('Legend: ● done ◐ in-progress ○ pending ⊗ blocked ✗ failed ◒ review');\n\n return lines.join('\\n');\n}\n\nfunction renderNode(\n graph: TaskGraph,\n nodeId: string,\n lines: string[],\n rendered: Set<string>,\n childrenMap: Map<string, string[]>,\n compact: boolean,\n prefix: string,\n): void {\n if (rendered.has(nodeId)) return;\n rendered.add(nodeId);\n\n const node = graph.nodes.get(nodeId);\n if (!node) return;\n\n const icon = STATUS_ICON[node.status];\n const prioIcon = PRIORITY_ICON[node.priority];\n const typeIcon = TYPE_ICON[node.type];\n const title = compact ? truncate(node.title, 40) : node.title;\n\n const blockedBy = childrenMap.get(nodeId) ?? [];\n const depsStr = blockedBy.length > 0\n ? ` ← [${blockedBy.map((d) => graph.nodes.get(d)?.title?.slice(0, 12) ?? '?').join(', ')}]`\n : '';\n\n lines.push(`${prefix}${icon} ${typeIcon} ${prioIcon} ${title}${depsStr}`);\n\n if (!compact && node.description) {\n const descLines = node.description.split('\\n').slice(0, 3);\n for (const dl of descLines) {\n lines.push(`${prefix} └ ${truncate(dl, 60)}`);\n }\n }\n\n // Render nodes that depend on this one\n const dependents = graph.edges\n .filter((e) => e.type === 'depends_on' && e.to === nodeId)\n .map((e) => e.from)\n .filter((id) => graph.nodes.has(id));\n\n for (const depId of dependents) {\n renderNode(graph, depId, lines, rendered, childrenMap, compact, prefix + ' ');\n }\n}\n\n/**\n * Render a progress bar.\n */\nexport function renderProgress(progress: TaskProgress): string {\n const barWidth = 30;\n const filled = Math.round((progress.percentComplete / 100) * barWidth);\n const empty = barWidth - filled;\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n\n return [\n `Progress: [${bar}] ${progress.percentComplete}%`,\n ` ${progress.completed} done │ ${progress.inProgress} active │ ${progress.pending} pending │ ${progress.blocked} blocked │ ${progress.failed} failed`,\n ].join('\\n');\n}\n\n/**\n * Render a compact task list (for quick status checks).\n */\nexport function renderTaskList(graph: TaskGraph): string {\n const lines: string[] = [];\n const nodes = Array.from(graph.nodes.values());\n\n // Group by status\n const groups: Record<string, TaskNode[]> = {\n in_progress: [],\n pending: [],\n blocked: [],\n review: [],\n failed: [],\n completed: [],\n };\n\n for (const node of nodes) {\n groups[node.status]?.push(node);\n }\n\n for (const [status, group] of Object.entries(groups)) {\n if (group.length === 0) continue;\n const icon = STATUS_ICON[status as TaskNode['status']];\n lines.push(`${icon} ${status.toUpperCase()} (${group.length})`);\n for (const node of group) {\n const prio = PRIORITY_ICON[node.priority];\n const type = TYPE_ICON[node.type];\n lines.push(` ${type} ${prio} ${node.title}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Render spec analysis summary.\n */\nexport function renderSpecAnalysis(\n spec: Specification,\n analysis: { completeness: number; gaps: string[]; risks: string[]; suggestions: string[] },\n): string {\n const lines: string[] = [];\n\n lines.push(`╭─ Spec Analysis: ${spec.title} ─╮`);\n lines.push('');\n\n // Completeness\n const barWidth = 20;\n const filled = Math.round((analysis.completeness / 100) * barWidth);\n const bar = '█'.repeat(filled) + '░'.repeat(barWidth - filled);\n lines.push(`Completeness: [${bar}] ${analysis.completeness}%`);\n lines.push('');\n\n if (analysis.gaps.length > 0) {\n lines.push('⚠ Gaps:');\n for (const gap of analysis.gaps) {\n lines.push(` • ${gap}`);\n }\n lines.push('');\n }\n\n if (analysis.risks.length > 0) {\n lines.push('🔴 Risks:');\n for (const risk of analysis.risks) {\n lines.push(` • ${risk}`);\n }\n lines.push('');\n }\n\n if (analysis.suggestions.length > 0) {\n lines.push('💡 Suggestions:');\n for (const sug of analysis.suggestions) {\n lines.push(` • ${sug}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n","import { expectDefined } from '../utils/expect-defined.js';\nimport type { TaskGraph } from '../types/task-graph.js';\nimport { topologicalSort } from '../types/task-graph.js';\n/**\n * Enhanced critical path analysis with bottleneck detection,\n * parallel execution groups, and time estimation.\n */\nexport interface CriticalPathAnalysis {\n /** Ordered list of critical path task IDs. */\n criticalPath: string[];\n /** Total estimated hours for the critical path. */\n totalHours: number;\n /** Tasks that block the most downstream work. */\n bottlenecks: BottleneckTask[];\n /** Groups of tasks that can run in parallel. */\n parallelGroups: string[][];\n /** Recommended execution order respecting dependencies. */\n executionOrder: string[];\n /** Tasks with no blockers (can start immediately). */\n readyTasks: string[];\n /** Tasks that are blocked and cannot start. */\n blockedTasks: string[];\n}\n\nexport interface BottleneckTask {\n taskId: string;\n title: string;\n /** Number of tasks directly or transitively blocked by this task. */\n blockedCount: number;\n /** Total estimated hours of blocked downstream work. */\n blockedHours: number;\n /** Severity score (0-100). */\n severity: number;\n}\n\n/**\n * Analyze a task graph and return critical path analysis.\n */\nexport function analyzeCriticalPath(graph: TaskGraph): CriticalPathAnalysis {\n const nodes = Array.from(graph.nodes.values());\n const topoOrder = topologicalSort(graph);\n\n // Build adjacency: blocker → blocked tasks\n const blockedByMap = new Map<string, Set<string>>();\n const blocksMap = new Map<string, Set<string>>();\n\n for (const edge of graph.edges) {\n if (edge.type === 'depends_on') {\n // edge.from depends on edge.to\n if (!blockedByMap.has(edge.from)) blockedByMap.set(edge.from, new Set());\n blockedByMap.get(edge.from)?.add(edge.to);\n\n if (!blocksMap.has(edge.to)) blocksMap.set(edge.to, new Set());\n blocksMap.get(edge.to)?.add(edge.from);\n }\n }\n\n // Find ready tasks (no blockers or all blockers completed)\n const readyTasks: string[] = [];\n const blockedTasks: string[] = [];\n\n for (const node of nodes) {\n if (node.status === 'completed') continue;\n const blockers = blockedByMap.get(node.id);\n if (!blockers || blockers.size === 0) {\n readyTasks.push(node.id);\n } else {\n const allCompleted = Array.from(blockers).every((id) => {\n const n = graph.nodes.get(id);\n return n?.status === 'completed';\n });\n if (allCompleted) {\n readyTasks.push(node.id);\n } else {\n blockedTasks.push(node.id);\n }\n }\n }\n\n // Compute bottleneck scores\n const bottlenecks: BottleneckTask[] = [];\n for (const node of nodes) {\n if (node.status === 'completed') continue;\n const downstream = getTransitiveBlocked(graph, node.id, blocksMap);\n if (downstream.size > 0) {\n const blockedHours = Array.from(downstream).reduce((sum, id) => {\n const n = graph.nodes.get(id);\n return sum + (n?.estimateHours ?? 0);\n }, 0);\n bottlenecks.push({\n taskId: node.id,\n title: node.title,\n blockedCount: downstream.size,\n blockedHours,\n severity: Math.min(100, Math.round((downstream.size / nodes.length) * 100)),\n });\n }\n }\n\n bottlenecks.sort((a, b) => b.severity - a.severity);\n\n // Compute critical path (longest path by estimated hours)\n const criticalPath = computeCriticalPath(graph, topoOrder, blockedByMap);\n\n // Total hours on critical path\n const totalHours = criticalPath.reduce((sum, id) => {\n const n = graph.nodes.get(id);\n return sum + (n?.estimateHours ?? 0);\n }, 0);\n\n // Parallel execution groups\n const parallelGroups = computeParallelGroups(graph, blockedByMap);\n\n // Execution order: topo sort filtered to non-completed tasks\n const executionOrder = topoOrder.filter((id) => {\n const n = graph.nodes.get(id);\n return n && n.status !== 'completed';\n });\n\n return {\n criticalPath,\n totalHours,\n bottlenecks,\n parallelGroups,\n executionOrder,\n readyTasks,\n blockedTasks,\n };\n}\n\n/**\n * Get all tasks transitively blocked by a given task.\n */\nfunction getTransitiveBlocked(\n _graph: TaskGraph,\n taskId: string,\n blocksMap: Map<string, Set<string>>,\n): Set<string> {\n const visited = new Set<string>();\n const queue = [taskId];\n\n while (queue.length > 0) {\n const current = expectDefined(queue.shift());\n const blocked = blocksMap.get(current);\n if (!blocked) continue;\n for (const id of blocked) {\n if (!visited.has(id) && id !== taskId) {\n visited.add(id);\n queue.push(id);\n }\n }\n }\n\n return visited;\n}\n\n/**\n * Compute the critical path (longest path by estimated hours).\n */\nfunction computeCriticalPath(\n graph: TaskGraph,\n _topoOrder: string[],\n blockedByMap: Map<string, Set<string>>,\n): string[] {\n // Use all nodes in the graph, not just topo-reachable ones\n const allIds = Array.from(graph.nodes.keys());\n if (allIds.length === 0) return [];\n\n const dist = new Map<string, number>();\n const prev = new Map<string, string | null>();\n\n // Initialize each node's distance to its own estimate\n for (const id of allIds) {\n dist.set(id, graph.nodes.get(id)?.estimateHours ?? 1);\n prev.set(id, null);\n }\n\n // Build reverse map: blocker → tasks it blocks\n const blocksMap = new Map<string, Set<string>>();\n for (const [taskId, blockers] of blockedByMap) {\n for (const blockerId of blockers) {\n if (!blocksMap.has(blockerId)) blocksMap.set(blockerId, new Set());\n blocksMap.get(blockerId)?.add(taskId);\n }\n }\n\n // Relax edges repeatedly (Bellman-Ford style) since topoOrder may be incomplete.\n // Run N-1 iterations to handle longest path in DAG.\n const n = allIds.length;\n for (let i = 0; i < n - 1; i++) {\n let changed = false;\n for (const id of allIds) {\n const blocked = blocksMap.get(id);\n if (!blocked) continue;\n for (const blockedId of blocked) {\n const candidateDist = (dist.get(id) ?? 0) + (graph.nodes.get(blockedId)?.estimateHours ?? 1);\n if (candidateDist > (dist.get(blockedId) ?? 0)) {\n dist.set(blockedId, candidateDist);\n prev.set(blockedId, id);\n changed = true;\n }\n }\n }\n if (!changed) break;\n }\n\n // Find the node with maximum distance (end of critical path)\n let maxDist = 0;\n let maxId = expectDefined(allIds[0]);\n for (const id of allIds) {\n const d = dist.get(id) ?? 0;\n if (d > maxDist) {\n maxDist = d;\n maxId = id;\n }\n }\n\n // Trace back the critical path\n const path: string[] = [];\n let current: string | null = maxId;\n const visited = new Set<string>();\n while (current && !visited.has(current)) {\n visited.add(current);\n path.unshift(current);\n current = prev.get(current) ?? null;\n }\n\n return path;\n}\n\n/**\n * Compute groups of tasks that can run in parallel.\n * Tasks in the same group have no dependencies on each other.\n */\nfunction computeParallelGroups(\n graph: TaskGraph,\n blockedByMap: Map<string, Set<string>>,\n): string[][] {\n const groups: string[][] = [];\n const assigned = new Set<string>();\n const nodes = Array.from(graph.nodes.values()).filter((n) => n.status !== 'completed');\n\n // Topological levels\n const remaining = new Set(nodes.map((n) => n.id));\n\n while (remaining.size > 0) {\n const group: string[] = [];\n for (const id of remaining) {\n const blockers = blockedByMap.get(id);\n if (!blockers || blockers.size === 0) {\n group.push(id);\n } else {\n const allAssigned = Array.from(blockers).every((b) => assigned.has(b));\n if (allAssigned) {\n group.push(id);\n }\n }\n }\n\n if (group.length === 0) {\n // Circular dependency or all remaining are blocked by non-completed\n // Just take the first remaining\n const first = Array.from(remaining)[0];\n if (first) group.push(first);\n }\n\n for (const id of group) {\n assigned.add(id);\n remaining.delete(id);\n }\n groups.push(group);\n }\n\n return groups;\n}\n","import type { Specification, SpecRequirement } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { assertNever } from '../utils/assert-never.js';\n\nexport interface SpecVersion {\n version: string;\n spec: Specification;\n timestamp: number;\n changeDescription?: string | undefined;\n}\n\nexport interface SpecDiff {\n added: SpecRequirement[];\n removed: SpecRequirement[];\n modified: Array<{\n requirement: SpecRequirement;\n previousVersion: SpecRequirement;\n changes: string[];\n }>;\n summary: string;\n}\n\n/**\n * Track spec versions and compute diffs between versions.\n */\nexport class SpecVersioning {\n private versions = new Map<string, SpecVersion[]>();\n\n /** Record a new version of a spec. */\n recordVersion(spec: Specification, changeDescription?: string): SpecVersion {\n const version: SpecVersion = {\n version: spec.version,\n spec: { ...spec },\n timestamp: Date.now(),\n changeDescription,\n };\n\n const history = this.versions.get(spec.id) ?? [];\n history.push(version);\n this.versions.set(spec.id, history);\n\n return version;\n }\n\n /** Get version history for a spec. */\n getHistory(specId: string): SpecVersion[] {\n return this.versions.get(specId) ?? [];\n }\n\n /** Get a specific version of a spec. */\n getVersion(specId: string, version: string): SpecVersion | undefined {\n const history = this.versions.get(specId) ?? [];\n return history.find((v) => v.version === version);\n }\n\n /** Get the latest version of a spec. */\n getLatest(specId: string): SpecVersion | undefined {\n const history = this.versions.get(specId) ?? [];\n return history[history.length - 1];\n }\n\n /** Compute diff between two versions of a spec. */\n diff(oldSpec: Specification, newSpec: Specification): SpecDiff {\n const oldReqs = new Map(oldSpec.requirements.map((r) => [r.id, r]));\n const newReqs = new Map(newSpec.requirements.map((r) => [r.id, r]));\n\n const added: SpecRequirement[] = [];\n const removed: SpecRequirement[] = [];\n const modified: SpecDiff['modified'] = [];\n\n // Find added and modified\n for (const [id, newReq] of newReqs) {\n const oldReq = oldReqs.get(id);\n if (!oldReq) {\n added.push(newReq);\n } else {\n const changes = this.compareRequirements(oldReq, newReq);\n if (changes.length > 0) {\n modified.push({\n requirement: newReq,\n previousVersion: oldReq,\n changes,\n });\n }\n }\n }\n\n // Find removed\n for (const [id, oldReq] of oldReqs) {\n if (!newReqs.has(id)) {\n removed.push(oldReq);\n }\n }\n\n const parts: string[] = [];\n if (added.length > 0) parts.push(`${added.length} added`);\n if (removed.length > 0) parts.push(`${removed.length} removed`);\n if (modified.length > 0) parts.push(`${modified.length} modified`);\n\n return {\n added,\n removed,\n modified,\n summary: parts.length > 0 ? parts.join(', ') : 'No changes',\n };\n }\n\n /**\n * Update a task graph incrementally based on spec changes.\n * - Added requirements → new tasks\n * - Removed requirements → remove tasks\n * - Modified requirements → update task descriptions\n * Returns the updated graph and list of changes made.\n */\n updateTaskGraph(\n graph: TaskGraph,\n oldSpec: Specification,\n newSpec: Specification,\n ): { graph: TaskGraph; changes: string[] } {\n const specDiff = this.diff(oldSpec, newSpec);\n const changes: string[] = [];\n\n // Map requirement IDs to task nodes\n const reqToTask = new Map<string, TaskNode>();\n for (const node of graph.nodes.values()) {\n if (node.specRequirementId) {\n reqToTask.set(node.specRequirementId, node);\n }\n }\n\n // Remove tasks for removed requirements\n for (const req of specDiff.removed) {\n const task = reqToTask.get(req.id);\n if (task) {\n graph.nodes.delete(task.id);\n graph.edges = graph.edges.filter((e) => e.from !== task.id && e.to !== task.id);\n changes.push(`Removed task: ${task.title}`);\n }\n }\n\n // Update tasks for modified requirements\n for (const mod of specDiff.modified) {\n const task = reqToTask.get(mod.requirement.id);\n if (task) {\n task.title = mod.requirement.description;\n task.description = this.buildTaskDescription(mod.requirement);\n task.priority = mod.requirement.priority;\n task.updatedAt = Date.now();\n changes.push(`Updated task: ${task.title} (${mod.changes.join(', ')})`);\n }\n }\n\n // Add tasks for new requirements\n for (const req of specDiff.added) {\n const now = Date.now();\n const newTask: TaskNode = {\n id: crypto.randomUUID(),\n title: req.description,\n description: this.buildTaskDescription(req),\n type: this.mapReqType(req.type),\n priority: req.priority,\n status: 'pending',\n specRequirementId: req.id,\n tags: [req.type, req.priority],\n createdAt: now,\n updatedAt: now,\n };\n graph.nodes.set(newTask.id, newTask);\n graph.rootNodes.push(newTask.id);\n changes.push(`Added task: ${newTask.title}`);\n }\n\n graph.updatedAt = Date.now();\n return { graph, changes };\n }\n\n private compareRequirements(old: SpecRequirement, current: SpecRequirement): string[] {\n const changes: string[] = [];\n if (old.description !== current.description) changes.push('description');\n if (old.priority !== current.priority) changes.push('priority');\n if (old.type !== current.type) changes.push('type');\n if (JSON.stringify(old.acceptanceCriteria) !== JSON.stringify(current.acceptanceCriteria)) {\n changes.push('acceptance criteria');\n }\n if (JSON.stringify(old.blockedBy) !== JSON.stringify(current.blockedBy)) {\n changes.push('dependencies');\n }\n return changes;\n }\n\n private buildTaskDescription(req: SpecRequirement): string {\n const lines = [req.description, '', `**Type:** ${req.type}`, `**Priority:** ${req.priority}`];\n if (req.acceptanceCriteria.length > 0) {\n lines.push('', '**Acceptance Criteria:**');\n for (const ac of req.acceptanceCriteria) {\n lines.push(`- ${ac}`);\n }\n }\n return lines.join('\\n');\n }\n\n private mapReqType(type: SpecRequirement['type']): TaskNode['type'] {\n switch (type) {\n case 'functional':\n return 'feature';\n case 'non-functional':\n return 'feature';\n case 'security':\n return 'feature';\n case 'performance':\n return 'feature';\n case 'ux':\n return 'feature';\n default:\n return assertNever(type);\n }\n }\n}\n","import type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport type { Specification } from '../types/spec.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { TaskTracker } from './task-tracker.js';\nimport { analyzeCriticalPath } from './critical-path.js';\n\nexport interface AutoExecutorOptions {\n tracker: TaskTracker;\n events: EventBus;\n /** Maximum concurrent tasks. Defaults to 1 (sequential). */\n maxConcurrent?: number | undefined;\n /** Maximum retry attempts for failed tasks. */\n maxRetries?: number | undefined;\n /** Custom task executor function. */\n executeTask: (task: TaskNode, context: TaskExecutionContext) => Promise<TaskExecutionResult>;\n /** Called before each task starts. */\n onTaskStart?: (((task: TaskNode) => void)) | undefined;\n /** Called after each task completes. */\n onTaskComplete?: (task: TaskNode, result: TaskExecutionResult) => void;\n /** Called when a task fails. */\n onTaskFail?: (task: TaskNode, error: Error, retryCount: number) => void;\n /** Called when all tasks are done or no more can execute. */\n onDone?: (((summary: ExecutionSummary) => void)) | undefined;\n}\n\nexport interface TaskExecutionContext {\n /** The spec being implemented. */\n spec: Specification;\n /** The full task graph. */\n graph: TaskGraph;\n /** The current task being executed. */\n task: TaskNode;\n /** Tasks that this task depends on. */\n dependencies: TaskNode[];\n /** Tasks that depend on this task. */\n dependents: TaskNode[];\n /** Retry count for this task (0 = first attempt). */\n retryCount: number;\n}\n\nexport interface TaskExecutionResult {\n success: boolean;\n output?: string | undefined;\n error?: string | undefined;\n /** If true, the task will be retried. */\n retry?: boolean | undefined;\n}\n\nexport interface ExecutionSummary {\n total: number;\n completed: number;\n failed: number;\n skipped: number;\n retried: number;\n duration: number;\n criticalPath: string[];\n}\n\n/**\n * Auto-executor that drives task execution with dependency resolution,\n * retry logic, and critical path awareness.\n */\nexport class AutoExecutor {\n private readonly opts: AutoExecutorOptions;\n private stopped = false;\n private retryMap = new Map<string, number>();\n\n constructor(opts: AutoExecutorOptions) {\n this.opts = opts;\n }\n\n /**\n * Execute all tasks in the graph, respecting dependencies.\n */\n async execute(graph: TaskGraph, spec: Specification): Promise<ExecutionSummary> {\n this.stopped = false;\n this.retryMap.clear();\n const startTime = Date.now();\n\n const critical = analyzeCriticalPath(graph);\n let completed = 0;\n let failed = 0;\n const skipped = 0;\n let retried = 0;\n\n while (!this.stopped) {\n const readyTasks = this.getReadyTasks(graph);\n\n if (readyTasks.length === 0) {\n // Check if all tasks are done\n const allDone = Array.from(graph.nodes.values()).every(\n (n) => n.status === 'completed' || n.status === 'failed',\n );\n if (allDone) break;\n\n // Check for deadlock (all remaining tasks are blocked by failed tasks)\n const hasDeadlock = this.detectDeadlock(graph);\n if (hasDeadlock) break;\n\n break;\n }\n\n // Execute batch\n const batch = readyTasks.slice(0, this.opts.maxConcurrent ?? 1);\n\n const results = await Promise.allSettled(\n batch.map((task) => this.executeTaskWithRetry(task, graph, spec)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n if (!result || !task) continue;\n\n if (result.status === 'fulfilled') {\n const { result: execResult, retries } = result.value;\n if (execResult.success) {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n completed++;\n if (retries > 0) retried++;\n this.opts.onTaskComplete?.(task, execResult);\n } else if (execResult.retry) {\n retried++;\n // Task will be retried on next iteration\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'failed', execResult.error);\n failed++;\n }\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'failed', String(result.reason));\n failed++;\n this.opts.onTaskFail?.(task, result.reason as Error, 0);\n }\n }\n }\n\n const duration = Date.now() - startTime;\n const summary: ExecutionSummary = {\n total: graph.nodes.size,\n completed,\n failed,\n skipped,\n retried,\n duration,\n criticalPath: critical.criticalPath,\n };\n\n this.opts.onDone?.(summary);\n return summary;\n }\n\n /** Stop execution. */\n stop(): void {\n this.stopped = true;\n }\n\n /** Get tasks that are ready to execute (all dependencies completed). */\n private getReadyTasks(graph: TaskGraph): TaskNode[] {\n const ready: TaskNode[] = [];\n\n for (const node of graph.nodes.values()) {\n if (node.status !== 'pending') continue;\n\n // Check if all blockers are completed\n const blockers = graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === node.id)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n\n const allBlockersDone = blockers.every((b) => b.status === 'completed');\n if (allBlockersDone) {\n ready.push(node);\n }\n }\n\n // Sort by priority\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n ready.sort((a, b) => (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4));\n\n return ready;\n }\n\n /** Execute a single task with retry logic. */\n private async executeTaskWithRetry(\n task: TaskNode,\n graph: TaskGraph,\n spec: Specification,\n ): Promise<{ result: TaskExecutionResult; retries: number }> {\n const maxRetries = this.opts.maxRetries ?? 2;\n let retryCount = this.retryMap.get(task.id) ?? 0;\n\n while (retryCount <= maxRetries) {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.opts.onTaskStart?.(task);\n\n const dependencies = this.getTaskDependencies(task.id, graph);\n const dependents = this.getTaskDependents(task.id, graph);\n\n const context: TaskExecutionContext = {\n spec,\n graph,\n task,\n dependencies,\n dependents,\n retryCount,\n };\n\n try {\n const result = await this.opts.executeTask(task, context);\n\n if (result.success) {\n const retriesForTask = this.retryMap.get(task.id) ?? 0;\n this.retryMap.delete(task.id);\n return { result, retries: retriesForTask };\n }\n\n if (result.retry && retryCount < maxRetries) {\n retryCount++;\n this.retryMap.set(task.id, retryCount);\n this.opts.tracker.updateNodeStatus(task.id, 'pending');\n continue;\n }\n\n return { result, retries: retryCount };\n } catch (error) {\n if (retryCount < maxRetries) {\n retryCount++;\n this.retryMap.set(task.id, retryCount);\n this.opts.tracker.updateNodeStatus(task.id, 'pending');\n this.opts.onTaskFail?.(task, error as Error, retryCount);\n continue;\n }\n\n return {\n result: {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n },\n retries: retryCount,\n };\n }\n }\n\n return { result: { success: false, error: 'Max retries exceeded' }, retries: retryCount };\n }\n\n /** Get tasks that this task depends on. */\n private getTaskDependencies(taskId: string, graph: TaskGraph): TaskNode[] {\n return graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === taskId)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n }\n\n /** Get tasks that depend on this task. */\n private getTaskDependents(taskId: string, graph: TaskGraph): TaskNode[] {\n return graph.edges\n .filter((e) => e.type === 'depends_on' && e.to === taskId)\n .map((e) => graph.nodes.get(e.from))\n .filter(Boolean) as TaskNode[];\n }\n\n /** Detect deadlock: all remaining tasks are blocked by failed tasks. */\n private detectDeadlock(graph: TaskGraph): boolean {\n const remaining = Array.from(graph.nodes.values()).filter(\n (n) => n.status === 'pending' || n.status === 'blocked',\n );\n\n if (remaining.length === 0) return false;\n\n return remaining.every((node) => {\n const blockers = graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === node.id)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n\n return blockers.some((b) => b.status === 'failed');\n });\n }\n}\n\n/**\n * Create an auto-executor that works with TaskFlow.\n */\nexport function createAutoExecutor(opts: {\n tracker: TaskTracker;\n events: EventBus;\n executeTask: AutoExecutorOptions['executeTask'];\n maxConcurrent?: number | undefined;\n maxRetries?: number | undefined;\n}): AutoExecutor {\n return new AutoExecutor({\n tracker: opts.tracker,\n events: opts.events,\n executeTask: opts.executeTask,\n maxConcurrent: opts.maxConcurrent,\n maxRetries: opts.maxRetries,\n });\n}\n","/**\n * Cross-provider fallback model extension.\n *\n * Lives in core so EVERY agent surface can reuse it: the CLI leader, the CLI\n * director/host subagent factory, and the runtime light subagent factory (used\n * by standalone SDD runs). It wraps the provider runner and, when the active\n * model 429s / overloads / stream-hangs, rotates through a fallback chain. The\n * chain is recomputed from live config every turn, so changes take effect\n * without a restart; an empty chain makes the wrapper a no-op.\n *\n * Moved here from `@wrongstack/cli` (it only ever depended on core types) so the\n * runtime light factory can wire fallbacks for SDD worker subagents.\n */\nimport type { AgentExtension } from '../extension/extension-points.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { Config, ProviderConfig } from '../types/config.js';\n\nfunction visibleProviderModels(config: Config, providerId: string, providerModels: string[]): string[] {\n const entry = config.providers?.[providerId];\n return entry?.models !== undefined ? [...entry.models] : providerModels;\n}\nimport type { Logger } from '../types/logger.js';\nimport { type Provider, ProviderError, StreamHangError } from '../types/provider.js';\n\nexport interface FallbackModelDeps {\n /** Returns the live config (re-read each turn so `/model` switches are honored). */\n getConfig: () => Config;\n /**\n * Builds a credential-resolved Provider for a provider id (alias-resolved),\n * WITHOUT persisting anything to config/configStore. Supplied by the boot\n * path, which shares this with the `/model` switch logic. May be async — the\n * subagent host resolves a provider's real context window asynchronously.\n */\n buildProvider: (providerId: string) => Provider | Promise<Provider>;\n /**\n * Called after the active model changes (a fallback hop or the primary\n * restore) so the host can refresh the auto-compaction / context-window\n * denominator — important when a fallback crosses to a smaller-window model.\n */\n onModelSwitch?: (providerId: string, modelId: string) => void | Promise<void>;\n events: EventBus;\n /** Optional — warnings about un-buildable fallback providers. */\n logger?: Logger | undefined;\n}\n\ninterface ModelRef {\n provider?: string | undefined;\n model: string;\n}\n\n/** Parse a fallback entry: `model`, `provider/model`, or `provider model`. */\nexport function parseModelRef(ref: string): ModelRef {\n const trimmed = ref.trim();\n const slash = trimmed.indexOf('/');\n if (slash !== -1) {\n // An empty provider (leading slash, e.g. \"/gpt\") means \"use the primary\n // provider\" — collapse to undefined so the `?? cfg.provider` fallback fires.\n return {\n provider: trimmed.slice(0, slash) || undefined,\n model: trimmed.slice(slash + 1).trim(),\n };\n }\n const parts = trimmed.split(/\\s+/);\n if (parts.length >= 2) {\n return { provider: parts[0], model: parts.slice(1).join(' ') };\n }\n return { model: trimmed };\n}\n\nexport function formatModelRef(ref: ModelRef, defaultProvider?: string | undefined): string {\n const provider = ref.provider ?? defaultProvider;\n return provider ? `${provider}/${ref.model}` : ref.model;\n}\n\nexport function normalizeModelRef(ref: string, defaultProvider?: string | undefined): string {\n const parsed = parseModelRef(ref);\n return formatModelRef(parsed, defaultProvider);\n}\n\nexport function fallbackProfileChain(config: Config, profileName: string | undefined): string[] {\n if (!profileName) return [];\n const chain = config.fallbackProfiles?.[profileName];\n return Array.isArray(chain) ? chain.filter((ref) => parseModelRef(ref).model) : [];\n}\n\n/**\n * Check if an error should trigger a fallback. Returns the status for\n * logging, or null if the error doesn't warrant a fallback attempt.\n *\n * Triggers on:\n * - StreamHangError (always — the upstream endpoint stalled mid-response)\n * - HTTP 429 (rate limited)\n * - HTTP 529 (overloaded)\n * - HTTP 5xx (server error)\n * - HTTP 0 / network error (connection failure, DNS failure, etc.)\n */\nfunction shouldFallback(err: unknown): number | null {\n if (err instanceof StreamHangError) {\n // Stream hangs are always worth falling back — the endpoint is\n // likely overloaded or has a routing issue.\n return 599;\n }\n if (!(err instanceof ProviderError)) return null;\n const s = err.status;\n // Network errors (status 0) — connection couldn't be established\n if (s === 0) return s;\n // Rate limits, overload, and server errors\n if (s === 429 || s === 529 || s >= 500) return s;\n return null;\n}\n\n/** A provider is usable as a fallback target when it has a stored key, a key\n * list, or a populated env var. Mirrors `setmodel.providerHasKey`. */\nfunction providerHasKey(entry: ProviderConfig | undefined): boolean {\n if (!entry) return false;\n if (typeof entry.apiKey === 'string' && entry.apiKey.length > 0) return true;\n if (Array.isArray(entry.apiKeys) && entry.apiKeys.some((k) => k?.apiKey)) return true;\n if (Array.isArray(entry.envVars) && entry.envVars.some((v) => !!process.env[v])) return true;\n return false;\n}\n\n/** Hard ceiling on the auto-derived chain so we don't burn through a dozen\n * models on a transient blip. */\nconst SMART_DEFAULT_MAX = 4;\n\n/**\n * Derive a fallback chain from the configured providers when the user has not\n * set an explicit `fallbackModels` list. Picks declared models from every\n * keyed provider — same-provider alternatives first (same key, cheapest\n * failover), then cross-provider — excluding the active leader model. Returns\n * `[]` when nothing usable is configured (e.g. providers with no `models`\n * list), in which case the extension is a no-op.\n */\nexport function smartDefaultFallbackChain(config: Config): string[] {\n const leaderProvider = config.provider;\n const leaderModel = config.model;\n const providers = config.providers ?? {};\n const favoriteSet = new Set(\n (config.favoriteModels ?? []).map((ref) => normalizeModelRef(ref, leaderProvider)),\n );\n const hasFavorites = favoriteSet.size > 0;\n const favoritesOnly = config.favoriteModelsOnly === true;\n const seen = new Set<string>();\n const favoriteRefs: string[] = [];\n const sameProvider: string[] = [];\n const crossProvider: string[] = [];\n\n // Leader provider first so its other models lead the chain.\n const ids = Object.keys(providers).sort((a, b) =>\n a === leaderProvider ? -1 : b === leaderProvider ? 1 : a.localeCompare(b),\n );\n\n for (const id of ids) {\n const entry = providers[id];\n if (!providerHasKey(entry)) continue;\n const models = visibleProviderModels(config, id, entry?.models ?? []);\n for (const model of models) {\n if (id === leaderProvider && model === leaderModel) continue;\n const ref = `${id}/${model}`;\n if (seen.has(ref)) continue;\n seen.add(ref);\n if (favoriteSet.has(ref)) {\n favoriteRefs.push(ref);\n continue;\n }\n if (favoritesOnly && hasFavorites) continue;\n (id === leaderProvider ? sameProvider : crossProvider).push(ref);\n }\n }\n return [...favoriteRefs, ...sameProvider, ...crossProvider].slice(0, SMART_DEFAULT_MAX);\n}\n\n/**\n * The effective fallback chain for a turn: the explicit `fallbackModels` list\n * when non-empty, otherwise the smart default (unless `fallbackAuto` is off).\n */\nexport function effectiveFallbackChain(config: Config): string[] {\n const explicit = config.fallbackModels ?? [];\n const filteredExplicit = explicit.filter((ref) => {\n const parsed = parseModelRef(ref);\n if (!parsed.model) return false;\n const providerId = parsed.provider ?? config.provider;\n const entry = config.providers?.[providerId];\n if (!entry?.models) return true;\n return entry.models.includes(parsed.model);\n });\n if (filteredExplicit.length > 0) return filteredExplicit;\n if (config.fallbackAuto === false) return [];\n return smartDefaultFallbackChain(config);\n}\n\n/**\n * Build the cross-provider fallback extension. Always returns an extension —\n * the effective chain (`effectiveFallbackChain`) is recomputed every turn from\n * the live config, so a chain that is empty at boot but populated later (via\n * `/fallback add` or the smart default kicking in once a key is added) takes\n * effect WITHOUT a restart. An empty chain makes the wrapper a no-op (it just\n * rethrows the original error).\n *\n * Mechanism (see plan): wraps the provider runner. The inner runner already\n * applies the per-model retry policy (backoff, up to 5 tries for 429), so the\n * fallback only engages AFTER the active model's own retries are exhausted.\n * Because the wrapper resolves within a single provider call, it does not\n * consume the agent loop's `recoveryRetries` budget — chains longer than two\n * entries work. `beforeRun` restores the configured primary at the start of\n * every turn, giving Claude's \"retry the primary each user turn\" semantics.\n */\nexport function createFallbackModelExtension(deps: FallbackModelDeps): AgentExtension {\n // True when a prior turn left the live context on a fallback model.\n let dirty = false;\n\n return {\n name: 'fallback-model',\n\n beforeRun: async (ctx) => {\n if (!dirty) return;\n const cfg = deps.getConfig();\n try {\n ctx.provider = await deps.buildProvider(cfg.provider);\n ctx.model = cfg.model;\n await deps.onModelSwitch?.(cfg.provider, cfg.model);\n } catch (err) {\n deps.logger?.warn(\n `fallback-model: could not restore primary \"${cfg.provider}/${cfg.model}\": ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n dirty = false;\n },\n\n wrapProviderRunner: async (ctx, request, inner) => {\n try {\n return await inner(ctx, request);\n } catch (firstErr) {\n let lastErr: unknown = firstErr;\n const cfg = deps.getConfig();\n const chain = effectiveFallbackChain(cfg);\n\n for (const ref of chain) {\n const status = shouldFallback(lastErr);\n if (status === null) break; // not a fallback-worthy error\n\n const parsed = parseModelRef(ref);\n if (!parsed.model) continue;\n const targetProviderId = parsed.provider ?? cfg.provider;\n\n const from = { providerId: ctx.provider.id, model: ctx.model };\n\n let nextProvider: Provider;\n try {\n nextProvider = await deps.buildProvider(targetProviderId);\n } catch (err) {\n deps.logger?.warn(\n `fallback-model: skipping \"${ref}\" — cannot build provider \"${targetProviderId}\": ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n continue;\n }\n\n const providerSwitched = nextProvider.id !== from.providerId;\n ctx.provider = nextProvider;\n ctx.model = parsed.model;\n request.model = parsed.model;\n dirty = true;\n await deps.onModelSwitch?.(targetProviderId, parsed.model);\n\n deps.events.emit('provider.fallback', {\n sessionId: ctx.session?.id,\n from,\n to: { providerId: nextProvider.id, model: parsed.model },\n status,\n providerSwitched,\n });\n\n try {\n return await inner(ctx, request);\n } catch (err) {\n lastErr = err;\n }\n }\n\n throw lastErr;\n }\n },\n };\n}\n","// SddSupervisor — a decision agent over an SDD parallel run.\n//\n// When a task has exhausted its retries and is about to go terminal, the\n// SddParallelRun consults `superviseFailure` (see SddParallelRunOptions). This\n// supervisor answers that consult by asking a BrainArbiter (policy → LLM →\n// human, reused from the coordination layer) whether to retry, reassign to a\n// different model, split the task into sub-tasks, or give up. The goal is the\n// user's: a run should \"decide\" rather than dead-end — never silently get stuck.\n//\n// Safe by default: with the conservative DefaultBrainArbiter (no LLM) the\n// `fallback: 'continue'` policy resolves to a plain retry, so wiring a supervisor\n// never makes a run worse — it only adds intelligence when an LLM brain is wired.\n\nimport type { BrainArbiter } from '../coordination/brain.js';\nimport { parseModelRef } from '../core/fallback-model.js';\nimport type { TaskNode } from '../types/task-graph.js';\nimport type { SddSubtaskSpec, SddSupervisorVerdict } from './sdd-parallel-run.js';\n\nexport interface SddSupervisorOptions {\n /** Decision authority (policy/LLM/human). Reuse the session's TOKENS.BrainArbiter. */\n brain: BrainArbiter;\n /**\n * Models to rotate through on a `reassign` verdict (e.g. the run's fallback\n * chain). Omit to drop the reassign option entirely.\n */\n reassignModels?: string[] | undefined;\n /**\n * Optional sub-task generator for a `split` verdict — typically an LLM call\n * that decomposes the failing task into smaller pieces. Omit to drop the split\n * option. Returning an empty array degrades the split into a retry.\n */\n generateSubtasks?:\n | ((info: { task: TaskNode; error: string }) => Promise<SddSubtaskSpec[]>)\n | undefined;\n /**\n * Let the tiered brain's LLM layer actually pick the verdict.\n *\n * Default (false) requests `fallback: 'continue'`, which the policy layer\n * answers immediately (a bounded retry) — the LLM never runs, so `reassign`/\n * `split` can't be chosen. Set true to request `fallback: 'ask_human'`, which\n * makes the policy escalate so the autonomous (LLM) layer decides.\n *\n * ONLY enable this when the supplied `brain` will NOT block on a human prompt\n * for an unresolved decision (i.e. it has an autonomous layer and is NOT\n * wrapped in `HumanEscalatingBrainArbiter`). When the LLM can't decide (no\n * autonomous layer / over the risk ceiling / LLM down) the brain returns\n * `ask_human`, which the supervisor degrades to a **bounded retry** (never a\n * block, never a dead-end). A human-escalating brain would instead block\n * inside `decide()` and wedge the run — keep this false there.\n */\n requestLlmVerdict?: boolean | undefined;\n}\n\nexport class SddSupervisor {\n constructor(private readonly opts: SddSupervisorOptions) {}\n\n /**\n * Bind this as `SddParallelRunOptions.superviseFailure`. Returns a verdict the\n * run applies, or `undefined`/`{action:'fail'}` to let the task terminal-fail.\n */\n readonly superviseFailure = async (info: {\n task: TaskNode;\n error: string;\n attempts: number;\n }): Promise<SddSupervisorVerdict | undefined> => {\n const { task, error, attempts } = info;\n const canReassign = (this.opts.reassignModels?.length ?? 0) > 0;\n const canSplit = Boolean(this.opts.generateSubtasks);\n\n const decision = await this.opts.brain.decide({\n id: `sdd-supervisor-${task.id}-${attempts}`,\n source: 'system',\n question: `SDD task \"${task.title}\" exhausted its retries. How should the run proceed?`,\n context: `Error: ${error}\\nSupervisor rescues already used: ${attempts}`,\n options: [\n { id: 'retry', label: 'Retry the task as-is', recommended: true },\n ...(canReassign ? [{ id: 'reassign', label: 'Reassign to a different model' }] : []),\n ...(canSplit ? [{ id: 'split', label: 'Split into smaller sub-tasks' }] : []),\n { id: 'fail', label: 'Give up and mark the task failed' },\n ],\n // Higher risk once we've already rescued it once — pushes a wired LLM/human\n // toward a decisive verdict instead of looping retries.\n risk: attempts >= 1 ? 'high' : 'medium',\n // `continue` → policy answers in place (bounded retry, LLM never runs).\n // `ask_human` → policy escalates so the autonomous LLM layer can actually\n // pick reassign/split (see requestLlmVerdict's safety contract).\n fallback: this.opts.requestLlmVerdict ? 'ask_human' : 'continue',\n });\n\n // A hard deny is a decisive \"give up\" → terminal fail. An unresolved\n // escalation (`ask_human`: the LLM declined / was unavailable / over the\n // ceiling) degrades to a bounded retry so the run keeps moving rather than\n // dead-ending — the never-stuck invariant. (A human-escalating brain would\n // have blocked inside decide() already; requestLlmVerdict forbids that.)\n if (decision.type === 'deny') return { action: 'fail' };\n if (decision.type !== 'answer') return { action: 'retry' };\n // DefaultBrainArbiter's 'continue' answer carries no optionId → retry.\n const choice = decision.optionId ?? 'retry';\n\n if (choice === 'fail') return { action: 'fail' };\n if (choice === 'reassign' && canReassign) {\n const models = this.opts.reassignModels as string[];\n // Rotate through the chain by rescue count; a `provider/model` entry sets\n // both fields so the worker dispatches on the right provider (a bare model\n // keeps the task's current provider).\n const ref = models[attempts % models.length];\n const parsed = ref ? parseModelRef(ref) : undefined;\n return { action: 'reassign', model: parsed?.model, provider: parsed?.provider };\n }\n if (choice === 'split' && this.opts.generateSubtasks) {\n const subtasks = await this.opts\n .generateSubtasks({ task, error })\n .catch(() => [] as SddSubtaskSpec[]);\n return subtasks.length ? { action: 'split', subtasks } : { action: 'retry' };\n }\n return { action: 'retry' };\n };\n}\n","// makeCommandVerifier — the shared completion-gate verifier for an SDD parallel\n// run. Both surfaces that start a run (the CLI `/sdd parallel` handler and the\n// standalone WebUI wizard) need an identical `verifyTask`: when a task declares\n// `metadata.verificationCommand`, run it in the task's worktree cwd and only let\n// the task complete on exit 0. No command → no-op. Bounded by a timeout so a\n// hung verifier can't wedge the run.\n//\n// core may use node:child_process directly — it already does for git detection.\n\nimport { spawn } from 'node:child_process';\nimport type { TaskNode } from '../types/task-graph.js';\nimport type { TaskResult } from '../types/multi-agent.js';\n\nexport interface CommandVerifierOptions {\n /** Metadata key holding the shell command to run. Default 'verificationCommand'. */\n metadataKey?: string;\n /** Kill + fail the verification after this many ms. Default 180_000 (3 min). */\n timeoutMs?: number;\n}\n\n/**\n * Build a `verifyTask` closure (shape matches {@link SddParallelRunOptions.verifyTask}).\n * Returns `{ ok: true }` immediately when the task carries no verification command,\n * otherwise spawns the command in `cwd` (shell, output discarded) and resolves\n * `{ ok: false, reason }` on non-zero exit, spawn error, or timeout.\n */\nexport function makeCommandVerifier(options: CommandVerifierOptions = {}) {\n const metadataKey = options.metadataKey ?? 'verificationCommand';\n const timeoutMs = options.timeoutMs ?? 180_000;\n\n return async function verifyTask(info: {\n task: TaskNode;\n result: TaskResult;\n cwd: string;\n }): Promise<{ ok: boolean; reason?: string }> {\n const cmd = info.task.metadata?.[metadataKey];\n if (typeof cmd !== 'string' || !cmd.trim()) return { ok: true };\n\n return await new Promise((resolve) => {\n // Parse the command string through an explicit shell invocation rather than\n // spawn(..., { shell: true }), which lets Node interpolate the whole string\n // and exposes any metacharacters (; && | $() etc.) as injection vectors\n // in the command itself. sh -c \"cmd\" / cmd /s /c \"cmd\" passes the full string\n // to the shell as a single positional argument — the shell interprets it, not Node.\n const isWindows = process.platform === 'win32';\n const [shell, ...shellArgs] = isWindows\n ? ['cmd', '/d', '/c'] satisfies [string, ...string[]]\n : ['sh', '-c'] satisfies [string, ...string[]];\n const child = spawn(shell, [...shellArgs, cmd], {\n cwd: info.cwd,\n shell: false,\n windowsHide: true,\n stdio: 'ignore',\n });\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill();\n resolve({ ok: false, reason: `verification timed out: ${cmd}` });\n }, timeoutMs);\n child.on('exit', (code) => {\n clearTimeout(timer);\n // Don't overwrite the timeout reason once the timer has fired.\n if (timedOut) return;\n resolve(\n code === 0 ? { ok: true } : { ok: false, reason: `verification failed (exit ${code}): ${cmd}` },\n );\n });\n child.on('error', (err) => {\n clearTimeout(timer);\n // Don't overwrite the timeout reason once the timer has fired.\n if (timedOut) return;\n resolve({ ok: false, reason: `verification spawn error: ${String(err)}` });\n });\n });\n };\n}\n","import { readFileSync, statSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function readBundledInstructionText(relativePath: string): string {\n for (const root of instructionRootCandidates()) {\n try {\n return readFileSync(path.join(root, relativePath), 'utf8').trimEnd();\n } catch {\n // try next candidate\n }\n }\n return '';\n}\n\nexport function renderInstructionTemplate(\n template: string,\n values: Record<string, string>,\n): string {\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_.-]+)\\s*\\}\\}/g, (match, key: string) =>\n Object.prototype.hasOwnProperty.call(values, key) ? values[key] ?? '' : match,\n );\n}\n\nfunction instructionRootCandidates(): string[] {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, '../../instructions'),\n path.resolve(here, '../instructions'),\n path.resolve(here, 'instructions'),\n ];\n return candidates.sort((a, b) => Number(!isDirectory(a)) - Number(!isDirectory(b)));\n}\n\nfunction isDirectory(candidate: string): boolean {\n try {\n return statSync(candidate).isDirectory();\n } catch {\n return false;\n }\n}\n","// makeLlmSubtaskGenerator — the LLM auto-split backing for the SDD supervisor.\n//\n// When the supervisor's brain returns a `split` verdict for a retry-exhausted\n// task, it calls `generateSubtasks(task, error)` to decompose the failing task\n// into smaller pieces. This helper produces that closure from a single `run`\n// callback (one isolated LLM turn → text), so core stays free of agent-spawning\n// coupling: each surface supplies the runner via its own subagent factory (the\n// same isolated-turn pattern as the interview driver).\n//\n// Safety: the result is heavily validated and bounded. A leaf can only be split\n// into ≥2 well-formed sub-tasks; anything else (parse failure, 0/1 items, junk)\n// returns [] and the supervisor degrades the split into a bounded retry. The\n// per-task `maxSupervisorEscalations` guard already caps how often this runs, so\n// recursive splitting can't run away.\n\nimport type { TaskNode, TaskPriority, TaskType } from '../types/task-graph.js';\nimport {\n readBundledInstructionText,\n renderInstructionTemplate,\n} from '../utils/instruction-file.js';\nimport type { SddSubtaskSpec } from './sdd-parallel-run.js';\n\nconst TASK_TYPES = new Set<TaskType>(['feature', 'bugfix', 'refactor', 'docs', 'test', 'chore']);\nconst PRIORITIES = new Set<TaskPriority>(['critical', 'high', 'medium', 'low']);\n\nexport interface SubtaskGeneratorOptions {\n /** Runs one self-contained, isolated LLM turn and resolves its final text. */\n run: (prompt: string) => Promise<string>;\n /** Minimum well-formed sub-tasks required to accept a split. Default 2. */\n minSubtasks?: number;\n /** Maximum sub-tasks kept (excess is dropped). Default 4. */\n maxSubtasks?: number;\n}\n\n/** Extract a JSON array from model output (```json fence or first bare `[...]`). */\nfunction extractJsonArray(text: string): string | null {\n const fence = text.match(/```(?:json)?\\s*(\\[[\\s\\S]*?\\])\\s*```/);\n if (fence?.[1]) return fence[1].trim();\n const bare = text.match(/(\\[[\\s\\S]*\\])/);\n if (bare?.[1]) {\n try {\n if (Array.isArray(JSON.parse(bare[1]))) return bare[1];\n } catch {\n // not valid JSON — fall through\n }\n }\n return null;\n}\n\nfunction buildPrompt(task: TaskNode, error: string, min: number, max: number): string {\n return renderInstructionTemplate(readBundledInstructionText('sdd/decompose-task.md'), {\n minSubtasks: String(min),\n maxSubtasks: String(max),\n title: task.title,\n description: task.description,\n error: error || '(none recorded)',\n });\n}\n\n/**\n * Build a `SddSupervisorOptions.generateSubtasks` closure backed by an LLM turn.\n * Returns [] on any failure (parse error, too few valid items, runner throw), so\n * the supervisor safely degrades a `split` verdict into a retry.\n */\nexport function makeLlmSubtaskGenerator(opts: SubtaskGeneratorOptions) {\n const min = Math.max(2, opts.minSubtasks ?? 2);\n const max = Math.max(min, opts.maxSubtasks ?? 4);\n\n return async function generateSubtasks(info: {\n task: TaskNode;\n error: string;\n }): Promise<SddSubtaskSpec[]> {\n let text: string;\n try {\n text = await opts.run(buildPrompt(info.task, info.error, min, max));\n } catch {\n return [];\n }\n\n const json = extractJsonArray(text ?? '');\n if (!json) return [];\n\n let raw: unknown;\n try {\n raw = JSON.parse(json);\n } catch {\n return [];\n }\n if (!Array.isArray(raw)) return [];\n\n const specs: SddSubtaskSpec[] = [];\n for (const item of raw) {\n if (!item || typeof item !== 'object') continue;\n const r = item as Record<string, unknown>;\n const title = typeof r['title'] === 'string' ? r['title'].trim() : '';\n const description = typeof r['description'] === 'string' ? r['description'].trim() : '';\n if (!title || !description) continue;\n const type = TASK_TYPES.has(r['type'] as TaskType) ? (r['type'] as TaskType) : undefined;\n const priority = PRIORITIES.has(r['priority'] as TaskPriority)\n ? (r['priority'] as TaskPriority)\n : undefined;\n specs.push({ title, description, type, priority });\n if (specs.length >= max) break;\n }\n\n // A split must yield at least `min` genuinely smaller pieces — otherwise it's\n // not a decomposition and we let the supervisor retry instead.\n return specs.length >= min ? specs : [];\n };\n}\n","// makePreferSideConflictResolver — a conservative, opt-in merge-conflict resolver\n// for an SDD parallel run's worktree integration.\n//\n// Wired as `SddParallelRunOptions.conflictResolver`, it is consulted when a\n// completed task's worktree can't squash-merge cleanly. It rewrites each\n// conflicted file by keeping ONE side of every conflict hunk:\n// • 'incoming' — the worktree's changes (theirs); good for generated artefacts\n// a worker is expected to regenerate wholesale.\n// • 'base' — the already-merged base (ours); discards the worktree's edit.\n// The WorktreeManager re-stages and REJECTS the resolution if any conflict marker\n// survives (`git diff --cached --check`), so a malformed rewrite degrades safely\n// to the conservative retry-on-fresh-base path rather than corrupting the base.\n//\n// This is intentionally blunt (no semantic merge). It is OFF by default — callers\n// opt in explicitly — because auto-picking a side can silently drop work.\n\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join, isAbsolute } from 'node:path';\nimport type { TaskNode } from '../types/task-graph.js';\nimport {\n readBundledInstructionText,\n renderInstructionTemplate,\n} from '../utils/instruction-file.js';\n\nexport type ConflictSide = 'incoming' | 'base';\n\nconst START = '<<<<<<<';\nconst BASE = '|||||||';\nconst SEP = '=======';\nconst END = '>>>>>>>';\n\n/**\n * Resolve every standard git conflict hunk in `text` by keeping `side`. Handles\n * both 2-way (`<<<<<<< / ======= / >>>>>>>`) and diff3 (`||||||| base`) markers.\n * Returns the rewritten text (markers removed).\n */\nexport function resolveConflictText(text: string, side: ConflictSide): string {\n const out: string[] = [];\n // 'normal' | 'ours' | 'base' | 'theirs'\n let state: 'normal' | 'ours' | 'base' | 'theirs' = 'normal';\n for (const line of text.split('\\n')) {\n const marker = line.slice(0, 7);\n if (state === 'normal' && marker === START) {\n state = 'ours';\n continue;\n }\n if (state !== 'normal' && marker === BASE) {\n state = 'base';\n continue;\n }\n if (state !== 'normal' && marker === SEP) {\n state = 'theirs';\n continue;\n }\n if (state !== 'normal' && marker === END) {\n state = 'normal';\n continue;\n }\n if (state === 'normal') out.push(line);\n else if (state === 'ours' && side === 'base') out.push(line);\n else if (state === 'theirs' && side === 'incoming') out.push(line);\n // 'base' section + the non-selected side are dropped.\n }\n return out.join('\\n');\n}\n\n/** True when `text` still contains a git conflict marker line. */\nexport function hasConflictMarkers(text: string): boolean {\n return text.split('\\n').some((l) => {\n const m = l.slice(0, 7);\n return m === START || m === SEP || m === END || m === BASE;\n });\n}\n\n/**\n * Build a `conflictResolver` that keeps `side` of every hunk in each conflicted\n * file. Returns false (abort → conservative fail) if any file can't be read,\n * written, or still has markers after the rewrite.\n */\nexport function makePreferSideConflictResolver(side: ConflictSide) {\n return async function conflictResolver(info: {\n task: TaskNode;\n conflictFiles: string[];\n cwd: string;\n }): Promise<boolean> {\n if (info.conflictFiles.length === 0) return false;\n for (const rel of info.conflictFiles) {\n const abs = isAbsolute(rel) ? rel : join(info.cwd, rel);\n let content: string;\n try {\n content = await readFile(abs, 'utf8');\n } catch {\n return false; // can't read → don't risk a partial resolution\n }\n const resolved = resolveConflictText(content, side);\n if (hasConflictMarkers(resolved)) return false; // refuse a half-resolved file\n try {\n await writeFile(abs, resolved, 'utf8');\n } catch {\n return false;\n }\n }\n return true;\n };\n}\n\nexport interface LlmConflictResolverOptions {\n /** Runs one self-contained, isolated LLM turn and resolves its final text. */\n run: (prompt: string) => Promise<string>;\n /**\n * Reject a resolution that shrinks the file below this fraction of its original\n * non-marker line count — a crude guard against the model dropping content.\n * Default 0.5.\n */\n minRetainedFraction?: number;\n}\n\n/** Strip a single surrounding ``` code fence (any/no language) if present. */\nfunction unfence(text: string): string {\n const m = text.match(/^[\\s\\S]*?```[^\\n]*\\n([\\s\\S]*?)\\n```[\\s\\S]*$/);\n return m?.[1] !== undefined ? m[1] : text.trim();\n}\n\n/** Original line count ignoring conflict-marker lines (the resolution baseline). */\nfunction nonMarkerLineCount(text: string): number {\n return text.split('\\n').filter((l) => {\n const m = l.slice(0, 7);\n return m !== START && m !== SEP && m !== END && m !== BASE;\n }).length;\n}\n\n/**\n * Build an LLM-backed `conflictResolver`: for each conflicted file it asks the\n * model (via one isolated `run` turn) to produce the fully resolved file and\n * writes it back. Heavily guarded — returns false (→ conservative abort/retry)\n * if the model leaves a marker, returns junk, or drops too much content. The\n * WorktreeManager STILL rejects any surviving marker, and (when a `verifyTask`\n * is configured) the run re-verifies the integrated base and reverts a\n * regression — so a bad LLM merge can never silently stick. OFF by default.\n */\nexport function makeLlmConflictResolver(opts: LlmConflictResolverOptions) {\n const minFraction = opts.minRetainedFraction ?? 0.5;\n\n return async function conflictResolver(info: {\n task: TaskNode;\n conflictFiles: string[];\n cwd: string;\n }): Promise<boolean> {\n if (info.conflictFiles.length === 0) return false;\n for (const rel of info.conflictFiles) {\n const abs = isAbsolute(rel) ? rel : join(info.cwd, rel);\n let content: string;\n try {\n content = await readFile(abs, 'utf8');\n } catch {\n return false;\n }\n if (!hasConflictMarkers(content)) continue; // already clean — nothing to do\n\n const prompt = renderInstructionTemplate(\n readBundledInstructionText('sdd/merge-conflict-resolver.md'),\n {\n file: rel,\n content,\n },\n );\n\n let out: string;\n try {\n out = await opts.run(prompt);\n } catch {\n return false;\n }\n const resolved = unfence(out ?? '');\n if (!resolved.trim() || hasConflictMarkers(resolved)) return false;\n // Content-drop guard: a resolution far smaller than the original almost\n // certainly lost real work — abort rather than write it.\n if (resolved.split('\\n').length < Math.floor(nonMarkerLineCount(content) * minFraction)) {\n return false;\n }\n try {\n await writeFile(abs, resolved, 'utf8');\n } catch {\n return false;\n }\n }\n return true;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/assert-never.ts","../../src/utils/atomic-write.ts","../../src/utils/child-env.ts","../../src/utils/error.ts","../../src/utils/expect-defined.ts","../../src/utils/string.ts","../../src/types/errors.ts","../../src/sdd/spec-parser.ts","../../src/sdd/task-generator.ts","../../src/types/task-graph.ts","../../src/sdd/task-tracker.ts","../../src/sdd/task-flow.ts","../../src/sdd/spec-store.ts","../../src/sdd/task-graph-store.ts","../../src/sdd/board-types.ts","../../src/sdd/sdd-board-store.ts","../../src/sdd/sdd-board-projector.ts","../../src/sdd/sdd-run-registry.ts","../../src/sdd/spec-builder.ts","../../src/sdd/sdd-interview-driver.ts","../../src/sdd/sdd-parallel-run.ts","../../src/coordination/agent-subagent-runner.ts","../../src/coordination/subagent-budget.ts","../../src/types/provider.ts","../../src/coordination/coordinator/error-classifier.ts","../../src/coordination/agents/types.ts","../../src/coordination/agents/agent-prompts.ts","../../src/coordination/agents/phase1-discovery.ts","../../src/coordination/agents/phase2-planning.ts","../../src/coordination/agents/phase3-build.ts","../../src/coordination/agents/phase4-verify.ts","../../src/coordination/agents/phase5-review.ts","../../src/coordination/agents/phase6-domain.ts","../../src/coordination/agents/phase7-knowledge.ts","../../src/coordination/agents/phase8-delivery.ts","../../src/coordination/agents/phase9-meta.ts","../../src/coordination/agents/index.ts","../../src/coordination/fleet.ts","../../src/coordination/subagent-nicknames.ts","../../src/coordination/multi-agent-coordinator.ts","../../src/sdd/sdd-task-decomposer.ts","../../src/sdd/start-sdd-run.ts","../../src/worktree/worktree-manager.ts","../../src/sdd/sdd-lifecycle.ts","../../src/sdd/spec-templates.ts","../../src/sdd/task-visualizer.ts","../../src/sdd/critical-path.ts","../../src/sdd/spec-versioning.ts","../../src/sdd/auto-executor.ts","../../src/core/fallback-model.ts","../../src/sdd/sdd-supervisor.ts","../../src/sdd/verify-task.ts","../../src/utils/instruction-file.ts","../../src/sdd/decompose-task.ts","../../src/sdd/conflict-resolver.ts"],"names":["path","stat","resolve","path2","fsp","path3","fsp2","path4","fsp3","atomicWrite","first","baseMessage","randomUUID","PreemptState","join","mkdir","rm","fsp4","r","spawn","readFileSync","path6","fileURLToPath","isDirectory","statSync","TASK_TYPES","readFile","writeFile"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Exhaustiveness check for discriminated union switches.\n * Place in the `default` branch of a switch over a union type\n * to get a compile-time error when a new variant is added.\n *\n * @example\n * switch (block.type) {\n * case 'text': return renderText(block);\n * case 'tool_use': return renderToolUse(block);\n * default: return assertNever(block);\n * }\n */\nexport function assertNever(x: never, message?: string): never {\n const err = new Error(\n message ?? `Unhandled case: ${JSON.stringify(x)}`,\n );\n err.name = 'AssertNeverError';\n throw err;\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { FsError } from '../types/errors.js';\n\nexport interface AtomicWriteOptions {\n mode?: number | undefined;\n encoding?: BufferEncoding | undefined;\n}\n\nexport interface FileLockOptions {\n timeoutMs?: number | undefined;\n staleMs?: number | undefined;\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 // P3 #20 (before-release.md): on Windows, fs.rename (MoveFileExW) does\n // not preserve Unix permission bits — the chmod above applies to the tmp\n // file, but the rename may reset the destination's mode to the Windows\n // default. Re-apply the mode after rename on win32 so an edited file\n // keeps its executable bit (or any non-default permission). On POSIX,\n // rename preserves metadata so this is a no-op (chmod is idempotent and\n // cheap), but we gate it on win32 to avoid the extra stat+chmod on the\n // common path.\n if (mode !== undefined && process.platform === 'win32') {\n try {\n await fs.chmod(targetPath, mode);\n } catch {\n // Best-effort: a transient EPERM (antivirus lock) should not fail\n // the write — the content is already on disk.\n }\n }\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\nexport async function withFileLock<T>(\n targetPath: string,\n fn: () => Promise<T>,\n opts: FileLockOptions = {},\n): Promise<T> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const lockPath = path.join(dir, `.${path.basename(targetPath)}.lock`);\n const timeoutMs = opts.timeoutMs ?? 5_000;\n const staleMs = opts.staleMs ?? 30_000;\n const started = Date.now();\n let handle: fs.FileHandle | undefined;\n\n for (;;) {\n try {\n handle = await fs.open(lockPath, 'wx');\n await handle.writeFile(`${process.pid}:${Date.now()}`);\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n // ENOENT means the directory was deleted (e.g. by concurrent cleanup).\n // Recreate it and retry acquiring the lock.\n if (code === 'ENOENT') {\n await fs.mkdir(dir, { recursive: true });\n continue;\n }\n if (code !== 'EEXIST') throw err;\n try {\n const stat = await fs.stat(lockPath);\n if (Date.now() - stat.mtimeMs > staleMs) {\n await fs.unlink(lockPath);\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() - started >= timeoutMs) {\n throw new FsError({\n message: `Timed out waiting for file lock: ${targetPath}`,\n code: 'FS_ATOMIC_WRITE_FAILED',\n path: targetPath,\n context: { timeoutMs },\n });\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n\n try {\n return await fn();\n } finally {\n try {\n await handle?.close();\n } catch {\n // ignore\n }\n try {\n await fs.unlink(lockPath);\n } catch {\n // ignore\n }\n }\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","/**\n * Build a sanitized child-process environment.\n *\n * The bash/exec tools and MCP stdio transports execute LLM-generated or\n * configured commands. The parent process carries provider API keys\n * (ANTHROPIC_API_KEY, OPENAI_API_KEY, ...), VCS tokens (GITHUB_TOKEN),\n * and cloud credentials. Forwarding those to a child is an exfiltration\n * vector even with `permission: 'confirm'` — a compromised MCP server\n * or a cleverly composed shell pipeline can leak secrets.\n *\n * Strategy: copy a small, explicit allowlist of variables that real builds\n * need, then copy anything else that does NOT look secret-bearing. This\n * preserves user-friendly behavior (locale, terminal, npm config) while\n * blocking the obvious leak channels. Two value-side guards back up the\n * name-based filter:\n * - any value carrying an embedded URI credential (`scheme://user:pass@host`,\n * e.g. `DATABASE_URL`/`REDIS_URL`/`*_DSN`) is dropped (WS-01);\n * - `NODE_OPTIONS` is forwarded but with module-preload directives\n * (`--require`/`--import`/`--loader`) stripped so a parent-set value can't\n * inject code into node children (WS-02).\n *\n * Override with `WRONGSTACK_CHILD_ENV_PASSTHROUGH=1` to forward the full\n * parent environment unchanged (opt-in for advanced users who understand\n * the risk).\n */\n\nconst ALLOWED_KEYS = new Set<string>([\n 'PATH',\n 'HOME',\n 'USER',\n 'USERNAME',\n 'LOGNAME',\n 'SHELL',\n 'LANG',\n 'LC_ALL',\n 'LC_CTYPE',\n 'TERM',\n 'TZ',\n 'TMPDIR',\n 'TEMP',\n 'TMP',\n 'PWD',\n 'OLDPWD',\n 'COMSPEC',\n 'SYSTEMROOT',\n 'SYSTEMDRIVE',\n 'WINDIR',\n 'PROGRAMFILES',\n 'PROGRAMFILES(X86)',\n 'PROGRAMDATA',\n 'APPDATA',\n 'LOCALAPPDATA',\n 'USERPROFILE',\n 'PUBLIC',\n 'PATHEXT',\n]);\n\n// Substring match against env-var names (case-insensitive). Bias toward\n// false-positives — a missing var is recoverable, an exfiltrated key is not.\n// Only consulted for vars NOT on the curated allowlist; PWD/PASSWD-style\n// false positives there are avoided by checking allowlist first.\nconst SECRET_NAME_PARTS = [\n 'TOKEN',\n 'SECRET',\n 'PASSWORD',\n 'PASSWD',\n 'AUTH',\n 'CRED',\n 'BEARER',\n 'COOKIE',\n 'PRIVATE',\n];\n\nfunction looksSecret(name: string): boolean {\n const upper = name.toUpperCase();\n for (const p of SECRET_NAME_PARTS) {\n if (upper.includes(p)) return true;\n }\n // KEY is tricky — PUBLIC_KEY is fine to forward but most _KEY vars are\n // secrets. Require word boundary so KEYBOARD_LAYOUT etc. are not flagged.\n if (/(?:^|_)KEY(?:$|_|S$)/i.test(upper)) return true;\n if (/API[_-]?KEY/i.test(upper)) return true;\n if (/ACCESS[_-]?KEY/i.test(upper)) return true;\n if (/SESSION[_-]?ID/i.test(upper) === false && /SESSION/i.test(upper)) {\n // SESSION_ID is metadata (we set our own); other SESSION_* often holds\n // session cookies. Be conservative.\n return true;\n }\n return false;\n}\n\n/**\n * Value-side secret detection (WS-01). The name-based `looksSecret` filter\n * misses connection-string variables whose NAME is innocuous but whose VALUE\n * embeds a password — e.g. `DATABASE_URL=postgres://user:pass@host`,\n * `REDIS_URL=redis://:pass@host`, `MONGO_URI`, `AMQP_URL`, `*_DSN`. Forwarding\n * these to a child (bash/exec/MCP server) leaks the embedded credential.\n *\n * Matches a URI userinfo component that contains a password, i.e.\n * `scheme://[user]:<password>@host`. Deliberately precise: a credential-free\n * URL (`https://api.example.com`, `https://user@host` with no password) is NOT\n * matched, so non-secret `*_URL` knobs (registries, endpoints) still forward.\n */\nfunction valueHasEmbeddedCredential(value: string): boolean {\n // scheme:// then optional user, a ':' , a non-empty password, then '@'.\n // Userinfo chars stop at '/', whitespace, ':' (separator) and '@'.\n return /\\b[a-z][a-z0-9+.-]*:\\/\\/[^/\\s:@]*:[^/\\s@]+@/i.test(value);\n}\n\n/**\n * Code-injection directives that turn `NODE_OPTIONS` into an RCE channel by\n * preloading an arbitrary module into every node child process (WS-02).\n */\nconst NODE_OPTIONS_INJECTION_FLAG =\n /^(?:--require|-r|--import|--loader|--experimental-loader)$/;\nconst NODE_OPTIONS_INJECTION_FLAG_EQ =\n /^(?:--require|-r|--import|--loader|--experimental-loader)=/;\n\n/**\n * Strip module-preload directives from a `NODE_OPTIONS` value while preserving\n * benign flags (`--no-warnings`, `--max-old-space-size=…`, etc.). Handles both\n * the `--require=./x.js` and space-separated `--require ./x.js` forms. Returns\n * the sanitized string (possibly empty).\n */\nexport function sanitizeNodeOptions(value: string): string {\n const tokens = value.split(/\\s+/).filter(Boolean);\n const kept: string[] = [];\n for (let i = 0; i < tokens.length; i++) {\n const tok = tokens[i] as string;\n if (NODE_OPTIONS_INJECTION_FLAG_EQ.test(tok)) continue; // --require=./x\n if (NODE_OPTIONS_INJECTION_FLAG.test(tok)) {\n i++; // also drop the following path token (--require ./x)\n continue;\n }\n kept.push(tok);\n }\n return kept.join(' ');\n}\n\nexport interface BuildChildEnvOptions {\n /** Session ID to inject as WRONGSTACK_SESSION_ID. */\n sessionId?: string | undefined;\n /** Additional env vars to merge (takes priority over filtered parent env). */\n extra?: NodeJS.ProcessEnv | undefined;\n}\n\n/**\n * Build a filtered child-process environment suitable for bash, exec, and\n * MCP server subprocesses. Strips API keys, tokens, and other credentials\n * while preserving system/tooling variables.\n */\nexport function buildChildEnv(optsOrSessionId?: BuildChildEnvOptions | string): NodeJS.ProcessEnv {\n const opts: BuildChildEnvOptions =\n typeof optsOrSessionId === 'string'\n ? { sessionId: optsOrSessionId }\n : (optsOrSessionId ?? {});\n\n // WRONGSTACK_CHILD_ENV_PASSTHROUGH may NOT be set via config file.\n // It is a privileged override that opt-outs the entire credential filter\n // and must only be set by the operator's shell environment (real env var,\n // not something a config file injects into process.env). Config-file\n // sources do NOT go through process.env — only the actual shell environment\n // does — so checking Object.prototype.hasOwnProperty.call(process.env, ...)\n // is sufficient to exclude config-driven values.\n const hasOwn = Object.hasOwn(process.env, 'WRONGSTACK_CHILD_ENV_PASSTHROUGH');\n const legacyHasOwn = Object.hasOwn(process.env, 'WRONGSTACK_BASH_ENV_PASSTHROUGH');\n const passthrough = (hasOwn && process.env['WRONGSTACK_CHILD_ENV_PASSTHROUGH'] === '1')\n || (legacyHasOwn && process.env['WRONGSTACK_BASH_ENV_PASSTHROUGH'] === '1');\n if (passthrough && !process.env['CI']) {\n console.warn(\n '[agent] WARNING: WRONGSTACK_*_ENV_PASSTHROUGH=1 is active —\\n' +\n ' all parent env vars (including API keys) forwarded to child processes.\\n' +\n ' Do not use on shared or multi-tenant systems.'\n );\n }\n const out: NodeJS.ProcessEnv = {};\n\n // The CLI entry defaults NODE_ENV=production (so React/Ink resolve their\n // production builds — see cli-main) and marks the injection with this\n // flag. The injected value must NOT reach children: NODE_ENV=production\n // makes `pnpm install` skip devDependencies and flips test-runner\n // behavior. Strip both vars whenever the flag says wrongstack set them —\n // a NODE_ENV genuinely exported by the operator's shell (flag absent)\n // is forwarded unchanged. Applies in passthrough mode too: passthrough\n // means \"the operator's real environment\", which this value is not.\n const nodeEnvDefaulted = process.env['WRONGSTACK_NODE_ENV_DEFAULTED'] === '1';\n\n for (const [k, v] of Object.entries(process.env)) {\n if (v === undefined) continue;\n if (nodeEnvDefaulted && (k === 'NODE_ENV' || k === 'WRONGSTACK_NODE_ENV_DEFAULTED')) continue;\n if (passthrough) {\n out[k] = v;\n continue;\n }\n const upper = k.toUpperCase();\n // 0. Strip any value with an embedded URI credential (user:pass@host),\n // regardless of the variable name (WS-01). Applied before the allowlist\n // so even a \"system\" name carrying a connection string is caught.\n if (valueHasEmbeddedCredential(v)) continue;\n // 1. Forward names on the explicit allowlist — these are well-known\n // non-secret system variables (PATH, HOME, LANG, ...).\n if (ALLOWED_KEYS.has(upper)) {\n out[k] = v;\n continue;\n }\n // 2. Strip anything that looks like a secret.\n if (looksSecret(upper)) continue;\n // NODE_OPTIONS is forwarded (builds rely on flags like --no-warnings) but\n // module-preload directives (--require/--import/--loader) are stripped —\n // they would let a parent-set NODE_OPTIONS inject code into every node\n // child (WS-02 defense-in-depth).\n if (upper === 'NODE_OPTIONS') {\n const sanitized = sanitizeNodeOptions(v);\n if (sanitized) out[k] = sanitized;\n continue;\n }\n // 3. Forward tooling-prefixed vars that builds commonly need, unless\n // they already failed the secret check above.\n if (\n upper.startsWith('NODE_') ||\n upper.startsWith('NPM_') ||\n upper.startsWith('PNPM_') ||\n upper.startsWith('YARN_') ||\n upper.startsWith('GIT_') ||\n upper.startsWith('CI') ||\n upper.startsWith('XDG_') ||\n // Our own non-secret knobs (WRONGSTACK_HOME, WRONGSTACK_SESSION_ID, …).\n // Secrets never live in WRONGSTACK_* env vars (they're in the encrypted\n // vault). Forwarding keeps child wstack processes — e.g. ones spawned\n // by the test suite — inside the same redirected global root.\n upper.startsWith('WRONGSTACK_') ||\n upper === 'EDITOR' ||\n upper === 'VISUAL' ||\n upper === 'PAGER'\n ) {\n out[k] = v;\n }\n }\n\n // Merge explicit extras AFTER filtering. Callers MUST treat `opts.extra`\n // as a small, user-authored allowlist (e.g. MCP server tokens, LSP env\n // overrides from config). Do NOT pass `process.env` or any object derived\n // from it — that would defeat the parent-env scrub above. The secret\n // filter is intentionally skipped here so legitimate secret-bearing\n // tokens the user explicitly configured can still reach the child.\n if (opts.extra) {\n Object.assign(out, opts.extra);\n }\n\n if (opts.sessionId) out['WRONGSTACK_SESSION_ID'] = opts.sessionId;\n return out;\n}\n","/**\n * Converts an unknown error value to a human-readable string.\n * Used in 40+ files across the codebase to normalize error messaging.\n */\nexport function toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","/** Assert a value is neither null nor undefined. Throws if it is.\n * Useful after optional chaining and indexed access when the\n * control flow guarantees the value exists but TypeScript can't\n * prove it (e.g. after a check on a related field). */\nexport function expectDefined<T>(value: T | null | undefined, label?: string): T {\n if (value === null || value === undefined) {\n const err = new Error(label ? `Expected ${label} to be defined` : 'Expected value to be defined');\n err.name = 'ExpectDefinedError';\n throw err;\n }\n return value;\n}\n","/**\n * String utilities shared across the WrongStack codebase.\n */\n\n/**\n * Truncate a string to at most `max` characters, appending an ellipsis if it\n * was longer. Returns the original string unchanged when it fits.\n */\nexport function truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n","import { toErrorMessage } from '../utils/index.js';\n\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\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // SDD (Spec-Driven Development)\n SDD_VALIDATION_FAILED: 'SDD_VALIDATION_FAILED',\n SDD_PARSE_FAILED: 'SDD_PARSE_FAILED',\n SDD_INVALID_STATE: 'SDD_INVALID_STATE',\n SDD_NOT_READY: 'SDD_NOT_READY',\n // General\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n PARSE_FAILED: 'PARSE_FAILED',\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'sdd'\n | 'container'\n | 'fs'\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> | undefined;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity | undefined;\n recoverable?: boolean | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\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 | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\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> | undefined;\n cause?: unknown | undefined;\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> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.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 | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.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'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = toErrorMessage(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.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 | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.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/**\n * SDD (Spec-Driven Development) errors — spec validation, parsing, and\n * state machine violations in the AISpecBuilder, TaskFlow, and TaskTracker.\n */\nexport class SddError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'SDD_VALIDATION_FAILED' | 'SDD_PARSE_FAILED' | 'SDD_INVALID_STATE' | 'SDD_NOT_READY'\n >;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'sdd',\n severity: opts.code === ERROR_CODES.SDD_PARSE_FAILED ? 'warning' : 'error',\n recoverable: opts.code === ERROR_CODES.SDD_NOT_READY,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'SddError';\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string | undefined;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n/**\n * HTTP fetch error — thrown when a network request returns a non-OK status.\n * Carries the response status so {@link classifyToolError} can branch on it\n * (429 → transient, 404 → not_found, 401 → permission) without duck-typing\n * the error via `'response' in err`.\n *\n * P3 #18 (before-release.md): the previous `'response' in err` check caught\n * any Error with a `response` property, including custom errors, proxy\n * objects, or mocked errors in tests. `instanceof FetchError` is reliable.\n *\n * Tools and providers that make HTTP requests and need the executor to\n * classify their failures should throw `new FetchError({ status, message })`\n * instead of a bare `Error` with an ad-hoc `response` field.\n */\nexport class FetchError extends WrongStackError {\n readonly status: number;\n\n constructor(opts: {\n message: string;\n status: number;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: opts.status === 429 || opts.status >= 500,\n context: { status: opts.status, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FetchError';\n this.status = opts.status;\n }\n}\n\n/**\n * Tool input validation error — thrown when a tool's input fails a validation\n * check that the JSON Schema cannot express (e.g. `old_string === new_string`\n * in edit, or a cross-field invariant). Use this instead of a bare\n * `throw new Error('...validation...')` so {@link classifyToolError} can\n * match on `instanceof` rather than a locale-dependent message substring.\n *\n * P2 #6 (before-release.md): the previous `err.message.includes('validation')`\n * check misclassified any error whose message happened to contain \"validation\"\n * (e.g. a third-party \"input validation timeout\") as a VALIDATION error.\n *\n * Named `ToolValidationError` (not `ValidationError`) to avoid colliding with\n * the existing `ValidationError` interface exported by json-schema-validate.ts\n * (a validation-result shape, not an Error subclass).\n */\nexport class ToolValidationError extends WrongStackError {\n constructor(opts: {\n message: string;\n /** Field path or tool name that failed validation, for diagnostics. */\n field?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.VALIDATION_ERROR,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { field: opts.field, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolValidationError';\n }\n}\n\n/**\n * Response / payload parse error — thrown when an upstream HTTP response,\n * file, or data structure is well-formed at the transport layer (HTTP 200,\n * valid JSON) but is missing required fields or has an unexpected shape.\n *\n * Distinct from `ConfigError(CONFIG_PARSE_FAILED)` (which is specifically\n * for config-file parsing) and `FetchError` (which covers HTTP non-OK\n * responses). `ParseError` fills the gap: the request succeeded but the\n * response body couldn't be interpreted.\n *\n * Common sites: OAuth token responses missing `access_token`, device-code\n * responses missing `device_code`, registry responses with unexpected\n * schemas.\n */\nexport class ParseError extends WrongStackError {\n readonly source?: string | undefined;\n\n constructor(opts: {\n message: string;\n /**\n * What was being parsed — e.g. `'oauth-token-response'`,\n * `'device-code-response'`. Lets consumers distinguish parse failures\n * from different upstream APIs without parsing the message.\n */\n source?: string | undefined;\n context?: Record<string, unknown> | undefined;\n cause?: unknown | undefined;\n }) {\n super({\n message: opts.message,\n code: ERROR_CODES.PARSE_FAILED,\n subsystem: 'general',\n severity: 'error',\n recoverable: false,\n context: { source: opts.source, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ParseError';\n this.source = opts.source;\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\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n\nexport function isToolValidationError(err: unknown): err is ToolValidationError {\n return err instanceof ToolValidationError;\n}\n\nexport function isFetchError(err: unknown): err is FetchError {\n return err instanceof FetchError;\n}\n\nexport function isParseError(err: unknown): err is ParseError {\n return err instanceof ParseError;\n}\n\nexport function isSddError(err: unknown): err is SddError {\n return err instanceof SddError;\n}\n","import type {\n SpecAnalysis,\n SpecRequirement,\n SpecSection,\n SpecValidationResult,\n Specification,\n} from '../types/spec.js';\n\nexport class SpecParser {\n parse(content: string): Specification {\n const lines = content.split('\\n');\n const sections = this.extractSections(lines);\n const requirements = this.extractRequirements(lines);\n const now = Date.now();\n\n return {\n id: crypto.randomUUID(),\n title: this.extractTitle(lines),\n version: this.extractVersion(lines),\n status: 'draft',\n overview: this.extractOverview(lines),\n sections,\n requirements,\n createdAt: now,\n updatedAt: now,\n };\n }\n\n private extractTitle(lines: string[]): string {\n for (const line of lines) {\n const m = /^#\\s+(.+)/.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return 'Untitled Specification';\n }\n\n private extractVersion(lines: string[]): string {\n for (const line of lines) {\n const m = /version[:\\s]+(\\d+\\.\\d+\\.\\d+)/i.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return '0.0.1';\n }\n\n private extractOverview(lines: string[]): string {\n const overviewLines: string[] = [];\n let inOverview = false;\n let foundHeading = false;\n\n for (const line of lines) {\n if (/^##\\s+Overview/i.test(line.trim())) {\n inOverview = true;\n foundHeading = true;\n continue;\n }\n if (foundHeading && /^##\\s+/.test(line.trim())) break;\n if (inOverview) overviewLines.push(line);\n }\n\n return overviewLines.join('\\n').trim() || 'No overview provided';\n }\n\n private extractSections(lines: string[]): SpecSection[] {\n const sections: SpecSection[] = [];\n let currentSection: Partial<SpecSection> | null = null;\n let currentLines: string[] = [];\n let depth = 1;\n\n for (const line of lines) {\n const h2 = /^##\\s+(.+)/.exec(line.trim());\n const h3 = /^###\\s+(.+)/.exec(line.trim());\n\n if (h2) {\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n currentSection = { title: h2[1] ?? 'Unknown' };\n currentLines = [];\n depth = 2;\n continue;\n }\n\n if (h3) {\n currentLines.push(line);\n continue;\n }\n\n if (currentSection) {\n currentLines.push(line);\n }\n }\n\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n\n return sections;\n }\n\n private extractRequirements(lines: string[]): SpecRequirement[] {\n const requirements: SpecRequirement[] = [];\n let inRequirements = false;\n let idCounter = 0;\n\n for (const line of lines) {\n if (/^##\\s+Requirements/i.test(line.trim())) {\n inRequirements = true;\n continue;\n }\n if (inRequirements && /^##\\s+/.test(line.trim())) break;\n\n if (inRequirements) {\n const req = this.parseRequirementLine(line, `REQ-${++idCounter}`);\n if (req) requirements.push(req);\n }\n }\n\n return requirements;\n }\n\n private parseRequirementLine(line: string, id: string): SpecRequirement | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return null;\n\n const lower = trimmed.toLowerCase();\n const types: SpecRequirement['type'][] = [\n 'functional',\n 'non-functional',\n 'security',\n 'performance',\n 'ux',\n ];\n let type: SpecRequirement['type'] = 'functional';\n for (const t of types) {\n if (lower.includes(`[${t}]`)) type = t;\n }\n\n let priority: SpecRequirement['priority'] = 'medium';\n if (trimmed.includes('[critical]') || trimmed.includes('[prio:high]')) {\n priority = 'critical';\n } else if (trimmed.includes('[high]')) {\n priority = 'high';\n } else if (trimmed.includes('[low]')) {\n priority = 'low';\n }\n\n return {\n id,\n type,\n priority,\n description: trimmed.replace(/\\[[^\\]]+\\]/g, '').trim(),\n acceptanceCriteria: [],\n };\n }\n\n private mapSectionType(title: string): SpecSection['type'] {\n const t = title.toLowerCase();\n if (t.includes('overview')) return 'overview';\n if (t.includes('requirement')) return 'requirements';\n if (t.includes('architect')) return 'architecture';\n if (t.includes('api')) return 'api';\n if (t.includes('data')) return 'data';\n if (t.includes('security')) return 'security';\n if (t.includes('acceptance')) return 'acceptance';\n return 'overview';\n }\n\n analyze(spec: Specification): SpecAnalysis {\n const gaps: string[] = [];\n const suggestions: string[] = [];\n const risks: SpecAnalysis['risks'] = [];\n\n // Check completeness\n const hasOverview = spec.sections.some((s) => s.type === 'overview');\n const hasRequirements = spec.sections.some((s) => s.type === 'requirements');\n const hasAcceptance = spec.sections.some((s) => s.type === 'acceptance');\n\n if (!hasOverview) gaps.push('Missing Overview section');\n if (!hasRequirements) gaps.push('Missing Requirements section');\n if (!hasAcceptance) gaps.push('Missing Acceptance Criteria section');\n\n if (spec.requirements.length === 0) {\n gaps.push('No requirements defined');\n suggestions.push('Add specific functional and non-functional requirements');\n }\n\n const unverifiedReqs = spec.requirements.filter((r) => r.acceptanceCriteria.length === 0);\n if (unverifiedReqs.length > 0) {\n gaps.push(`${unverifiedReqs.length} requirements without acceptance criteria`);\n suggestions.push('Define clear acceptance criteria for each requirement');\n }\n\n const criticalUnresolved = spec.requirements.filter(\n (r) => r.priority === 'critical' && r.blockedBy && r.blockedBy.length > 0,\n );\n for (const req of criticalUnresolved) {\n risks.push({\n requirement: req.id,\n risk: `Critical requirement blocked by ${req.blockedBy?.length} other requirements`,\n severity: 'high',\n });\n }\n\n const completeness = Math.round(\n (((hasOverview ? 1 : 0) +\n (hasRequirements ? 1 : 0) +\n (hasAcceptance ? 1 : 0) +\n (spec.requirements.length > 0 ? 1 : 0) +\n (spec.sections.length > 3 ? 1 : 0)) /\n 5) *\n 100,\n );\n\n return {\n specId: spec.id,\n completeness,\n coverage: {\n requirements: spec.requirements.length,\n apiEndpoints: spec.apiEndpoints?.length ?? 0,\n edgeCases: 0,\n errorHandling: 0,\n },\n gaps,\n risks,\n suggestions,\n };\n }\n\n validate(spec: Specification): SpecValidationResult {\n const errors: SpecValidationResult['errors'] = [];\n const warnings: SpecValidationResult['warnings'] = [];\n\n if (!spec.title.trim()) {\n errors.push({ path: 'title', message: 'Title is required' });\n }\n\n if (!spec.version.trim()) {\n errors.push({ path: 'version', message: 'Version is required' });\n }\n\n for (const req of spec.requirements) {\n if (!req.description.trim()) {\n errors.push({ path: `requirement.${req.id}`, message: 'Requirement description is empty' });\n }\n if (req.acceptanceCriteria.length === 0) {\n warnings.push({ path: `requirement.${req.id}`, message: 'No acceptance criteria defined' });\n }\n }\n\n const reqIds = new Set(spec.requirements.map((r) => r.id));\n const blockedByIds = new Set(spec.requirements.flatMap((r) => r.blockedBy ?? []));\n for (const id of blockedByIds) {\n if (!reqIds.has(id)) {\n errors.push({\n path: 'requirements',\n message: `BlockedBy references non-existent requirement: ${id}`,\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n}\n","import type { SpecRequirement, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode, TaskPriority, TaskType } from '../types/task-graph.js';\nimport type { TaskStore, TaskTracker } from './task-tracker.js';\n\nexport interface TaskGeneratorOptions {\n taskTracker: TaskTracker;\n /**\n * Opt-in (default off): derive each task's completion-gate\n * `metadata.verificationCommand` from an acceptance criterion that carries a\n * runnable-command marker (`$ <cmd>`, or `run:`/`verify:`/`cmd:` prefix). Off\n * by default so the common case stays fast — auto-running a check per task is\n * exactly the slowness the robustness initiative set out to avoid; enable it\n * explicitly (the CLI gates it behind WRONGSTACK_SDD_VERIFY_FROM_ACCEPTANCE).\n */\n verificationFromAcceptance?: boolean | undefined;\n}\n\n/**\n * Pull a runnable verification command out of a requirement's acceptance\n * criteria. A criterion qualifies only when it carries an explicit marker —\n * `$ <cmd>` (shell-prompt style) or a `run:` / `verify:` / `cmd:` prefix — so\n * free-text criteria are never mistaken for commands. Returns the first match.\n */\nexport function extractVerificationCommand(criteria: readonly string[]): string | undefined {\n const marker = /^\\s*(?:\\$\\s+|(?:run|verify|cmd)\\s*:\\s*)(.+\\S)\\s*$/i;\n for (const c of criteria) {\n const m = marker.exec(c);\n if (m?.[1]) return m[1].trim();\n }\n return undefined;\n}\n\nexport interface GeneratedTask {\n specRequirementId?: string | undefined;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n estimateHours?: number | undefined;\n tags?: string[] | undefined;\n}\n\nexport class TaskGenerator {\n constructor(private readonly opts: TaskGeneratorOptions) {}\n\n async generateFromSpec(spec: Specification): Promise<TaskGraph> {\n const graph = await this.opts.taskTracker.createGraph(spec.id, spec.title);\n\n // Track feature/implementation node ids so the deterministic fallback still\n // produces a real DAG: tests depend on the features they cover, docs depend\n // on everything. Without this the generated graph is edgeless and every task\n // looks independently runnable (the naive slot-filling the user rejected).\n const featureIds: string[] = [];\n\n const overview = spec.sections.find((s) => s.type === 'overview');\n if (overview) {\n featureIds.push(\n this.opts.taskTracker.addNode({\n title: `Implement ${spec.title}`,\n description: overview.content,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n }).id,\n );\n }\n\n // Group requirements by priority in a single pass, then emit in priority order.\n const byPriority: Record<TaskPriority, SpecRequirement[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n for (const req of spec.requirements) {\n const bucket = byPriority[req.priority] ?? byPriority.medium;\n bucket.push(req);\n }\n\n const order: TaskPriority[] = ['critical', 'high', 'medium', 'low'];\n for (const p of order) {\n for (const req of byPriority[p]) {\n featureIds.push(this.opts.taskTracker.addNode(this.createTaskFromRequirement(req)).id);\n }\n }\n\n // API tasks\n if (spec.apiEndpoints && spec.apiEndpoints.length > 0) {\n const apiParent = this.opts.taskTracker.addNode({\n title: 'API Implementation',\n description: `Implement ${spec.apiEndpoints.length} API endpoints`,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n });\n featureIds.push(apiParent.id);\n\n for (const endpoint of spec.apiEndpoints) {\n const task = this.createTaskFromEndpoint(endpoint);\n featureIds.push(\n this.opts.taskTracker.addNode({\n ...task,\n parentId: apiParent.id,\n }).id,\n );\n }\n }\n\n // Test tasks — depend on every feature so they run after implementation.\n const testId = this.opts.taskTracker.addNode({\n title: 'Write Tests',\n description: 'Comprehensive test coverage for all features',\n type: 'test',\n priority: 'high',\n status: 'pending',\n }).id;\n for (const f of featureIds) this.opts.taskTracker.addDependency(f, testId);\n\n // Documentation tasks — depend on features + tests (last in the chain).\n const docsId = this.opts.taskTracker.addNode({\n title: 'Update Documentation',\n description: 'Update docs for new features',\n type: 'docs',\n priority: 'medium',\n status: 'pending',\n }).id;\n for (const f of [...featureIds, testId]) this.opts.taskTracker.addDependency(f, docsId);\n\n return graph;\n }\n\n private createTaskFromRequirement(\n req: SpecRequirement,\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n const verificationCommand = this.opts.verificationFromAcceptance\n ? extractVerificationCommand(req.acceptanceCriteria)\n : undefined;\n return {\n title: req.description,\n description: this.buildDescription(req),\n type: this.mapRequirementType(req.type),\n priority: req.priority,\n status: 'pending',\n specRequirementId: req.id,\n tags: [req.type, req.priority],\n estimateHours: this.estimateHours(req),\n ...(verificationCommand ? { metadata: { verificationCommand } } : {}),\n };\n }\n\n private createTaskFromEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\n return {\n title: `${endpoint.method} ${endpoint.path}`,\n description: endpoint.description,\n type: 'feature',\n priority: 'high',\n status: 'pending',\n tags: [endpoint.method],\n estimateHours: this.estimateForEndpoint(endpoint),\n };\n }\n\n private buildDescription(req: SpecRequirement): string {\n const lines = [req.description, '', '**Type:** ' + req.type, '**Priority:** ' + req.priority];\n\n if (req.acceptanceCriteria.length > 0) {\n lines.push('', '**Acceptance Criteria:**');\n for (const criterion of req.acceptanceCriteria) {\n lines.push(`- ${criterion}`);\n }\n }\n\n if (req.blockedBy && req.blockedBy.length > 0) {\n lines.push('', `**Blocked by:** ${req.blockedBy.join(', ')}`);\n }\n\n return lines.join('\\n');\n }\n\n private mapRequirementType(type: SpecRequirement['type']): TaskType {\n switch (type) {\n case 'functional':\n return 'feature';\n case 'non-functional':\n return 'feature';\n case 'security':\n return 'feature';\n case 'performance':\n return 'feature';\n case 'ux':\n return 'feature';\n default:\n return 'feature';\n }\n }\n\n private estimateHours(req: SpecRequirement): number {\n switch (req.priority) {\n case 'critical':\n return 8;\n case 'high':\n return 4;\n case 'medium':\n return 2;\n case 'low':\n return 1;\n default:\n return 2;\n }\n }\n\n private estimateForEndpoint(\n endpoint: NonNullable<Specification['apiEndpoints']>[number],\n ): number {\n let hours = 2;\n if (endpoint.auth) hours += 1;\n if (endpoint.request) hours += 1;\n return hours;\n }\n\n async generateSubtasks(parentTaskId: string, spec: Specification): Promise<void> {\n const reqId = this.opts.taskTracker.getNode(parentTaskId)?.specRequirementId;\n if (!reqId) return;\n\n const req = spec.requirements.find((r) => r.id === reqId);\n if (!req) return;\n\n if (req.acceptanceCriteria.length > 0) {\n for (const criterion of req.acceptanceCriteria) {\n this.opts.taskTracker.addNode({\n title: criterion,\n description: `Verify: ${criterion}`,\n type: 'test',\n priority: 'medium',\n status: 'pending',\n parentId: parentTaskId,\n });\n }\n }\n }\n}\n\nexport class DefaultTaskStore implements TaskStore {\n private graphs = new Map<string, TaskGraph>();\n\n async saveGraph(graph: TaskGraph): Promise<void> {\n this.graphs.set(graph.id, this.cloneGraph(graph));\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n const g = this.graphs.get(id);\n return g ? this.cloneGraph(g) : null;\n }\n\n async listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]> {\n return Array.from(this.graphs.values()).map((g) => ({\n id: g.id,\n title: g.title,\n updatedAt: g.updatedAt,\n }));\n }\n\n async deleteGraph(id: string): Promise<void> {\n this.graphs.delete(id);\n }\n\n private cloneGraph(g: TaskGraph): TaskGraph {\n return {\n ...g,\n nodes: new Map(g.nodes),\n edges: [...g.edges],\n rootNodes: [...g.rootNodes],\n };\n }\n}\n","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\n\nexport interface TaskNode {\n id: string;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n status: TaskStatus;\n assignee?: string | undefined;\n estimateHours?: number | undefined;\n actualHours?: number | undefined;\n tags?: string[] | undefined;\n specRequirementId?: string | undefined;\n parentId?: string | undefined;\n children?: string[] | undefined;\n createdAt: number;\n updatedAt: number;\n startedAt?: number | undefined; // set when status → in_progress\n completedAt?: number | undefined;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskEdge {\n id: string;\n from: string;\n to: string;\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\n weight?: number | undefined;\n}\n\nexport interface TaskGraph {\n id: string;\n specId: string;\n title: string;\n nodes: Map<string, TaskNode>;\n edges: TaskEdge[];\n rootNodes: string[];\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface TaskDependency {\n taskId: string;\n blockedBy: string[];\n blocking: string[];\n}\n\nexport interface TaskAssignment {\n taskId: string;\n assignee: string;\n assignedAt: number;\n}\n\nexport interface TaskProgress {\n total: number;\n pending: number;\n inProgress: number;\n blocked: number;\n failed: number;\n review: number;\n completed: number;\n percentComplete: number;\n estimatedHours: number;\n actualHours: number;\n}\n\nexport interface TaskFilter {\n status?: TaskStatus[] | undefined;\n priority?: TaskPriority[] | undefined;\n type?: TaskType[] | undefined;\n assignee?: string[] | undefined;\n tags?: string[] | undefined;\n specRequirementId?: string | undefined;\n}\n\nexport interface TaskSort {\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\n direction: 'asc' | 'desc';\n}\n\nexport interface CriticalPathResult {\n taskIds: string[];\n totalEstimateHours: number;\n bottleneckTasks: string[];\n}\n\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\n let completed = 0;\n let pending = 0;\n let inProgress = 0;\n let blocked = 0;\n let failed = 0;\n let review = 0;\n let estimatedHours = 0;\n let actualHours = 0;\n for (const n of graph.nodes.values()) {\n switch (n.status) {\n case 'completed':\n completed++;\n break;\n case 'pending':\n pending++;\n break;\n case 'in_progress':\n inProgress++;\n break;\n case 'blocked':\n blocked++;\n break;\n case 'failed':\n failed++;\n break;\n case 'review':\n review++;\n break;\n }\n estimatedHours += n.estimateHours ?? 0;\n actualHours += n.actualHours ?? 0;\n }\n const total = graph.nodes.size;\n\n return {\n total,\n pending,\n inProgress,\n blocked,\n failed,\n review,\n completed,\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\n estimatedHours,\n actualHours,\n };\n}\n\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\n const nodes = Array.from(graph.nodes.values());\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\n const bottleneckTasks = criticalNodes\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\n .map((n) => n.id);\n\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\n\n return {\n taskIds: criticalNodes.map((n) => n.id),\n totalEstimateHours,\n bottleneckTasks,\n };\n}\n\nexport function topologicalSort(graph: TaskGraph): string[] {\n const visited = new Set<string>();\n const inStack = new Set<string>();\n const result: string[] = [];\n\n function visit(id: string): void {\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\n if (inStack.has(id)) return;\n if (visited.has(id)) return;\n if (!graph.nodes.has(id)) return;\n\n visited.add(id);\n inStack.add(id);\n\n for (const edge of graph.edges) {\n if (edge.from === id) visit(edge.to);\n }\n\n inStack.delete(id);\n result.push(id);\n }\n\n for (const rootId of graph.rootNodes) {\n visit(rootId);\n }\n\n return result;\n}\n","import type {\n TaskFilter,\n TaskGraph,\n TaskNode,\n TaskProgress,\n TaskSort,\n} from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\nimport { SddError, ERROR_CODES } from '../types/errors.js';\nimport { toErrorMessage } from '../utils/error.js';\n\nexport interface TaskStore {\n saveGraph(graph: TaskGraph): Promise<void>;\n loadGraph(id: string): Promise<TaskGraph | null>;\n listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]>;\n deleteGraph(id: string): Promise<void>;\n}\n\nexport interface TaskTrackerOptions {\n store: TaskStore;\n /**\n * Called when an in-the-background persistence (`saveGraph`) rejects.\n * The synchronous TaskTracker methods (addNode/addEdge/updateNodeStatus)\n * fire-and-forget their writes; without this, a failing store silently\n * loses graph mutations. Defaults to a console.warn.\n */\n onPersistError?: (((err: unknown) => void)) | undefined;\n}\n\nexport interface TaskTransition {\n from: TaskNode['status'];\n to: TaskNode['status'];\n timestamp: number;\n reason?: string | undefined;\n}\n\n/** A change notification emitted to `TaskTracker.subscribe` listeners. */\nexport interface TaskTrackerChange {\n type: 'node_added' | 'node_updated' | 'status_changed' | 'node_removed';\n nodeId: string;\n /** For `node_removed` this is the node as it was just before deletion. */\n node: TaskNode;\n transition?: TaskTransition | undefined;\n}\n\nexport type TaskTrackerListener = (change: TaskTrackerChange) => void;\n\nexport class TaskTracker {\n private graph: TaskGraph | null = null;\n private transitions: TaskTransition[] = [];\n private listeners: TaskTrackerListener[] = [];\n\n constructor(private readonly opts: TaskTrackerOptions) {}\n\n /**\n * Subscribe to live task mutations (add / update / status change). Returns an\n * unsubscribe fn. This is the hook the board projector uses to stream a live\n * snapshot — the tracker was previously fire-and-forget with no observability.\n */\n subscribe(listener: TaskTrackerListener): () => void {\n this.listeners.push(listener);\n return () => {\n const i = this.listeners.indexOf(listener);\n if (i >= 0) this.listeners.splice(i, 1);\n };\n }\n\n private notifyChange(change: TaskTrackerChange): void {\n for (const l of this.listeners) {\n try {\n l(change);\n } catch {\n // A faulty listener must never break a tracker mutation.\n }\n }\n }\n\n /**\n * Attach an existing graph (used by PhaseOrchestrator to associate a tracker\n * with a phase's pre-built task graph without re-creating it).\n */\n setGraph(graph: TaskGraph): void {\n this.graph = graph;\n }\n\n async createGraph(specId: string, title: string): Promise<TaskGraph> {\n this.graph = {\n id: crypto.randomUUID(),\n specId,\n title,\n nodes: new Map(),\n edges: [],\n rootNodes: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n await this.opts.store.saveGraph(this.graph);\n return this.graph;\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n this.graph = await this.opts.store.loadGraph(id);\n return this.graph;\n }\n\n addNode(node: Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'>): TaskNode {\n if (!this.graph) throw new SddError({\n message: 'No graph loaded',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n\n const now = Date.now();\n const newNode: TaskNode = {\n ...node,\n id: crypto.randomUUID(),\n status: node.status ?? 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n this.graph.nodes.set(newNode.id, newNode);\n\n if (!node.parentId) {\n this.graph.rootNodes.push(newNode.id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n this.notifyChange({ type: 'node_added', nodeId: newNode.id, node: newNode });\n\n return newNode;\n }\n\n addEdge(from: string, to: string, type: TaskGraph['edges'][0]['type'] = 'depends_on'): void {\n if (!this.graph) throw new SddError({\n message: 'No graph loaded',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n\n this.graph.edges.push({\n id: crypto.randomUUID(),\n from,\n to,\n type,\n });\n this.graph.updatedAt = Date.now();\n this.persist();\n }\n\n /**\n * Declare that `taskId` depends on `depId` (a `depends_on` edge `depId → taskId`),\n * guarding against self-loops, duplicates, missing nodes, and cycles. Returns\n * true if the dependency now holds (added or already present), false if it was\n * rejected (would create a cycle / unknown node). This is the safe entry point\n * for wiring agent-declared `dependsOn` references into the graph.\n */\n addDependency(depId: string, taskId: string): boolean {\n if (!this.graph) return false;\n if (depId === taskId) return false;\n if (!this.graph.nodes.has(depId) || !this.graph.nodes.has(taskId)) return false;\n // Already a blocker — idempotent success.\n if (this.getBlockers(taskId).includes(depId)) return true;\n // Cycle guard: if `depId` already (transitively) depends on `taskId`, adding\n // `taskId → depId` would close a loop. Reject rather than deadlock the run.\n if (this.dependsOnTransitively(depId, taskId, new Set())) return false;\n this.addEdge(depId, taskId, 'depends_on');\n return true;\n }\n\n /** True when `taskId` transitively depends on `targetId` (follows depends_on blockers). */\n private dependsOnTransitively(taskId: string, targetId: string, seen: Set<string>): boolean {\n if (taskId === targetId) return true;\n if (seen.has(taskId)) return false;\n seen.add(taskId);\n for (const blocker of this.getBlockers(taskId)) {\n if (this.dependsOnTransitively(blocker, targetId, seen)) return true;\n }\n return false;\n }\n\n /**\n * Merge `patch` into a node's `metadata` (used for per-task model/provider/\n * fallback assignment and the cancel marker). Persists + notifies as a node\n * update. No-op if the node is missing.\n */\n patchMetadata(id: string, patch: Record<string, unknown>): void {\n if (!this.graph) return;\n const node = this.graph.nodes.get(id);\n if (!node) return;\n node.metadata = { ...node.metadata, ...patch };\n node.updatedAt = Date.now();\n this.graph.updatedAt = node.updatedAt;\n this.persist();\n this.notifyChange({ type: 'node_updated', nodeId: id, node });\n }\n\n /**\n * Remove a node and every edge touching it. Intended for deleting a task that\n * has not started yet — callers must gate on status (do not remove a running\n * task). Dependents simply lose this blocker (re-evaluated by `canStart`).\n * Returns true if a node was removed.\n */\n removeNode(id: string): boolean {\n if (!this.graph) return false;\n const node = this.graph.nodes.get(id);\n if (!node) return false;\n this.graph.nodes.delete(id);\n this.graph.edges = this.graph.edges.filter((e) => e.from !== id && e.to !== id);\n this.graph.rootNodes = this.graph.rootNodes.filter((r) => r !== id);\n // Detach from any parent's children list.\n for (const n of this.graph.nodes.values()) {\n if (n.children?.includes(id)) n.children = n.children.filter((c) => c !== id);\n }\n this.graph.updatedAt = Date.now();\n this.persist();\n this.notifyChange({ type: 'node_removed', nodeId: id, node });\n return true;\n }\n\n updateNodeStatus(id: string, status: TaskNode['status'], reason?: string): void {\n if (!this.graph) throw new SddError({\n message: 'No graph loaded',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n\n const node = this.graph.nodes.get(id);\n if (!node) throw new SddError({\n message: `Node ${id} not found`,\n code: ERROR_CODES.SDD_NOT_READY,\n context: { nodeId: id },\n });\n\n const from = node.status;\n const now = Date.now();\n node.status = status;\n node.updatedAt = now;\n\n if (status === 'completed') {\n node.completedAt = now;\n node.startedAt = node.startedAt ?? now; // ensure startedAt is set\n }\n if (status === 'in_progress') {\n node.startedAt = now;\n }\n\n this.transitions.push({ from, to: status, timestamp: now, reason });\n\n // Auto-unblock dependents\n if (status === 'completed') {\n this.unblockDependents(id);\n }\n\n // Auto-block blockers\n if (status === 'in_progress') {\n this.checkAndBlockIfNeeded(id);\n }\n\n this.graph.updatedAt = now;\n this.persist();\n this.notifyChange({\n type: 'status_changed',\n nodeId: id,\n node,\n transition: { from, to: status, timestamp: now, reason },\n });\n }\n\n updateNode(id: string, patch: Partial<Pick<TaskNode, 'title' | 'description' | 'priority' | 'estimateHours' | 'tags' | 'assignee'>>): void {\n if (!this.graph) throw new SddError({\n message: 'No graph loaded',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n\n const node = this.graph.nodes.get(id);\n if (!node) throw new SddError({\n message: `Node ${id} not found`,\n code: ERROR_CODES.SDD_NOT_READY,\n context: { nodeId: id },\n });\n\n if (patch.title !== undefined) node.title = patch.title;\n if (patch.description !== undefined) node.description = patch.description;\n if (patch.priority !== undefined) node.priority = patch.priority;\n if (patch.estimateHours !== undefined) node.estimateHours = patch.estimateHours;\n if (patch.tags !== undefined) node.tags = patch.tags;\n if (patch.assignee !== undefined) node.assignee = patch.assignee;\n node.updatedAt = Date.now();\n this.graph.updatedAt = node.updatedAt;\n this.persist();\n this.notifyChange({ type: 'node_updated', nodeId: id, node });\n }\n\n getNode(id: string): TaskNode | undefined {\n return this.graph?.nodes.get(id);\n }\n\n getAllNodes(filter?: TaskFilter, sort?: TaskSort): TaskNode[] {\n if (!this.graph) return [];\n\n let nodes = Array.from(this.graph.nodes.values());\n\n if (filter) {\n nodes = nodes.filter((n) => {\n if (filter.status?.length && !filter.status.includes(n.status)) return false;\n if (filter.priority?.length && !filter.priority.includes(n.priority)) return false;\n if (filter.type?.length && !filter.type.includes(n.type)) return false;\n if (filter.assignee?.length && n.assignee && !filter.assignee.includes(n.assignee))\n return false;\n if (filter.tags?.length && n.tags && !n.tags.some((t) => filter.tags?.includes(t)))\n return false;\n if (filter.specRequirementId && n.specRequirementId !== filter.specRequirementId)\n return false;\n return true;\n });\n }\n\n if (sort) {\n nodes.sort((a, b) => {\n const cmp = compareByField(a, b, sort.field);\n return sort.direction === 'asc' ? cmp : -cmp;\n });\n }\n\n return nodes;\n }\n\n getChildren(parentId: string): TaskNode[] {\n if (!this.graph) return [];\n return Array.from(this.graph.nodes.values()).filter((n) => n.parentId === parentId);\n }\n\n getDependents(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.from === taskId && e.type === 'depends_on')\n .map((e) => e.to);\n }\n\n getBlockers(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.to === taskId && e.type === 'depends_on')\n .map((e) => e.from);\n }\n\n canStart(taskId: string): boolean {\n const blockers = this.getBlockers(taskId);\n return blockers.every((id) => {\n const node = this.graph?.nodes.get(id);\n // A task can start when all blockers are either completed or failed.\n // Failed blockers should not permanently deadlock dependent tasks.\n return node?.status === 'completed' || node?.status === 'failed';\n });\n }\n\n getProgress(): TaskProgress {\n if (!this.graph) {\n return {\n total: 0,\n pending: 0,\n inProgress: 0,\n blocked: 0,\n failed: 0,\n review: 0,\n completed: 0,\n percentComplete: 0,\n estimatedHours: 0,\n actualHours: 0,\n };\n }\n return computeTaskProgress(this.graph);\n }\n\n getTransitions(_taskId?: string): TaskTransition[] {\n return [...this.transitions];\n }\n\n private unblockDependents(completedId: string): void {\n if (!this.graph) return;\n const dependents = this.getDependents(completedId);\n for (const depId of dependents) {\n const dep = this.graph.nodes.get(depId);\n if (dep?.status === 'blocked') {\n // Check if all blockers are now completed\n const remainingBlockers = this.getBlockers(depId);\n const allUnblocked = remainingBlockers.every((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status === 'completed' || blocker?.status === 'failed';\n });\n if (allUnblocked) {\n dep.status = 'pending';\n dep.updatedAt = Date.now();\n }\n }\n }\n }\n\n private checkAndBlockIfNeeded(taskId: string): void {\n if (!this.graph) return;\n const blockers = this.getBlockers(taskId);\n const someBlocked = blockers.some((id) => {\n const blocker = this.graph?.nodes.get(id);\n // A task is only blocked by incomplete blockers that haven't failed.\n // Failed tasks should not block their dependents.\n return blocker?.status !== 'completed' && blocker?.status !== 'failed';\n });\n if (someBlocked) {\n const node = this.graph.nodes.get(taskId);\n if (node) {\n node.status = 'blocked';\n node.updatedAt = Date.now();\n }\n }\n }\n\n /**\n * Fire-and-forget persistence with attached error handler.\n * Synchronous mutators (addNode/addEdge/updateNodeStatus) use this to\n * avoid forcing an async cascade through every caller; if the store\n * is missing or throwing, the error is surfaced via onPersistError.\n */\n private persist(): void {\n if (!this.graph) return;\n this.opts.store.saveGraph(this.graph).catch((err) => {\n this.opts.onPersistError\n ? this.opts.onPersistError(err)\n : console.warn(JSON.stringify({\n level: 'warn',\n event: 'task_tracker.save_graph_failed',\n message: toErrorMessage(err),\n timestamp: new Date().toISOString(),\n }));\n });\n }\n}\n\n// Sort comparison helpers\nconst PRIORITY_RANK: Record<TaskNode['priority'], number> = {\n critical: 0,\n high: 1,\n medium: 2,\n low: 3,\n};\nconst STATUS_RANK: Record<TaskNode['status'], number> = {\n in_progress: 0,\n pending: 1,\n review: 2,\n blocked: 3,\n failed: 4,\n completed: 5,\n};\n\nfunction compareByField(a: TaskNode, b: TaskNode, field: TaskSort['field']): number {\n switch (field) {\n case 'priority': return PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority];\n case 'status': return STATUS_RANK[a.status] - STATUS_RANK[b.status];\n case 'createdAt': return a.createdAt - b.createdAt;\n case 'updatedAt': return a.updatedAt - b.updatedAt;\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { DoneCondition } from '../types/multi-agent.js';\nimport type { SpecAnalysis, Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { SddError, ERROR_CODES } from '../types/errors.js';\nimport { SpecParser } from './spec-parser.js';\nimport { DefaultTaskStore, TaskGenerator } from './task-generator.js';\nimport { TaskTracker } from './task-tracker.js';\n\n/**\n * Extended event map used internally by TaskFlow and multi-agent components.\n * These events are emitted on the injected EventBus and are a subset of\n * the full EventMap — they do not require a separate registration.\n */\nexport interface TaskFlowEventMap {\n 'phase.change': { from: TaskFlowPhase; to: TaskFlowPhase };\n 'task.started': { taskId: string };\n 'task.completed': { taskId: string; result?: unknown | undefined };\n 'task.failed': { taskId: string; error: string };\n 'task.review': { taskId: string };\n 'spec.analyzed': { analysis: SpecAnalysis };\n progress: { percent: number; message: string };\n done: { graph: TaskGraph };\n error: { phase: TaskFlowPhase; error: Error };\n}\n\nexport type TaskFlowPhase =\n | 'idle'\n | 'parsing'\n | 'analyzing'\n | 'generating'\n | 'executing'\n | 'reviewing'\n | 'completing'\n | 'done'\n | 'failed';\n\nexport type TaskFlowEventName = keyof TaskFlowEventMap;\n\nexport interface TaskFlowOptions {\n tracker: TaskTracker;\n events: EventBus;\n doneCondition?: DoneCondition | undefined;\n maxConcurrent?: number | undefined;\n}\n\nexport interface TaskFlowExecutionContext {\n executeTask: (task: TaskNode) => Promise<unknown>;\n onTaskComplete?: (task: TaskNode | undefined, result: unknown) => void;\n onTaskFail?: (task: TaskNode | undefined, error: Error) => void;\n}\n\nexport class TaskFlow {\n private phase: TaskFlowPhase = 'idle';\n private spec: Specification | null = null;\n private graph: TaskGraph | null = null;\n private stopped = false;\n\n constructor(private readonly opts: TaskFlowOptions) {\n this.setPhase('idle');\n }\n\n private emit<K extends TaskFlowEventName>(event: K, payload: TaskFlowEventMap[K]): void {\n (this.opts.events.emit as (event: string, payload: unknown) => void)(event, payload);\n }\n\n async fromSpec(specContent: string): Promise<TaskGraph> {\n this.setPhase('parsing');\n\n const parser = new SpecParser();\n this.spec = parser.parse(specContent);\n\n this.setPhase('analyzing');\n const analysis = parser.analyze(this.spec);\n this.emit('spec.analyzed', { analysis });\n\n if (analysis.completeness < 50) {\n const err = new SddError({\n message: `Spec completeness too low: ${analysis.completeness}%`,\n code: ERROR_CODES.SDD_VALIDATION_FAILED,\n context: { completeness: analysis.completeness },\n });\n this.emit('error', { phase: 'analyzing', error: err });\n this.setPhase('failed');\n throw err;\n }\n\n this.setPhase('generating');\n const generator = new TaskGenerator({\n taskTracker: this.opts.tracker,\n verificationFromAcceptance: process.env['WRONGSTACK_SDD_VERIFY_FROM_ACCEPTANCE'] === '1',\n });\n this.graph = await generator.generateFromSpec(this.spec);\n\n return this.graph;\n }\n\n async execute(ctx: TaskFlowExecutionContext): Promise<TaskGraph> {\n if (!this.graph) throw new SddError({\n message: 'No graph loaded. Call fromSpec first.',\n code: ERROR_CODES.SDD_INVALID_STATE,\n context: { phase: this.phase },\n });\n\n this.setPhase('executing');\n this.stopped = false;\n\n const pendingTasks = this.getExecutableTasks();\n const maxConcurrent = this.opts.maxConcurrent ?? 2;\n\n while (pendingTasks.length > 0 && !this.stopped) {\n const batch = pendingTasks.splice(0, maxConcurrent);\n const results = await Promise.allSettled(\n batch.map((task) => this.executeSingleTask(task, ctx)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n\n if (!result || !task) continue;\n\n if (result.status === 'rejected') {\n const reason = result.reason as Error | undefined;\n this.opts.tracker.updateNodeStatus(task.id, 'failed', reason?.message);\n this.emit('task.failed', { taskId: task.id, error: reason?.message ?? 'unknown' });\n ctx.onTaskFail?.(task, reason as Error);\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n this.emit('task.completed', { taskId: task.id, result: result.value });\n ctx.onTaskComplete?.(task, result.value);\n }\n\n this.emitProgress();\n }\n\n // Re-evaluate pending tasks (some may have become unblocked)\n const stillPending = this.getExecutableTasks();\n pendingTasks.length = 0;\n pendingTasks.push(...stillPending);\n\n // Check done condition\n if (this.checkDoneCondition()) {\n break;\n }\n }\n\n this.setPhase('completing');\n this.emit('done', { graph: this.graph });\n this.setPhase('done');\n\n return this.graph;\n }\n\n async reviewTask(taskId: string, approved: boolean, comment?: string): Promise<void> {\n const task = this.opts.tracker.getNode(taskId);\n if (!task) throw new SddError({\n message: `Task ${taskId} not found`,\n code: ERROR_CODES.SDD_NOT_READY,\n context: { taskId },\n });\n\n if (approved) {\n this.opts.tracker.updateNodeStatus(taskId, 'completed', comment);\n this.emit('task.completed', { taskId });\n } else {\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress', comment ?? 'Needs revision');\n this.emit('task.review', { taskId });\n }\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n getPhase(): TaskFlowPhase {\n return this.phase;\n }\n\n getGraph(): TaskGraph | null {\n return this.graph;\n }\n\n getSpec(): Specification | null {\n return this.spec;\n }\n\n private setPhase(phase: TaskFlowPhase): void {\n const from = this.phase;\n this.phase = phase;\n this.emit('phase.change', { from, to: phase });\n }\n\n private getExecutableTasks(): TaskNode[] {\n return this.opts.tracker\n .getAllNodes({ status: ['pending', 'blocked'] })\n .filter((n) => n.status === 'pending' && this.opts.tracker.canStart(n.id))\n .sort((a, b) => {\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\n });\n }\n\n private async executeSingleTask(task: TaskNode, ctx: TaskFlowExecutionContext): Promise<unknown> {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.emit('task.started', { taskId: task.id });\n return ctx.executeTask(task);\n }\n\n private checkDoneCondition(): boolean {\n const condition = this.opts.doneCondition;\n if (!condition) {\n const progress = this.opts.tracker.getProgress();\n return progress.percentComplete === 100;\n }\n\n switch (condition.type) {\n case 'all_tasks_done': {\n const progress = this.opts.tracker.getProgress();\n return progress.pending === 0 && progress.inProgress === 0;\n }\n case 'iterations':\n return false; // Not tracked here\n case 'tool_calls':\n return false;\n default:\n return false;\n }\n }\n\n private emitProgress(): void {\n const progress = this.opts.tracker.getProgress();\n this.emit('progress', {\n percent: progress.percentComplete,\n message: `${progress.completed}/${progress.total} tasks completed`,\n });\n }\n}\n\nexport interface SpecDrivenDevOptions {\n workingDirectory: string;\n events: EventBus;\n doneCondition?: DoneCondition | undefined;\n}\n\nexport class SpecDrivenDev {\n private store: DefaultTaskStore;\n private tracker: TaskTracker;\n private readonly events: EventBus;\n private flows = new Map<string, TaskFlow>();\n\n constructor(opts: SpecDrivenDevOptions) {\n this.store = new DefaultTaskStore();\n this.tracker = new TaskTracker({ store: this.store });\n this.events = opts.events;\n }\n\n async createFlow(specContent: string, options?: Partial<TaskFlowOptions>): Promise<TaskFlow> {\n const flow = new TaskFlow({\n tracker: this.tracker,\n events: this.events,\n ...options,\n });\n\n const graph = await flow.fromSpec(specContent);\n this.flows.set(graph.id, flow);\n\n return flow;\n }\n\n getTracker(): TaskTracker {\n return this.tracker;\n }\n\n getFlow(graphId: string): TaskFlow | undefined {\n return this.flows.get(graphId);\n }\n\n listFlows(): { id: string; title: string; phase: TaskFlowPhase }[] {\n return Array.from(this.flows.entries()).map(([id, flow]) => ({\n id,\n title: flow.getGraph()?.title ?? 'Untitled',\n phase: flow.getPhase(),\n }));\n }\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { Specification, SpecStatus } from '../types/spec.js';\n\nexport interface SpecStoreOptions {\n /** Directory where spec files are stored. Defaults to `.wrongstack/specs`. */\n baseDir: string;\n}\n\nexport interface SpecIndexEntry {\n id: string;\n title: string;\n version: string;\n status: SpecStatus;\n updatedAt: number;\n filePath: string;\n}\n\ninterface SpecIndex {\n version: 1;\n entries: SpecIndexEntry[];\n}\n\n/**\n * File-backed spec storage. Each spec is a JSON file under `baseDir/`.\n * An index file (`_index.json`) tracks all specs for fast listing.\n */\nexport class SpecStore {\n private readonly baseDir: string;\n private readonly indexPath: string;\n\n constructor(opts: SpecStoreOptions) {\n this.baseDir = opts.baseDir;\n this.indexPath = path.join(this.baseDir, '_index.json');\n }\n\n async save(spec: Specification): Promise<void> {\n await ensureDir(this.baseDir);\n const filePath = this.filePath(spec.id);\n await atomicWrite(filePath, JSON.stringify(spec, null, 2), { mode: 0o600 });\n await this.updateIndex(spec);\n }\n\n async load(id: string): Promise<Specification | null> {\n try {\n const raw = await fsp.readFile(this.filePath(id), 'utf8');\n return JSON.parse(raw) as Specification;\n } catch {\n return null;\n }\n }\n\n async list(): Promise<SpecIndexEntry[]> {\n const index = await this.readIndex();\n return index.entries.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async delete(id: string): Promise<boolean> {\n try {\n await fsp.unlink(this.filePath(id));\n await this.removeFromIndex(id);\n return true;\n } catch {\n return false;\n }\n }\n\n async exists(id: string): Promise<boolean> {\n try {\n await fsp.access(this.filePath(id));\n return true;\n } catch {\n return false;\n }\n }\n\n /** Create a new spec with defaults, assign ID, and persist. */\n async createDraft(title: string, overview?: string): Promise<Specification> {\n const now = Date.now();\n const spec: Specification = {\n id: randomUUID(),\n title,\n version: '0.1.0',\n status: 'draft',\n overview: overview ?? '',\n sections: [],\n requirements: [],\n createdAt: now,\n updatedAt: now,\n };\n await this.save(spec);\n return spec;\n }\n\n /** Update spec fields and persist. */\n async update(id: string, patch: Partial<Omit<Specification, 'id' | 'createdAt'>>): Promise<Specification | null> {\n const spec = await this.load(id);\n if (!spec) return null;\n const updated: Specification = {\n ...spec,\n ...patch,\n id: spec.id,\n createdAt: spec.createdAt,\n updatedAt: Date.now(),\n };\n await this.save(updated);\n return updated;\n }\n\n private filePath(id: string): string {\n return path.join(this.baseDir, `${id}.json`);\n }\n\n private async readIndex(): Promise<SpecIndex> {\n try {\n const raw = await fsp.readFile(this.indexPath, 'utf8');\n const parsed = JSON.parse(raw) as SpecIndex;\n if (parsed?.version === 1) return parsed;\n } catch {\n /* no index yet */\n }\n return { version: 1, entries: [] };\n }\n\n private async updateIndex(spec: Specification): Promise<void> {\n const index = await this.readIndex();\n const entry: SpecIndexEntry = {\n id: spec.id,\n title: spec.title,\n version: spec.version,\n status: spec.status,\n updatedAt: spec.updatedAt,\n filePath: this.filePath(spec.id),\n };\n const idx = index.entries.findIndex((e) => e.id === spec.id);\n if (idx >= 0) {\n index.entries[idx] = entry;\n } else {\n index.entries.push(entry);\n }\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n\n private async removeFromIndex(id: string): Promise<void> {\n const index = await this.readIndex();\n index.entries = index.entries.filter((e) => e.id !== id);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\n\nexport interface TaskGraphStoreOptions {\n /** Directory where task graph files are stored. Defaults to `.wrongstack/task-graphs`. */\n baseDir: string;\n}\n\nexport interface TaskGraphIndexEntry {\n id: string;\n specId: string;\n title: string;\n nodeCount: number;\n completedCount: number;\n updatedAt: number;\n filePath: string;\n}\n\ninterface TaskGraphIndex {\n version: 1;\n entries: TaskGraphIndexEntry[];\n}\n\n/**\n * JSON serialisation helpers for TaskGraph (Map → Array round-trip).\n */\nfunction graphToJSON(graph: TaskGraph): string {\n const serialisable = {\n ...graph,\n nodes: Array.from(graph.nodes.entries()),\n };\n return JSON.stringify(serialisable, null, 2);\n}\n\nfunction graphFromJSON(raw: string): TaskGraph {\n const parsed = JSON.parse(raw) as Omit<TaskGraph, 'nodes'> & { nodes: [string, TaskNode][] };\n return {\n ...parsed,\n nodes: new Map(parsed.nodes),\n };\n}\n\n/**\n * File-backed task graph storage. Each graph is a JSON file under `baseDir/`.\n * An index file (`_index.json`) tracks all graphs for fast listing.\n */\nexport class TaskGraphStore {\n private readonly baseDir: string;\n private readonly indexPath: string;\n\n constructor(opts: TaskGraphStoreOptions) {\n this.baseDir = opts.baseDir;\n this.indexPath = path.join(this.baseDir, '_index.json');\n }\n\n async save(graph: TaskGraph): Promise<void> {\n await ensureDir(this.baseDir);\n const filePath = this.filePath(graph.id);\n await atomicWrite(filePath, graphToJSON(graph), { mode: 0o600 });\n await this.updateIndex(graph);\n }\n\n async load(id: string): Promise<TaskGraph | null> {\n try {\n const raw = await fsp.readFile(this.filePath(id), 'utf8');\n return graphFromJSON(raw);\n } catch {\n return null;\n }\n }\n\n async list(): Promise<TaskGraphIndexEntry[]> {\n const index = await this.readIndex();\n return index.entries.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async delete(id: string): Promise<boolean> {\n try {\n await fsp.unlink(this.filePath(id));\n await this.removeFromIndex(id);\n return true;\n } catch {\n return false;\n }\n }\n\n async exists(id: string): Promise<boolean> {\n try {\n await fsp.access(this.filePath(id));\n return true;\n } catch {\n return false;\n }\n }\n\n private filePath(id: string): string {\n return path.join(this.baseDir, `${id}.json`);\n }\n\n private async readIndex(): Promise<TaskGraphIndex> {\n try {\n const raw = await fsp.readFile(this.indexPath, 'utf8');\n const parsed = JSON.parse(raw) as TaskGraphIndex;\n if (parsed?.version === 1) return parsed;\n } catch {\n /* no index yet */\n }\n return { version: 1, entries: [] };\n }\n\n private async updateIndex(graph: TaskGraph): Promise<void> {\n const index = await this.readIndex();\n const completedCount = Array.from(graph.nodes.values()).filter(\n (n) => n.status === 'completed',\n ).length;\n const entry: TaskGraphIndexEntry = {\n id: graph.id,\n specId: graph.specId,\n title: graph.title,\n nodeCount: graph.nodes.size,\n completedCount,\n updatedAt: graph.updatedAt,\n filePath: this.filePath(graph.id),\n };\n const idx = index.entries.findIndex((e) => e.id === graph.id);\n if (idx >= 0) {\n index.entries[idx] = entry;\n } else {\n index.entries.push(entry);\n }\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n\n private async removeFromIndex(id: string): Promise<void> {\n const index = await this.readIndex();\n index.entries = index.entries.filter((e) => e.id !== id);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n}\n","/**\n * SDD live board model.\n *\n * A board snapshot is the canonical, surface-agnostic projection of a running\n * (or persisted) SDD TaskGraph: tasks laid into topological dependency columns,\n * each carrying its short id, status, blockers and the agent currently on it.\n * The projector (sdd-board-projector.ts) emits these over the EventBus and\n * persists them (sdd-board-store.ts); every surface (WebUI/TUI) renders the\n * same shape.\n */\n\nimport type { TaskGraph, TaskNode, TaskProgress } from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\n\nexport type SddBoardStatus =\n | 'idle'\n | 'running'\n | 'paused'\n | 'stopped'\n | 'completed'\n | 'failed'\n | 'deadlocked';\n\n/**\n * FORGE-style display status: `queued` = pending with all blockers done;\n * `cancelled` = a task the user stopped (stored as a terminal `failed` node\n * carrying `metadata.cancelled`, surfaced distinctly so it doesn't read as an\n * error). Display-only — not a core `TaskStatus`.\n */\nexport type SddTaskDisplayStatus = TaskNode['status'] | 'queued' | 'cancelled';\n\nexport interface SddBoardTask {\n id: string;\n /** Stable short id (t01, t02, …) in creation order. */\n shortId: string;\n title: string;\n description: string;\n status: TaskNode['status'];\n displayStatus: SddTaskDisplayStatus;\n priority: TaskNode['priority'];\n type: TaskNode['type'];\n /** Short ids of the tasks that block this one (depends_on edges). */\n deps: string[];\n /** Worker on the task right now (scientist nickname), if any. */\n agentName?: string | undefined;\n /** Git worktree branch this task runs in, when isolated. */\n worktreeBranch?: string | undefined;\n startedAt?: number | undefined;\n completedAt?: number | undefined;\n retries: number;\n /** Per-task model assignment (overrides the run default), if set. */\n model?: string | undefined;\n /** Per-task provider assignment (overrides the run default), if set. */\n provider?: string | undefined;\n /** Per-task fallback model chain (overrides the run default), if set. */\n fallbackModels?: string[] | undefined;\n /** Per-task completion-gate verification command, if set. */\n verificationCommand?: string | undefined;\n}\n\n/** A topological column: tasks whose deepest dependency chain is `depth`. */\nexport interface SddBoardColumn {\n label: string;\n /** Short ids of the tasks in this column (join against `tasks`). */\n taskIds: string[];\n}\n\nexport interface SddDeadlockChain {\n /** Short id of the blocked task. */\n blocked: string;\n /** Short ids of the failed/incomplete blockers holding it. */\n blockedBy: string[];\n}\n\n/** One entry in the live activity feed (the board's \"what just happened\" ticker). */\nexport interface SddBoardFeedEntry {\n ts: number;\n kind:\n | 'started'\n | 'completed'\n | 'failed'\n | 'retrying'\n | 'wave'\n | 'deadlock'\n | 'verification_failed'\n | 'conflict'\n | 'split'\n | 'supervisor';\n /** Short id of the task this entry concerns, when applicable. */\n taskShortId?: string | undefined;\n /** Worker involved, when applicable. */\n agentName?: string | undefined;\n /** Human-readable one-line summary. */\n text: string;\n}\n\nexport interface SddBoardSnapshot {\n runId: string;\n specId?: string | undefined;\n graphId: string;\n title: string;\n status: SddBoardStatus;\n startedAt: number;\n updatedAt: number;\n progress: TaskProgress;\n /** Current wave index (0-based) of the parallel run. */\n wave: number;\n tasks: SddBoardTask[];\n columns: SddBoardColumn[];\n diagnostics?: { deadlockChains?: SddDeadlockChain[] } | undefined;\n /** Live activity feed — most recent first (capped). */\n feed?: SddBoardFeedEntry[] | undefined;\n /** Run-level default worker model (task overrides take precedence). */\n defaultModel?: string | undefined;\n /** Run-level default worker provider. */\n defaultProvider?: string | undefined;\n /** Run-level default fallback model chain. */\n fallbackModels?: string[] | undefined;\n /** Base branch the run's squash commits land on (worktree runs only). */\n baseBranch?: string | undefined;\n /**\n * Squash commits the run landed on the base branch, in landing order. Lets a\n * post-run `/sdd rollback` revert them from disk after the live run is gone.\n */\n mergedCommits?: Array<{ taskId: string; sha: string; title: string }> | undefined;\n}\n\n/**\n * Lay a TaskGraph's nodes into topological dependency columns with stable short\n * ids and per-task blocker refs. Shared by the projector (live) and any static\n * board browser. Pure; no run state — `agentName`/`worktreeBranch`/`retries`\n * are read from the node's `assignee`/`metadata` so a reload reflects the last\n * persisted run.\n */\n/**\n * Stable short-id map (t01, t02, …) for a graph's nodes in creation order.\n * Shared by the board renderer and the projector (deadlock-chain labelling).\n */\nexport function shortIdMap(graph: TaskGraph): Map<string, string> {\n const nodes = Array.from(graph.nodes.values()).sort((a, b) => a.createdAt - b.createdAt);\n const m = new Map<string, string>();\n nodes.forEach((n, i) => {\n m.set(n.id, `t${String(i + 1).padStart(2, '0')}`);\n });\n return m;\n}\n\nexport function buildBoardTasks(graph: TaskGraph): {\n tasks: SddBoardTask[];\n columns: SddBoardColumn[];\n} {\n const nodes = Array.from(graph.nodes.values()).sort((a, b) => a.createdAt - b.createdAt);\n const shortId = shortIdMap(graph);\n\n // Blockers per node (depends_on edges pointing at the node).\n const blockers = new Map<string, string[]>();\n for (const n of nodes) blockers.set(n.id, []);\n for (const e of graph.edges) {\n if (e.type === 'depends_on') blockers.get(e.to)?.push(e.from);\n }\n\n const statusOf = (id: string) => graph.nodes.get(id)?.status;\n\n // Memoized topological depth (longest blocker chain), cycle-guarded.\n const depthCache = new Map<string, number>();\n const depthOf = (id: string, seen = new Set<string>()): number => {\n const cached = depthCache.get(id);\n if (cached !== undefined) return cached;\n if (seen.has(id)) return 0;\n seen.add(id);\n const deps = blockers.get(id) ?? [];\n const d = deps.length === 0 ? 0 : 1 + Math.max(...deps.map((b) => depthOf(b, seen)));\n depthCache.set(id, d);\n return d;\n };\n\n const toTask = (n: TaskNode): SddBoardTask => {\n const deps = blockers.get(n.id) ?? [];\n const allDepsDone = deps.every((b) => statusOf(b) === 'completed');\n const meta = (n.metadata ?? {}) as Record<string, unknown>;\n const cancelled = Boolean(meta['cancelled']);\n const displayStatus: SddTaskDisplayStatus = cancelled\n ? 'cancelled'\n : n.status === 'pending' && deps.length > 0 && allDepsDone\n ? 'queued'\n : n.status;\n return {\n id: n.id,\n shortId: shortId.get(n.id) ?? n.id.slice(0, 6),\n title: n.title,\n description: n.description,\n status: n.status,\n displayStatus,\n priority: n.priority,\n type: n.type,\n deps: deps.map((b) => shortId.get(b) ?? b.slice(0, 6)),\n agentName: n.assignee,\n worktreeBranch: typeof meta['worktreeBranch'] === 'string' ? (meta['worktreeBranch'] as string) : undefined,\n startedAt: n.startedAt,\n completedAt: n.completedAt,\n retries: typeof meta['retries'] === 'number' ? (meta['retries'] as number) : 0,\n model: typeof meta['model'] === 'string' ? (meta['model'] as string) : undefined,\n provider: typeof meta['provider'] === 'string' ? (meta['provider'] as string) : undefined,\n fallbackModels: Array.isArray(meta['fallbackModels']) ? (meta['fallbackModels'] as string[]) : undefined,\n verificationCommand:\n typeof meta['verificationCommand'] === 'string' ? (meta['verificationCommand'] as string) : undefined,\n };\n };\n\n const tasks = nodes.map(toTask);\n\n const byDepth = new Map<number, string[]>();\n for (const n of nodes) {\n const d = depthOf(n.id);\n if (!byDepth.has(d)) byDepth.set(d, []);\n byDepth.get(d)?.push(shortId.get(n.id) ?? n.id.slice(0, 6));\n }\n const columns: SddBoardColumn[] = [...byDepth.keys()]\n .sort((a, b) => a - b)\n .map((d) => ({ label: d === 0 ? 'Start' : `Phase ${d}`, taskIds: byDepth.get(d) ?? [] }));\n\n return { tasks, columns };\n}\n\n/**\n * Build a full board snapshot from a graph + run state. The projector calls\n * this on every (throttled) change.\n */\nexport function buildBoardSnapshot(\n graph: TaskGraph,\n run: {\n runId: string;\n specId?: string | undefined;\n status: SddBoardStatus;\n startedAt: number;\n wave: number;\n deadlockChains?: SddDeadlockChain[] | undefined;\n defaultModel?: string | undefined;\n defaultProvider?: string | undefined;\n fallbackModels?: string[] | undefined;\n baseBranch?: string | undefined;\n mergedCommits?: Array<{ taskId: string; sha: string; title: string }> | undefined;\n },\n now: number,\n): SddBoardSnapshot {\n const { tasks, columns } = buildBoardTasks(graph);\n return {\n runId: run.runId,\n specId: run.specId,\n graphId: graph.id,\n title: graph.title,\n status: run.status,\n startedAt: run.startedAt,\n updatedAt: now,\n progress: computeTaskProgress(graph),\n wave: run.wave,\n tasks,\n columns,\n diagnostics: run.deadlockChains?.length ? { deadlockChains: run.deadlockChains } : undefined,\n defaultModel: run.defaultModel,\n defaultProvider: run.defaultProvider,\n fallbackModels: run.fallbackModels,\n baseBranch: run.baseBranch,\n mergedCommits: run.mergedCommits?.length ? run.mergedCommits : undefined,\n };\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { SddBoardSnapshot } from './board-types.js';\n\nexport interface SddBoardStoreOptions {\n /** Directory for board snapshots + event logs (wpaths.projectSddBoards). */\n baseDir: string;\n}\n\nexport interface SddBoardIndexEntry {\n runId: string;\n specId?: string | undefined;\n title: string;\n status: string;\n total: number;\n completed: number;\n updatedAt: number;\n}\n\ninterface SddBoardIndex {\n version: 1;\n entries: SddBoardIndexEntry[];\n}\n\n/** One appended line in a board's JSONL event log. */\nexport interface SddBoardEvent {\n ts: number;\n type: string;\n payload?: unknown;\n}\n\n/**\n * File-backed SDD board storage. Each board (= one parallel run) has:\n * - `<runId>.json` — latest full snapshot (atomic; resume + standalone-webui mirror)\n * - `<runId>.events.jsonl`— append-only event log (audit / replay)\n * - `<runId>.control.jsonl` — append-only command queue (cross-process control, written by readers)\n * plus `_index.json` for fast listing. JSON for state, JSONL for streams.\n */\nexport class SddBoardStore {\n private readonly baseDir: string;\n private readonly indexPath: string;\n\n constructor(opts: SddBoardStoreOptions) {\n this.baseDir = opts.baseDir;\n this.indexPath = path.join(this.baseDir, '_index.json');\n }\n\n snapshotPath(runId: string): string {\n return path.join(this.baseDir, `${this.safe(runId)}.json`);\n }\n eventsPath(runId: string): string {\n return path.join(this.baseDir, `${this.safe(runId)}.events.jsonl`);\n }\n controlPath(runId: string): string {\n return path.join(this.baseDir, `${this.safe(runId)}.control.jsonl`);\n }\n\n async saveSnapshot(snapshot: SddBoardSnapshot): Promise<void> {\n await ensureDir(this.baseDir);\n await atomicWrite(this.snapshotPath(snapshot.runId), JSON.stringify(snapshot, null, 2), {\n mode: 0o600,\n });\n await this.updateIndex(snapshot);\n }\n\n async load(runId: string): Promise<SddBoardSnapshot | null> {\n try {\n const raw = await fsp.readFile(this.snapshotPath(runId), 'utf8');\n return JSON.parse(raw) as SddBoardSnapshot;\n } catch {\n return null;\n }\n }\n\n async list(): Promise<SddBoardIndexEntry[]> {\n const index = await this.readIndex();\n return index.entries.sort((a, b) => b.updatedAt - a.updatedAt);\n }\n\n async loadLatestForSpec(specId: string): Promise<SddBoardSnapshot | null> {\n const entry = (await this.list()).find((e) => e.specId === specId);\n return entry ? this.load(entry.runId) : null;\n }\n\n /** Append one line to the board's JSONL event log (best-effort, never throws). */\n async appendEvent(runId: string, event: SddBoardEvent): Promise<void> {\n try {\n await ensureDir(this.baseDir);\n await fsp.appendFile(this.eventsPath(runId), `${JSON.stringify(event)}\\n`, { mode: 0o600 });\n } catch {\n /* event log is best-effort */\n }\n }\n\n /** Append a control command (used by readers to steer a CLI-owned run). */\n async appendControl(runId: string, command: { ts: number; type: string; payload?: unknown }): Promise<void> {\n await ensureDir(this.baseDir);\n await fsp.appendFile(this.controlPath(runId), `${JSON.stringify(command)}\\n`, { mode: 0o600 });\n }\n\n /** Read + truncate the control queue (the run drains it). Returns parsed commands. */\n async drainControl(runId: string): Promise<Array<{ ts: number; type: string; payload?: unknown }>> {\n const p = this.controlPath(runId);\n let raw: string;\n try {\n raw = await fsp.readFile(p, 'utf8');\n } catch {\n return [];\n }\n try {\n await fsp.writeFile(p, '', { mode: 0o600 });\n } catch {\n /* ignore truncate failure */\n }\n return raw\n .split('\\n')\n .filter((l) => l.trim())\n .map((l) => {\n try {\n return JSON.parse(l) as { ts: number; type: string; payload?: unknown };\n } catch {\n return null;\n }\n })\n .filter((c): c is { ts: number; type: string; payload?: unknown } => c !== null);\n }\n\n async delete(runId: string): Promise<void> {\n await Promise.allSettled([\n fsp.unlink(this.snapshotPath(runId)),\n fsp.unlink(this.eventsPath(runId)),\n fsp.unlink(this.controlPath(runId)),\n ]);\n await this.removeFromIndex(runId);\n }\n\n // ── internal ────────────────────────────────────────────────────────────\n\n private safe(runId: string): string {\n return runId.replace(/[^a-zA-Z0-9._-]/g, '_');\n }\n\n private async readIndex(): Promise<SddBoardIndex> {\n try {\n const raw = await fsp.readFile(this.indexPath, 'utf8');\n const parsed = JSON.parse(raw) as SddBoardIndex;\n if (parsed?.version === 1) return parsed;\n } catch {\n /* no index yet */\n }\n return { version: 1, entries: [] };\n }\n\n private async updateIndex(snapshot: SddBoardSnapshot): Promise<void> {\n const index = await this.readIndex();\n const entry: SddBoardIndexEntry = {\n runId: snapshot.runId,\n specId: snapshot.specId,\n title: snapshot.title,\n status: snapshot.status,\n total: snapshot.progress.total,\n completed: snapshot.progress.completed,\n updatedAt: snapshot.updatedAt,\n };\n const idx = index.entries.findIndex((e) => e.runId === snapshot.runId);\n if (idx >= 0) index.entries[idx] = entry;\n else index.entries.push(entry);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n\n private async removeFromIndex(runId: string): Promise<void> {\n const index = await this.readIndex();\n index.entries = index.entries.filter((e) => e.runId !== runId);\n await atomicWrite(this.indexPath, JSON.stringify(index, null, 2), { mode: 0o600 });\n }\n}\n","/**\n * SddBoardProjector\n *\n * Composes a live SDD board snapshot from a running graph and streams it to\n * every surface. It subscribes to `TaskTracker` mutations (the source of truth\n * for task state) plus the run's `sdd.*` lifecycle events (status / wave /\n * deadlock), and on each change — throttled — rebuilds a `SddBoardSnapshot`,\n * emits `sdd.board.snapshot` on the EventBus, persists it (JSON) and appends the\n * triggering event to the board's JSONL log.\n *\n * The graph is the single source of truth: task status/assignee/worktree live\n * on the nodes (the run mutates them through the tracker), so the projector\n * mostly re-derives the snapshot and only tracks run-level status/wave/deadlock.\n */\nimport type { EventBus, EventMap } from '../kernel/events.js';\nimport type { TaskGraph } from '../types/task-graph.js';\nimport type { TaskTracker } from './task-tracker.js';\nimport {\n buildBoardSnapshot,\n shortIdMap,\n type SddBoardFeedEntry,\n type SddBoardStatus,\n type SddDeadlockChain,\n} from './board-types.js';\nimport type { SddBoardStore } from './sdd-board-store.js';\n\nexport interface SddBoardProjectorOptions {\n runId: string;\n graph: TaskGraph;\n tracker: TaskTracker;\n events: EventBus;\n /** Parent session id for emitted `sdd.board.snapshot` events. */\n sessionId?: string | (() => string | undefined) | undefined;\n /** Persist snapshots + JSONL events (optional — omit for in-memory only). */\n store?: SddBoardStore | undefined;\n specId?: string | undefined;\n /** Run-level default worker model/provider/fallbacks (shown in the board header). */\n defaultModel?: string | undefined;\n defaultProvider?: string | undefined;\n fallbackModels?: string[] | undefined;\n /** Base branch the run's squash commits land on (for the board + rollback). */\n baseBranch?: string | undefined;\n /** Snapshot coalescing window in ms (default 250). */\n throttleMs?: number | undefined;\n /** Clock injection for tests; defaults to Date.now. */\n now?: (() => number) | undefined;\n}\n\nexport class SddBoardProjector {\n private readonly o: SddBoardProjectorOptions;\n private readonly now: () => number;\n private readonly throttleMs: number;\n private readonly shortId: Map<string, string>;\n\n private status: SddBoardStatus = 'idle';\n private wave = 0;\n private startedAt: number;\n private deadlockChains: SddDeadlockChain[] = [];\n /** Live activity feed, most recent first (capped). */\n private feed: SddBoardFeedEntry[] = [];\n private static readonly FEED_CAP = 60;\n private finished = false;\n private runDeadlocked = false;\n private runStopped = false;\n /** Squash commits the run landed on the base branch (for post-run rollback). */\n private mergedCommits: Array<{ taskId: string; sha: string; title: string }> = [];\n /** Base branch reported by the run at start (overrides the constructor option). */\n private runBaseBranch: string | undefined;\n\n private dirty = false;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly unsubs: Array<() => void> = [];\n /** Tail of in-flight persistence, so callers can await a settled state. */\n private lastSave: Promise<void> = Promise.resolve();\n\n constructor(opts: SddBoardProjectorOptions) {\n this.o = opts;\n this.now = opts.now ?? Date.now;\n this.throttleMs = opts.throttleMs ?? 250;\n this.shortId = shortIdMap(opts.graph);\n this.startedAt = this.now();\n\n // Source of truth: any task mutation redraws the board.\n this.unsubs.push(opts.tracker.subscribe(() => this.markDirty()));\n\n // Run lifecycle → status/wave/deadlock + JSONL audit.\n this.onRun('sdd.run.started', (e) => {\n this.status = 'running';\n this.startedAt = this.now();\n if (e.baseBranch) this.runBaseBranch = e.baseBranch;\n this.markDirty();\n });\n this.onRun('sdd.run.finished', (e) => {\n this.finished = true;\n this.runDeadlocked = e.deadlocked;\n this.runStopped = e.stopped;\n this.flush(); // final snapshot persists synchronously\n });\n this.onRun('sdd.wave', (e) => {\n this.wave = e.wave;\n this.pushFeed({ ts: this.now(), kind: 'wave', text: `Wave ${e.wave + 1} started · ${e.batchSize} task(s) in parallel` });\n this.markDirty();\n });\n this.onRun('sdd.deadlock', (e) => {\n this.deadlockChains = e.chains.map((c) => ({\n blocked: this.shortId.get(c.blocked) ?? c.blocked.slice(0, 6),\n blockedBy: c.blockedBy.map((b) => this.shortId.get(b) ?? b.slice(0, 6)),\n }));\n this.pushFeed({ ts: this.now(), kind: 'deadlock', text: `Deadlock — ${e.chains.length} task(s) blocked by failed work` });\n this.markDirty();\n });\n // Task lifecycle → live activity feed (task STATE comes from the tracker,\n // which already triggers a redraw; here we narrate \"what just happened\").\n this.onRun('sdd.task.started', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'started',\n taskShortId: sid,\n agentName: e.agentName,\n text: `${e.agentName || 'a worker'} picked up ${sid ?? 'a task'}${this.titleOf(e.taskId)}`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.completed', (e) => {\n const sid = this.shortId.get(e.taskId);\n const agent = this.assigneeOf(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'completed',\n taskShortId: sid,\n agentName: agent,\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} completed${agent ? ` by ${agent}` : ''} · ${(e.durationMs / 1000).toFixed(1)}s`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.failed', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'failed',\n taskShortId: sid,\n agentName: this.assigneeOf(e.taskId),\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} failed — ${e.error}`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.retrying', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'retrying',\n taskShortId: sid,\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} retrying (${e.attempt}/${e.maxRetries})`,\n });\n this.markDirty();\n });\n // Robustness events (completion gate / merge / supervisor / split) — narrate\n // \"why a task didn't just sail to done\" so the board never silently hides a\n // gate rejection, conflict, or supervisor verdict.\n this.onRun('sdd.task.verification_failed', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'verification_failed',\n taskShortId: sid,\n agentName: this.assigneeOf(e.taskId),\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} failed verification — ${e.reason}`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.conflict', (e) => {\n const sid = this.shortId.get(e.taskId);\n const files = e.conflictFiles.length;\n this.pushFeed({\n ts: this.now(),\n kind: 'conflict',\n taskShortId: sid,\n agentName: this.assigneeOf(e.taskId),\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} merge conflict — ${files} file(s)${files ? `: ${e.conflictFiles.slice(0, 3).join(', ')}${files > 3 ? '…' : ''}` : ''}`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.merged', (e) => {\n // Persist the run commit so a post-run rollback can revert it off disk.\n const title = this.o.graph.nodes.get(e.taskId)?.title ?? '';\n this.mergedCommits.push({ taskId: e.taskId, sha: e.sha, title });\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'completed',\n taskShortId: sid,\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} merged → ${this.runBaseBranch ?? this.o.baseBranch ?? 'base'} (${e.sha.slice(0, 8)})`,\n });\n this.markDirty();\n });\n this.onRun('sdd.task.split', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'split',\n taskShortId: sid,\n text: `${sid ?? 'task'}${this.titleOf(e.taskId)} split into ${e.subtaskIds.length} sub-task(s)`,\n });\n this.markDirty();\n });\n this.onRun('sdd.supervisor.decision', (e) => {\n const sid = this.shortId.get(e.taskId);\n this.pushFeed({\n ts: this.now(),\n kind: 'supervisor',\n taskShortId: sid,\n text: `supervisor → ${e.action} for ${sid ?? 'task'}${this.titleOf(e.taskId)}${e.rationale ? ` (${e.rationale})` : ''}`,\n });\n this.markDirty();\n });\n }\n\n private pushFeed(entry: SddBoardFeedEntry): void {\n this.feed.unshift(entry);\n if (this.feed.length > SddBoardProjector.FEED_CAP) this.feed.length = SddBoardProjector.FEED_CAP;\n }\n\n /** ` (title…)` suffix for a feed line, or '' when the node/title is missing. */\n private titleOf(taskId: string): string {\n const t = this.o.graph.nodes.get(taskId)?.title;\n if (!t) return '';\n return ` (${t.length > 40 ? `${t.slice(0, 39)}…` : t})`;\n }\n\n private assigneeOf(taskId: string): string | undefined {\n return this.o.graph.nodes.get(taskId)?.assignee;\n }\n\n /** Latest snapshot, built on demand (e.g. for a late-joining client). */\n snapshot() {\n return this.build();\n }\n\n /** Resolve once all in-flight snapshot persistence has settled. */\n async drain(): Promise<void> {\n await this.lastSave;\n }\n\n /** Stop projecting and release subscriptions. */\n dispose(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n for (const u of this.unsubs) u();\n this.unsubs.length = 0;\n }\n\n // ── internal ────────────────────────────────────────────────────────────\n\n /** Subscribe to a run event scoped to this run id; also append to JSONL. */\n private onRun<K extends keyof EventMap>(event: K, handler: (e: EventMap[K]) => void): void {\n const wrapped = (e: EventMap[K]) => {\n if ((e as { runId?: string }).runId !== this.o.runId) return;\n void this.o.store?.appendEvent(this.o.runId, { ts: this.now(), type: event, payload: e });\n handler(e);\n };\n const off = this.o.events.on(event, wrapped as (p: EventMap[K]) => void);\n this.unsubs.push(off);\n }\n\n private resolveStatus(completed: number, total: number): SddBoardStatus {\n if (!this.finished) return this.status;\n if (this.runDeadlocked) return 'deadlocked';\n if (total > 0 && completed >= total) return 'completed';\n // A user-stopped run is a TERMINAL 'stopped' — distinct from a live 'paused'\n // run (which is still resumable). Surfaces must treat 'stopped' as inactive\n // so the post-run lifecycle controls (clean / rollback / destroy) apply.\n if (this.runStopped) return 'stopped';\n return 'failed';\n }\n\n private build() {\n const snap = buildBoardSnapshot(\n this.o.graph,\n {\n runId: this.o.runId,\n specId: this.o.specId,\n status: 'running',\n startedAt: this.startedAt,\n wave: this.wave,\n deadlockChains: this.deadlockChains,\n defaultModel: this.o.defaultModel,\n defaultProvider: this.o.defaultProvider,\n fallbackModels: this.o.fallbackModels,\n baseBranch: this.runBaseBranch ?? this.o.baseBranch,\n mergedCommits: this.mergedCommits,\n },\n this.now(),\n );\n snap.status = this.resolveStatus(snap.progress.completed, snap.progress.total);\n snap.feed = this.feed.slice(0, SddBoardProjector.FEED_CAP);\n return snap;\n }\n\n private markDirty(): void {\n this.dirty = true;\n if (this.timer || this.finished) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n if (this.dirty) this.flush();\n }, this.throttleMs);\n }\n\n private flush(): void {\n this.dirty = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n const snap = this.build();\n const sessionId = this.currentSessionId();\n this.o.events.emit('sdd.board.snapshot', {\n ...(sessionId ? { sessionId } : {}),\n runId: this.o.runId,\n snapshot: snap,\n });\n if (this.o.store) {\n // Serialize writes (no two snapshots race on the same file) and swallow\n // persistence errors — a live stream must never crash on a disk hiccup.\n const store = this.o.store;\n this.lastSave = this.lastSave.then(() => store.saveSnapshot(snap)).catch(() => {});\n }\n }\n\n private currentSessionId(): string | undefined {\n const value =\n typeof this.o.sessionId === 'function'\n ? this.o.sessionId()\n : this.o.sessionId;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\n}\n","import type { SddBoardSnapshot } from './board-types.js';\nimport type { SddSubtaskSpec } from './sdd-parallel-run.js';\n\n/**\n * Control surface over a live SDD run, exposed to every steering surface\n * (TUI, CLI-hosted WebUI in-process; standalone WebUI via a control file the\n * run drains). The run itself stays CLI-owned — this is the only sanctioned\n * way to pause / retry / reassign from outside the run loop.\n */\nexport interface SddRunControl {\n runId: string;\n specId?: string | undefined;\n pause(): void;\n resume(): void;\n stop(): void;\n retryTask(taskId: string): boolean;\n /** Requeue every failed task to pending (board \"Retry all failed\"). Returns the count. */\n retryAllFailed(): number;\n reassignTask(taskId: string, agentName: string): boolean;\n /** Set/override a task's worker model (+ optional provider). Next dispatch. */\n setTaskModel(taskId: string, model: string | undefined, provider?: string | undefined): boolean;\n /** Set/override a task's fallback model chain. Next dispatch. */\n setTaskFallbacks(taskId: string, fallbackModels: string[] | undefined): boolean;\n /** Set/override a task's completion-gate verification command. Next dispatch. */\n setTaskVerification(taskId: string, verificationCommand: string | undefined): boolean;\n /** Cancel a task — abort it if running, else mark it cancelled. */\n cancelTask(taskId: string): Promise<boolean> | boolean;\n /** Delete a not-started task from the graph (refused while running). */\n deleteTask(taskId: string): boolean;\n /** Split a task into sub-tasks (refused while running). Returns the new leaf ids. */\n splitTask(taskId: string, subtasks: SddSubtaskSpec[]): string[];\n /**\n * Remove every git worktree + branch the run created (refused while running —\n * stop first). Returns the number removed.\n */\n cleanupWorktrees(): Promise<number>;\n /**\n * Undo the run's merged commits by reverting each on the base branch (refused\n * while running). History-preserving; refuses on a dirty tree / revert conflict.\n */\n rollback(): Promise<{ ok: boolean; reverted: number; reason?: string }>;\n /** Base branch the run's squash commits land on (worktree runs only). */\n getBaseBranch(): string | undefined;\n /** Squash commits the run landed on the base branch, in landing order. */\n getMergedCommits(): ReadonlyArray<{ taskId: string; sha: string; title: string }>;\n /** Latest board snapshot (built on demand). */\n snapshot(): SddBoardSnapshot;\n isRunning(): boolean;\n}\n\n/**\n * In-process registry of the active SDD run. One run is active at a time (a\n * single fleet drives it); a new run replaces the previous. Lives in the CLI\n * process where the fleet runs.\n */\nexport class SddRunRegistry {\n private current: SddRunControl | null = null;\n\n register(control: SddRunControl): void {\n this.current = control;\n }\n\n clear(runId: string): void {\n if (this.current?.runId === runId) this.current = null;\n }\n\n getActive(): SddRunControl | null {\n return this.current;\n }\n}\n","import { expectDefined } from '../utils/expect-defined.js';\nimport { toErrorMessage } from '../utils/error.js';\nimport type { Specification, SpecRequirement, SpecSection } from '../types/spec.js';\nimport type { SpecStore } from './spec-store.js';\nimport { SddError, ERROR_CODES } from '../types/errors.js';\n\n// ─── Session Types ────────────────────────────────────────────────────────────\n\nexport type AISpecPhase =\n | 'questioning' // AI is asking questions\n | 'spec_review' // Spec generated, waiting for user approval\n | 'implementation' // Implementation plan phase\n | 'task_review' // Tasks generated, waiting for execution\n | 'executing' // Running tasks\n | 'done'; // Everything complete\n\nexport interface CollectedAnswer {\n question: string;\n answer: string;\n timestamp: number;\n}\n\nexport interface AISpecSession {\n id: string;\n phase: AISpecPhase;\n title: string;\n userIntent: string;\n projectContext: string;\n answers: CollectedAnswer[];\n questionCount: number;\n spec?: Specification | undefined;\n implementation?: string | undefined;\n taskGraphId?: string | undefined;\n approved: boolean;\n createdAt: number;\n updatedAt: number;\n}\n\n// ─── Builder Options ──────────────────────────────────────────────────────────\n\nexport interface AISpecBuilderOptions {\n store: SpecStore;\n /** Minimum questions the AI should ask. Default: 2 */\n minQuestions?: number | undefined;\n /** Maximum questions before forcing spec generation. Default: 10 */\n maxQuestions?: number | undefined;\n /** Project context string (package.json, file structure, etc.) */\n projectContext?: string | undefined;\n /** Path to persist session state. If set, session survives process restarts. */\n sessionPath?: string | undefined;\n}\n\n// ─── AI Prompts ───────────────────────────────────────────────────────────────\n\nfunction buildQuestioningPrompt(session: AISpecSession, min: number, max: number): string {\n const answered = session.answers.length;\n const remaining = Math.max(0, min - answered);\n const budget = max - answered;\n\n const lines: string[] = [\n `═══ SDD Spec Builder ═══`,\n `Feature: \"${session.title}\"`,\n session.userIntent ? `Intent: ${session.userIntent}` : '',\n `Phase: Questioning (${answered} answered, ${budget} remaining budget)`,\n '',\n '**Instructions for AI:**',\n '',\n 'You are conducting a specification interview. Your job is to ask the user',\n 'intelligent, contextual questions to understand what they want to build.',\n '',\n `You have asked ${answered} questions so far.`,\n ];\n\n if (remaining > 0) {\n lines.push(`You MUST ask at least ${remaining} more question(s) before generating the spec.`);\n } else if (budget <= 0) {\n lines.push('You have reached the maximum question budget. Generate the spec NOW.');\n } else {\n lines.push(\n 'You may ask more questions if needed, or generate the spec if you have enough information.',\n 'Ask a question ONLY if it reveals something you genuinely need to know.',\n );\n }\n\n lines.push(\n '',\n '**Rules:**',\n '- Ask ONE question at a time',\n '- Questions must be specific and contextual — never generic',\n '- Adapt based on previous answers',\n '- Cover: scope, constraints, edge cases, integrations, security, performance as relevant',\n '- When you have enough info, respond with the full specification in JSON format',\n '- This is a planning interview: respond with TEXT ONLY (a question, or the spec JSON).',\n ' Do NOT write or edit files, and do NOT run shell/terminal commands — the code is',\n ' written later, after the plan is approved.',\n '',\n `**Question budget:** ${budget}/${max} remaining`,\n `**Minimum required:** ${remaining > 0 ? remaining : 'met'}`,\n );\n\n if (session.projectContext) {\n lines.push('', '**Project Context:**', '```', session.projectContext, '```');\n }\n\n if (answered > 0) {\n lines.push('', '**Conversation so far:**');\n for (let i = 0; i < answered; i++) {\n const a = expectDefined(session.answers[i]);\n lines.push(``, `Q${i + 1}: ${a.question}`, `A${i + 1}: ${a.answer}`);\n }\n }\n\n lines.push(\n '',\n '---',\n 'Now either:',\n `1. Ask your next question (if you need more info)`,\n `2. Generate the complete specification as JSON (if ready)`,\n '',\n 'If generating spec, output JSON inside ```json code block with this structure:',\n '```json',\n '{',\n ' \"title\": \"...\",',\n ' \"overview\": \"...\",',\n ' \"sections\": [{ \"type\": \"overview|requirements|architecture|api|data|security|acceptance\", \"title\": \"...\", \"content\": \"...\", \"level\": 1 }],',\n ' \"requirements\": [{ \"id\": \"REQ-1\", \"type\": \"functional|non-functional|security|performance|ux\", \"priority\": \"critical|high|medium|low\", \"description\": \"...\", \"acceptanceCriteria\": [\"...\"] }]',\n '}',\n '```',\n );\n\n return lines.filter(Boolean).join('\\n');\n}\n\nfunction buildSpecReviewPrompt(session: AISpecSession): string {\n const spec = session.spec;\n if (!spec) return 'No spec generated yet.';\n\n const reqSummary = spec.requirements\n .map((r) => ` [${r.priority}] ${r.description}`)\n .join('\\n');\n\n return [\n `═══ Spec Review ═══`,\n `Feature: \"${spec.title}\"`,\n `Requirements: ${spec.requirements.length}`,\n '',\n '**Specification:**',\n spec.overview,\n '',\n '**Requirements:**',\n reqSummary,\n '',\n '---',\n 'Approve this spec? The AI will then generate an implementation plan and tasks.',\n 'Say \"approve\" to proceed, or describe what needs to change.',\n ].join('\\n');\n}\n\nfunction buildImplementationPrompt(session: AISpecSession): string {\n const spec = session.spec;\n if (!spec) return 'No spec to implement.';\n\n const reqList = spec.requirements\n .map((r) => ` - [${r.priority}] ${r.description}`)\n .join('\\n');\n\n return [\n `═══ Implementation Planning ═══`,\n `Feature: \"${spec.title}\"`,\n `Requirements: ${spec.requirements.length}`,\n '',\n '**Requirements to implement:**',\n reqList,\n '',\n '**Instructions for AI:**',\n 'Generate a detailed implementation plan for this specification.',\n 'This is a PLANNING step — describe the plan and emit the task JSON as TEXT. Do NOT',\n 'create or edit files and do NOT run shell/terminal commands here; the tasks you list',\n 'are executed later, one by one, after you approve them.',\n 'Include:',\n '1. Architecture decisions',\n '2. File structure changes',\n '3. Key implementation details',\n '4. Dependency requirements',\n '5. Testing strategy',\n '',\n '**IMPORTANT:** After the plan, you MUST generate executable tasks as a JSON array.',\n 'Each task should be a concrete, actionable step. Output the JSON inside a ```json code block:',\n '```json',\n '[',\n ' {',\n ' \"id\": \"t1\",',\n ' \"title\": \"Create auth middleware\",',\n ' \"description\": \"Implement JWT verification middleware for protected routes\",',\n ' \"type\": \"feature\",',\n ' \"priority\": \"critical\",',\n ' \"estimateHours\": 3,',\n ' \"dependsOn\": [],',\n ' \"tags\": [\"auth\", \"middleware\"]',\n ' },',\n ' {',\n ' \"id\": \"t2\",',\n ' \"title\": \"Write auth tests\",',\n ' \"description\": \"Unit and integration tests for authentication flow\",',\n ' \"type\": \"test\",',\n ' \"priority\": \"high\",',\n ' \"estimateHours\": 2,',\n ' \"dependsOn\": [\"t1\"],',\n ' \"tags\": [\"test\", \"auth\"]',\n ' }',\n ']',\n '```',\n '',\n 'Rules:',\n '- Give every task a short stable \"id\" (t1, t2, …). Reference prerequisites in \"dependsOn\"',\n ' as a list of those ids — this builds the real dependency graph that drives parallel vs',\n ' sequential execution.',\n '- \"dependsOn\": [] means the task is independent and may run in parallel with other roots.',\n '- A task with dependsOn runs ONLY after every listed task completes. Model true ordering:',\n ' tests depend on the feature they test, docs/integration depend on the parts they cover.',\n '- Do NOT create cycles (t1→t2→t1). Keep chains as shallow as correctness allows so',\n ' independent work runs concurrently.',\n '- Use type: \"feature\" for code, \"test\" for tests, \"docs\" for documentation, \"chore\" for config',\n '- Use priority: \"critical\" for blockers, \"high\" for core features, \"medium\" for nice-to-haves, \"low\" for polish',\n ].join('\\n');\n}\n\nfunction buildTaskReviewPrompt(session: AISpecSession): string {\n return [\n `═══ Task Review ═══`,\n `Feature: \"${session.spec?.title ?? session.title}\"`,\n '',\n session.implementation ?? 'No implementation plan yet.',\n '',\n '---',\n 'Ready to execute these tasks? Say \"execute\" to begin, or describe changes needed.',\n ].join('\\n');\n}\n\nfunction buildExecutingPrompt(session: AISpecSession): string {\n return [\n `═══ Task Execution ═══`,\n `Feature: \"${session.spec?.title ?? session.title}\"`,\n '',\n '**Instructions for AI:**',\n 'Execute the tasks one by one in the order shown in the task list above.',\n '',\n 'For each task:',\n '1. Implement the code (create/modify files)',\n '2. Write tests if applicable',\n '3. After completing a task, tell the user to run: /sdd done <task number or title>',\n '4. Then move to the next task',\n '',\n '**Important:**',\n '- Focus on ONE task at a time',\n '- After completing each task, explicitly state what you did',\n '- Tell the user: \"Run /sdd done <N> to mark this task complete\"',\n '- Then proceed to the next task automatically',\n '- When ALL tasks are done, provide a summary of everything implemented',\n '',\n 'Start executing the first pending task now.',\n ].join('\\n');\n}\n\n// ─── Spec Builder Class ───────────────────────────────────────────────────────\n\n/**\n * AI-driven specification builder. Instead of static questions, this builder\n * tracks conversation state and generates prompts that instruct the AI agent\n * to ask contextual questions and build specifications interactively.\n */\nexport class AISpecBuilder {\n private session: AISpecSession;\n private readonly store: SpecStore;\n private readonly minQuestions: number;\n private readonly maxQuestions: number;\n private readonly sessionPath?: string | undefined;\n\n constructor(opts: AISpecBuilderOptions) {\n this.store = opts.store;\n this.minQuestions = opts.minQuestions ?? 2;\n this.maxQuestions = opts.maxQuestions ?? 10;\n this.sessionPath = opts.sessionPath;\n this.session = {\n id: crypto.randomUUID(),\n phase: 'questioning',\n title: '',\n userIntent: '',\n projectContext: opts.projectContext ?? '',\n answers: [],\n questionCount: 0,\n approved: false,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n }\n\n // ── Session Persistence ──────────────────────────────────────────────────\n\n /** Save session state to disk. */\n async saveSession(): Promise<void> {\n if (!this.sessionPath) return;\n try {\n const fsp = await import('node:fs/promises');\n const path = await import('node:path');\n const { atomicWrite } = await import('../utils/atomic-write.js');\n await fsp.mkdir(path.dirname(this.sessionPath), { recursive: true });\n // atomicWrite: torn save would corrupt the SDD session JSON and the\n // next load would silently fall back to a fresh session.\n await atomicWrite(this.sessionPath, JSON.stringify(this.session, null, 2));\n } catch {\n // Best-effort persistence — don't crash if save fails\n }\n }\n\n /** Load session state from disk. Returns true if a session was loaded. */\n async loadSession(): Promise<boolean> {\n if (!this.sessionPath) return false;\n try {\n const fsp = await import('node:fs/promises');\n const raw = await fsp.readFile(this.sessionPath, 'utf8');\n const loaded = JSON.parse(raw) as AISpecSession;\n // Validate basic structure\n if (loaded?.id && loaded?.phase && loaded?.title) {\n this.session = loaded;\n return true;\n }\n } catch {\n // No saved session or invalid file\n }\n return false;\n }\n\n /** Delete saved session from disk. */\n async deleteSession(): Promise<void> {\n if (!this.sessionPath) return;\n try {\n const fsp = await import('node:fs/promises');\n await fsp.unlink(this.sessionPath);\n } catch {\n // File might not exist\n }\n }\n\n /** Auto-save helper — calls saveSession() but never throws.\n * Failures are surfaced via process.emitWarning so a persistent\n * ENOSPC / EACCES doesn't silently strand session edits in memory. */\n private autoSave(): void {\n this.saveSession().catch((err) => {\n const detail = toErrorMessage(err);\n process.emitWarning(\n `SpecBuilder autoSave failed: ${detail}`,\n 'SpecBuilderWarning',\n );\n });\n }\n\n // ── Session Lifecycle ─────────────────────────────────────────────────────\n\n /** Start a new session with a title and optional intent. */\n startSession(title: string, intent?: string): void {\n this.session.title = title;\n this.session.userIntent = intent ?? '';\n this.session.phase = 'questioning';\n this.session.updatedAt = Date.now();\n this.autoSave();\n }\n\n /** Get current session state (readonly). */\n getSession(): Readonly<AISpecSession> {\n return { ...this.session };\n }\n\n /** Get the current phase. */\n getPhase(): AISpecPhase {\n return this.session.phase;\n }\n\n // ── AI Prompt Generation ──────────────────────────────────────────────────\n\n /**\n * Get the AI prompt for the current phase.\n * This prompt is injected into the conversation so the AI agent knows\n * what to do next (ask a question, generate a spec, etc.).\n */\n getAIPrompt(): string {\n switch (this.session.phase) {\n case 'questioning':\n return buildQuestioningPrompt(this.session, this.minQuestions, this.maxQuestions);\n case 'spec_review':\n return buildSpecReviewPrompt(this.session);\n case 'implementation':\n return buildImplementationPrompt(this.session);\n case 'task_review':\n return buildTaskReviewPrompt(this.session);\n case 'executing':\n return buildExecutingPrompt(this.session);\n case 'done':\n return 'All tasks completed. Specification is fully implemented.';\n }\n }\n\n // ── Answer Processing ─────────────────────────────────────────────────────\n\n /**\n * Record a question/answer pair from the AI conversation.\n * Call this when the AI asks a question and the user responds.\n */\n addAnswer(question: string, answer: string): void {\n this.session.answers.push({ question, answer, timestamp: Date.now() });\n this.session.questionCount++;\n this.session.updatedAt = Date.now();\n this.autoSave();\n }\n\n /**\n * Check if more questions should be asked.\n * Returns false if max reached or if the AI has signaled it has enough info.\n */\n shouldContinueQuestioning(): boolean {\n return this.session.questionCount < this.maxQuestions;\n }\n\n /**\n * Check if minimum questions have been asked.\n */\n hasMetMinimumQuestions(): boolean {\n return this.session.questionCount >= this.minQuestions;\n }\n\n // ── Phase Transitions ─────────────────────────────────────────────────────\n\n /**\n * Set the generated specification and move to spec_review phase.\n */\n setSpec(spec: Specification): void {\n this.session.spec = spec;\n this.session.phase = 'spec_review';\n this.session.updatedAt = Date.now();\n this.autoSave();\n }\n\n /**\n * Approve the current phase and advance to the next.\n * questioning → spec_review (requires spec to be set)\n * spec_review → implementation\n * implementation → task_review (requires implementation to be set)\n * task_review → executing\n * executing → done\n */\n approve(): AISpecPhase {\n switch (this.session.phase) {\n case 'questioning':\n if (!this.session.spec) {\n throw new SddError({\n message: 'Cannot approve: no spec generated yet.',\n code: ERROR_CODES.SDD_INVALID_STATE,\n context: { phase: 'questioning', sessionId: this.session.id },\n });\n }\n this.session.phase = 'spec_review';\n break;\n case 'spec_review':\n this.session.phase = 'implementation';\n break;\n case 'implementation':\n this.session.phase = 'task_review';\n break;\n case 'task_review':\n this.session.phase = 'executing';\n break;\n case 'executing':\n this.session.phase = 'done';\n break;\n case 'done':\n break;\n }\n this.session.approved = true;\n this.session.updatedAt = Date.now();\n this.autoSave();\n return this.session.phase;\n }\n\n /**\n * Set the implementation plan text.\n */\n setImplementation(plan: string): void {\n this.session.implementation = plan;\n this.session.phase = 'task_review';\n this.session.updatedAt = Date.now();\n this.autoSave();\n }\n\n /**\n * Mark session as done.\n */\n markDone(): void {\n this.session.phase = 'done';\n this.session.updatedAt = Date.now();\n this.autoSave();\n }\n\n /**\n * Set the task graph ID for this session.\n */\n setTaskGraphId(graphId: string): void {\n this.session.taskGraphId = graphId;\n this.autoSave();\n }\n\n /**\n * Get the task graph ID for this session.\n */\n getTaskGraphId(): string | undefined {\n return this.session.taskGraphId;\n }\n\n // ── Spec Persistence ──────────────────────────────────────────────────────\n\n /**\n * Save the current spec to the store.\n */\n async saveSpec(): Promise<Specification> {\n if (!this.session.spec) {\n throw new SddError({\n message: 'No spec to save.',\n code: ERROR_CODES.SDD_NOT_READY,\n context: { sessionId: this.session.id },\n });\n }\n await this.store.save(this.session.spec);\n return this.session.spec;\n }\n\n // ── Spec Generation Helpers ───────────────────────────────────────────────\n\n /**\n * Parse a spec from a JSON string (from AI output).\n * Validates and normalizes the structure.\n */\n parseSpecFromJSON(jsonStr: string): Specification {\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonStr);\n } catch (e) {\n throw new SddError({\n message: 'Invalid JSON for spec',\n code: ERROR_CODES.SDD_PARSE_FAILED,\n cause: e,\n context: { detail: e instanceof Error ? e.message : 'parse error' },\n });\n }\n\n if (!parsed || typeof parsed !== 'object') {\n throw new SddError({\n message: 'Spec JSON must be an object',\n code: ERROR_CODES.SDD_VALIDATION_FAILED,\n context: { actualType: typeof parsed },\n });\n }\n\n const raw = parsed as Record<string, unknown>;\n const now = Date.now();\n\n const title = String(raw.title ?? this.session.title ?? 'Untitled');\n const overview = String(raw.overview ?? '');\n\n // Validate overview is not empty\n if (!overview || overview === 'undefined') {\n throw new SddError({\n message: 'Spec must have an overview',\n code: ERROR_CODES.SDD_VALIDATION_FAILED,\n context: { field: 'overview', title },\n });\n }\n\n const rawSections = Array.isArray(raw.sections) ? raw.sections : [];\n const sections: SpecSection[] = rawSections\n .filter((s: unknown) => s && typeof s === 'object')\n .map((s: Record<string, unknown>) => ({\n type: (['overview', 'requirements', 'architecture', 'api', 'data', 'security', 'acceptance']\n .includes(String(s.type)) ? String(s.type) : 'overview') as SpecSection['type'],\n title: String(s.title ?? ''),\n content: String(s.content ?? ''),\n level: Number(s.level) || 1,\n }));\n\n const rawReqs = Array.isArray(raw.requirements) ? raw.requirements : [];\n const requirements: SpecRequirement[] = rawReqs\n .filter((r: unknown) => r && typeof r === 'object')\n .map((r: Record<string, unknown>, i: number) => ({\n id: String(r.id ?? `REQ-${i + 1}`),\n type: (['functional', 'non-functional', 'security', 'performance', 'ux']\n .includes(String(r.type)) ? String(r.type) : 'functional') as SpecRequirement['type'],\n priority: (['critical', 'high', 'medium', 'low']\n .includes(String(r.priority)) ? String(r.priority) : 'medium') as SpecRequirement['priority'],\n description: String(r.description ?? ''),\n acceptanceCriteria: Array.isArray(r.acceptanceCriteria)\n ? r.acceptanceCriteria.map(String)\n : [],\n }));\n\n const spec: Specification = {\n id: crypto.randomUUID(),\n title,\n version: '0.1.0',\n status: 'draft',\n overview,\n sections,\n requirements,\n createdAt: now,\n updatedAt: now,\n metadata: {\n generatedBy: 'AISpecBuilder',\n sessionId: this.session.id,\n },\n };\n\n return spec;\n }\n\n /**\n * Extract JSON from AI output (handles ```json blocks and raw JSON).\n */\n extractJSON(text: string): string | null {\n // Try ```json ... ``` first\n const codeBlockMatch = text.match(/```json\\s*([\\s\\S]*?)```/);\n if (codeBlockMatch?.[1]) {\n return codeBlockMatch[1].trim();\n }\n\n // Try ``` ... ``` without language tag\n const genericBlockMatch = text.match(/```\\s*([\\s\\S]*?)```/);\n if (genericBlockMatch?.[1]) {\n const trimmed = genericBlockMatch[1].trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return trimmed;\n }\n }\n\n // Try raw JSON object\n const jsonMatch = text.match(/(\\{[\\s\\S]*\\})/);\n if (jsonMatch?.[1]) {\n try {\n JSON.parse(jsonMatch[1]);\n return jsonMatch[1];\n } catch {\n // not valid JSON\n }\n }\n\n return null;\n }\n\n /**\n * Detect if AI output contains a spec (JSON block).\n */\n hasSpecInOutput(text: string): boolean {\n return this.extractJSON(text) !== null;\n }\n\n /**\n * Try to parse a spec from AI output text.\n * Returns null if no valid spec found.\n */\n tryParseSpecFromOutput(text: string): Specification | null {\n const json = this.extractJSON(text);\n if (!json) return null;\n\n try {\n return this.parseSpecFromJSON(json);\n } catch {\n return null;\n }\n }\n\n // ── JSON Array Extraction (for tasks) ─────────────────────────────────────\n\n /**\n * Extract a JSON array from AI output (for task lists).\n */\n extractJSONArray(text: string): string | null {\n const codeBlockMatch = text.match(/```json\\s*([\\s\\S]*?)```/);\n if (codeBlockMatch?.[1]) {\n const trimmed = codeBlockMatch[1].trim();\n if (trimmed.startsWith('[')) return trimmed;\n }\n\n const arrayMatch = text.match(/(\\[[\\s\\S]*\\])/);\n if (arrayMatch?.[1]) {\n try {\n const parsed = JSON.parse(arrayMatch[1]);\n if (Array.isArray(parsed)) return arrayMatch[1];\n } catch {\n // not valid\n }\n }\n\n return null;\n }\n}\n","// SddInterviewDriver — a headless, REPL-free wrapper around AISpecBuilder that\n// drives the interactive Spec-Driven-Development interview (questioning → spec\n// → implementation plan → task graph) from any surface (WebUI, CLI, tests).\n//\n// The CLI `/sdd` slash command historically owned this loop via module-singleton\n// state (`sddState`) plus thin detection helpers in `packages/cli` — which the\n// WebUI cannot import (layer rule: webui ⇏ cli). This driver lifts the *pure*\n// logic into core so every surface shares one implementation: feed it the\n// agent's text output, it detects the spec / plan / task JSON, advances the\n// AISpecBuilder phases, and persists the resulting TaskGraph to disk so the run\n// machinery (SddParallelRun) can pick it up.\n//\n// The driver never runs the agent itself — the caller runs `agent.run(prompt)`\n// and feeds the output back via `ingestAgentOutput`. That keeps core free of any\n// agent-loop / provider coupling.\n\nimport type { Specification } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { AISpecBuilder, type AISpecPhase } from './spec-builder.js';\nimport type { SpecStore } from './spec-store.js';\nimport type { TaskGraphStore } from './task-graph-store.js';\nimport { TaskTracker } from './task-tracker.js';\nimport { DefaultTaskStore, TaskGenerator } from './task-generator.js';\nimport { buildBoardTasks, type SddBoardTask, type SddBoardColumn } from './board-types.js';\n\nexport interface SddInterviewDriverOptions {\n /** Disk-backed spec store (`wpaths.projectSpecs`). */\n specStore: SpecStore;\n /** Disk-backed task-graph store (`wpaths.projectTaskGraphs`). */\n graphStore: TaskGraphStore;\n /** Persist the interview session here so a reconnect can resume it. */\n sessionPath?: string | undefined;\n /** Project context string injected into the questioning prompt. */\n projectContext?: string | undefined;\n minQuestions?: number | undefined;\n maxQuestions?: number | undefined;\n}\n\n/** A serialisable view of the interview, streamed to observing surfaces. */\nexport interface SddInterviewSnapshot {\n sessionId: string;\n phase: AISpecPhase;\n title: string;\n /** The operator's original goal prompt (verbatim). `title` is a short heading. */\n goal: string;\n questionCount: number;\n minQuestions: number;\n maxQuestions: number;\n answers: Array<{ question: string; answer: string }>;\n spec?:\n | {\n id: string;\n title: string;\n overview: string;\n requirements: Array<{ priority: string; description: string }>;\n }\n | undefined;\n graphId?: string | undefined;\n taskCount: number;\n /**\n * Topologically-laid-out task graph (once decomposed) — lets the wizard\n * render the same animated DAG as the live board (\"decomposition reveal\").\n */\n board?: { tasks: SddBoardTask[]; columns: SddBoardColumn[] } | undefined;\n /** The current AI prompt for this phase (what to send the agent next). */\n prompt: string;\n}\n\n/** What `ingestAgentOutput` detected and acted on. */\nexport interface SddIngestResult {\n specDetected: boolean;\n implementationDetected: boolean;\n tasksDetected: boolean;\n graphId?: string | undefined;\n}\n\nexport class SddInterviewDriver {\n readonly builder: AISpecBuilder;\n private readonly o: SddInterviewDriverOptions;\n private readonly minQuestions: number;\n private readonly maxQuestions: number;\n private tracker: TaskTracker | null = null;\n private graph: TaskGraph | null = null;\n\n constructor(opts: SddInterviewDriverOptions) {\n this.o = opts;\n this.minQuestions = opts.minQuestions ?? 2;\n this.maxQuestions = opts.maxQuestions ?? 10;\n this.builder = new AISpecBuilder({\n store: opts.specStore,\n sessionPath: opts.sessionPath,\n projectContext: opts.projectContext,\n minQuestions: this.minQuestions,\n maxQuestions: this.maxQuestions,\n });\n }\n\n /** Begin a fresh interview. Returns the first AI prompt (a question kickoff). */\n start(title: string, intent?: string): string {\n this.builder.startSession(title, intent);\n this.tracker = null;\n this.graph = null;\n return this.builder.getAIPrompt();\n }\n\n /**\n * Resume a previously-persisted interview from disk. Re-hydrates the task\n * graph too when one was already produced. Returns true if a session loaded.\n */\n async loadExisting(): Promise<boolean> {\n const loaded = await this.builder.loadSession();\n if (!loaded) return false;\n const graphId = this.builder.getTaskGraphId();\n if (graphId) {\n const graph = await this.o.graphStore.load(graphId);\n if (graph) {\n this.graph = graph;\n const tracker = new TaskTracker({ store: new DefaultTaskStore() });\n tracker.setGraph(graph);\n this.tracker = tracker;\n }\n }\n return true;\n }\n\n phase(): AISpecPhase {\n return this.builder.getPhase();\n }\n\n currentPrompt(): string {\n return this.builder.getAIPrompt();\n }\n\n getTracker(): TaskTracker | null {\n return this.tracker;\n }\n\n getGraph(): TaskGraph | null {\n return this.graph;\n }\n\n /** Record a Q/A pair (the agent asked `question`, the user replied `answer`). */\n submitAnswer(question: string, answer: string): void {\n this.builder.addAnswer(question, answer);\n }\n\n /**\n * Feed the agent's text output back into the interview. Detects, in order:\n * 1. a Specification JSON → setSpec (phase → spec_review) + persist to SpecStore\n * 2. an implementation plan (implementation phase) → setImplementation\n * 3. a task JSON array → build + persist a TaskGraph\n * Each step is independent and best-effort; a malformed payload is ignored\n * rather than thrown, so a chatty agent turn never breaks the interview.\n */\n async ingestAgentOutput(text: string): Promise<SddIngestResult> {\n const result: SddIngestResult = {\n specDetected: false,\n implementationDetected: false,\n tasksDetected: false,\n };\n\n // 1. Spec JSON → spec_review.\n if (!this.builder.getSession().spec) {\n const spec = this.builder.tryParseSpecFromOutput(text);\n if (spec) {\n this.builder.setSpec(spec);\n await this.persistSpec(spec);\n result.specDetected = true;\n }\n }\n\n // 2. Implementation plan (only meaningful in the implementation phase).\n if (this.builder.getPhase() === 'implementation') {\n if (this.trySaveImplementationPlan(text)) result.implementationDetected = true;\n }\n\n // 3. Task JSON array → TaskGraph (requires a spec to anchor the graph).\n const session = this.builder.getSession();\n if (session.spec) {\n const built = await this.tryBuildTasksFromOutput(text);\n if (built) {\n result.tasksDetected = true;\n result.graphId = built;\n }\n }\n\n return result;\n }\n\n /**\n * Advance to the next phase (mirrors `/sdd approve`). When moving into the\n * executing phase, guarantees a task graph exists — deterministically\n * generating one from the approved spec if the agent never emitted a valid\n * task array. Returns the new phase and its AI prompt.\n */\n async approve(): Promise<{ phase: AISpecPhase; prompt: string }> {\n const phase = this.builder.approve();\n if (phase === 'executing') {\n await this.ensureTaskGraph();\n }\n return { phase, prompt: this.builder.getAIPrompt() };\n }\n\n /**\n * Ensure a TaskGraph exists for the approved spec. If the agent already\n * produced one (via `ingestAgentOutput`), returns it; otherwise builds a\n * deterministic graph from the spec's requirements via TaskGenerator. This is\n * the robustness backstop: a run can always start, even if the model never\n * emitted a parseable task array.\n */\n async ensureTaskGraph(): Promise<TaskGraph | null> {\n if (this.graph) return this.graph;\n const spec = this.builder.getSession().spec;\n if (!spec) return null;\n\n const tracker = new TaskTracker({ store: new DefaultTaskStore() });\n const generator = new TaskGenerator({\n taskTracker: tracker,\n verificationFromAcceptance: process.env['WRONGSTACK_SDD_VERIFY_FROM_ACCEPTANCE'] === '1',\n });\n const graph = await generator.generateFromSpec(spec);\n this.tracker = tracker;\n this.graph = graph;\n await this.persistGraph(graph);\n this.builder.setTaskGraphId(graph.id);\n // Flush the session synchronously so a reconnect (loadExisting) sees the\n // graphId — setTaskGraphId's own auto-save is fire-and-forget.\n await this.builder.saveSession();\n return graph;\n }\n\n snapshot(): SddInterviewSnapshot {\n const s = this.builder.getSession();\n const spec = s.spec;\n return {\n sessionId: s.id,\n phase: s.phase,\n title: s.title,\n goal: s.userIntent || s.title,\n questionCount: s.questionCount,\n minQuestions: this.minQuestions,\n maxQuestions: this.maxQuestions,\n answers: s.answers.map((a) => ({ question: a.question, answer: a.answer })),\n spec: spec\n ? {\n id: spec.id,\n title: spec.title,\n overview: spec.overview,\n requirements: spec.requirements.map((r) => ({\n priority: r.priority,\n description: r.description,\n })),\n }\n : undefined,\n graphId: s.taskGraphId,\n taskCount: this.graph ? this.graph.nodes.size : 0,\n board: this.graph ? buildBoardTasks(this.graph) : undefined,\n prompt: this.builder.getAIPrompt(),\n };\n }\n\n // ── internals ────────────────────────────────────────────────────────────\n\n private async persistSpec(spec: Specification): Promise<void> {\n try {\n await this.o.specStore.save(spec);\n } catch {\n // best-effort — the in-memory session still has the spec\n }\n }\n\n private async persistGraph(graph: TaskGraph): Promise<void> {\n try {\n await this.o.graphStore.save(graph);\n } catch {\n // best-effort — the in-memory tracker still drives the run\n }\n }\n\n /**\n * Port of the CLI `trySaveImplementationPlan` operating on this driver's\n * builder. Captures the prose plan that precedes the task JSON block.\n */\n private trySaveImplementationPlan(text: string): boolean {\n const current = this.builder.getSession().implementation ?? '';\n const jsonStart = text.match(/```json\\s*\\[/);\n if (jsonStart?.index && jsonStart.index > 0) {\n const plan = text.substring(0, jsonStart.index).trim();\n if (plan.length > 50 && plan !== current && !isExplanatoryText(plan)) {\n this.builder.setImplementation(plan);\n return true;\n }\n }\n if (\n text.length > 100 &&\n !text.includes('```json') &&\n text.trim() !== current &&\n !isExplanatoryText(text)\n ) {\n this.builder.setImplementation(text.trim());\n return true;\n }\n return false;\n }\n\n /**\n * Port of the CLI `trySaveTasksFromAIOutput`: parse a task JSON array from the\n * agent output, build (or extend) the tracker + graph, persist to disk, and\n * link the graphId to the session. Returns the graphId on success.\n */\n private async tryBuildTasksFromOutput(text: string): Promise<string | undefined> {\n const json = this.builder.extractJSONArray(text);\n if (!json) return undefined;\n\n let tasks: Array<Record<string, unknown>>;\n try {\n tasks = JSON.parse(json) as Array<Record<string, unknown>>;\n } catch {\n return undefined;\n }\n const valid = tasks.filter(\n (t) => t && typeof t === 'object' && typeof t.title === 'string' && t.title.length > 0,\n );\n if (valid.length === 0) return undefined;\n\n const spec = this.builder.getSession().spec;\n if (!spec) return undefined;\n\n if (!this.tracker || !this.graph) {\n const tracker = new TaskTracker({ store: new DefaultTaskStore() });\n this.graph = await tracker.createGraph(spec.id, spec.title);\n this.tracker = tracker;\n }\n // Two passes: (1) create every node, recording every reference key by which\n // a `dependsOn` entry might name it (declared id, positional `t1`/`1`, title);\n // (2) resolve each task's `dependsOn` refs into real `depends_on` edges. This\n // is what turns a flat task list into a true dependency DAG — the scheduler\n // then runs independent tasks in parallel and dependent ones in order.\n const refMap = new Map<string, string>();\n const created: Array<{ nodeId: string; task: Record<string, unknown> }> = [];\n valid.forEach((task, i) => {\n const node = addTaskToTracker(this.tracker!, task);\n created.push({ nodeId: node.id, task });\n if (typeof task.id === 'string' && task.id.trim()) {\n refMap.set(task.id.trim().toLowerCase(), node.id);\n }\n refMap.set(`t${i + 1}`, node.id);\n refMap.set(String(i + 1), node.id);\n refMap.set(normalizeTaskRef(String(task.title)), node.id);\n });\n for (const { nodeId, task } of created) {\n const deps = Array.isArray(task.dependsOn) ? task.dependsOn : [];\n for (const ref of deps) {\n const depId = refMap.get(normalizeTaskRef(String(ref)));\n // addDependency self/duplicate/cycle-guards; a stale ref just no-ops.\n if (depId && depId !== nodeId) this.tracker!.addDependency(depId, nodeId);\n }\n }\n await this.persistGraph(this.graph);\n this.builder.setTaskGraphId(this.graph.id);\n // Flush so a reconnect resumes with the graph linked (see ensureTaskGraph).\n await this.builder.saveSession();\n return this.graph.id;\n }\n}\n\nconst TASK_TYPES = ['feature', 'bugfix', 'refactor', 'docs', 'test', 'chore'] as const;\nconst TASK_PRIORITIES = ['critical', 'high', 'medium', 'low'] as const;\n\n/** Normalize a dependsOn reference (id / positional / title) for map lookup. */\nfunction normalizeTaskRef(ref: string): string {\n return ref.trim().toLowerCase();\n}\n\nfunction addTaskToTracker(tracker: TaskTracker, task: Record<string, unknown>): TaskNode {\n return tracker.addNode({\n title: String(task.title),\n description: String(task.description ?? ''),\n type: (TASK_TYPES as readonly string[]).includes(String(task.type))\n ? (String(task.type) as (typeof TASK_TYPES)[number])\n : 'feature',\n priority: (TASK_PRIORITIES as readonly string[]).includes(String(task.priority))\n ? (String(task.priority) as (typeof TASK_PRIORITIES)[number])\n : 'medium',\n status: 'pending',\n estimateHours: Number(task.estimateHours) || 2,\n tags: Array.isArray(task.tags) ? task.tags.map(String) : [],\n });\n}\n\n/**\n * True when the text reads like conversational filler rather than a structured\n * implementation plan. Ported verbatim from the CLI detection so behaviour is\n * identical across surfaces.\n */\nexport function isExplanatoryText(text: string): boolean {\n const lower = text.toLowerCase();\n return (\n lower.startsWith(\"i'\") ||\n lower.startsWith('i will') ||\n lower.startsWith('let me') ||\n lower.startsWith(\"here's my\") ||\n lower.startsWith('here is my') ||\n lower.startsWith(\"i'm going to\") ||\n lower.startsWith('first, let me') ||\n lower.startsWith('sure') ||\n lower.startsWith('of course') ||\n lower.startsWith('okay') ||\n lower.startsWith('ok,') ||\n lower.startsWith('sounds good') ||\n lower.startsWith('no problem') ||\n (text.split('\\n').length < 3 && !text.includes('.'))\n );\n}\n","import { expectDefined } from '../utils/expect-defined.js';\n/**\n * SddParallelRun\n *\n * Drives a TaskGraph through ParallelEternalEngine's infrastructure\n * (DefaultMultiAgentCoordinator + AgentSubagentRunner) but powered by\n * SddTaskDecomposer — producing dependency-aware waves instead of\n * goal-driven iterations.\n *\n * One-shot: completes when all tasks are done OR a deadlock is detected.\n * Does NOT loop — each run() call is a discrete execution.\n *\n * Usage:\n * ```\n * const run = new SddParallelRun({ tracker, graph, agent, projectRoot });\n * await run.run({ onWave });\n * // or with progress callback:\n * await run.run({ onProgress: (p) => console.log(renderProgress(p)) });\n * ```\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { Agent } from '../core/agent.js';\nimport type { SubagentConfig, TaskResult } from '../types/multi-agent.js';\nimport type { AgentFactory } from '../coordination/agent-subagent-runner.js';\nimport { makeAgentSubagentRunner, withDisabledToolFiltering } from '../coordination/agent-subagent-runner.js';\nimport { DefaultMultiAgentCoordinator } from '../coordination/multi-agent-coordinator.js';\nimport { assignNickname } from '../coordination/subagent-nicknames.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { WorktreeHandle, WorktreeManager } from '../worktree/worktree-manager.js';\nimport type { MultiAgentConfig } from '../types/multi-agent.js';\nimport type { TaskGraph, TaskNode, TaskProgress } from '../types/task-graph.js';\nimport type { TaskTracker } from './task-tracker.js';\nimport { SddError, ERROR_CODES } from '../types/errors.js';\nimport { SddTaskDecomposer, type TaskBatch } from './sdd-task-decomposer.js';\n/** A sub-task produced by splitting a parent task (see `splitTask`). */\nexport interface SddSubtaskSpec {\n title: string;\n description: string;\n type?: TaskNode['type'] | undefined;\n priority?: TaskNode['priority'] | undefined;\n}\n\n/**\n * Verdict returned by the optional failure supervisor when a task is about to go\n * terminal. `retry` re-queues with a fresh attempt budget; `reassign` swaps the\n * worker model (+ optional provider) then re-queues; `split` breaks the task\n * into sub-tasks; `fail` (or `undefined`) lets it terminal-fail.\n */\nexport type SddSupervisorVerdict =\n | { action: 'retry' }\n | { action: 'reassign'; model?: string | undefined; provider?: string | undefined }\n | { action: 'split'; subtasks: SddSubtaskSpec[] }\n | { action: 'fail' };\n\nexport interface SddParallelRunOptions {\n /** Pre-constructed TaskTracker (must already hold the graph's initial state). */\n tracker: TaskTracker;\n /** The TaskGraph produced by TaskGenerator from an approved spec. */\n graph: TaskGraph;\n /** The main agent — used as the subagent factory. */\n agent: Agent;\n /** Project root (used for coordinator id). */\n projectRoot: string;\n /**\n * Override default parallel slots (1–16). Default: 2 — deliberately low so a\n * run never juggles more git worktrees than a human can review. Independent\n * tasks still run concurrently up to this cap; dependency chains run in order.\n */\n parallelSlots?: number | undefined;\n /**\n * Hard wall-clock cap per task in ms. OPT-IN — `undefined` by default so a\n * long-but-productive task is never killed merely for running long (the old\n * 5-min default hard-killed real coding tasks with `budget_timeout`). When\n * set, the coordinator watchdog enforces it. Prefer `taskIdleTimeoutMs`.\n */\n taskTimeoutMs?: number | undefined;\n /**\n * Idle reaper per task in ms: reap a task only after this long with NO\n * activity (iteration / tool call / streamed token / tool progress). Resets\n * on every sign of forward motion, so an actively-working agent runs until\n * its task naturally ends. Default: 600_000 (10 min of silence = genuinely\n * stuck). This is the default guard — wall-clock (`taskTimeoutMs`) is opt-in.\n */\n taskIdleTimeoutMs?: number | undefined;\n /** Maximum in-run retry attempts for a failed task before it goes terminal. Default: 3. */\n maxRetries?: number | undefined;\n /**\n * After the graph settles with terminal-failed tasks, requeue ALL failed\n * (non-cancelled) tasks to `pending` and run them again — up to this many\n * sweeps. Each sweep gives every failed task a fresh `maxRetries` budget. The\n * loop stops early once a sweep produces no new completions (no progress).\n * 0 = off. Default: 2.\n */\n maxFailedRetrySweeps?: number | undefined;\n /** Override the default agent factory. */\n subagentFactory?: AgentFactory | undefined;\n /**\n * Run-level default model for worker subagents. A task's own\n * `metadata.model` (set per-task in the WebUI) takes precedence; this is the\n * fallback for every task that has no explicit assignment. Undefined → the\n * factory's own default (the leader's model).\n */\n defaultModel?: string | undefined;\n /** Run-level default provider id (same precedence rules as defaultModel). */\n defaultProvider?: string | undefined;\n /**\n * Run-level fallback model chain (entries: `model` / `provider/model`). A\n * task's `metadata.fallbackModels` overrides this. The subagent factory wires\n * these into a fallback extension so a 429/stream-hang rotates to the next.\n */\n fallbackModels?: string[] | undefined;\n /**\n * Post-task verification gate. When set, a task whose worker reported success\n * is NOT marked `completed` (and NOT merged) until this resolves `{ok:true}`.\n * Runs in the task's worktree cwd (or the project root when no worktree). Core\n * stays shell-agnostic — the caller injects a verifier that, e.g., runs the\n * task's `metadata.verificationCommand` (tests / typecheck). A task with no\n * command should return `{ok:true}`. An `{ok:false}` routes the task into the\n * normal failure path (retry while attempts remain, else terminal-fail).\n */\n verifyTask?:\n | ((info: { task: TaskNode; result: TaskResult; cwd: string }) => Promise<{ ok: boolean; reason?: string }>)\n | undefined;\n /**\n * Optional merge-conflict resolver, forwarded to `WorktreeManager.merge`. Given\n * the conflicted files + the base checkout cwd, return `true` once resolved (no\n * markers left). When omitted or it returns `false`, the task is requeued (a\n * re-run forks a fresh worktree off the advanced base) and, if retries are\n * exhausted, terminally failed with its worktree kept for review.\n */\n conflictResolver?:\n | ((info: { task: TaskNode; conflictFiles: string[]; cwd: string }) => Promise<boolean>)\n | undefined;\n /**\n * Failure supervisor: consulted ONLY when a task has exhausted its retries and\n * is about to go terminal-failed. Returning a verdict lets a decision agent\n * keep the run moving — `retry` / `reassign` (swap model) / `split` — instead\n * of dead-ending. Returning `{action:'fail'}` / `undefined` lets it fail. Each\n * task can be rescued at most `maxSupervisorEscalations` times (loop guard).\n */\n superviseFailure?:\n | ((info: { task: TaskNode; error: string; attempts: number }) => Promise<SddSupervisorVerdict | undefined>)\n | undefined;\n /** Max times the supervisor may rescue a single task before it must fail. Default 2. */\n maxSupervisorEscalations?: number | undefined;\n /** Called after each wave completes. */\n onWave?: ((wave: WaveResult) => void) | undefined;\n /** Called with progress stats every ~2s during execution. */\n onProgress?: ((progress: SddProgress) => void) | undefined;\n /** Shared EventBus — when set, the run emits `sdd.*` live-board events. */\n events?: EventBus | undefined;\n /** Parent session id for every emitted `sdd.*` event. */\n sessionId?: string | (() => string | undefined) | undefined;\n /** Stable id correlating all events of this run (default: random). */\n runId?: string | undefined;\n /**\n * Optional git-worktree manager. When set (and the project is a git repo),\n * each task runs in its own isolated worktree and merges back into the base\n * branch after success — so parallel agents never collide on the same files.\n */\n worktrees?: WorktreeManager | undefined;\n /** Run-level backstops (prevent an autonomous run from looping forever). */\n maxTotalWaves?: number | undefined;\n maxWallClockMs?: number | undefined;\n /**\n * Deadlock auto-recovery rounds: when the graph deadlocks on failed blockers,\n * requeue those failed blockers `pending` and try again, up to N times. 0 = off.\n */\n maxRecoveryRounds?: number | undefined;\n}\n\nexport interface SddProgress {\n wave: number;\n total: number;\n completed: number;\n inProgress: number;\n failed: number;\n blocked: number;\n pending: number;\n percent: number;\n deadlocked: boolean;\n}\n\nexport interface WaveResult {\n wave: number;\n batch: TaskBatch;\n results: TaskResult[];\n successCount: number;\n failCount: number;\n durationMs: number;\n stopRequested: boolean;\n}\n\n/** Result of a single task's execution in the continuous scheduler. */\ninterface TaskOutcome {\n taskId: string;\n success: boolean;\n result?: TaskResult | undefined;\n}\n\nexport interface RunResult {\n totalWaves: number;\n totalCompleted: number;\n totalFailed: number;\n totalDurationMs: number;\n deadlocked: boolean;\n stopRequested: boolean;\n finalProgress: TaskProgress;\n}\n\nexport class SddParallelRun {\n private readonly slots: number;\n /** Opt-in hard wall-clock cap (undefined → no cap; idle reaper guards instead). */\n private readonly timeoutMs: number | undefined;\n /** Idle reaper window (ms) — resets on activity; reaps only a genuine stall. */\n private readonly idleTimeoutMs: number;\n private readonly maxRetries: number;\n /** Max supervisor rescues per task before it must terminal-fail (loop guard). */\n private readonly maxSupervisorEscalations: number;\n /** Per-task count of supervisor rescues used (resets nothing — bounds the loop). */\n private supervisorEscalations = new Map<string, number>();\n /** Max end-of-run failed-task sweeps (see `maxFailedRetrySweeps`). */\n private readonly maxFailedSweeps: number;\n /** How many failed-task sweeps have run this `run()` so far. */\n private failedSweeps = 0;\n /** Completed-count snapshot at the last sweep, to detect a no-progress sweep. */\n private lastSweepCompleted = 0;\n private decomposer: SddTaskDecomposer;\n private coordinator: DefaultMultiAgentCoordinator | null = null;\n private stopRequested = false;\n private retryMap = new Map<string, number>();\n readonly runId: string;\n private readonly events?: EventBus | undefined;\n private readonly sessionIdSource: string | (() => string | undefined) | undefined;\n private readonly maxTotalWaves: number;\n private readonly maxWallClockMs?: number | undefined;\n private readonly maxRecoveryRounds: number;\n private recoveryRounds = 0;\n /** Per-run worker identities, so the board shows \"who is on what\". */\n private usedNicknames = new Set<string>();\n /** Per-task git worktree cwd (Layer 2 worktree isolation; empty otherwise). */\n private taskCwds = new Map<string, string>();\n /** Per-task git worktree branch, for board display. */\n private taskBranches = new Map<string, string>();\n /** Live worktree handles keyed by task id (for commit/merge/release). */\n private taskWorktrees = new Map<string, WorktreeHandle>();\n /** Live subagent id per running task — lets cancelTask() abort exactly one. */\n private taskSubagents = new Map<string, string>();\n /** Tasks the user cancelled mid-flight — skip retry, mark terminal-cancelled. */\n private cancelledTasks = new Set<string>();\n /**\n * Base branch the run's squash commits land on (captured once at start when\n * worktrees are enabled). Anchors a later `rollback()`.\n */\n private baseBranch: string | undefined;\n /**\n * Squash-merge commits this run landed on the base branch, in landing order.\n * `rollback()` reverts these (newest → oldest). Persisted via the board\n * snapshot so a post-run rollback can read them off disk.\n */\n private mergedCommits: Array<{ taskId: string; sha: string; title: string }> = [];\n /** Monotonic dispatch counter (unique subagent ids) + dispatch-round counter. */\n private dispatchSeq = 0;\n private round = 0;\n\n constructor(private readonly opts: SddParallelRunOptions) {\n this.slots = Math.min(16, Math.max(1, opts.parallelSlots ?? 2));\n // Wall-clock cap is OPT-IN (undefined → none). The idle reaper is the\n // default guard: it resets on every activity signal so a productive task\n // is never killed for running long — only a genuine stall is reaped.\n this.timeoutMs = opts.taskTimeoutMs;\n this.idleTimeoutMs = Math.max(1, opts.taskIdleTimeoutMs ?? 600_000);\n this.maxRetries = Math.max(0, opts.maxRetries ?? 3);\n this.maxSupervisorEscalations = Math.max(0, opts.maxSupervisorEscalations ?? 2);\n this.maxFailedSweeps = Math.max(0, opts.maxFailedRetrySweeps ?? 2);\n this.runId = opts.runId ?? `sdd-${randomUUID().slice(0, 8)}`;\n this.events = opts.events;\n this.sessionIdSource = opts.sessionId;\n // Backstop: even with retries + recovery the loop must terminate. Derive a\n // generous ceiling from the graph size unless the caller pins one.\n this.maxTotalWaves =\n opts.maxTotalWaves ?? opts.graph.nodes.size * (this.maxRetries + 2) + 10;\n this.maxWallClockMs = opts.maxWallClockMs;\n this.maxRecoveryRounds = Math.max(0, opts.maxRecoveryRounds ?? 0);\n this.decomposer = new SddTaskDecomposer(opts.tracker, opts.graph, { parallelSlots: this.slots });\n }\n\n /** Type-safe emit on the optional EventBus (no-op when unwired). */\n private emit<K extends keyof import('../kernel/events.js').EventMap>(\n event: K,\n payload: import('../kernel/events.js').EventMap[K],\n ): void {\n const sessionId = this.currentSessionId();\n this.events?.emit(\n event,\n (sessionId ? { ...payload, sessionId } : payload) as import('../kernel/events.js').EventMap[K],\n );\n }\n\n private currentSessionId(): string | undefined {\n const value =\n typeof this.sessionIdSource === 'function'\n ? this.sessionIdSource()\n : this.sessionIdSource;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\n\n // -------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------\n\n private paused = false;\n\n /** Trigger stop — causes run() to abort after the current wave. */\n stop(): void {\n this.stopRequested = true;\n this.paused = false;\n this.coordinator?.stopAll();\n }\n\n /** Pause: no new wave starts until resume() (the current wave finishes). */\n pause(): void {\n this.paused = true;\n }\n resume(): void {\n this.paused = false;\n }\n isPaused(): boolean {\n return this.paused;\n }\n isRunning(): boolean {\n return !this.stopRequested && !this.decomposer.isSettled();\n }\n\n /** Base branch the run's squash commits land on (undefined when worktrees off). */\n getBaseBranch(): string | undefined {\n return this.baseBranch;\n }\n\n /** Squash commits this run landed on the base branch, in landing order. */\n getMergedCommits(): ReadonlyArray<{ taskId: string; sha: string; title: string }> {\n return this.mergedCommits;\n }\n\n /**\n * Remove every git worktree + branch this run (and any prior run) created.\n * Refuses while the run is still live — cleaning a checkout under an active\n * worker would corrupt it. Stop first. Returns the number of worktrees removed\n * (0 when worktrees are disabled). Idempotent.\n */\n async cleanupWorktrees(): Promise<number> {\n if (this.isRunning()) return 0;\n const wt = this.opts.worktrees;\n if (!wt) return 0;\n // Release any handles this run still holds (kept on stop / needs-review).\n for (const [taskId, handle] of [...this.taskWorktrees]) {\n await wt.release(handle, { keep: false }).catch(() => {});\n this.forgetWorktree(taskId);\n }\n const { removed } = await wt.cleanupAllManaged();\n return removed;\n }\n\n /**\n * Undo the run's merged commits by reverting each on the base branch (history\n * preserving). Refuses while the run is still live (stop first). Returns the\n * revert outcome; a dirty tree or revert conflict surfaces as `ok:false`.\n */\n async rollback(): Promise<{ ok: boolean; reverted: number; reason?: string }> {\n if (this.isRunning()) return { ok: false, reverted: 0, reason: 'run still active — stop it first' };\n const wt = this.opts.worktrees;\n if (!wt || !this.baseBranch) {\n return { ok: false, reverted: 0, reason: 'no worktree run to roll back' };\n }\n return wt.revertCommits(\n this.baseBranch,\n this.mergedCommits.map((c) => c.sha),\n );\n }\n\n /** Requeue a task to `pending` so the scheduler re-runs it (clears retries + cancel marker). */\n retryTask(taskId: string): boolean {\n if (!this.opts.tracker.getNode(taskId)) return false;\n this.retryMap.delete(taskId);\n this.persistRetries(taskId, 0);\n // Clear any cancel marker so a previously-cancelled task can run again.\n this.cancelledTasks.delete(taskId);\n this.opts.tracker.patchMetadata(taskId, { cancelled: undefined });\n this.opts.tracker.updateNodeStatus(taskId, 'pending', 'manual retry');\n return true;\n }\n\n /** Reassign a task to a specific agent name (reflected on the board). */\n reassignTask(taskId: string, agentName: string): boolean {\n if (!this.opts.tracker.getNode(taskId)) return false;\n this.opts.tracker.updateNode(taskId, { assignee: agentName });\n return true;\n }\n\n /**\n * Set/override a task's worker model (and optionally provider) — applied on its\n * NEXT dispatch (a running task must be cancelled + retried to take effect). The\n * assignment lives on node metadata so it survives crash → resume.\n */\n setTaskModel(taskId: string, model: string | undefined, provider?: string | undefined): boolean {\n if (!this.opts.tracker.getNode(taskId)) return false;\n this.opts.tracker.patchMetadata(taskId, { model, ...(provider !== undefined ? { provider } : {}) });\n return true;\n }\n\n /** Set/override a task's fallback model chain (applied on its next dispatch). */\n setTaskFallbacks(taskId: string, fallbackModels: string[] | undefined): boolean {\n if (!this.opts.tracker.getNode(taskId)) return false;\n this.opts.tracker.patchMetadata(taskId, { fallbackModels });\n return true;\n }\n\n /**\n * Set/override a task's verification command (the completion gate runs it in\n * the task's cwd and only lets the task complete on exit 0). Empty/undefined\n * clears it. Applied on the task's next verification — i.e. its next dispatch.\n */\n setTaskVerification(taskId: string, verificationCommand: string | undefined): boolean {\n if (!this.opts.tracker.getNode(taskId)) return false;\n const cmd = verificationCommand?.trim();\n this.opts.tracker.patchMetadata(taskId, { verificationCommand: cmd ? cmd : undefined });\n return true;\n }\n\n /**\n * Cancel a task. If it is currently running, abort its subagent and mark the\n * node terminally failed+cancelled (so the scheduler frees the slot and does\n * NOT retry it). If it has not started, it is simply marked cancelled. Use\n * `retryTask` to bring a cancelled task back. Returns false for an unknown task.\n */\n async cancelTask(taskId: string): Promise<boolean> {\n const node = this.opts.tracker.getNode(taskId);\n if (!node) return false;\n this.cancelledTasks.add(taskId);\n // Terminal failed + cancel marker: failed keeps dependents un-deadlocked,\n // the marker drives the \"Cancelled\" board look and blocks retry/auto-redispatch.\n this.opts.tracker.patchMetadata(taskId, { cancelled: true });\n this.opts.tracker.updateNodeStatus(taskId, 'failed', 'cancelled by user');\n this.emit('sdd.task.failed', { runId: this.runId, taskId, subagentId: '', error: 'cancelled by user' });\n const subagentId = this.taskSubagents.get(taskId);\n if (subagentId && this.coordinator) {\n await this.coordinator.stop(subagentId).catch(() => {});\n }\n return true;\n }\n\n /**\n * Delete a not-yet-started task from the graph (pending/blocked/failed only —\n * never a running task; cancel it first). Removes the node and every edge\n * touching it; dependents lose this blocker. Returns false if missing or running.\n */\n deleteTask(taskId: string): boolean {\n const node = this.opts.tracker.getNode(taskId);\n if (!node) return false;\n if (node.status === 'in_progress' || this.taskSubagents.has(taskId)) return false;\n this.cancelledTasks.delete(taskId);\n this.retryMap.delete(taskId);\n return this.opts.tracker.removeNode(taskId);\n }\n\n /**\n * Split a task into sub-tasks and delegate them to separate workers. The new\n * leaves inherit the parent's blockers (so they don't start before the\n * parent's dependencies are met), every existing dependent is rewired to\n * depend on ALL leaves (so downstream work waits for the whole split), and the\n * parent becomes a `completed` container. Refuses a running task (cancel it\n * first) or empty subtask list. Returns the new leaf ids (empty on refusal).\n * The scheduler picks the new pending leaves up on its next dispatch pass.\n */\n splitTask(taskId: string, subtasks: SddSubtaskSpec[]): string[] {\n const tracker = this.opts.tracker;\n const node = tracker.getNode(taskId);\n if (!node) return [];\n if (node.status === 'in_progress' || this.taskSubagents.has(taskId)) return [];\n if (!subtasks.length) return [];\n\n const blockers = tracker.getBlockers(taskId);\n const dependents = tracker.getDependents(taskId);\n\n const leafIds = subtasks.map(\n (s) =>\n tracker.addNode({\n title: s.title,\n description: s.description,\n type: s.type ?? node.type,\n priority: s.priority ?? node.priority,\n status: 'pending',\n parentId: taskId,\n } as never).id,\n );\n\n for (const leaf of leafIds) {\n // Each leaf inherits the parent's dependencies…\n for (const b of blockers) tracker.addDependency(b, leaf);\n // …and every prior dependent of the parent now waits on every leaf.\n for (const dep of dependents) tracker.addDependency(leaf, dep);\n }\n\n // The parent is now just a grouping node — mark it completed so the graph\n // can settle (its real work lives in the leaves).\n this.retryMap.delete(taskId);\n this.persistRetries(taskId, 0);\n tracker.updateNodeStatus(taskId, 'completed', `split into ${leafIds.length} subtasks`);\n this.emit('sdd.task.split', { runId: this.runId, taskId, subtaskIds: leafIds });\n return leafIds;\n }\n\n private async waitWhilePaused(): Promise<void> {\n while (this.paused && !this.stopRequested) {\n await new Promise((r) => setTimeout(r, 100));\n }\n }\n\n /**\n * Continuous dependency-driven execution. Unlike a wave-barrier loop (where a\n * whole batch must finish before the next starts), this fills free worker\n * slots the instant a task's dependencies are satisfied: a fast task's\n * dependent starts immediately rather than waiting for a slow sibling. Truly\n * independent tasks run in parallel; dependency chains run in order. Returns\n * the final summary when the graph settles, deadlocks, stops, or hits a backstop.\n */\n async run(): Promise<RunResult> {\n this.stopRequested = false;\n this.restoreRetryMap();\n const startTime = Date.now();\n this.round = 0;\n this.dispatchSeq = 0;\n let totalDispatched = 0;\n\n this.buildCoordinator();\n\n // Capture the base branch once so a later rollback knows where the run's\n // squash commits landed (worktree path only; no-op without a manager).\n if (this.opts.worktrees && !this.baseBranch) {\n const base = await this.opts.worktrees.currentBase().catch(() => null);\n if (base) this.baseBranch = base.branch;\n }\n\n this.emit('sdd.run.started', {\n runId: this.runId,\n graphId: this.opts.graph.id,\n specId: this.opts.graph.specId,\n total: this.opts.graph.nodes.size,\n baseBranch: this.baseBranch,\n });\n\n this.recoveryRounds = 0;\n this.failedSweeps = 0;\n this.lastSweepCompleted = 0;\n let deadlocked = false;\n // node id → in-flight executeOne promise. size = live worker count.\n const running = new Map<string, Promise<TaskOutcome>>();\n\n const dispatch = (task: TaskNode): void => {\n totalDispatched++;\n const tracked = (async (): Promise<TaskOutcome> => {\n try {\n return await this.executeOne(task);\n } catch (err) {\n // A dispatch-time throw must not wedge the scheduler: mark the node\n // terminally failed (frees its dependents per failed-blocker rules).\n this.opts.tracker.updateNodeStatus(task.id, 'failed', `dispatch error: ${String(err)}`);\n this.emit('sdd.task.failed', { runId: this.runId, taskId: task.id, subagentId: '', error: String(err) });\n return { taskId: task.id, success: false };\n } finally {\n running.delete(task.id);\n }\n })();\n running.set(task.id, tracked);\n };\n\n while (!this.stopRequested) {\n // Run-level backstops — an autonomous run must always terminate.\n if (totalDispatched >= this.maxTotalWaves) break;\n if (this.maxWallClockMs && Date.now() - startTime >= this.maxWallClockMs) break;\n\n await this.waitWhilePaused();\n if (this.stopRequested) break;\n\n // Fill free slots with ready (dependency-satisfied) tasks not already running.\n let dispatchedThisRound = 0;\n if (running.size < this.slots) {\n const ready = this.decomposer.readyNodes().filter((t) => !running.has(t.id));\n for (const task of ready) {\n if (running.size >= this.slots) break;\n dispatch(task);\n dispatchedThisRound++;\n }\n }\n if (dispatchedThisRound > 0) {\n this.emit('sdd.wave', { runId: this.runId, wave: this.round, batchSize: dispatchedThisRound });\n this.round++;\n }\n\n if (running.size === 0) {\n // Nothing in flight and nothing dispatched this pass.\n if (this.decomposer.isSettled()) {\n // End-of-run failed-task sweep: requeue every terminal-failed\n // (non-cancelled) task and run them again, bounded by\n // maxFailedSweeps. Stop early once a sweep yields no new completions\n // (no progress) so a hopeless task can't spin the loop forever.\n const completed = this.opts.tracker.getProgress().completed;\n const madeProgress = this.failedSweeps === 0 || completed > this.lastSweepCompleted;\n if (this.failedSweeps < this.maxFailedSweeps && madeProgress && this.requeueFailedTasks() > 0) {\n this.lastSweepCompleted = completed;\n this.failedSweeps++;\n continue;\n }\n break;\n }\n const chains = this.computeDeadlockChains();\n if (chains.length > 0) {\n this.emit('sdd.deadlock', { runId: this.runId, chains });\n if (this.recoveryRounds < this.maxRecoveryRounds && this.recoverFailedBlockers()) {\n this.recoveryRounds++;\n continue;\n }\n deadlocked = true;\n }\n // No running, no ready, no recoverable deadlock → no further progress.\n break;\n }\n\n // If we still have a free slot AND a ready task, loop to dispatch it now;\n // otherwise wait for any in-flight task to settle (which may unblock more).\n const moreReadyNow =\n running.size < this.slots && this.decomposer.readyNodes().some((t) => !running.has(t.id));\n if (!moreReadyNow) {\n await Promise.race(running.values());\n this.opts.onProgress?.(this.buildProgress());\n }\n }\n\n // Drain any still-running tasks so the run never returns with live workers.\n if (running.size > 0) await Promise.allSettled(running.values());\n\n // Clean teardown on stop: interrupted tasks reset, worktrees released.\n if (this.stopRequested) await this.teardown();\n\n const finalProgress = this.opts.tracker.getProgress();\n\n this.emit('sdd.run.finished', {\n runId: this.runId,\n deadlocked,\n completed: finalProgress.completed,\n failed: finalProgress.failed,\n stopped: this.stopRequested,\n });\n\n return {\n totalWaves: this.round,\n totalCompleted: finalProgress.completed,\n totalFailed: finalProgress.failed,\n totalDurationMs: Date.now() - startTime,\n deadlocked,\n stopRequested: this.stopRequested,\n finalProgress,\n };\n }\n\n /**\n * Compute the blocking chains for a deadlock: every still-incomplete task and\n * the blockers (by node id) that are NOT completed. Failed blockers are\n * included since they're the usual deadlock cause once retries are exhausted.\n */\n private computeDeadlockChains(): Array<{ blocked: string; blockedBy: string[] }> {\n const tracker = this.opts.tracker;\n const chains: Array<{ blocked: string; blockedBy: string[] }> = [];\n for (const node of tracker.getAllNodes()) {\n if (node.status === 'completed' || node.status === 'failed') continue;\n const blockedBy = tracker\n .getBlockers(node.id)\n .filter((id) => tracker.getNode(id)?.status !== 'completed');\n if (blockedBy.length > 0) chains.push({ blocked: node.id, blockedBy });\n }\n return chains;\n }\n\n /** Requeue failed tasks that block an incomplete dependent. Returns true if any. */\n private recoverFailedBlockers(): boolean {\n const tracker = this.opts.tracker;\n let recovered = false;\n for (const node of tracker.getAllNodes({ status: ['failed'] })) {\n const blocksIncomplete = tracker.getDependents(node.id).some((d) => {\n const s = tracker.getNode(d)?.status;\n return s !== 'completed' && s !== 'failed';\n });\n if (blocksIncomplete) {\n this.retryMap.delete(node.id);\n this.persistRetries(node.id, 0);\n tracker.updateNodeStatus(node.id, 'pending', 'deadlock recovery');\n recovered = true;\n }\n }\n return recovered;\n }\n\n /**\n * Requeue every terminal-failed task that the user did NOT cancel, giving each\n * a fresh `maxRetries` budget. Shared by the automatic end-of-run sweep and\n * the manual \"retry all failed\" control. Returns the number requeued.\n */\n private requeueFailedTasks(reason = 'retry failed sweep'): number {\n const tracker = this.opts.tracker;\n let n = 0;\n for (const node of tracker.getAllNodes({ status: ['failed'] })) {\n if (this.cancelledTasks.has(node.id) || node.metadata?.cancelled) continue;\n this.retryMap.delete(node.id);\n this.persistRetries(node.id, 0);\n tracker.updateNodeStatus(node.id, 'pending', reason);\n this.emit('sdd.task.retrying', {\n runId: this.runId,\n taskId: node.id,\n attempt: 0,\n maxRetries: this.maxRetries,\n });\n n++;\n }\n return n;\n }\n\n /**\n * Manually requeue all failed tasks to `pending` (board \"Retry all failed\").\n * Unlike the automatic sweep this also clears any `cancelled` marker, so a\n * user can bring cancelled tasks back in the same action — mirroring\n * `retryTask`. Picked up by the running scheduler on its next dispatch pass.\n * Returns the number of tasks requeued.\n */\n retryAllFailed(): number {\n const failed = this.opts.tracker.getAllNodes({ status: ['failed'] });\n for (const node of failed) {\n this.cancelledTasks.delete(node.id);\n this.opts.tracker.patchMetadata(node.id, { cancelled: undefined });\n }\n return this.requeueFailedTasks('manual retry all');\n }\n\n /** Restore per-task retry counts persisted in node metadata (resume support). */\n private restoreRetryMap(): void {\n this.retryMap.clear();\n for (const node of this.opts.tracker.getAllNodes()) {\n const r = (node.metadata as { retries?: unknown } | undefined)?.retries;\n if (typeof r === 'number' && r > 0) this.retryMap.set(node.id, r);\n }\n }\n\n /**\n * Reset orphaned `in_progress` tasks (no agent runs them after a crash) back\n * to `pending` so a fresh run re-executes them. Call before constructing a run\n * from a reloaded graph. Static so callers don't need a run instance.\n */\n static resetOrphans(tracker: TaskTracker): number {\n let n = 0;\n for (const node of tracker.getAllNodes({ status: ['in_progress'] })) {\n tracker.updateNodeStatus(node.id, 'pending', 'resume: orphaned in_progress');\n n++;\n }\n return n;\n }\n\n /** Clean teardown after a stop: reset interrupted tasks + release worktrees. */\n private async teardown(): Promise<void> {\n for (const node of this.opts.tracker.getAllNodes({ status: ['in_progress'] })) {\n this.opts.tracker.updateNodeStatus(node.id, 'pending', 'run stopped');\n }\n const wt = this.opts.worktrees;\n if (wt) {\n for (const [taskId, handle] of [...this.taskWorktrees]) {\n await wt.release(handle, { keep: true }).catch(() => {});\n this.forgetWorktree(taskId);\n }\n }\n }\n\n // -------------------------------------------------------------------\n // Internal\n // -------------------------------------------------------------------\n\n private buildCoordinator(): void {\n const config: MultiAgentConfig = {\n coordinatorId: `sdd-parallel-${randomUUID().slice(0, 8)}`,\n maxConcurrent: this.slots,\n doneCondition: { type: 'all_tasks_done' },\n // Default budget guard for every spawned worker: idle reaper (resets on\n // activity) plus the opt-in wall-clock cap when one was configured. This\n // ensures the reaper applies even if a per-spawn config path is bypassed.\n defaultBudget: {\n idleTimeoutMs: this.idleTimeoutMs,\n ...(this.timeoutMs ? { timeoutMs: this.timeoutMs } : {}),\n },\n };\n this.coordinator = new DefaultMultiAgentCoordinator(config);\n // Wrap factory with disabled tool filtering to prevent subagents from\n // using the delegate tool (or any other disabledTools in their config)\n const baseFactory = this.opts.subagentFactory ?? this.defaultFactory();\n const filteredFactory = withDisabledToolFiltering(baseFactory);\n const runner = makeAgentSubagentRunner({ factory: filteredFactory });\n this.coordinator.setRunner?.(runner);\n }\n\n private defaultFactory(): AgentFactory {\n return async (_config: SubagentConfig) => ({\n agent: this.opts.agent,\n events: this.opts.agent.events,\n });\n }\n\n /**\n * Execute a batch of tasks together. Retained as a thin wrapper over the\n * single-task primitive `executeOne` so the wave-oriented tests and any\n * batch callers keep working; the continuous scheduler in `run()` calls\n * `executeOne` directly. Throws if no coordinator is wired or a spawn fails\n * (surfaced from `executeOne`), preserving the original all-or-nothing contract.\n */\n async executeWave(batch: TaskBatch): Promise<WaveResult> {\n const waveStart = Date.now();\n const outcomes = await Promise.all(batch.tasks.map((task) => this.executeOne(task)));\n const results = outcomes.map((o) => o.result).filter((r): r is TaskResult => Boolean(r));\n const successCount = outcomes.filter((o) => o.success).length;\n const failCount = outcomes.length - successCount;\n return {\n wave: batch.wave,\n batch,\n results,\n successCount,\n failCount,\n durationMs: Date.now() - waveStart,\n stopRequested: this.stopRequested,\n };\n }\n\n /**\n * Execute one task end-to-end: assign a worker identity, allocate its worktree,\n * spawn + assign the subagent, await its result, then update tracker status\n * (success / retry / terminal-fail / cancelled) and resolve the worktree. This\n * is the unit the continuous scheduler dispatches into a free slot. Throws on a\n * missing coordinator or failed spawn so callers can enforce all-or-nothing.\n */\n async executeOne(task: TaskNode): Promise<TaskOutcome> {\n const taskId = task.id;\n\n // Worker identity (reuse a manual assignment if present), shown on the board.\n let agentName = task.assignee;\n if (!agentName) {\n const nick = assignNickname('executor', this.usedNicknames);\n this.usedNicknames.add(nick.key);\n agentName = nick.display.replace(/\\s*\\([^)]*\\)\\s*$/, '');\n this.opts.tracker.updateNode(taskId, { assignee: agentName });\n }\n\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress');\n\n // Per-task git-worktree isolation: a fresh checkout off the current base\n // (which already holds every dependency's merged work).\n await this.allocateWorktrees([task]);\n\n if (!this.coordinator) throw new SddError({\n message: 'SDD parallel runner requires a coordinator',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n const coordinator = this.coordinator;\n\n const subagentId = `sdd-d${this.dispatchSeq++}`;\n const correlationId = randomUUID();\n\n // Per-task model / provider / fallback resolution: the node's own assignment\n // (set per-task in the WebUI) wins, else the run-level default.\n const meta = (task.metadata ?? {}) as Record<string, unknown>;\n const model = (typeof meta.model === 'string' ? meta.model : undefined) ?? this.opts.defaultModel;\n const provider =\n (typeof meta.provider === 'string' ? meta.provider : undefined) ?? this.opts.defaultProvider;\n const fallbackModels = Array.isArray(meta.fallbackModels)\n ? (meta.fallbackModels as string[])\n : this.opts.fallbackModels;\n\n const spawnResult = await coordinator.spawn({\n id: subagentId,\n name: agentName ?? subagentId,\n role: 'executor',\n // Idle reaper is always on; the hard wall-clock cap only when opted in.\n idleTimeoutMs: this.idleTimeoutMs,\n ...(this.timeoutMs ? { timeoutMs: this.timeoutMs } : {}),\n cwd: this.taskCwds.get(taskId),\n disabledTools: ['delegate'],\n ...(model ? { model } : {}),\n ...(provider ? { provider } : {}),\n ...(fallbackModels?.length ? { fallbackModels } : {}),\n });\n if (!spawnResult.subagentId) {\n throw new SddError({\n message: 'One or more subagent spawns failed',\n code: ERROR_CODES.SDD_INVALID_STATE,\n });\n }\n // Record the live subagent so cancelTask() can abort exactly this task.\n this.taskSubagents.set(taskId, subagentId);\n\n this.emit('sdd.task.started', {\n runId: this.runId,\n taskId,\n subagentId,\n agentName: agentName ?? '',\n worktreeBranch: this.taskBranches.get(taskId),\n });\n\n const directivePreamble = [\n '═══ SDD PARALLEL EXECUTION ═══',\n '',\n `Graph: ${this.opts.graph.title}`,\n '',\n '── EXECUTION PROTOCOL ──',\n '• Execute the assigned SDD task end-to-end using multiple tool calls.',\n '• Mark the task [done] in the tracker when complete.',\n '• Do not ask before routine in-project tool use; if a permission gate appears, wait for that flow.',\n '• Keep output concise — summarize changes, do not transcribe files.',\n ].join('\\n');\n\n await coordinator.assign({\n id: correlationId,\n description: [\n directivePreamble,\n '',\n `── TASK ──`,\n `[${task.priority.toUpperCase()}] ${task.title}`,\n '',\n task.description,\n ].join('\\n'),\n subagentId,\n ...(this.timeoutMs ? { timeoutMs: this.timeoutMs } : {}),\n });\n\n let result: TaskResult;\n try {\n const got = await coordinator.awaitTasks([correlationId]);\n result = expectDefined(got[0]);\n } catch (err) {\n result = {\n subagentId,\n taskId: correlationId,\n status: 'failed',\n error: { kind: 'unknown', message: String(err), retryable: false },\n iterations: 0,\n toolCalls: 0,\n durationMs: 0,\n };\n }\n\n this.taskSubagents.delete(taskId);\n\n // Cancelled mid-flight: cancelTask() already marked the node terminal — don't\n // resurrect it via the retry path. Discard its worktree and report failure.\n if (this.cancelledTasks.has(taskId)) {\n await this.resolveWorktrees([task]);\n return { taskId, success: false, result };\n }\n\n // Completion gate: a worker-reported success is not trusted until the\n // optional verification gate passes. A rejection here is treated exactly\n // like a task failure (retry while attempts remain, else terminal-fail) and\n // — crucially — happens BEFORE the worktree merge, so unverified work never\n // reaches the base branch.\n let verificationFailReason: string | undefined;\n if (result.status === 'success' && this.opts.verifyTask) {\n const cwd = this.taskCwds.get(taskId) ?? this.opts.projectRoot;\n try {\n const verdict = await this.opts.verifyTask({ task, result, cwd });\n if (!verdict.ok) {\n verificationFailReason = `verification failed: ${verdict.reason ?? 'acceptance criteria not met'}`;\n }\n } catch (err) {\n verificationFailReason = `verification error: ${String(err)}`;\n }\n if (verificationFailReason) {\n this.emit('sdd.task.verification_failed', {\n runId: this.runId,\n taskId,\n reason: verificationFailReason,\n });\n }\n }\n\n let success = false;\n if (result.status === 'success' && !verificationFailReason) {\n // Merge gate: only declare 'completed' once this task's worktree integrates\n // cleanly into the base. An unresolved conflict is treated like any other\n // failure (retry on a fresh base, else terminal-fail) so the run never\n // wedges and dependents never build on un-merged work.\n const merged = await this.integrateWorktree(task, result);\n if (merged.ok) {\n success = true;\n this.opts.tracker.updateNodeStatus(taskId, 'completed');\n this.retryMap.delete(taskId);\n this.persistRetries(taskId, 0);\n this.emit('sdd.task.completed', {\n runId: this.runId,\n taskId,\n subagentId,\n durationMs: result.durationMs,\n });\n } else if (merged.reason) {\n // A conflict-resolved merge that regressed re-verification — the squash\n // commit was reverted. Surface it as a verification failure (not a raw\n // conflict) and let the retry path re-run on a fresh base.\n this.emit('sdd.task.verification_failed', {\n runId: this.runId,\n taskId,\n reason: merged.reason,\n });\n await this.applyTaskFailure(taskId, subagentId, merged.reason);\n } else {\n this.emit('sdd.task.conflict', {\n runId: this.runId,\n taskId,\n conflictFiles: merged.conflictFiles ?? [],\n });\n const reason = `merge conflict${merged.conflictFiles?.length ? `: ${merged.conflictFiles.join(', ')}` : ''}`;\n await this.applyTaskFailure(taskId, subagentId, reason);\n }\n } else {\n const errMsg =\n verificationFailReason ??\n (result.error?.kind\n ? `${result.error.kind}: ${result.error.message}`\n : result.error?.message ?? 'unknown error');\n await this.applyTaskFailure(taskId, subagentId, errMsg);\n // Resolve the worktree for the non-success path (failed → keep, retry → discard).\n await this.resolveWorktrees([task]);\n }\n\n return { taskId, success, result };\n }\n\n /**\n * Apply a task failure: retry (→ pending, bump retry count) while attempts\n * remain, else consult the optional supervisor (which can rescue via\n * retry/reassign/split), else terminal-fail (→ failed). Shared by the\n * worker-failure, verification-gate, and merge-conflict paths so all three\n * negotiate the same retry budget and emit the same events.\n */\n private async applyTaskFailure(taskId: string, subagentId: string, errMsg: string): Promise<void> {\n const currentRetries = this.retryMap.get(taskId) ?? 0;\n if (currentRetries < this.maxRetries) {\n this.retryMap.set(taskId, currentRetries + 1);\n this.persistRetries(taskId, currentRetries + 1);\n this.opts.tracker.updateNodeStatus(\n taskId,\n 'pending',\n `Retry ${currentRetries + 1}/${this.maxRetries}: ${errMsg}`,\n );\n this.emit('sdd.task.retrying', {\n runId: this.runId,\n taskId,\n attempt: currentRetries + 1,\n maxRetries: this.maxRetries,\n });\n return;\n }\n\n // Retries exhausted — give the supervisor a bounded chance to rescue the\n // task before it goes terminal, so a run \"decides\" rather than dead-ends.\n if (await this.trySupervisorRescue(taskId, errMsg)) return;\n\n this.opts.tracker.updateNodeStatus(taskId, 'failed', errMsg);\n this.emit('sdd.task.failed', { runId: this.runId, taskId, subagentId, error: errMsg });\n }\n\n /**\n * Consult `superviseFailure` for a task that has exhausted its retries.\n * Applies the verdict (retry / reassign+retry / split) and returns true when\n * the task was rescued (caller must NOT terminal-fail it). Bounded per task by\n * `maxSupervisorEscalations` so an always-\"retry\" supervisor can't loop forever.\n */\n private async trySupervisorRescue(taskId: string, errMsg: string): Promise<boolean> {\n const supervise = this.opts.superviseFailure;\n if (!supervise) return false;\n const used = this.supervisorEscalations.get(taskId) ?? 0;\n if (used >= this.maxSupervisorEscalations) return false;\n const node = this.opts.tracker.getNode(taskId);\n if (!node) return false;\n\n let verdict: SddSupervisorVerdict | undefined;\n try {\n verdict = await supervise({ task: node, error: errMsg, attempts: used });\n } catch {\n return false; // a flaky supervisor must not block terminal failure\n }\n if (!verdict || verdict.action === 'fail') return false;\n\n this.supervisorEscalations.set(taskId, used + 1);\n const requeue = (reason: string) => {\n this.retryMap.delete(taskId);\n this.persistRetries(taskId, 0);\n this.opts.tracker.updateNodeStatus(taskId, 'pending', reason);\n };\n\n if (verdict.action === 'reassign') {\n this.setTaskModel(taskId, verdict.model, verdict.provider);\n requeue(`supervisor reassign: ${verdict.model ?? 'default'}`);\n this.emit('sdd.supervisor.decision', { runId: this.runId, taskId, action: 'reassign' });\n return true;\n }\n if (verdict.action === 'split') {\n const ids = this.splitTask(taskId, verdict.subtasks);\n if (ids.length === 0) return false; // split refused (e.g. running) → let it fail\n this.emit('sdd.supervisor.decision', { runId: this.runId, taskId, action: 'split' });\n return true;\n }\n // 'retry'\n requeue('supervisor retry');\n this.emit('sdd.supervisor.decision', { runId: this.runId, taskId, action: 'retry' });\n return true;\n }\n\n /**\n * Integrate a verified-successful task's worktree into the base branch.\n * Commits, squash-merges (optionally running `conflictResolver` first), and on\n * success releases the worktree. On an UNRESOLVED conflict it returns\n * `{ok:false}` with the conflicting files so the caller routes the task into\n * the failure path (a retry forks a fresh worktree off the now-advanced base,\n * which usually clears the conflict). No-op `{ok:true}` when worktrees are\n * disabled or none was allocated for this task. Never throws — a merge hiccup\n * degrades to a (retryable) failure rather than wedging the run.\n */\n private async integrateWorktree(\n task: TaskNode,\n result?: TaskResult,\n ): Promise<{ ok: boolean; conflictFiles?: string[]; reason?: string }> {\n const wt = this.opts.worktrees;\n if (!wt) return { ok: true };\n const handle = this.taskWorktrees.get(task.id);\n if (!handle) return { ok: true };\n try {\n await wt.commitAll(handle, `sdd(${task.title}): ${task.id}`);\n // Capture the base tip before merging so a regressed conflict-resolution\n // can be reverted to exactly this commit (see the re-verify branch below),\n // and so we can tell whether this merge actually advanced the base (an\n // empty squash creates no commit → nothing to record for rollback).\n const baseShaBefore = await wt.baseHead(handle);\n const baseSha = this.opts.conflictResolver ? baseShaBefore : null;\n const res = await wt.merge(handle, {\n squash: true,\n ...(this.opts.conflictResolver\n ? {\n resolve: (info: { conflictFiles: string[]; cwd: string }) =>\n this.opts.conflictResolver!({ task, conflictFiles: info.conflictFiles, cwd: info.cwd }),\n }\n : {}),\n });\n if (res.ok) {\n // A merge that only landed because the conflictResolver rewrote files is\n // not trusted blindly: re-run the completion gate against the INTEGRATED\n // base. If it regresses, revert the squash commit so the auto-resolution\n // never sticks, and treat the task as a (retryable) failure.\n if (res.resolved && this.opts.verifyTask && baseSha) {\n let regressed: string | undefined;\n try {\n const verdict = await this.opts.verifyTask({\n task,\n result: result ?? ({} as TaskResult),\n cwd: this.opts.projectRoot,\n });\n if (!verdict.ok) regressed = verdict.reason ?? 'verification failed after conflict resolution';\n } catch (err) {\n regressed = `verification error after conflict resolution: ${String(err)}`;\n }\n if (regressed) {\n await wt.revertBaseTo(handle, baseSha).catch(() => {});\n await wt.release(handle, { keep: false }).catch(() => {});\n this.forgetWorktree(task.id, { keepBranchLabel: true });\n return { ok: false, conflictFiles: [], reason: regressed };\n }\n }\n // Record the squash commit for rollback — but only if the merge actually\n // advanced the base tip (an empty/no-op squash leaves it unchanged).\n const baseShaAfter = await wt.baseHead(handle);\n if (baseShaAfter && baseShaAfter !== baseShaBefore) {\n this.mergedCommits.push({ taskId: task.id, sha: baseShaAfter, title: task.title });\n this.emit('sdd.task.merged', { runId: this.runId, taskId: task.id, sha: baseShaAfter });\n }\n await wt.release(handle, { keep: false });\n this.forgetWorktree(task.id);\n return { ok: true };\n }\n // Unresolved conflict: the manager already hard-reset the base and parked\n // the handle as `needs-review` (force-kept for inspection). Drop our handle\n // reference so a retry allocates a fresh worktree off the advanced base.\n await wt.release(handle, { keep: false }).catch(() => {});\n this.forgetWorktree(task.id, { keepBranchLabel: true });\n return { ok: false, conflictFiles: res.conflictFiles ?? [] };\n } catch {\n // Commit/merge hiccup — don't wedge the run; treat as a retryable failure.\n this.forgetWorktree(task.id);\n return { ok: false, conflictFiles: [] };\n }\n }\n\n /** Allocate a fresh git worktree per task in the batch (no-op without a manager). */\n private async allocateWorktrees(tasks: TaskNode[]): Promise<void> {\n const wt = this.opts.worktrees;\n if (!wt) return;\n for (const task of tasks) {\n if (this.taskWorktrees.has(task.id)) continue;\n try {\n const handle = await wt.allocate(`sdd-${task.id}`, {\n slugHint: task.title,\n ownerLabel: task.title,\n });\n if (handle.status === 'active') {\n this.taskWorktrees.set(task.id, handle);\n this.taskCwds.set(task.id, handle.dir);\n this.taskBranches.set(task.id, handle.branch);\n const node = this.opts.tracker.getNode(task.id);\n if (node) node.metadata = { ...node.metadata, worktreeBranch: handle.branch };\n }\n } catch {\n // Allocation failed → this task runs on the shared working tree.\n }\n }\n }\n\n /**\n * Resolve each task's worktree after its result is known. Serialized merges\n * (one at a time) keep the base branch consistent; the wave structure already\n * guarantees dependency order (a task's blockers merged in an earlier wave).\n */\n private async resolveWorktrees(tasks: TaskNode[]): Promise<void> {\n const wt = this.opts.worktrees;\n if (!wt) return;\n for (const task of tasks) {\n const handle = this.taskWorktrees.get(task.id);\n if (!handle) continue;\n const node = this.opts.tracker.getNode(task.id);\n const status = node?.status;\n const cancelled = Boolean(node?.metadata?.cancelled);\n try {\n if (cancelled) {\n // User cancelled → throw away the partial checkout, don't merge it.\n await wt.release(handle, { keep: false });\n this.forgetWorktree(task.id, { keepBranchLabel: false });\n } else if (status === 'completed') {\n await wt.commitAll(handle, `sdd(${task.title}): ${task.id}`);\n await wt.merge(handle, { squash: true });\n await wt.release(handle, { keep: false });\n this.forgetWorktree(task.id);\n } else if (status === 'failed') {\n // Discard the failed checkout so worktrees don't pile up across a run\n // with many failures. (A genuine merge-conflict handle — status\n // 'needs-review'/'failed' — is force-kept by the manager regardless,\n // so conflicts that actually need a human still stay on disk.)\n await wt.release(handle, { keep: false });\n this.forgetWorktree(task.id, { keepBranchLabel: false });\n } else {\n // Pending again (retry) → discard so the next wave starts clean.\n await wt.release(handle, { keep: false });\n this.forgetWorktree(task.id, { keepBranchLabel: false });\n }\n } catch {\n // Merge/release hiccup must not abort the run; leave the handle parked.\n this.forgetWorktree(task.id);\n }\n }\n }\n\n private forgetWorktree(taskId: string, opts: { keepBranchLabel?: boolean } = {}): void {\n this.taskWorktrees.delete(taskId);\n this.taskCwds.delete(taskId);\n if (!opts.keepBranchLabel) this.taskBranches.delete(taskId);\n }\n\n /** Persist a task's retry count into node metadata (survives crash → resume). */\n private persistRetries(taskId: string, retries: number): void {\n const node = this.opts.tracker.getNode(taskId);\n if (node) node.metadata = { ...node.metadata, retries };\n }\n\n private buildProgress(): SddProgress {\n const gp = this.opts.tracker.getProgress();\n const isDeadlocked = !this.decomposer.isDone() &&\n this.decomposer.nextBatch().deadlocked;\n return {\n wave: this.decomposer.getWaveCount(),\n total: gp.total,\n completed: gp.completed,\n inProgress: gp.inProgress,\n failed: gp.failed,\n blocked: gp.blocked,\n pending: gp.pending,\n percent: gp.percentComplete,\n deadlocked: isDeadlocked,\n };\n }\n}\n","import type { Agent, AgentInput, RunResult } from '../core/agent.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type {\n SubagentConfig,\n SubagentRunContext,\n SubagentRunOutcome,\n SubagentRunner,\n TaskSpec,\n} from '../types/multi-agent.js';\nimport { AgentError, ERROR_CODES } from '../types/errors.js';\nimport {\n BudgetExceededError,\n BudgetThresholdSignal,\n} from './subagent-budget.js';\nimport type { FleetBus } from './fleet-bus.js';\n\n/**\n * Caller-supplied factory that builds an isolated `Agent` for a subagent.\n * The factory MUST construct a fresh `Context` per call — sharing context\n * between subagents defeats isolation. Each Agent should also use either\n * its own `EventBus` or a forwarded view, so per-subagent metrics can be\n * attributed correctly.\n */\nexport type AgentFactory = (config: SubagentConfig) => Promise<AgentFactoryResult>;\n\n/**\n * Wrap a factory to automatically filter out disabled tools from subagent\n * configurations. This provides mechanical enforcement of tool restrictions\n * (e.g., preventing delegation) in addition to the baseline prompt constraint.\n *\n * The wrapper reads `config.disabledTools` and removes those tools from the\n * agent's tool registry before returning.\n *\n * Usage:\n * const filteredFactory = withDisabledToolFiltering(originalFactory);\n * const runner = makeAgentSubagentRunner({ factory: filteredFactory });\n */\nexport function withDisabledToolFiltering(factory: AgentFactory): AgentFactory {\n return async (config: SubagentConfig) => {\n const result = await factory(config);\n const disabled = config.disabledTools ?? [];\n if (disabled.length === 0) return result;\n\n // Agent.tools is a ToolRegistry with unregister() method\n const registry = result.agent.tools;\n if (registry && typeof registry.unregister === 'function') {\n for (const toolName of disabled) {\n registry.unregister(toolName);\n }\n }\n return result;\n };\n}\n\nexport interface AgentFactoryResult {\n agent: Agent;\n /** Event bus the factory wired to this agent — required for budget hookup. */\n events: EventBus;\n /**\n * Optional cleanup hook invoked in the runner's `finally` block once\n * the task ends (success, failure, abort — same exit path). Factories\n * that own resources scoped to a single task (per-subagent JSONL\n * writers, transient providers, throwaway containers) implement this\n * to close them deterministically instead of relying on GC. Errors\n * thrown here are swallowed so a flaky cleanup can't mask the task's\n * real result.\n */\n dispose?: ((() => Promise<void> | void)) | undefined;\n}\n\nexport interface AgentRunnerOptions {\n factory: AgentFactory;\n /**\n * Format a TaskSpec into the user input the agent will receive. Defaults\n * to `task.description ?? ''`. Override when subagents expect structured\n * input (e.g. JSON contracts, role-prefixed prompts).\n */\n formatTaskInput?: (task: TaskSpec, config: SubagentConfig) => AgentInput;\n /**\n * When set, the runner attaches the subagent's EventBus to this FleetBus\n * on task start and detaches it when the task finishes. This is the\n * injection seam that lets the TUI fleet panel observe subagent activity\n * live — without it, FleetBus stays empty.\n */\n fleetBus?: FleetBus | undefined;\n}\n\n/**\n * Builds a `SubagentRunner` that drives a real `Agent` per task while honoring\n * the coordinator's budget and abort signal. This is the production adapter —\n * the coordinator's `runner` option in CLI/TUI assemblies points here.\n *\n * Lifecycle per task:\n * 1. factory(config) → fresh Agent + EventBus.\n * 2. Subscribe to events to feed the budget (tool calls, token usage).\n * 3. Call agent.run(input, { signal }) — the coordinator's signal cancels.\n * 4. Map RunResult.status onto a `SubagentRunOutcome` or throw on failure.\n * 5. Unsubscribe and let the factory's resources be GC'd.\n *\n * The budget is checked synchronously from event handlers — a runaway agent\n * that crosses its tool-call limit triggers `BudgetExceededError`, which the\n * coordinator surfaces as `status: 'failed'` on the task result.\n */\nexport function makeAgentSubagentRunner(opts: AgentRunnerOptions): SubagentRunner {\n const format = opts.formatTaskInput ?? defaultFormatTaskInput;\n\n return async (task: TaskSpec, ctx: SubagentRunContext): Promise<SubagentRunOutcome> => {\n const taskStartedAt = Date.now();\n const factoryResult = await opts.factory(ctx.config);\n const { agent, events } = factoryResult;\n\n // Attach subagent EventBus to FleetBus so the TUI fleet panel (and any\n // other FleetBus subscriber) can observe this subagent live. Detach on\n // task finish — each task is a fresh Agent + EventBus, so we never\n // want a stale bus lingering after the run.\n const detachFleet = opts.fleetBus?.attach(ctx.subagentId, events, task.id);\n\n // Hook budget into the agent's event stream. We capture errors thrown by\n // recordToolCall/recordUsage so the budget can short-circuit the run by\n // aborting the controller — the agent then unwinds cooperatively.\n const aborter = new AbortController();\n // Inject the EventBus into the budget so it can emit budget.threshold_reached\n // events when a soft limit is hit and the handler wants to ask the coordinator.\n ctx.budget._events = events;\n // Wire the threshold-negotiation handler. Without this the soft-limit\n // path is dead code: every budget overrun becomes a hard\n // BudgetExceededError and the subagent dies on its first 120-iteration\n // tick instead of asking the Director for headroom. The Director's\n // FleetBus listener (director.ts) auto-grants +50% up to a per-kind\n // ceiling and per-subagent extension count — wiring this is the\n // missing link that activates that flow.\n ctx.budget.onThreshold = ({ requestDecision }) => requestDecision();\n let budgetError: Error | null = null;\n\n /**\n * Common error handler for all budget-triggered events. Distinguishes:\n * - BudgetExceededError → hard stop, set budgetError + abort\n * - BudgetThresholdSignal → soft stop: await the coordinator's\n * decision. If 'stop', abort. If 'extend', the signal handler\n * has already patched the budget so we can continue without\n * actually aborting the agent.\n */\n const onBudgetError = (err: unknown): void => {\n if (err instanceof BudgetThresholdSignal) {\n // Defer the stop/extend decision to the post-finally block below.\n // The coordinator's verdict may arrive after agent.run() returns;\n // awaiting it there (rather than in this fire-and-forget handler)\n // avoids a race where both this callback and the post-finally\n // block try to mutate `budgetError` concurrently.\n budgetError = err;\n return;\n }\n // Hard stop (BudgetExceededError or other)\n aborter.abort();\n budgetError =\n err instanceof BudgetExceededError\n ? err\n : new BudgetExceededError(\n 'tool_calls',\n 0,\n 0,\n );\n // Attach the real error detail so the task result surfaces\n // something actionable instead of a generic budget message.\n if (budgetError !== err && err instanceof Error) {\n budgetError.message += ` (caused by: ${err.message})`;\n }\n };\n\n // Track the name of the most recent tool that returned ok:false so\n // we can lift it into the SubagentError when the agent ends without\n // recovering. Cleared on every successful tool execution so a tool\n // that later succeeded doesn't taint the final report.\n let lastToolFailed: string | null = null;\n\n const unsub: Array<() => void> = [];\n unsub.push(\n events.on('tool.executed', (e) => {\n // Count tool calls on the PAIRED 'tool.executed' event rather\n // than 'tool.started'. A tool can fire start then crash before\n // emitting executed (process killed, signal aborted mid-exec);\n // counting only the paired event keeps the budget tally honest\n // and matches what the model actually saw in its turn.\n try {\n ctx.budget.recordToolCall();\n } catch (eb) {\n onBudgetError(eb);\n }\n // Track ok:false so we can fail the subagent if it ends without\n // recovering. Successful runs clear it — the model may try a\n // tool, get an error, and self-heal on the next iteration; that\n // path should still report success.\n if (e.ok === false) {\n lastToolFailed = e.name;\n } else if (e.ok === true) {\n lastToolFailed = null;\n }\n }),\n events.on('provider.response', (e) => {\n try {\n ctx.budget.recordUsage(e.usage);\n } catch (e2) {\n void onBudgetError(e2);\n }\n }),\n events.on('iteration.started', () => {\n try {\n ctx.budget.recordIteration();\n } catch (e) {\n void onBudgetError(e);\n }\n // Emit a periodic progress snapshot every SUMMARY_INTERVAL\n // iterations so the leader can surface \"AGENT#2 ● L25 · 47 tools\"\n // in the main chat history without needing the FleetPanel open.\n const u = ctx.budget.usage();\n const since = u.iterations - lastSummaryAtIteration;\n if (since >= SUMMARY_INTERVAL) {\n lastSummaryAtIteration = u.iterations;\n events.emit('subagent.iteration_summary', {\n subagentId: ctx.subagentId,\n iteration: u.iterations,\n toolCalls: u.toolCalls,\n costUsd: u.costUsd,\n currentTool: currentToolName,\n partialText: streamingTextAcc.trim() || undefined,\n });\n }\n }),\n // D3: cooperative timeout enforcement DURING a long tool call.\n // The iteration-loop checkTimeout() only fires between agent\n // iterations — a single `bash sleep 3600` call would otherwise\n // park inside one tool execution while the timeout silently\n // passes, relying solely on the coordinator's hard Promise.race\n // to interrupt. Tools that emit `tool.progress` (bash chunks,\n // fetch byte progress, spawn-stream stdout) give us a heartbeat\n // we can hang the check on. When the budget trips here:\n // 1. onBudgetError sets budgetError + aborter.abort()\n // 2. aborter signal propagates to agent.run → tool executor\n // 3. tool's own signal listener kills the child process\n // Cheap: O(1) per progress event, and the budget short-circuits\n // when timeoutMs is unset (most subagents have one set anyway).\n events.on('tool.progress', () => {\n // Streamed progress (bash chunks, fetch bytes, spawn stdout) is forward\n // motion — reset the idle clock so a long-but-working tool is never\n // mistaken for a stall, THEN check whether a genuine timeout tripped.\n ctx.budget.markActivity();\n try {\n ctx.budget.checkTimeout();\n } catch (e) {\n void onBudgetError(e);\n }\n }),\n );\n\n // Track current tool name + streaming text for the periodic summary.\n let currentToolName: string | undefined;\n let streamingTextAcc = '';\n let lastSummaryAtIteration = 0;\n const SUMMARY_INTERVAL = 25;\n\n unsub.push(\n events.on('tool.started', (e) => {\n currentToolName = e.name;\n }),\n events.on('provider.text_delta', (e) => {\n // Streamed assistant text is forward motion too — keep the idle\n // clock fresh while the model is actively generating.\n ctx.budget.markActivity();\n // Accumulate last ~2000 chars for the partial text snapshot.\n streamingTextAcc = (streamingTextAcc + e.text).slice(-2000);\n }),\n );\n\n // Forward the coordinator signal so stop() from outside also aborts.\n const onParentAbort = () => aborter.abort();\n ctx.signal.addEventListener('abort', onParentAbort);\n\n let result: RunResult;\n try {\n result = await agent.run(format(task, ctx.config), { signal: aborter.signal });\n // Emit task_completed BEFORE the finally block unsubscribes the\n // FleetBus — this lets the WebUI see the subagent's final output.\n events.emit('subagent.task_completed', {\n subagentId: ctx.subagentId,\n taskId: task.id,\n status: result.status === 'done' ? 'success' : 'failed',\n iterations: result.iterations,\n toolCalls: ctx.budget.usage().toolCalls,\n durationMs: Date.now() - taskStartedAt,\n finalText: result.finalText?.trim() || undefined,\n });\n } finally {\n detachFleet?.();\n ctx.signal.removeEventListener('abort', onParentAbort);\n for (const u of unsub) u();\n // Per-task resource cleanup. Closes JSONL writers, throwaway\n // providers, etc. that the factory wired up. Swallowed errors —\n // a flaky cleanup must not mask the real task result. The\n // caller can re-emit via observability if needed.\n if (factoryResult.dispose) {\n try {\n await factoryResult.dispose();\n } catch {\n // intentional swallow — see comment above\n }\n }\n }\n\n // A budget violation is the signal — surface it so the coordinator can\n // tag the task with the right failure kind ('failed' for budget; the\n // coordinator separately recognises 'timeout' from BudgetExceededError).\n if (budgetError) {\n // BudgetThresholdSignal: the soft limit was hit but the coordinator\n // hasn't resolved the extension decision yet. If the decision was\n // 'extend', the coordinator patched limits and the agent finished\n // normally — no error to surface. If 'stop', budgetError becomes\n // a BudgetExceededError thrown below.\n // instanceof check on Error subtypes requires 'any' intersection\n // on the union — use a property guard instead.\n if ('decision' in budgetError) {\n try {\n const decision = await (budgetError as BudgetThresholdSignal).decision;\n if (decision === 'stop') {\n budgetError = new BudgetExceededError(\n (budgetError as BudgetThresholdSignal).kind,\n (budgetError as BudgetThresholdSignal).limit,\n (budgetError as BudgetThresholdSignal).used,\n );\n } else {\n budgetError = null;\n }\n } catch {\n // Decision promise rejected — treat as hard stop.\n budgetError = new BudgetExceededError(\n (budgetError as BudgetThresholdSignal).kind,\n (budgetError as BudgetThresholdSignal).limit,\n (budgetError as BudgetThresholdSignal).used,\n );\n }\n }\n if (budgetError) throw budgetError;\n }\n\n if (result.status === 'failed') {\n throw result.error instanceof AgentError\n ? result.error\n : new AgentError({\n message: result.error instanceof Error ? result.error.message : String(result.error ?? 'agent failed'),\n code: ERROR_CODES.AGENT_RUN_FAILED,\n cause: result.error,\n });\n }\n // 'aborted' and 'max_iterations' aren't successes — let the coordinator\n // classify them. When the parent signal was aborted, coordinator marks\n // the task 'stopped' (matched against subagent.abortController.aborted).\n if (result.status === 'aborted') {\n throw new AgentError({\n message: 'agent aborted',\n code: ERROR_CODES.AGENT_ABORTED,\n });\n }\n if (result.status === 'max_iterations') {\n throw new AgentError({\n message: 'agent exhausted iteration limit',\n code: ERROR_CODES.AGENT_ITERATION_LIMIT,\n recoverable: true,\n });\n }\n\n const usage = ctx.budget.usage();\n // Empty-response guard. A \"successful\" run with no text AND no tool\n // calls is almost always a prompt / config issue, not a real\n // success — the agent burned an iteration to say nothing. Surface\n // it as a classified failure so callers can show \"✗ empty_response\"\n // instead of a confusing green ✓ with no output. We only trip on\n // the (no-text AND no-tools) intersection because text-less runs\n // with tool calls are legit (e.g. \"run npm test then end_turn\").\n const finalText = (result.finalText ?? '').trim();\n if (finalText.length === 0 && usage.toolCalls === 0) {\n throw new AgentError({\n message: 'empty response — agent produced no text and no tool calls',\n code: ERROR_CODES.AGENT_RUN_FAILED,\n context: { iterations: result.iterations },\n });\n }\n // Unrecovered-tool-failure guard. If the last executed tool came\n // back ok:false AND the agent ended its turn with no closing text,\n // the agent never acknowledged or recovered from the failure — the\n // task is effectively broken. A model that handles a tool error\n // emits SOME text on the next iteration (\"the read failed, trying\n // an alternate path…\") which clears `lastToolFailed`; the only way\n // both signals can be live at end-of-run is if the model gave up\n // silently. Surface as `tool_failed` so callers see the actual\n // failure mode instead of a clean ✓ with no output.\n if (finalText.length === 0 && lastToolFailed !== null) {\n throw new AgentError({\n message: `unrecovered tool failure: ${lastToolFailed} — agent ended turn without acknowledging the error`,\n code: ERROR_CODES.AGENT_RUN_FAILED,\n context: { tool: lastToolFailed, iterations: result.iterations },\n });\n }\n return {\n result: result.finalText,\n iterations: result.iterations,\n toolCalls: usage.toolCalls,\n };\n };\n}\n\nfunction defaultFormatTaskInput(task: TaskSpec): AgentInput {\n return task.description ?? '';\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' | 'idle_timeout' | 'cost';\n\n/**\n * Fraction of the wall-clock `timeoutMs` window at which a PROACTIVE extension\n * is negotiated — BEFORE the deadline is actually crossed. The coordinator\n * watchdog (`executeWithTimeout`) arms at `timeoutMs * TIMEOUT_PREEMPT_FRACTION`\n * so a still-progressing subagent gets its ceiling raised while it is below the\n * limit, and never enters a \"timed out\" state. Reactive enforcement at the real\n * deadline still stands for the no-progress / denied case. Shared so the asking\n * side and any future caller agree on the same lead point.\n */\nexport const TIMEOUT_PREEMPT_FRACTION = 0.85;\n\n/**\n * Hard safety net for budget negotiation decisions. If no listener responds to\n * `budget.threshold_reached` within this window the negotiation defaults to\n * `'stop'`. Exported so the coordinator's watchdog can reuse the same ceiling\n * without hardcoding a second copy.\n */\nexport const DECISION_TIMEOUT_MS = 60_000;\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 | undefined;\n maxToolCalls?: number | undefined;\n maxTokens?: number | undefined;\n /** Estimated USD cost ceiling. */\n maxCostUsd?: number | undefined;\n /**\n * Hard wall-clock timeout measured from `start()`. Off by default — set it\n * explicitly only when a task must finish within an absolute window. For\n * the everyday \"don't kill an agent that's still working\" guard, prefer\n * `idleTimeoutMs`, which resets on activity.\n */\n timeoutMs?: number | undefined;\n /**\n * Idle timeout: the maximum gap (ms) between activity signals (iterations,\n * tool calls, token usage, streamed progress) before the subagent is\n * considered hung and reaped. Unlike `timeoutMs`, an actively-working\n * agent continuously resets this clock via `markActivity()`, so it never\n * trips on a long-but-productive run — only on a genuine stall.\n */\n idleTimeoutMs?: number | undefined;\n}\n\n/**\n * Controls how the budget behaves when `onThreshold` is set and a limit is hit.\n *\n * `'auto'` — emit `budget.threshold_reached` on the EventBus and wait for a\n * coordinator response (extend/stop). If no listener responds within\n * `DECISION_TIMEOUT_MS` the decision defaults to `'stop'`.\n * `'sync'` — do not emit any event; treat the threshold as a hard stop and\n * throw `BudgetExceededError` synchronously. Useful for fire-and-forget\n * subagents that have an `onThreshold` handler for logging/metrics but are\n * not wired into a coordinator.\n *\n * @default 'auto'\n */\nexport type BudgetNegotiationMode = 'auto' | 'sync';\n\nexport type BudgetSessionIdSource = string | (() => string | undefined);\n\nexport interface SubagentBudgetOptions {\n sessionId?: BudgetSessionIdSource | undefined;\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 /**\n * Direct grant/deny hooks for SYNCHRONOUS policy or recording handlers that\n * decide in-process without a wired `budget.threshold_reached` listener\n * (e.g. the coordinator watchdog). `extend` patches the limits in place;\n * `deny` records the intent to stop. Production listener-driven handlers use\n * `requestDecision()` instead and can ignore these.\n */\n extend?: (extra: Partial<BudgetLimits>) => void;\n deny?: () => void;\n}) => 'throw' | 'continue' | 'stop' | { extend: Partial<BudgetLimits> } | 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 without `onThreshold`: hard stops synchronously on every limit hit.\n *\n * Behavior with `onThreshold` and `_mode === 'auto'`: emits `budget.threshold_reached`\n * on the EventBus and throws `BudgetThresholdSignal`. The coordinator's verdict\n * (extend/stop) resolves the embedded promise. If no listener responds within\n * `DECISION_TIMEOUT_MS` the decision defaults to `'stop'`.\n *\n * Behavior with `onThreshold` and `_mode === 'sync'`: throws `BudgetExceededError`\n * synchronously regardless of EventBus state or listener presence. This is useful\n * for fire-and-forget subagents that have an `onThreshold` handler for logging/metrics\n * but are not wired into a coordinator — the `'sync'` mode makes the hard-stop\n * behavior explicit and means tests can use `expect().toThrow()` even without\n * a fully-wired EventBus.\n */\nexport class SubagentBudget {\n readonly limits: Readonly<BudgetLimits>;\n\n /** Patch one or more budget limits in-place after construction.\n * Used by the coordinator watchdog when granting an extension.\n * All fields are optional — only provided fields are updated.\n * This is the single write path for limit mutations so that future\n * validation or side-effects live in one place (M1). */\n patchLimits(ext: Partial<BudgetLimits>): void {\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 if (ext.timeoutMs !== undefined) {\n (this.limits as Record<string, unknown>).timeoutMs = ext.timeoutMs;\n }\n if (ext.idleTimeoutMs !== undefined) {\n (this.limits as Record<string, unknown>).idleTimeoutMs = ext.idleTimeoutMs;\n }\n }\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 /**\n * Timestamp of the most recent activity (iteration / tool call / token\n * usage / streamed progress). Drives the idle timeout — reset by\n * `markActivity()`. Initialised to `start()` time so a never-active agent\n * still eventually trips its idle window.\n */\n private lastActivityTime: number | null = null;\n private _onThreshold: BudgetThresholdHandler | undefined;\n private readonly _sessionId: BudgetSessionIdSource | undefined;\n /**\n * Hard cap on how long `_negotiateExtension` waits for the coordinator to\n * respond before defaulting to 'stop'. Without this fallback an absent\n * or hung listener (Director not built / event filter detached mid-run)\n * leaves the budget over-limit and never enforces anything.\n */\n private static readonly DECISION_TIMEOUT_MS = DECISION_TIMEOUT_MS;\n /**\n * Injected by the runner when wiring the budget to its EventBus.\n * Used to emit `budget.threshold_reached` events in `'auto'` mode.\n */\n _events?: EventBus | undefined;\n\n /**\n * Guard against dual-path races between the coordinator watchdog\n * (`executeWithTimeout`) and the budget's own `checkTimeout()`.\n * Both paths detect `elapsed >= timeoutMs` and can emit\n * `budget.threshold_reached` for kind `'timeout'` simultaneously.\n * Set to the current `timeoutMs` ceiling by the coordinator BEFORE\n * calling `onThreshold`, and cleared after the negotiation resolves.\n * `checkTimeout()` skips its wall-clock check while this is set so\n * the coordinator's watchdog is the sole source of wall-clock timeout\n * events — `checkTimeout()` focuses exclusively on `idle_timeout`.\n */\n private _watchdogActive: number | undefined;\n\n /** Returns the timeout ceiling currently being negotiated by the watchdog,\n * or `undefined` when no wall-clock negotiation is in flight.\n * Used by `executeWithTimeout` to detect a stale lock (M3). */\n get watchdogActive(): number | undefined { return this._watchdogActive; }\n\n /** Called by the coordinator watchdog BEFORE calling `onThreshold` so that\n * `checkTimeout()` skips its wall-clock check for this ceiling. Prevents\n * the budget's own `checkTimeout()` from emitting a second\n * `budget.threshold_reached` event while the watchdog is already\n * negotiating the same wall-clock deadline (C1). */\n setWatchdogNegotiation(timeoutMs: number): void { this._watchdogActive = timeoutMs; }\n\n /** Clears the watchdog guard after negotiation resolves. Called in the\n * `finally` block of both the pre-empt and deadline branches so it fires\n * on every exit path: grant, deny, throw, or error. */\n clearWatchdogNegotiation(): void { this._watchdogActive = undefined; }\n\n /**\n * Negotiation mode — controls whether a threshold hit tries to emit\n * `budget.threshold_reached` and wait for a coordinator decision, or\n * falls straight through to a synchronous hard stop.\n *\n * `'auto'` (default) — emit on the EventBus and wait; times out to 'stop'.\n * `'sync'` — throw `BudgetExceededError` immediately regardless of listeners.\n */\n private _mode: BudgetNegotiationMode;\n\n /**\n * Optional callback for soft-limit handling. When set, the budget will\n * invoke it rather than throw immediately. The handler decides whether to\n * throw synchronously, continue, or ask the coordinator for an extension.\n */\n get onThreshold(): BudgetThresholdHandler | undefined {\n return this._onThreshold;\n }\n set onThreshold(fn: BudgetThresholdHandler | undefined) {\n this._onThreshold = fn;\n }\n\n /** Returns the current negotiation mode. */\n get mode(): BudgetNegotiationMode {\n return this._mode;\n }\n\n constructor(\n limits: BudgetLimits = {},\n mode: BudgetNegotiationMode = 'auto',\n options: SubagentBudgetOptions = {},\n ) {\n this._mode = mode;\n this._sessionId = options.sessionId;\n // NOT frozen: `negotiateExtension` patches these limits in place when the\n // coordinator grants an auto-extension. Freezing made every granted\n // extension throw `TypeError: Cannot assign to read only property` in\n // strict mode, which the runner caught as a hard stop — so extensions\n // silently became kills. The `readonly limits: Readonly<BudgetLimits>`\n // typing still blocks external mutation at compile time.\n this.limits = { ...limits };\n }\n\n private currentSessionId(): string | undefined {\n const value = typeof this._sessionId === 'function' ? this._sessionId() : this._sessionId;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\n\n start(): void {\n this.startTime = Date.now();\n this.lastActivityTime = this.startTime;\n }\n\n /**\n * Reset the idle clock. Called on any sign of forward progress —\n * iterations, tool calls, token usage, and streamed tool/text progress —\n * so a long-but-productive subagent never trips its `idleTimeoutMs`.\n */\n markActivity(): void {\n this.lastActivityTime = Date.now();\n }\n\n /**\n * Milliseconds since the last activity signal. Returns 0 before `start()`\n * (nothing to measure yet). Used by the coordinator watchdog to decide\n * whether to re-arm (still active) or reap (genuinely idle).\n */\n idleMs(): number {\n const since = this.lastActivityTime ?? this.startTime;\n return since === null ? 0 : Date.now() - since;\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 (especially\n * test event handlers using `expect().toThrow()`) get an unhandled rejection\n * when the budget is exceeded without a handler.\n *\n * Decision table:\n * - no `onThreshold` handler → throw `BudgetExceededError` (hard stop, always)\n * - `mode === 'sync'` → throw `BudgetExceededError` (hard stop, always)\n * - `mode === 'auto'` + no listener → throw `BudgetExceededError` (hard stop; no one to ask)\n * - `mode === 'auto'` + listener → throw `BudgetThresholdSignal` with async decision promise\n */\n /**\n * Collects all exceeded budget kinds into a single NOOP-free negotiation.\n * Called by recordIteration / recordToolCall / recordUsage — each may call\n * this for its own kind. The first call starts the negotiation and stores\n * the Promise in _pendingNegotiation. Subsequent calls for DIFFERENT\n * kinds (while a negotiation is in flight) are NOOPs — they don't start\n * new conversations with the coordinator. This prevents an EventBus flood\n * when multiple budget kinds are exceeded simultaneously in one iteration.\n *\n * Returns the kinds that were found to be exceeded (for logging/debugging).\n */\n private checkLimits(elapsedMs?: number): { kind: BudgetKind; used: number; limit: number }[] {\n const exceeded: { kind: BudgetKind; used: number; limit: number }[] = [];\n\n if (this.limits.maxIterations !== undefined && this.iterations > this.limits.maxIterations) {\n exceeded.push({ kind: 'iterations', used: this.iterations, limit: this.limits.maxIterations });\n }\n if (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\n exceeded.push({ kind: 'tool_calls', used: this.toolCalls, limit: this.limits.maxToolCalls });\n }\n const totalTokens = this.tokenInput + this.tokenOutput;\n if (this.limits.maxTokens !== undefined && totalTokens > this.limits.maxTokens) {\n exceeded.push({ kind: 'tokens', used: totalTokens, limit: this.limits.maxTokens });\n }\n if (this.limits.maxCostUsd !== undefined && this.costUsd > this.limits.maxCostUsd) {\n exceeded.push({ kind: 'cost', used: this.costUsd, limit: this.limits.maxCostUsd });\n }\n // Timeout: called from checkTimeout() with elapsedMs (wall-clock) and the\n // current idle gap. Either crossing its limit trips its own kind so the\n // coordinator and auto-extend policy can distinguish them.\n // Wall-clock (`timeoutMs`) is an explicit hard cap; idle (`idleTimeoutMs`)\n // is the default guard that resets on activity. Both can be exceeded in\n // the same call — we push both entries so all violated limits are reported.\n if (elapsedMs !== undefined) {\n const idle = this.idleMs();\n if (this.limits.idleTimeoutMs !== undefined && idle > this.limits.idleTimeoutMs) {\n exceeded.push({ kind: 'idle_timeout', used: idle, limit: this.limits.idleTimeoutMs });\n }\n // Skip the wall-clock 'timeout' kind while the coordinator watchdog is\n // negotiating this exact ceiling — it owns wall-clock; checkTimeout/here\n // own idle. Only suppress in the negotiation path (a handler is set); on\n // the no-handler hard-throw path the wall-clock must still trip. (Mirrors\n // the guard in checkTimeout, which previously was NOT applied here — so\n // an idle trip that called checkLimits re-added 'timeout' and defeated the\n // watchdog dedup.)\n const wallOwnedByWatchdog =\n this._onThreshold !== undefined && this._watchdogActive === this.limits.timeoutMs;\n if (\n this.limits.timeoutMs !== undefined &&\n elapsedMs > this.limits.timeoutMs &&\n !wallOwnedByWatchdog\n ) {\n exceeded.push({ kind: 'timeout', used: elapsedMs, limit: this.limits.timeoutMs });\n }\n }\n\n if (exceeded.length === 0) return [];\n\n if (!this._onThreshold) {\n // Hard stop — throw on the first exceeded kind.\n const first = exceeded[0] ?? { kind: 'iterations', limit: 0, used: 0 };\n throw new BudgetExceededError(first.kind, first.limit, first.used);\n }\n if (this._mode === 'sync') {\n // Hard stop in sync mode.\n const first = exceeded[0] ?? { kind: 'iterations', limit: 0, used: 0 };\n throw new BudgetExceededError(first.kind, first.limit, first.used);\n }\n const bus = this._events;\n if (!bus) {\n // No EventBus wired at all → nobody to negotiate with → hard stop.\n const first = exceeded[0] ?? { kind: 'iterations', limit: 0, used: 0 };\n throw new BudgetExceededError(first.kind, first.limit, first.used);\n }\n\n const first = exceeded[0] ?? { kind: 'iterations', limit: 0, used: 0 };\n\n // LISTENER-DRIVEN PATH. A registered `budget.threshold_reached` listener\n // (director / collab / auto-extend) negotiates asynchronously. Start one\n // negotiation PER exceeded kind — each reports its OWN kind/used/limit and\n // emits a single event (no O(N^2) re-emission, no cross-kind first-wins\n // drop). Throw `BudgetThresholdSignal` for the first kind so the runner\n // awaits the decision and enforces extend/stop.\n if (bus.hasListenerFor('budget.threshold_reached')) {\n for (const entry of exceeded) {\n if (this._pendingNegotiations.has(entry.kind)) continue; // already negotiating this kind\n this._pendingNegotiations.set(entry.kind, this._negotiateExtension(entry));\n }\n const decision = this._pendingNegotiations.get(first.kind);\n if (!decision) throw new Error(`No pending negotiation for ${first.kind}`);\n throw new BudgetThresholdSignal(first.kind, first.limit, first.used, decision);\n }\n\n // NO-LISTENER PATH. Invoke the handler synchronously to let an in-process\n // policy decide. Two outcomes:\n // • SYNC handler (returns a string/decision — e.g. the coordinator\n // watchdog / recording handlers) → its decision is honored in place\n // (an `extend` patches limits); no throw. This is the path the\n // watchdog drives while it owns wall-clock enforcement.\n // • ASYNC handler (returns a Promise via `requestDecision()`) → there is\n // no listener to resolve it and `requestDecision` resolves to 'stop',\n // so this is a definite hard stop: throw `BudgetExceededError`. This is\n // the documented \"auto mode + no listener → hard stop\" invariant that\n // protects a bare `/spawn` (no director) from a runaway subagent.\n let hardStop: BudgetExceededError | null = null;\n for (const entry of exceeded) {\n // Dedup per kind across back-to-back overruns in the same tick — a still\n // exceeded kind (e.g. iterations stays over after a grant) must not\n // re-invoke the handler on every record* call. The marker clears on a\n // microtask so a genuinely fresh overrun later can re-negotiate.\n if (this._pendingNegotiations.has(entry.kind)) continue;\n const marker = Promise.resolve<BudgetThresholdDecision>('stop');\n this._pendingNegotiations.set(entry.kind, marker);\n void marker.finally(() => this._pendingNegotiations.delete(entry.kind));\n const sync = this._invokeHandlerSync(entry);\n if (!sync) hardStop ??= new BudgetExceededError(entry.kind, entry.limit, entry.used);\n }\n if (hardStop) throw hardStop;\n return exceeded;\n }\n\n /**\n * Invoke `onThreshold` once for `entry` on the NO-LISTENER path and report\n * whether it decided synchronously. Returns `true` when the handler returned\n * a synchronous decision (already honored — an `extend` patched the limits),\n * or `false` when it returned a Promise (async; the caller hard-stops, since\n * there is no listener to resolve the negotiation). The handler is given the\n * full info shape (`requestDecision` plus direct `extend`/`deny`) so both\n * recording handlers and policy handlers work without a wired listener.\n */\n private _invokeHandlerSync(entry: { kind: BudgetKind; used: number; limit: number }): boolean {\n const handler = this._onThreshold;\n if (!handler) return false;\n let extendArg: Partial<BudgetLimits> | undefined;\n const result = handler({\n kind: entry.kind,\n used: entry.used,\n limit: entry.limit,\n requestDecision: (): Promise<BudgetThresholdDecision> => this._busRequestDecision(entry),\n // Direct hooks for synchronous policy/recording handlers.\n extend: (extra: Partial<BudgetLimits>) => {\n extendArg = extra;\n },\n deny: () => {},\n } as Parameters<BudgetThresholdHandler>[0]);\n // A thenable means the handler deferred to async negotiation — but there is\n // no listener here, so it can never be granted → hard stop.\n if (result && typeof (result as { then?: unknown }).then === 'function') return false;\n if (result === 'throw') return false; // explicit hard stop\n // 'continue' / 'stop' / a returned { extend } decision — honor in place.\n if (result && typeof result === 'object' && 'extend' in result) {\n extendArg = (result as { extend: Partial<BudgetLimits> }).extend;\n }\n if (extendArg) this.patchLimits(extendArg);\n return true;\n }\n\n /**\n * Emit `budget.threshold_reached` and resolve to the listener's verdict.\n * Resolves to `'stop'` immediately when there is no listener (or no bus) so\n * no negotiation can hang and no fallback timer leaks. Mirrors the\n * coordinator watchdog's own request path so both agree on the no-listener\n * default.\n */\n private _busRequestDecision(entry: {\n kind: BudgetKind;\n used: number;\n limit: number;\n }): Promise<BudgetThresholdDecision> {\n const bus = this._events;\n if (!bus?.hasListenerFor('budget.threshold_reached')) {\n return Promise.resolve('stop');\n }\n return new Promise<BudgetThresholdDecision>((resolve) => {\n let resolved = false;\n const respond = (d: BudgetThresholdDecision) => {\n if (resolved) return;\n resolved = true;\n clearTimeout(fallback);\n resolve(d);\n };\n const fallback = setTimeout(() => respond('stop'), SubagentBudget.DECISION_TIMEOUT_MS);\n const sessionId = this.currentSessionId();\n bus.emit('budget.threshold_reached', {\n ...(sessionId ? { sessionId } : {}),\n kind: entry.kind as\n | 'iterations'\n | 'tool_calls'\n | 'tokens'\n | 'cost'\n | 'timeout'\n | 'idle_timeout',\n used: entry.used,\n limit: entry.limit,\n timeoutMs: SubagentBudget.DECISION_TIMEOUT_MS,\n // deny() wins over a same-dispatch extend(): a listener that both grants\n // and denies (or two listeners disagreeing) is resolved as a stop. The\n // grant is deferred a microtask so a synchronous deny in the same emit\n // pre-empts it; async grants still resolve normally.\n extend: (extra: Partial<BudgetLimits>) => queueMicrotask(() => respond({ extend: extra })),\n deny: () => respond('stop'),\n });\n });\n }\n\n /**\n * Per-kind in-flight negotiation Promises. Each budget kind can have its\n * own concurrent negotiation — e.g. iterations and timeout can both\n * be exceeded simultaneously without blocking each other. The same kind\n * cannot start two concurrent negotiations (dedup guard).\n * Cleared in `_negotiateExtension`'s `finally` block.\n */\n private _pendingNegotiations = new Map<BudgetKind, Promise<BudgetThresholdDecision>>();\n\n /**\n * Drive the threshold handler to a decision. Resolves with `'stop'`\n * (signal the runner to abort) or `{ extend: ... }` (limits already\n * patched in-place; the runner should not abort). Clears the\n * per-kind slot in `_pendingNegotiations` in `finally`.\n *\n * The 'continue' return from a sync handler is treated as\n * `{ extend: {} }` — keep going without patching; next overrun fires\n * a fresh signal.\n */\n private async _negotiateExtension(\n entry: { kind: BudgetKind; used: number; limit: number },\n ): Promise<BudgetThresholdDecision> {\n if (!this._onThreshold) {\n // Should never reach here — caller should have thrown already\n return 'stop';\n }\n try {\n const result = this._onThreshold({\n kind: entry.kind,\n used: entry.used,\n limit: entry.limit,\n // One event for THIS kind only — each exceeded kind has its own\n // negotiation (and its own resolve), so there is no cross-kind\n // first-wins drop and no O(N^2) re-emission.\n requestDecision: (): Promise<BudgetThresholdDecision> => this._busRequestDecision(entry),\n extend: (extra: Partial<BudgetLimits>) => {\n this.patchLimits(extra);\n },\n deny: () => {},\n } as Parameters<BudgetThresholdHandler>[0]);\n\n if (result === 'throw') return 'stop';\n if (result === 'continue') return { extend: {} };\n\n const decision = await result;\n if (decision === 'stop') return 'stop';\n\n // 'extend' — patch in-place limits BEFORE resolving (single write path).\n this.patchLimits(decision.extend);\n return decision;\n } finally {\n this._pendingNegotiations.delete(entry.kind);\n }\n }\n\n recordIteration(): void {\n this.iterations++;\n this.markActivity();\n void this.checkLimits();\n }\n\n recordToolCall(): void {\n this.toolCalls++;\n this.markActivity();\n void this.checkLimits();\n }\n\n recordUsage(usage: Usage, costUsd = 0): void {\n this.tokenInput += usage.input;\n this.tokenOutput += usage.output;\n this.costUsd += costUsd;\n this.markActivity();\n void this.checkLimits();\n }\n\n /**\n * Wall-clock / idle budget check. Delegates to `checkLimits(elapsed)`, so\n * `timeout` and `idle_timeout` follow the SAME negotiation path as the other\n * kinds — they are NOT a special-cased hard stop. This is deliberate: a\n * heartbeat-aware policy (see `attachAutoExtend` and `CollabSession`) grants\n * a timeout extension only while the agent is making progress and denies it\n * once the agent is genuinely stuck, which is safer than an unconditional\n * hard kill of a long-but-working agent. The runner translates the resulting\n * `BudgetThresholdSignal` decision (`extend` → patch limits in place,\n * `stop` → abort) just like every other kind.\n *\n * Decision table (same as `checkLimits`):\n * - no `onThreshold` handler → throw `BudgetExceededError` (hard stop)\n * - `mode === 'sync'` → throw `BudgetExceededError` (hard stop)\n * - `mode === 'auto'` + no listener → throw `BudgetExceededError` (no one to ask)\n * - `mode === 'auto'` + listener → throw `BudgetThresholdSignal` (negotiated;\n * a heartbeat-aware policy may extend the timeout)\n */\n checkTimeout(): void {\n if (this.startTime === null) return;\n const { timeoutMs, idleTimeoutMs } = this.limits;\n if (timeoutMs === undefined && idleTimeoutMs === undefined) return;\n const elapsed = Date.now() - this.startTime;\n // Skip wall-clock timeout if the coordinator watchdog is already in the middle\n // of negotiating this exact ceiling — tool.progress is too frequent and creates\n // a race where both paths emit budget.threshold_reached for the same kind.\n // The watchdog owns wall-clock; checkTimeout focuses exclusively on idle.\n const wallSkipped =\n this._onThreshold !== undefined &&\n this._watchdogActive !== undefined &&\n timeoutMs !== undefined &&\n this._watchdogActive === timeoutMs;\n const wallTripped = wallSkipped ? false : timeoutMs !== undefined && elapsed > timeoutMs;\n const idleTripped = idleTimeoutMs !== undefined && this.idleMs() > idleTimeoutMs;\n if (!wallTripped && !idleTripped) return;\n void this.checkLimits(elapsed);\n }\n\n /** Returns true if a wall-clock or idle timeout has occurred without throwing. */\n isTimedOut(): boolean {\n if (this.startTime === null) return false;\n const { timeoutMs, idleTimeoutMs } = this.limits;\n if (timeoutMs !== undefined && Date.now() - this.startTime > timeoutMs) return true;\n if (idleTimeoutMs !== undefined && this.idleMs() > idleTimeoutMs) return true;\n return false;\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}\n","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError, ERROR_CODES } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.js';\nimport { truncate } from '../utils/string.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 type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\nexport type CacheTtl = '5m' | '1h';\n\n/**\n * Provider-agnostic response-format directive.\n *\n * - `{ type: 'text' }` — free-form text (default).\n * - `{ type: 'json_object' }` — valid JSON without a schema constraint.\n * - `{ type: 'json_schema', jsonSchema: { name, schema, strict? } }` — JSON\n * constrained to the supplied JSON Schema. The `strict` flag is\n * OpenAI-specific; Gemini ignores it in favour of `responseMimeType`.\n *\n * Each provider adapter maps this into its own wire format:\n * OpenAI → `response_format`\n * Gemini → `responseMimeType` + `responseSchema`\n * Anthropic → (not yet supported; uses tools for structured output)\n */\nexport interface JsonSchemaSpec {\n name: string;\n /** OpenAI-specific: enable strict schema adherence. */\n strict?: boolean | undefined;\n /** The JSON Schema object describing the expected shape. */\n schema: Record<string, unknown>;\n /** Optional human-readable description (OpenAI). */\n description?: string | undefined;\n}\n\nexport type ResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | { type: 'json_schema'; jsonSchema: JsonSchemaSpec };\n\n/**\n * Safety category threshold pair used by Google Gemini's `safetySettings`.\n *\n * Categories: `HARM_CATEGORY_HARASSMENT`, `HARM_CATEGORY_HATE_SPEECH`,\n * `HARM_CATEGORY_SEXUALLY_EXPLICIT`, `HARM_CATEGORY_DANGEROUS_CONTENT`.\n *\n * Thresholds: `BLOCK_NONE`, `BLOCK_ONLY_HIGH`, `BLOCK_MEDIUM_AND_ABOVE`,\n * `BLOCK_LOW_AND_ABOVE`.\n */\nexport interface SafetySetting {\n category: string;\n threshold: string;\n}\n\nexport interface Usage {\n input: number;\n output: number;\n cacheRead?: number | undefined;\n /** Back-compat aggregate of all cache-write tokens. Prefer TTL-specific fields when present. */\n cacheWrite?: number | undefined;\n cacheWrite5m?: number | undefined;\n cacheWrite1h?: number | undefined;\n}\n\nexport interface ReasoningRequest {\n enabled?: boolean | undefined;\n effort?: ReasoningEffort | undefined;\n preserve?: boolean | undefined;\n display?: 'summarized' | 'omitted' | undefined;\n}\n\nexport interface RequestCacheControl {\n ttl?: CacheTtl | undefined;\n}\n\nexport interface ReasoningConfig {\n default: 'enabled' | 'disabled' | 'adaptive' | 'always_on';\n disableSupported: boolean;\n effortSupported: boolean;\n effortLevels: ReasoningEffort[];\n preserveThinking: 'unsupported' | 'optional' | 'always_on';\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 reasoning: boolean;\n maxContext: number;\n /**\n * Maximum output tokens the model can produce in a single response.\n * Used as the default for `Request.maxTokens` when the caller doesn't\n * supply an explicit value — letting subagents run up to the model's\n * native ceiling instead of a fixed 8192 cap. Omit (undefined) to fall\n * back to a conservative default; populate per family in\n * `family-capabilities.ts` once you know the spec.\n */\n maxOutput?: number | undefined;\n cacheControl: 'native' | 'auto' | 'none';\n\n // ── Extended parameter support (optional; family defaults in CAPABILITIES_BY_FAMILY) ──\n\n /** Model accepts `top_k` / `topK` sampling parameter. */\n topK?: boolean | undefined;\n /** Model accepts `frequency_penalty` / `frequencyPenalty` parameter. */\n frequencyPenalty?: boolean | undefined;\n /** Model accepts `presence_penalty` / `presencePenalty` parameter. */\n presencePenalty?: boolean | undefined;\n /** Model accepts `seed` parameter for deterministic generation. */\n seed?: boolean | undefined;\n /**\n * Model accepts JSON Schema / structured-output constraints\n * (OpenAI `response_format.json_schema`, Gemini `responseMimeType`+`responseSchema`).\n * Distinct from `jsonMode` (which is just a system-prompt hint).\n */\n structuredOutput?: boolean | undefined;\n /** Model supports log-probability output (`logprobs`, `top_logprobs`). */\n logprobs?: boolean | undefined;\n /** Model supports audio input/output modality. */\n audio?: boolean | undefined;\n /** Model supports the `n` parameter for multiple completions. */\n multipleCompletions?: boolean | undefined;\n}\n\nexport interface Request {\n model: string;\n system?: TextBlock[] | undefined;\n messages: Message[];\n tools?: Tool[] | undefined;\n /**\n * Cap on output tokens for this single response. Optional — when\n * omitted, the provider adapter falls back to its own\n * `capabilities.maxOutput` (which the catalog populates from\n * `ModelsDevModel.limit.output`). If neither is available, the\n * adapter applies a conservative 8192 safety net. Letting this stay\n * undefined at the call site means callers like Chimera can hand the\n * model its native output ceiling without hard-coding a number.\n */\n maxTokens?: number | undefined;\n temperature?: number | undefined;\n topP?: number | undefined;\n topK?: number | undefined;\n frequencyPenalty?: number | undefined;\n presencePenalty?: number | undefined;\n seed?: number | undefined;\n /**\n * End-user identifier for abuse monitoring and per-user rate limiting.\n * - Anthropic → `metadata.user_id`\n * - OpenAI → `user`\n * - Gemini → (not supported)\n */\n user?: string | undefined;\n /**\n * Number of response candidates to generate. Google Gemini supports\n * this via `generationConfig.candidateCount`. OpenAI does not have\n * an equivalent (`n` is conceptually similar but distinct).\n */\n candidateCount?: number | undefined;\n /**\n * Whether to return log probabilities for output tokens.\n * - OpenAI → `logprobs: boolean` (+ `topLogprobs: number`)\n * - Gemini → `generationConfig.logprobs: number` (how many top candidates)\n * Default undefined = no logprobs requested.\n */\n logprobs?: boolean | undefined;\n /**\n * Number of most probable tokens to return log probabilities for\n * (OpenAI `top_logprobs`). Only meaningful when `logprobs` is true.\n * Range: 0-20. Gemini ignores this (uses `logprobs` as the count).\n */\n topLogprobs?: number | undefined;\n stopSequences?: string[] | undefined;\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool' | undefined; name: string };\n reasoning?: ReasoningRequest | undefined;\n cache?: RequestCacheControl | undefined;\n /**\n * Structured-output / response-format directive.\n * When set, the provider adapter maps this to its native response-format\n * parameter (OpenAI `response_format`, Gemini `responseMimeType`, etc.).\n * The model must advertise `capabilities.structuredOutput` for this to be\n * honoured; unsupported models will likely 400 or ignore it.\n */\n responseFormat?: ResponseFormat | undefined;\n /**\n * Safety category thresholds for filtering harmful content.\n * - Gemini → top-level `safetySettings` array with `{ category, threshold }`\n * - OpenAI → not supported (uses server-side moderation)\n * - Anthropic → not supported\n */\n safetySettings?: SafetySetting[] | undefined;\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 | undefined;\n name?: string | undefined;\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 | undefined;\n /** Human-readable explanation from the provider. */\n message?: string | undefined;\n /** Provider request id, when present in the body or headers. */\n requestId?: string | undefined;\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\n retryAfterMs?: number | undefined;\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\n raw?: string | undefined;\n /** True when `raw` was truncated; check `rawLength` for the original size. */\n truncated?: boolean | undefined;\n /** Original length of the response body in bytes, when `truncated` is true. */\n rawLength?: number | undefined;\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 | undefined;\n\n constructor(\n message: string,\n status: number,\n retryable: boolean,\n providerId: string,\n opts: { body?: ProviderErrorBody | undefined; cause?: unknown | undefined } = {},\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\n/**\n * Thrown when the provider stream stops delivering data mid-response.\n * This is distinct from a network error (TCP reset, DNS failure) — the\n * connection is established and the response started, but chunks stopped\n * arriving before the stream completed.\n *\n * Status 599 is used as a sentinel to distinguish stream hangs from\n * regular HTTP errors while still flowing through ProviderError-based\n * retry and fallback infrastructure.\n */\nexport class StreamHangError extends ProviderError {\n /** Name of the provider that hung, e.g. \"zai\", \"anthropic\". */\n public readonly hungProviderId: string;\n /** Model that was being called when the hang occurred. */\n public readonly hungModel: string;\n /** How long (ms) we waited for the next chunk before declaring a hang. */\n public readonly hangTimeoutMs: number;\n /** How many bytes were received before the hang. */\n public readonly bytesReceived: number;\n /** Elapsed time (ms) from the start of the stream until the hang. */\n public readonly elapsedMs: number;\n\n constructor(opts: {\n providerId: string;\n model: string;\n hangTimeoutMs: number;\n bytesReceived: number;\n elapsedMs: number;\n cause?: unknown | undefined;\n }) {\n super(\n `Stream hang: ${opts.providerId}/${opts.model} — no data for ${opts.hangTimeoutMs}ms after ${opts.bytesReceived} bytes (${opts.elapsedMs}ms elapsed)`,\n 599,\n true, // always retryable\n opts.providerId,\n {\n body: {\n message: `Stream stalled after ${opts.elapsedMs}ms, ${opts.bytesReceived} bytes received`,\n },\n cause: opts.cause,\n },\n );\n this.name = 'StreamHangError';\n this.hungProviderId = opts.providerId;\n this.hungModel = opts.model;\n this.hangTimeoutMs = opts.hangTimeoutMs;\n this.bytesReceived = opts.bytesReceived;\n this.elapsedMs = opts.elapsedMs;\n }\n}\n\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\n if (status === 0) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (type === 'rate_limit_error' || status === 429) return ERROR_CODES.PROVIDER_RATE_LIMITED;\n if (type === 'authentication_error' || status === 401) return ERROR_CODES.PROVIDER_AUTH_FAILED;\n if (type === 'overloaded_error' || status === 529) return ERROR_CODES.PROVIDER_OVERLOADED;\n if (type === 'invalid_request_error' || status === 400) return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n if (status === 408) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (status >= 500) return ERROR_CODES.PROVIDER_SERVER_ERROR;\n return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n}\n","import type { SubagentError, SubagentErrorKind } from '../../types/multi-agent.js';\nimport { ProviderError } from '../../types/provider.js';\nimport { AgentError } from '../../types/errors.js';\nimport { BudgetExceededError } from '../subagent-budget.js';\nimport { toErrorMessage } from '../../utils/error.js';\n\n/**\n * Map any raw exception thrown out of a subagent's runner into a\n * structured `SubagentError`. This is the single point where the\n * coordinator decides \"what kind of failure was that\" — so callers\n * (delegate tool output, /agents UI, retry policies) branch on\n * `kind` instead of substring-matching `error.message`.\n *\n * Exported because tests and CLI surfaces want to assert on the\n * classification without instantiating a coordinator.\n */\nexport function classifySubagentError(\n err: unknown,\n hints: { parentAborted?: boolean | undefined } = {},\n): SubagentError {\n // Unwrap AgentError wrappers — the runner wraps non-AgentError\n // throwables (ProviderError, TypeError, etc.) in AgentError so the\n // coordinator's try/catch catches a consistent type. Recurse into the\n // inner cause so classification sees the original error kind.\n if (err instanceof AgentError && err.cause) {\n return classifySubagentError(err.cause, hints);\n }\n\n const cause = err instanceof Error\n ? { name: err.name, message: err.message, stack: err.stack }\n : undefined;\n\n if (err instanceof ProviderError) {\n const baseMessage = err.describe();\n return providerErrorToSubagentError(err, baseMessage, cause);\n }\n\n const baseMessage = toErrorMessage(err);\n\n if (err instanceof BudgetExceededError) {\n const map: Record<BudgetExceededError['kind'], SubagentErrorKind> = {\n iterations: 'budget_iterations',\n tool_calls: 'budget_tool_calls',\n tokens: 'budget_tokens',\n cost: 'budget_cost',\n timeout: 'budget_timeout',\n idle_timeout: 'budget_timeout',\n };\n return {\n kind: map[err.kind],\n message: baseMessage,\n retryable: false,\n cause,\n };\n }\n\n if (hints.parentAborted) {\n return { kind: 'aborted_by_parent', message: baseMessage, retryable: false, cause };\n }\n\n const lower = baseMessage.toLowerCase();\n if (/agent aborted$/i.test(baseMessage)) {\n return { kind: 'aborted_by_parent', message: baseMessage, retryable: false, cause };\n }\n if (/agent exhausted iteration limit$/i.test(baseMessage)) {\n return { kind: 'budget_iterations', message: baseMessage, retryable: false, cause };\n }\n if (/empty response/i.test(baseMessage)) {\n return { kind: 'empty_response', message: baseMessage, retryable: false, cause };\n }\n if (/^tool failed: /i.test(baseMessage)) {\n return { kind: 'tool_failed', message: baseMessage, retryable: false, cause };\n }\n if (lower.includes('bridge transport') || /bridge.*(closed|disconnect)/i.test(baseMessage)) {\n return { kind: 'bridge_failed', message: baseMessage, retryable: false, cause };\n }\n if (/context length|max.*tokens?.*exceeded|prompt is too long/i.test(baseMessage)) {\n return { kind: 'context_overflow', message: baseMessage, retryable: false, cause };\n }\n\n return { kind: 'unknown', message: baseMessage, retryable: false, cause };\n}\n\nfunction providerErrorToSubagentError(\n err: ProviderError,\n message: string,\n cause: SubagentError['cause'],\n): SubagentError {\n const status = err.status;\n if (status === 429 || err.body?.type === 'rate_limit_error') {\n return { kind: 'provider_rate_limit', message, retryable: true, backoffMs: 5_000, cause };\n }\n if (status === 401 || status === 403 || err.body?.type === 'authentication_error') {\n return { kind: 'provider_auth', message, retryable: false, cause };\n }\n if (status === 408 || status === 0) {\n return { kind: 'provider_timeout', message, retryable: true, cause };\n }\n if (status >= 500 && status < 600) {\n return { kind: 'provider_5xx', message, retryable: true, backoffMs: 3_000, cause };\n }\n return { kind: 'unknown', message, retryable: err.retryable, cause };\n}\n","/**\n * Catalog types for the WrongStack agent fleet.\n *\n * An `AgentDefinition` bundles the runtime `SubagentConfig` (id/name/role/\n * prompt/tools) with two things the bare config lacks:\n * - a per-role `budget` tier (consumed by FLEET_ROSTER_BUDGETS), and\n * - dispatcher `capability` metadata (keywords + summary + phase) used by\n * the smart dispatcher to route a free-form task to the best agent.\n *\n * Phase files (`phase1-discovery.ts` … `phase9-meta.ts`) each export an\n * `AgentDefinition[]`; `index.ts` aggregates them into `AGENT_CATALOG`.\n * `fleet.ts` derives `FLEET_ROSTER` + `FLEET_ROSTER_BUDGETS` from the catalog.\n */\nimport type { SubagentConfig } from '../../types/multi-agent.js';\n\n/** Lifecycle phase grouping. Drives statusline labels + dispatcher tie-breaks. */\nexport type AgentPhase =\n | 'discovery'\n | 'planning'\n | 'build'\n | 'verify'\n | 'review'\n | 'domain'\n | 'knowledge'\n | 'delivery'\n | 'meta';\n\n/** Per-role budget tier. Same shape as fleet.ts `FleetRosterBudget`. */\nexport interface AgentBudgetTier {\n timeoutMs?: number | undefined;\n maxIterations?: number | undefined;\n maxToolCalls?: number | undefined;\n maxTokens?: number | undefined;\n maxCostUsd?: number | undefined;\n}\n\n/** Dispatcher routing metadata. */\nexport interface AgentCapability {\n phase: AgentPhase;\n /**\n * One-line capability summary. Fed to the LLM dispatcher classifier as the\n * candidate's description, and shown to the user when explaining a routing\n * decision. Keep it concrete and distinct from sibling agents.\n */\n summary: string;\n /**\n * Lowercased signal words/phrases for the heuristic dispatcher. A task whose\n * description contains these scores toward this agent. Order doesn't matter;\n * prefer specific terms (\"graphql\", \"wcag\") over generic ones (\"code\").\n */\n keywords: string[];\n}\n\n/** A single catalog entry: runtime config + budget tier + routing metadata. */\nexport interface AgentDefinition {\n config: SubagentConfig;\n budget: AgentBudgetTier;\n capability: AgentCapability;\n}\n\nconst HOUR = 60 * 60 * 1000;\n\n/**\n * Budget tiers by workload weight. Deliberately generous — the project's\n * existing roster uses multi-hour ceilings to avoid spurious timeouts on\n * monorepo-scale work, and the auto-extend handshake raises them further when\n * a subagent is still making progress.\n */\nexport const LIGHT_BUDGET: AgentBudgetTier = {\n timeoutMs: 3 * HOUR,\n maxIterations: 3000,\n maxToolCalls: 8000,\n};\nexport const MEDIUM_BUDGET: AgentBudgetTier = {\n timeoutMs: 5 * HOUR,\n maxIterations: 5000,\n maxToolCalls: 14000,\n};\nexport const HEAVY_BUDGET: AgentBudgetTier = {\n timeoutMs: 10 * HOUR,\n maxIterations: 8000,\n maxToolCalls: 20000,\n};\n\n/**\n * Tool allowlist presets. Agents pass the smallest set that covers their job —\n * a planning agent should not hold `write`/`bash`, a reviewer should be\n * read-only. Spread + extend per-agent where a role needs one extra tool.\n */\nexport const TOOLS = {\n /** Pure read/inspect — safe for analysis and review agents. */\n read: ['read', 'grep', 'glob', 'search', 'tree', 'mailbox'],\n /** Read + structured inspection (logs, diffs, json, dependency audit). */\n inspect: ['read', 'grep', 'glob', 'search', 'tree', 'json', 'diff', 'logs', 'audit', 'mailbox'],\n /** Read + edit (no shell). For agents that write code/docs but don't run it. */\n write: ['read', 'grep', 'glob', 'search', 'tree', 'write', 'edit', 'replace', 'patch', 'mailbox'],\n /** Full build loop: edit + run (lint/format/typecheck/test/bash). */\n build: [\n 'read',\n 'grep',\n 'glob',\n 'search',\n 'tree',\n 'write',\n 'edit',\n 'replace',\n 'patch',\n 'bash',\n 'exec',\n 'lint',\n 'format',\n 'typecheck',\n 'test',\n 'mailbox',\n ],\n /** Version control. */\n vcs: ['read', 'grep', 'glob', 'git', 'diff'],\n /** Dependency management + CVE audit. */\n deps: ['read', 'grep', 'glob', 'install', 'outdated', 'audit', 'json', 'mailbox'],\n /** Documentation authoring. */\n docs: ['read', 'grep', 'glob', 'search', 'tree', 'write', 'edit', 'document', 'mailbox'],\n /** Web research. */\n research: ['read', 'grep', 'glob', 'search', 'fetch', 'mailbox'],\n} as const satisfies Record<string, readonly string[]>;\n","import { readFileSync, statSync } from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function agentPrompt(id: string): string {\n const fileName = `${id}.md`;\n for (const dir of agentPromptDirCandidates()) {\n try {\n return readFileSync(path.join(dir, fileName), 'utf8').trimEnd();\n } catch {\n // try next candidate\n }\n }\n return '';\n}\n\nfunction agentPromptDirCandidates(): string[] {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const explicitDir = process.env['WRONGSTACK_AGENT_INSTRUCTIONS_DIR'];\n const globalRoot = process.env['WRONGSTACK_HOME'] || path.join(os.homedir(), '.wrongstack');\n const candidates = [\n ...(explicitDir ? [path.resolve(explicitDir)] : []),\n path.join(globalRoot, 'instructions', 'agents'),\n path.resolve(here, '../../../../instructions/agents'),\n path.resolve(here, '../../../instructions/agents'),\n path.resolve(here, '../../instructions/agents'),\n path.resolve(here, '../instructions/agents'),\n path.resolve(here, 'instructions/agents'),\n ];\n return candidates.sort((a, b) => Number(!isDirectory(a)) - Number(!isDirectory(b)));\n}\n\nfunction isDirectory(candidate: string): boolean {\n try {\n return statSync(candidate).isDirectory();\n } catch {\n return false;\n }\n}\n","import { type AgentDefinition, LIGHT_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 1 · Discovery — map the territory before any work begins. */\nexport const DISCOVERY_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'explore',\n name: 'Explore',\n role: 'explore',\n tools: [...TOOLS.read],\n prompt: agentPrompt('explore'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'discovery',\n summary: 'Maps unfamiliar codebases: entry points, structure, architecture, feature flow (read-only).',\n keywords: [\n 'explore',\n 'map',\n 'understand',\n 'where is',\n 'how does',\n 'codebase',\n 'architecture',\n 'structure',\n 'overview',\n 'find file',\n 'entry point',\n 'orient',\n ],\n },\n },\n {\n config: {\n id: 'search',\n name: 'Search',\n role: 'search',\n tools: [...TOOLS.read],\n prompt: agentPrompt('search'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'discovery',\n summary: 'Semantic + lexical code search across repos; finds definitions, references, duplicates, ranks by relevance.',\n keywords: [\n 'search',\n 'find all',\n 'references',\n 'usages',\n 'call sites',\n 'grep',\n 'locate symbol',\n 'duplicate',\n 'where used',\n 'occurrences',\n 'cross-repo',\n ],\n },\n },\n {\n config: {\n id: 'research',\n name: 'Research',\n role: 'research',\n tools: [...TOOLS.research],\n prompt: agentPrompt('research'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'discovery',\n summary: 'Technical research and feasibility: compares libraries/approaches, recommends a path with evidence and tradeoffs.',\n keywords: [\n 'research',\n 'feasibility',\n 'compare libraries',\n 'which library',\n 'best practice',\n 'tradeoff',\n 'investigate',\n 'evaluate approach',\n 'should we use',\n 'pros and cons',\n ],\n },\n },\n];\n","import { type AgentDefinition, HEAVY_BUDGET, LIGHT_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\nconst PLAN_TOOLS = [...TOOLS.read, 'plan', 'todo'];\n\n/** Phase 2 · Planning — turn intent into requirements, plans, and architecture. */\nexport const PLANNING_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'analyst',\n name: 'Analyst',\n role: 'analyst',\n tools: [...PLAN_TOOLS],\n prompt: agentPrompt('analyst'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'planning',\n summary: 'Requirement analysis: turns vague requests into testable specs with acceptance criteria and open questions.',\n keywords: [\n 'requirements',\n 'analyze requirement',\n 'acceptance criteria',\n 'spec',\n 'specification',\n 'clarify',\n 'scope',\n 'user story',\n 'what should it do',\n ],\n },\n },\n {\n config: {\n id: 'planner',\n name: 'Planner',\n role: 'planner',\n tools: [...PLAN_TOOLS],\n prompt: agentPrompt('planner'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'planning',\n summary: 'Execution planning: decomposes a goal into ordered, dependency-aware, parallelizable steps with checkpoints.',\n keywords: [\n 'plan',\n 'execution plan',\n 'break down',\n 'decompose',\n 'steps',\n 'sequence',\n 'roadmap',\n 'task breakdown',\n 'order of work',\n 'milestones',\n ],\n },\n },\n {\n config: {\n id: 'architect',\n name: 'Architect',\n role: 'architect',\n tools: [...PLAN_TOOLS],\n prompt: agentPrompt('architect'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'planning',\n summary: 'System architecture: designs module boundaries, interfaces, data flow, and records key decisions.',\n keywords: [\n 'architecture',\n 'design system',\n 'module boundaries',\n 'interfaces',\n 'data flow',\n 'component design',\n 'system design',\n 'decision record',\n 'adr',\n 'structure the',\n ],\n },\n },\n {\n config: {\n id: 'critic',\n name: 'Critic',\n role: 'critic',\n tools: [...TOOLS.read],\n prompt: agentPrompt('critic'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'planning',\n summary: 'Adversarial review of plans/designs: finds gaps, risks, and unstated assumptions with ranked fixes.',\n keywords: [\n 'critique',\n 'review plan',\n 'review design',\n 'red team',\n 'poke holes',\n 'risks',\n 'what could go wrong',\n 'second opinion',\n 'challenge',\n 'flaws',\n ],\n },\n },\n {\n config: {\n id: 'refactor-planner',\n name: 'Refactor Planner',\n role: 'refactor-planner',\n tools: [...PLAN_TOOLS, 'diff'],\n prompt: agentPrompt('refactor-planner'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'planning',\n summary: 'Refactoring planner: analyzes code structure, maps dependencies, produces risk-scored phased plans with rollback strategy.',\n keywords: [\n 'refactor',\n 'refactoring',\n 'restructure',\n 'debt',\n 'technical debt',\n 'clean up',\n 'modularize',\n 'decouple',\n 'dependency graph',\n 'code structure',\n ],\n },\n },\n];\n","import { type AgentDefinition, HEAVY_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 3 · Build — write, refactor, migrate, and fix code. */\nexport const BUILD_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'executor',\n name: 'Executor',\n role: 'executor',\n tools: [...TOOLS.build],\n prompt: agentPrompt('executor'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Implements well-specified tasks: writes code, runs checks, leaves the tree green.',\n keywords: [\n 'implement',\n 'build',\n 'write code',\n 'add feature',\n 'create',\n 'code up',\n 'develop',\n 'apply change',\n 'make it work',\n ],\n },\n },\n {\n config: {\n id: 'refactor',\n name: 'Refactor',\n role: 'refactor',\n tools: [...TOOLS.build],\n prompt: agentPrompt('refactor'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Structural refactoring: extract/split/move/rename/decouple without changing observable behavior.',\n keywords: [\n 'refactor',\n 'restructure',\n 'extract',\n 'split module',\n 'decouple',\n 'rename',\n 'move code',\n 'break dependency',\n 'reorganize',\n ],\n },\n },\n {\n config: {\n id: 'simplifier',\n name: 'Simplifier',\n role: 'simplifier',\n tools: [...TOOLS.build],\n prompt: agentPrompt('simplifier'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Reduces complexity: deletes dead code, collapses needless abstractions, shortens and clarifies code.',\n keywords: [\n 'simplify',\n 'dead code',\n 'remove unused',\n 'reduce complexity',\n 'clean up',\n 'denest',\n 'shorten',\n 'over-engineered',\n 'too complex',\n ],\n },\n },\n {\n config: {\n id: 'migration',\n name: 'Migration',\n role: 'migration',\n tools: [...TOOLS.build, 'install', 'outdated'],\n prompt: agentPrompt('migration'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Framework/language/version upgrades: applies codemods across call sites, staged and verified.',\n keywords: [\n 'migrate',\n 'upgrade',\n 'codemod',\n 'breaking change',\n 'major version',\n 'port to',\n 'convert to',\n 'esm',\n 'modernize',\n ],\n },\n },\n {\n config: {\n id: 'vision',\n name: 'Vision',\n role: 'vision',\n tools: [...TOOLS.write, 'fetch'],\n prompt: agentPrompt('vision'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Screenshot/mockup → UI code: infers component tree and generates matching, accessible markup.',\n keywords: [\n 'screenshot',\n 'mockup',\n 'design to code',\n 'image to ui',\n 'figma',\n 'replicate this ui',\n 'from this picture',\n 'vision',\n 'clone ui',\n ],\n },\n },\n {\n config: {\n id: 'debugger',\n name: 'Debugger',\n role: 'debugger',\n tools: [...TOOLS.build, 'logs'],\n prompt: agentPrompt('debugger'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Root-cause bug fixing: reproduces, bisects to the true cause, applies a minimal fix with a regression test.',\n keywords: [\n 'bug',\n 'fix',\n 'debug',\n 'broken',\n 'error',\n 'crash',\n 'root cause',\n 'not working',\n 'failing',\n 'reproduce',\n 'why does',\n ],\n },\n },\n {\n config: {\n id: 'tracer',\n name: 'Tracer',\n role: 'tracer',\n tools: [...TOOLS.build, 'logs'],\n prompt: agentPrompt('tracer'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'build',\n summary: 'Runtime tracing: instruments and runs code to observe call order, values, and timing, then cleans up.',\n keywords: [\n 'trace',\n 'runtime',\n 'instrument',\n 'execution path',\n 'what happens at runtime',\n 'call order',\n 'profile execution',\n 'observe behavior',\n 'stack trace',\n ],\n },\n },\n];\n","import { type AgentDefinition, HEAVY_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 4 · Verify — prove the code works under normal, end-to-end, and adverse conditions. */\nexport const VERIFY_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'test',\n name: 'Test',\n role: 'test',\n tools: [...TOOLS.build],\n prompt: agentPrompt('test'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Unit + integration testing: writes meaningful tests covering golden path and edge cases, runs the suite.',\n keywords: [\n 'test',\n 'unit test',\n 'integration test',\n 'write tests',\n 'coverage',\n 'test suite',\n 'vitest',\n 'jest',\n 'add tests',\n 'spec',\n ],\n },\n },\n {\n config: {\n id: 'e2e',\n name: 'E2E',\n role: 'e2e',\n tools: [\n ...TOOLS.build,\n 'fetch',\n 'playwright_navigate',\n 'playwright_screenshot',\n 'playwright_click',\n 'playwright_type',\n 'playwright_evaluate',\n 'playwright_select_option',\n 'playwright_hover',\n 'playwright_fill_form',\n 'playwright_wait_for',\n 'playwright_press_key',\n 'playwright_drag',\n ],\n prompt: agentPrompt('e2e'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'End-to-end testing: drives full user journeys across UI/CLI/API boundaries with reproducible failures.',\n keywords: [\n 'e2e',\n 'end to end',\n 'end-to-end',\n 'user journey',\n 'smoke test',\n 'playwright',\n 'browser',\n 'screenshot',\n 'web ui',\n 'headless',\n 'cypress',\n 'full flow',\n 'browser test',\n 'acceptance test',\n 'navigate',\n 'click',\n 'form fill',\n 'dom',\n 'page load',\n ],\n },\n },\n {\n config: {\n id: 'browser',\n name: 'Browser',\n role: 'browser',\n tools: [\n ...TOOLS.read,\n 'fetch',\n 'playwright_navigate',\n 'playwright_screenshot',\n 'playwright_click',\n 'playwright_type',\n 'playwright_evaluate',\n 'playwright_select_option',\n 'playwright_hover',\n 'playwright_fill_form',\n 'playwright_wait_for',\n 'playwright_press_key',\n 'playwright_drag',\n ],\n prompt: agentPrompt('browser'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Browser automation: opens pages, clicks, types, screenshots, extracts data via Playwright headless Chromium.',\n keywords: [\n 'browser',\n 'screenshot',\n 'navigate',\n 'web page',\n 'scrape',\n 'crawl',\n 'headless',\n 'chrome',\n 'open url',\n 'capture',\n 'page title',\n 'extract data',\n 'fill form',\n 'click button',\n 'take screenshot',\n ],\n },\n },\n {\n config: {\n id: 'performance',\n name: 'Performance',\n role: 'performance',\n tools: [...TOOLS.build, 'logs'],\n prompt: agentPrompt('performance'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Performance analysis: benchmarks/profiles to find the real bottleneck, optimizes, proves speedup with numbers.',\n keywords: [\n 'performance',\n 'slow',\n 'optimize',\n 'bottleneck',\n 'profile',\n 'benchmark',\n 'latency',\n 'throughput',\n 'memory',\n 'speed up',\n 'too slow',\n ],\n },\n },\n {\n config: {\n id: 'chaos',\n name: 'Chaos',\n role: 'chaos',\n tools: [...TOOLS.build, 'logs'],\n prompt: agentPrompt('chaos'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Resilience testing via fault injection: breaks network/disk/timing to find ungraceful failures and recovery gaps.',\n keywords: [\n 'chaos',\n 'resilience',\n 'fault injection',\n 'failure mode',\n 'fail safe',\n 'retry',\n 'circuit breaker',\n 'graceful degradation',\n 'inject failure',\n 'robustness',\n ],\n },\n },\n {\n config: {\n id: 'security-scanner',\n name: 'Security Scanner',\n role: 'security-scanner',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('security-scanner'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Security scanner: detects hardcoded secrets, injection vectors, insecure patterns, and supply-chain risks with remediation.',\n keywords: [\n 'security',\n 'scan',\n 'vulnerability',\n 'secret',\n 'api key',\n 'hardcoded',\n 'injection',\n 'cve',\n 'audit dependencies',\n 'supply chain',\n 'xss',\n 'sqli',\n 'shell injection',\n 'sensitive data',\n 'credential',\n ],\n },\n },\n {\n config: {\n id: 'bug-hunter',\n name: 'Bug Hunter',\n role: 'bug-hunter',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('bug-hunter'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Bug hunter: scans source code for bugs, anti-patterns, and code smells, producing a file:line-ranked hit list with fixes.',\n keywords: [\n 'bug',\n 'hunt',\n 'scan',\n 'code smell',\n 'anti-pattern',\n 'race condition',\n 'memory leak',\n 'null deref',\n 'type safety',\n 'unhandled error',\n 'find bugs',\n 'audit code',\n 'code quality',\n ],\n },\n },\n {\n config: {\n id: 'audit-log',\n name: 'Audit Log',\n role: 'audit-log',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('audit-log'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'verify',\n summary: 'Audit log analyzer: parses session JSONL, detects failure patterns, tool anomalies, and cost trends with structured reports.',\n keywords: [\n 'audit',\n 'log',\n 'logs',\n 'session',\n 'trace',\n 'analyze logs',\n 'error patterns',\n 'cost analysis',\n 'tool usage',\n 'token usage',\n 'post-mortem',\n 'trend',\n 'anomaly',\n ],\n },\n },\n];\n","import { type AgentDefinition, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 5 · Review — read-only quality, security, a11y, and compliance gates. */\nexport const REVIEW_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'code-reviewer',\n name: 'Code Reviewer',\n role: 'code-reviewer',\n tools: [...TOOLS.inspect, 'git'],\n prompt: agentPrompt('code-reviewer'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'review',\n summary: 'Correctness-first code review of diffs/PRs: finds bugs, edge cases, and convention violations with fixes.',\n keywords: [\n 'review',\n 'code review',\n 'review pr',\n 'review diff',\n 'look over',\n 'feedback on code',\n 'quality',\n 'is this correct',\n 'check my code',\n ],\n },\n },\n {\n config: {\n id: 'security-reviewer',\n name: 'Security Reviewer',\n role: 'security-reviewer',\n tools: [...TOOLS.inspect, 'git'],\n prompt: agentPrompt('security-reviewer'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'review',\n summary: 'Security review: finds injection/authz/secret/crypto issues mapped to OWASP severity with remediation.',\n keywords: [\n 'security review',\n 'security',\n 'vulnerability',\n 'vulnerabilities',\n 'owasp',\n 'injection',\n 'sql injection',\n 'xss',\n 'ssrf',\n 'authz',\n 'secrets',\n 'security audit',\n 'threat',\n 'unsafe',\n ],\n },\n },\n {\n config: {\n id: 'accessibility',\n name: 'Accessibility',\n role: 'accessibility',\n tools: [...TOOLS.read],\n prompt: agentPrompt('accessibility'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'review',\n summary: 'WCAG/a11y review of UI: checks semantics, ARIA, keyboard, contrast; maps findings to success criteria.',\n keywords: [\n 'accessibility',\n 'a11y',\n 'wcag',\n 'aria',\n 'screen reader',\n 'keyboard navigation',\n 'contrast',\n 'disabled users',\n 'accessible',\n ],\n },\n },\n {\n config: {\n id: 'compliance',\n name: 'Compliance',\n role: 'compliance',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('compliance'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'review',\n summary: 'License/privacy/regulatory review: audits licenses, PII handling, and controls vs GDPR/SOC2.',\n keywords: [\n 'compliance',\n 'license',\n 'gdpr',\n 'soc2',\n 'privacy',\n 'pii',\n 'data retention',\n 'regulatory',\n 'audit log',\n 'legal review',\n ],\n },\n },\n];\n","import { type AgentDefinition, HEAVY_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 6 · Domain — specialists for the major slices of a system. */\nexport const DOMAIN_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'database',\n name: 'Database',\n role: 'database',\n tools: [...TOOLS.build],\n prompt: agentPrompt('database'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'Schema design, query optimization, and safe reversible migrations for SQL databases.',\n keywords: [\n 'database',\n 'schema',\n 'sql',\n 'migration',\n 'query',\n 'index',\n 'postgres',\n 'mysql',\n 'table',\n 'orm',\n 'slow query',\n ],\n },\n },\n {\n config: {\n id: 'api',\n name: 'API',\n role: 'api',\n tools: [...TOOLS.build, 'fetch'],\n prompt: agentPrompt('api'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'REST + GraphQL API design and implementation: contracts, HTTP/GraphQL semantics, versioning.',\n keywords: [\n 'api',\n 'rest',\n 'graphql',\n 'endpoint',\n 'resolver',\n 'http',\n 'openapi',\n 'swagger',\n 'route',\n 'contract',\n 'webhook',\n ],\n },\n },\n {\n config: {\n id: 'auth',\n name: 'Auth',\n role: 'auth',\n tools: [...TOOLS.build],\n prompt: agentPrompt('auth'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'Authentication and authorization: identity, sessions/tokens, RBAC/ABAC, OAuth/OIDC, done securely.',\n keywords: [\n 'auth',\n 'authentication',\n 'authorization',\n 'login',\n 'session',\n 'jwt',\n 'oauth',\n 'oidc',\n 'rbac',\n 'permissions',\n 'token',\n 'sso',\n ],\n },\n },\n {\n config: {\n id: 'data',\n name: 'Data',\n role: 'data',\n tools: [...TOOLS.build],\n prompt: agentPrompt('data'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'Data engineering: ETL/ELT pipelines, data-quality validation, idempotent transforms, reconciliation.',\n keywords: [\n 'etl',\n 'elt',\n 'pipeline',\n 'data quality',\n 'data engineering',\n 'transform',\n 'ingestion',\n 'batch',\n 'stream',\n 'reconcile',\n 'dataset',\n ],\n },\n },\n {\n config: {\n id: 'frontend',\n name: 'Frontend',\n role: 'frontend',\n tools: [...TOOLS.build, 'fetch'],\n prompt: agentPrompt('frontend'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'UI implementation: components, client state, data fetching, responsive and accessible by default.',\n keywords: [\n 'frontend',\n 'component',\n 'react',\n 'vue',\n 'svelte',\n 'client state',\n 'ui implementation',\n 'css',\n 'responsive',\n 'hook',\n 'render',\n ],\n },\n },\n {\n config: {\n id: 'backend',\n name: 'Backend',\n role: 'backend',\n tools: [...TOOLS.build],\n prompt: agentPrompt('backend'),\n },\n budget: HEAVY_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'Server-side logic: services, business rules, persistence/queue wiring, concurrency and transactions.',\n keywords: [\n 'backend',\n 'server',\n 'service',\n 'business logic',\n 'controller',\n 'handler',\n 'queue',\n 'cache',\n 'transaction',\n 'microservice',\n 'server-side',\n ],\n },\n },\n {\n config: {\n id: 'designer',\n name: 'Designer',\n role: 'designer',\n tools: [...TOOLS.docs],\n prompt: agentPrompt('designer'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'domain',\n summary: 'UI/UX design: user flows, layout/wireframes, interaction states, and design-system decisions.',\n keywords: [\n 'design',\n 'ux',\n 'ui design',\n 'wireframe',\n 'user flow',\n 'layout',\n 'design system',\n 'interaction',\n 'mockup design',\n 'information architecture',\n ],\n },\n },\n];\n","import { type AgentDefinition, LIGHT_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 7 · Knowledge — documentation, diagrams, localization, and prompts. */\nexport const KNOWLEDGE_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'document',\n name: 'Document',\n role: 'document',\n tools: [...TOOLS.docs],\n prompt: agentPrompt('document'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'knowledge',\n summary: 'Technical documentation: READMEs, API/reference docs, guides, and verified examples grounded in code.',\n keywords: [\n 'document',\n 'documentation',\n 'readme',\n 'docs',\n 'write up',\n 'guide',\n 'api docs',\n 'explain in writing',\n 'reference',\n 'changelog notes',\n ],\n },\n },\n {\n config: {\n id: 'uml',\n name: 'UML',\n role: 'uml',\n tools: [...TOOLS.read, 'write', 'edit'],\n prompt: agentPrompt('uml'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'knowledge',\n summary: 'Diagram generation from code: class/sequence/component/ER diagrams as Mermaid/PlantUML.',\n keywords: [\n 'uml',\n 'diagram',\n 'mermaid',\n 'plantuml',\n 'sequence diagram',\n 'class diagram',\n 'er diagram',\n 'visualize',\n 'flowchart',\n 'architecture diagram',\n ],\n },\n },\n {\n config: {\n id: 'i18n',\n name: 'I18n',\n role: 'i18n',\n tools: [...TOOLS.write],\n prompt: agentPrompt('i18n'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'knowledge',\n summary: 'Internationalization/localization: string extraction, catalog management, plurals/RTL/format handling.',\n keywords: [\n 'i18n',\n 'internationalization',\n 'localization',\n 'l10n',\n 'translation',\n 'translate ui',\n 'locale',\n 'rtl',\n 'message catalog',\n 'multilingual',\n ],\n },\n },\n {\n config: {\n id: 'prompt',\n name: 'Prompt',\n role: 'prompt',\n tools: [...TOOLS.write],\n prompt: agentPrompt('prompt'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'knowledge',\n summary: 'Prompt engineering: designs/refines/evaluates LLM system prompts and agent instructions.',\n keywords: [\n 'prompt',\n 'prompt engineering',\n 'system prompt',\n 'llm instructions',\n 'few-shot',\n 'refine prompt',\n 'agent instructions',\n 'prompt template',\n ],\n },\n },\n];\n","import { type AgentDefinition, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 8 · Delivery & Ops — ship it, run it, keep it healthy. */\nexport const DELIVERY_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'git',\n name: 'Git',\n role: 'git',\n tools: [...TOOLS.vcs, 'bash'],\n prompt: agentPrompt('git'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'delivery',\n summary: 'Git automation: focused commits, branch/rebase/conflict handling, PR prep, history investigation.',\n keywords: [\n 'git',\n 'commit',\n 'branch',\n 'rebase',\n 'merge',\n 'pull request',\n 'pr',\n 'conflict',\n 'blame',\n 'bisect',\n 'cherry-pick',\n 'stash',\n ],\n },\n },\n {\n config: {\n id: 'release',\n name: 'Release',\n role: 'release',\n tools: [...TOOLS.vcs, 'bash', 'json'],\n prompt: agentPrompt('release'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'delivery',\n summary: 'Release management: semver bumps, changelogs, and release notes derived from real history.',\n keywords: [\n 'release',\n 'version',\n 'semver',\n 'changelog',\n 'release notes',\n 'tag',\n 'bump version',\n 'publish',\n 'versioning',\n ],\n },\n },\n {\n config: {\n id: 'devops',\n name: 'DevOps',\n role: 'devops',\n tools: [\n ...TOOLS.build,\n 'mcp__ssh__ssh_list_servers',\n 'mcp__ssh__ssh_connection_status',\n 'mcp__ssh__ssh_execute',\n 'mcp__ssh__ssh_execute_sudo',\n 'mcp__ssh__ssh_upload',\n 'mcp__ssh__ssh_download',\n 'mcp__ssh__ssh_sync',\n 'mcp__ssh__ssh_deploy',\n 'mcp__ssh__ssh_health_check',\n 'mcp__ssh__ssh_service_status',\n 'mcp__ssh__ssh_process_manager',\n 'mcp__ssh__ssh_tunnel',\n 'mcp__ssh__ssh_backup_create',\n 'mcp__ssh__ssh_backup_list',\n 'mcp__ssh__ssh_backup_restore',\n 'mcp__ssh__ssh_db_list',\n 'mcp__ssh__ssh_db_query',\n 'mcp__ssh__ssh_profile',\n ],\n prompt: agentPrompt('devops'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'delivery',\n summary: 'CI/CD, containerization, and deployment config: reproducible builds and safe deploys with rollback.',\n keywords: [\n 'devops',\n 'ci',\n 'cd',\n 'ci/cd',\n 'pipeline',\n 'docker',\n 'dockerfile',\n 'kubernetes',\n 'k8s',\n 'deploy',\n 'ssh',\n 'remote ssh',\n 'remote server',\n 'sftp',\n 'tunnel',\n 'bastion',\n 'jump host',\n 'github actions',\n 'container',\n ],\n },\n },\n {\n config: {\n id: 'observability',\n name: 'Observability',\n role: 'observability',\n tools: [...TOOLS.build, 'logs'],\n prompt: agentPrompt('observability'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'delivery',\n summary: 'Observability: structured logging, metrics, distributed tracing, and alerts/dashboards.',\n keywords: [\n 'observability',\n 'logging',\n 'metrics',\n 'tracing',\n 'telemetry',\n 'opentelemetry',\n 'otel',\n 'prometheus',\n 'monitoring',\n 'alert',\n 'dashboard',\n 'instrument',\n ],\n },\n },\n {\n config: {\n id: 'dependency',\n name: 'Dependency',\n role: 'dependency',\n tools: [...TOOLS.deps, 'bash'],\n prompt: agentPrompt('dependency'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'delivery',\n summary: 'Package management + supply-chain safety: CVE audit, safe upgrades, pruning, install-script review.',\n keywords: [\n 'dependency',\n 'dependencies',\n 'package',\n 'npm',\n 'pnpm',\n 'cve',\n 'vulnerability scan',\n 'upgrade deps',\n 'audit',\n 'supply chain',\n 'outdated',\n 'lockfile',\n ],\n },\n },\n];\n","import { type AgentDefinition, LIGHT_BUDGET, MEDIUM_BUDGET, TOOLS } from './types.js';\nimport { agentPrompt } from './agent-prompts.js';\n\n/** Phase 9 · Meta — agents that improve the agent system itself. */\nexport const META_AGENTS: AgentDefinition[] = [\n {\n config: {\n id: 'skill-manage',\n name: 'Skill Manager',\n role: 'skill-manage',\n tools: [...TOOLS.write],\n prompt: agentPrompt('skill-manage'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'meta',\n summary: 'Skill curation: audits, refines descriptions/triggers, scaffolds, and retires skills.',\n keywords: [\n 'skill',\n 'skills',\n 'curate skill',\n 'skill description',\n 'create skill',\n 'skill library',\n 'skill trigger',\n 'manage skills',\n ],\n },\n },\n {\n config: {\n id: 'self-improving',\n name: 'Self-Improving',\n role: 'self-improving',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('self-improving'),\n },\n budget: MEDIUM_BUDGET,\n capability: {\n phase: 'meta',\n summary: 'Learns from execution logs: mines recurring failures/inefficiencies and proposes evidence-based improvements.',\n keywords: [\n 'self-improving',\n 'learn from',\n 'session logs',\n 'execution analysis',\n 'recurring failure',\n 'improve agents',\n 'post-mortem',\n 'retrospective',\n 'meta-analysis',\n ],\n },\n },\n {\n config: {\n id: 'context',\n name: 'Context',\n role: 'context',\n tools: [...TOOLS.inspect, 'remember', 'forget'],\n prompt: agentPrompt('context'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'meta',\n summary: 'Memory + context-window management: compaction, recall, and curation within a token budget.',\n keywords: [\n 'context',\n 'context window',\n 'memory',\n 'compact',\n 'summarize history',\n 'recall',\n 'token budget',\n 'prune context',\n 'remember',\n 'dfmt',\n ],\n },\n },\n {\n config: {\n id: 'cost',\n name: 'Cost',\n role: 'cost',\n tools: [...TOOLS.inspect],\n prompt: agentPrompt('cost'),\n },\n budget: LIGHT_BUDGET,\n capability: {\n phase: 'meta',\n summary: 'Token/cloud cost optimization: finds spend waste, recommends model routing and trimming with $ estimates.',\n keywords: [\n 'cost',\n 'token cost',\n 'optimize cost',\n 'spend',\n 'cheaper',\n 'model routing',\n 'budget',\n 'expensive',\n 'reduce tokens',\n 'pricing',\n 'cloud cost',\n ],\n },\n },\n {\n config: {\n id: 'tech-stack',\n name: 'Tech Stack Validator',\n role: 'tech-stack',\n tools: ['search', 'fetch', 'read', 'grep', 'glob', 'outdated', 'audit', 'json', 'mailbox'],\n prompt: agentPrompt('tech-stack'),\n },\n budget: {\n timeoutMs: 120_000,\n maxIterations: 10,\n maxToolCalls: 40,\n maxTokens: 60_000,\n maxCostUsd: 0.25,\n },\n capability: {\n phase: 'meta',\n summary: 'Single-shot tech stack validator: checks npm for latest versions, rejects dead/obsolete packages, enforces modern alternatives.',\n keywords: [\n 'tech stack',\n 'version',\n 'package',\n 'library',\n 'framework',\n 'dependency',\n 'install',\n 'upgrade',\n 'latest',\n 'npm',\n 'pnpm add',\n 'outdated',\n 'obsolete',\n 'deprecated',\n 'what version',\n 'which package',\n 'check version',\n 'verify version',\n 'is this current',\n ],\n },\n },\n];\n","/**\n * Agent catalog aggregator.\n *\n * Collects every phase's `AgentDefinition[]` into:\n * - `ALL_AGENT_DEFINITIONS` — flat list, catalog order (phase 1 → 9)\n * - `AGENT_CATALOG` — keyed by role for O(1) lookup\n * - `AGENTS_BY_PHASE` — grouped for statusline / dispatcher tie-breaks\n *\n * `fleet.ts` derives `FLEET_ROSTER` + `FLEET_ROSTER_BUDGETS` from this, and the\n * dispatcher routes free-form tasks against `capability` metadata here.\n */\nimport type { AgentDefinition, AgentPhase } from './types.js';\nimport { DISCOVERY_AGENTS } from './phase1-discovery.js';\nimport { PLANNING_AGENTS } from './phase2-planning.js';\nimport { BUILD_AGENTS } from './phase3-build.js';\nimport { VERIFY_AGENTS } from './phase4-verify.js';\nimport { REVIEW_AGENTS } from './phase5-review.js';\nimport { DOMAIN_AGENTS } from './phase6-domain.js';\nimport { KNOWLEDGE_AGENTS } from './phase7-knowledge.js';\nimport { DELIVERY_AGENTS } from './phase8-delivery.js';\nimport { META_AGENTS } from './phase9-meta.js';\n\nexport * from './types.js';\nexport {\n DISCOVERY_AGENTS,\n PLANNING_AGENTS,\n BUILD_AGENTS,\n VERIFY_AGENTS,\n REVIEW_AGENTS,\n DOMAIN_AGENTS,\n KNOWLEDGE_AGENTS,\n DELIVERY_AGENTS,\n META_AGENTS,\n};\n\n/** Every catalog agent, in phase order. */\nexport const ALL_AGENT_DEFINITIONS: AgentDefinition[] = [\n ...DISCOVERY_AGENTS,\n ...PLANNING_AGENTS,\n ...BUILD_AGENTS,\n ...VERIFY_AGENTS,\n ...REVIEW_AGENTS,\n ...DOMAIN_AGENTS,\n ...KNOWLEDGE_AGENTS,\n ...DELIVERY_AGENTS,\n ...META_AGENTS,\n];\n\n/** Phase → its agents, for grouped display and dispatcher fallbacks. */\nexport const AGENTS_BY_PHASE: Record<AgentPhase, AgentDefinition[]> = {\n discovery: DISCOVERY_AGENTS,\n planning: PLANNING_AGENTS,\n build: BUILD_AGENTS,\n verify: VERIFY_AGENTS,\n review: REVIEW_AGENTS,\n domain: DOMAIN_AGENTS,\n knowledge: KNOWLEDGE_AGENTS,\n delivery: DELIVERY_AGENTS,\n meta: META_AGENTS,\n};\n\n/**\n * Role → definition. Built once at module load. Throws on a duplicate role so\n * a copy-paste collision fails loudly at startup instead of silently shadowing.\n */\nexport const AGENT_CATALOG: Record<string, AgentDefinition> = (() => {\n const map: Record<string, AgentDefinition> = {};\n for (const def of ALL_AGENT_DEFINITIONS) {\n const role = def.config.role;\n if (!role) {\n throw new Error(`Agent \"${def.config.name}\" is missing a role`);\n }\n if (map[role]) {\n throw new Error(`Duplicate agent role in catalog: \"${role}\"`);\n }\n map[role] = def;\n }\n return map;\n})();\n\n/** Role lookup helper. Returns undefined for unknown roles. */\nexport function getAgentDefinition(role: string): AgentDefinition | undefined {\n return AGENT_CATALOG[role];\n}\n","/**\n * Pre-built subagent role configurations for the WrongStack fleet.\n * These can be passed to `MultiAgentHost.spawn()` or used as templates\n * for the director's roster.\n */\nimport type { SubagentConfig } from '../types/multi-agent.js';\nimport { ALL_AGENT_DEFINITIONS } from './agents/index.js';\nimport { agentPrompt } from './agents/agent-prompts.js';\n\n/**\n * Audit Log Agent — analyzes session logs, event streams, and traces.\n * Use for: post-mortems, trend analysis, operational insights.\n */\nexport const AUDIT_LOG_AGENT: SubagentConfig = {\n id: 'audit-log',\n name: 'Audit Log',\n role: 'audit-log',\n prompt: agentPrompt('audit-log'),\n\n // No hardcoded budgets — the orchestrator (delegate tool or\n // spawn_subagent) decides per-task how much room a subagent gets.\n // A monorepo audit needs hours; a single-file lint check needs\n // seconds. Pinning a number here forces the orchestrator to fight\n // the role's default instead of just asking for what it needs.\n};\n\n/**\n * Bug Hunter Agent — systematic bug and code smell detection.\n * Use for: pre-refactoring health checks, code review, regression prevention.\n */\nexport const BUG_HUNTER_AGENT: SubagentConfig = {\n id: 'bug-hunter',\n name: 'Bug Hunter',\n role: 'bug-hunter',\n prompt: agentPrompt('bug-hunter'),\n\n // Budgets are set by the orchestrator per task — see fleet.ts header.\n};\n\n/**\n * Refactor Planner Agent — structured refactoring planning.\n * Use for: large rewrites, technical debt reduction, architecture improvements.\n */\nexport const REFACTOR_PLANNER_AGENT: SubagentConfig = {\n id: 'refactor-planner',\n name: 'Refactor Planner',\n role: 'refactor-planner',\n prompt: agentPrompt('refactor-planner'),\n\n // Budgets are set by the orchestrator per task — see fleet.ts header.\n};\n\n/**\n * Security Scanner Agent — vulnerability and secret detection.\n * Use for: CI checks, pre-release audits, dependency vulnerability scanning.\n */\nexport const SECURITY_SCANNER_AGENT: SubagentConfig = {\n id: 'security-scanner',\n name: 'Security Scanner',\n role: 'security-scanner',\n prompt: agentPrompt('security-scanner'),\n\n // Budgets are set by the orchestrator per task — see fleet.ts header.\n};\n\n/**\n * Shadow Agent — one-shot fleet monitoring and intervention.\n * Use for: quiet anomaly checks and on-demand intervention.\n */\nexport const SHADOW_AGENT: SubagentConfig = {\n id: 'shadow-agent',\n name: 'Shadow',\n role: 'shadow-agent',\n prompt: agentPrompt('shadow-agent'),\n\n // Budgets are set by the orchestrator per task — see fleet.ts header.\n};\n\n/**\n * Critic Agent — evaluates code quality, architecture decisions, and\n * refactoring plans against project conventions and engineering standards.\n * Use for: real-time evaluation of bug reports, refactor plans, and\n * architectural proposals during collaborative debugging sessions.\n */\nexport const CRITIC_AGENT: SubagentConfig = {\n id: 'critic',\n name: 'Critic',\n role: 'critic',\n prompt: agentPrompt('critic'),\n\n // Budgets are set by the orchestrator per task — see fleet.ts header.\n};\n\n/**\n * All agents in a map for easy lookup by role. The four legacy pre-built\n * agents plus the phase 1-9 catalog (`ALL_AGENT_DEFINITIONS`). Catalog roles\n * are guaranteed collision-free by the catalog builder; none overlap the\n * legacy four.\n */\nexport const FLEET_ROSTER: Record<string, SubagentConfig> = {\n 'audit-log': AUDIT_LOG_AGENT,\n 'bug-hunter': BUG_HUNTER_AGENT,\n 'refactor-planner': REFACTOR_PLANNER_AGENT,\n 'security-scanner': SECURITY_SCANNER_AGENT,\n 'critic': CRITIC_AGENT,\n 'shadow-agent': SHADOW_AGENT,\n ...Object.fromEntries(\n ALL_AGENT_DEFINITIONS.map((d) => [d.config.role as string, d.config] as const),\n ),\n};\n\n// ---------------------------------------------------------------------------\n// Default per-role budgets.\n//\n// MASSIVELY RAISED from earlier values. User requested x5–x10 multiplier\n// to prevent any timeout or budget exhaustion on long-running tasks\n// like monorepo audits, deep refactors, and security scans.\n//\n// x10 values (realistic upper bound for a single subagent task):\n// audit-log: 7.5 hours, 5000 iterations, 15000 tool calls\n// bug-hunter: 10 hours, 8000 iterations, 20000 tool calls\n// refactor-planner: 7.5 hours, 6000 iterations, 18000 tool calls\n// security-scanner: 10 hours, 8000 iterations, 20000 tool calls\n//\n// These can be overridden per-call via delegate tool parameters.\n// ---------------------------------------------------------------------------\nexport interface FleetRosterBudget {\n timeoutMs?: number | undefined;\n /** Idle reap window (ms). Resets on activity — see `applyRosterBudget`. */\n idleTimeoutMs?: number | undefined;\n maxIterations?: number | undefined;\n maxToolCalls?: number | undefined;\n maxTokens?: number | undefined;\n maxCostUsd?: number | undefined;\n}\n\n/**\n * Default idle window for delegated subagents: reap only after this long with\n * NO activity (no iteration / tool call / streamed progress). An actively-\n * working agent resets this clock continuously, so it runs until its task\n * naturally ends — no more wall-clock kills of productive runs. Power users\n * can still impose a hard `timeoutMs` per delegate.\n */\nexport const DEFAULT_IDLE_TIMEOUT_MS = 15 * 60 * 1000;\n\nexport const FLEET_ROSTER_BUDGETS: Record<string, FleetRosterBudget> = {\n 'audit-log': { timeoutMs: 7.5 * 60 * 60 * 1000, maxIterations: 5000, maxToolCalls: 15000 },\n 'bug-hunter': { timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000 },\n 'refactor-planner': { timeoutMs: 7.5 * 60 * 60 * 1000, maxIterations: 6000, maxToolCalls: 18000 },\n 'security-scanner': { timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000 },\n 'critic': { timeoutMs: 5 * 60 * 60 * 1000, maxIterations: 4000, maxToolCalls: 12000 },\n 'shadow-agent': {\n idleTimeoutMs: DEFAULT_IDLE_TIMEOUT_MS,\n maxIterations: 2000,\n maxToolCalls: 5000,\n maxTokens: 60_000,\n maxCostUsd: 1,\n },\n ...Object.fromEntries(\n ALL_AGENT_DEFINITIONS.map((d) => [d.config.role as string, d.budget] as const),\n ),\n};\n\n/**\n * Apply roster budget to a config (only when the config has no explicit\n * budget fields set). This is called by the coordinator before dispatch.\n */\n// Generic default budget applied when no role matches and no explicit budget\n// fields are set. Used for `name` / free-form delegates. There is no default\n// wall-clock timeout — a delegated agent runs until its task naturally ends\n// (`end_turn`) or it stalls past the idle window. Iteration / tool-call ceilings\n// remain as a runaway backstop.\nconst GENERIC_SUBAGENT_BUDGET: FleetRosterBudget = {\n idleTimeoutMs: DEFAULT_IDLE_TIMEOUT_MS,\n maxIterations: 5000,\n maxToolCalls: 15000,\n};\n\nexport function applyRosterBudget(cfg: SubagentConfig): SubagentConfig {\n // First try role-specific budget; fall back to generic for name-only delegates.\n const roleBudget = cfg.role ? FLEET_ROSTER_BUDGETS[cfg.role] : undefined;\n const defaultBudget = roleBudget ?? (cfg.name ? GENERIC_SUBAGENT_BUDGET : undefined);\n if (!defaultBudget) return cfg;\n return {\n ...cfg,\n // Wall-clock cap is opt-in only: forward an explicit `cfg.timeoutMs`, but\n // do NOT impose the roster's historical multi-hour wall-clock default — it\n // killed agents that were still actively working. Reaping is idle-based.\n timeoutMs: cfg.timeoutMs,\n // Idle window is the default reaper. Resets on activity, so a long-but-\n // productive run is never killed; only a genuine stall is reaped.\n idleTimeoutMs: cfg.idleTimeoutMs ?? defaultBudget.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS,\n maxIterations: cfg.maxIterations ?? defaultBudget.maxIterations,\n maxToolCalls: cfg.maxToolCalls ?? defaultBudget.maxToolCalls,\n maxTokens: cfg.maxTokens ?? defaultBudget.maxTokens,\n maxCostUsd: cfg.maxCostUsd ?? defaultBudget.maxCostUsd,\n };\n}\n\n/** Quick-access list for spawning all at once. */\nexport const ALL_FLEET_AGENTS = Object.values(FLEET_ROSTER);\n\n// ---------------------------------------------------------------------------\n// ACP external agents — WrongStack spawns these as subagents via ACP protocol.\n// Each agent runs its own loop; WrongStack sends tasks as ACP messages and\n// receives results. These don't go through makeAgentSubagentRunner — they\n// are handled by makeACPSubagentRunner in the CLI multi-agent layer.\n// ---------------------------------------------------------------------------\n\n/**\n * Cline — ACP-compatible coding agent by @asonix.\n * Spawned as: `npx @agentify/cline`\n */\nexport const CLINE_AGENT: SubagentConfig = {\n id: 'cline',\n name: 'Cline',\n role: 'cline',\n prompt: agentPrompt('acp-cline'),\n provider: 'acp',\n};\n\n/**\n * Gemini CLI — Google's ACP-compatible command-line agent.\n * Spawned as: `gemini` (when gemini CLI is installed and in PATH)\n */\nexport const GEMINI_CLI_AGENT: SubagentConfig = {\n id: 'gemini-cli',\n name: 'Gemini CLI',\n role: 'gemini-cli',\n prompt: agentPrompt('acp-gemini-cli'),\n provider: 'acp',\n};\n\n/**\n * GitHub Copilot (public preview) — ACP-compatible Copilot CLI agent.\n * Spawned as: `gh copilot` (when gh CLI with copilot extension is installed)\n */\nexport const COPILOT_AGENT: SubagentConfig = {\n id: 'copilot',\n name: 'GitHub Copilot',\n role: 'copilot',\n prompt: agentPrompt('acp-copilot'),\n provider: 'acp',\n};\n\n/**\n * OpenHands — AI coding agent by all-in.ai, ACP-compatible.\n * Spawned as: `openhands` (when installed)\n */\nexport const OPENHANDS_AGENT: SubagentConfig = {\n id: 'openhands',\n name: 'OpenHands',\n role: 'openhands',\n prompt: agentPrompt('acp-openhands'),\n provider: 'acp',\n};\n\n/**\n * Goose — IDE agent by ExoRL, ACP-compatible.\n * Spawned as: `goose` (when goose CLI is installed)\n */\nexport const GOOSE_AGENT: SubagentConfig = {\n id: 'goose',\n name: 'Goose',\n role: 'goose',\n prompt: agentPrompt('acp-goose'),\n provider: 'acp',\n};\n\n/** All ACP external agents. */\nexport const ACP_AGENTS: SubagentConfig[] = [\n CLINE_AGENT,\n GEMINI_CLI_AGENT,\n COPILOT_AGENT,\n OPENHANDS_AGENT,\n GOOSE_AGENT,\n];\n\n// ACP agents share the same generous budgets as the built-in fleet agents.\n// External ACP agents may need more time than typical in-process subagents\n// since they run their own loops and may do tool-call round-trips.\nFLEET_ROSTER_BUDGETS['cline'] = {timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000};\nFLEET_ROSTER_BUDGETS['gemini-cli'] = {timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000};\nFLEET_ROSTER_BUDGETS['copilot'] = {timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000};\nFLEET_ROSTER_BUDGETS['openhands'] = {timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000};\nFLEET_ROSTER_BUDGETS['goose'] = {timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000};\n\n/** Extended roster including ACP agents. */\nexport const FLEET_ROSTER_WITHACP: Record<string, SubagentConfig> = {\n ...FLEET_ROSTER,\n ...Object.fromEntries(ACP_AGENTS.map((a) => [a.role as string, a])),\n};\n","/**\n * Subagent nickname pool — famous scientists, mathematicians, and computing pioneers.\n * Names are grouped by domain affinity so the nickname hints at the agent's role.\n */\n\nconst NICKNAME_POOL = {\n // Physics & fundamental sciences\n 'einstein': { name: 'Einstein', domain: 'physics' },\n 'newton': { name: 'Newton', domain: 'physics' },\n 'feynman': { name: 'Feynman', domain: 'physics' },\n 'dirac': { name: 'Dirac', domain: 'physics' },\n 'bohr': { name: 'Bohr', domain: 'physics' },\n 'planck': { name: 'Planck', domain: 'physics' },\n 'curie': { name: 'Curie', domain: 'physics' },\n 'fermi': { name: 'Fermi', domain: 'physics' },\n 'heisenberg': { name: 'Heisenberg', domain: 'physics' },\n 'schrodinger': { name: 'Schrödinger', domain: 'physics' },\n\n // Mathematics\n 'euclid': { name: 'Euclid', domain: 'math' },\n 'gauss': { name: 'Gauss', domain: 'math' },\n 'turing': { name: 'Turing', domain: 'math' },\n 'poincare': { name: 'Poincaré', domain: 'math' },\n 'riemann': { name: 'Riemann', domain: 'math' },\n 'hilbert': { name: 'Hilbert', domain: 'math' },\n 'pythagoras': { name: 'Pythagoras', domain: 'math' },\n\n // Computing & information theory\n 'von-neumann': { name: 'Von Neumann', domain: 'computing' },\n 'shannon': { name: 'Shannon', domain: 'computing' },\n 'hopper': { name: 'Hopper', domain: 'computing' },\n 'backus': { name: 'Backus', domain: 'computing' },\n 'knuth': { name: 'Knuth', domain: 'computing' },\n 'torvalds': { name: 'Torvalds', domain: 'computing' },\n 'stallman': { name: 'Stallman', domain: 'computing' },\n 'berners-lee': { name: 'Berners-Lee', domain: 'computing' },\n 'babbage': { name: 'Babbage', domain: 'computing' },\n 'lovelace': { name: 'Lovelace', domain: 'computing' },\n 'klein': { name: 'Klein', domain: 'computing' },\n\n // Electronics & electrical engineering\n 'edison': { name: 'Edison', domain: 'ee' },\n 'tesla': { name: 'Tesla', domain: 'ee' },\n 'faraday': { name: 'Faraday', domain: 'ee' },\n 'maxwell': { name: 'Maxwell', domain: 'ee' },\n 'ohm': { name: 'Ohm', domain: 'ee' },\n 'bell': { name: 'Bell', domain: 'ee' },\n 'marconi': { name: 'Marconi', domain: 'ee' },\n 'lamarr': { name: 'Lamarr', domain: 'ee' },\n\n // General science / multi-disciplinary\n 'darwin': { name: 'Darwin', domain: 'biology' },\n 'mendel': { name: 'Mendel', domain: 'biology' },\n 'pasteur': { name: 'Pasteur', domain: 'biology' },\n 'hawking': { name: 'Hawking', domain: 'cosmology' },\n 'sagan': { name: 'Sagan', domain: 'cosmology' },\n\n // Exploration & navigation\n 'columbus': { name: 'Columbus', domain: 'exploration' },\n 'polo': { name: 'Polo', domain: 'exploration' },\n 'magellan': { name: 'Magellan', domain: 'exploration' },\n\n // Chemistry / materials\n 'lavoisier': { name: 'Lavoisier', domain: 'chemistry' },\n 'mendeleev': { name: 'Mendeleev', domain: 'chemistry' },\n} as const;\n\n/** Flat ordered list of all available nicknames — used for round-robin. */\nconst ALL_NICKNAMES = Object.entries(NICKNAME_POOL) as [NicknameKey, { name: string; domain: string }][];\n\n/** Reverse index: display name (e.g. \"Von Neumann\") → canonical pool key. */\nconst NAME_TO_KEY: Record<string, string> = Object.fromEntries(\n ALL_NICKNAMES.map(([key, entry]) => [entry.name, key]),\n);\n\n/** Domain → preferred nickname keys (fallback chain). */\nconst DOMAIN_PREFERENCES: Record<string, string[]> = {\n 'security': ['shannon', 'turing', 'lamarr', 'stallman'],\n 'bug-hunter': ['darwin', 'curie', 'feynman', 'fermi'],\n 'refactor': ['gauss', 'hilbert', 'euclid', 'planck'],\n 'audit-log': ['sagan', 'hawking', 'poincare', 'newton'],\n 'planner': ['hilbert', 'gauss', 'turing', 'euclid'],\n 'researcher': ['sagan', 'hawking', 'darwin', 'pasteur'],\n 'explorer': ['marconi', 'bell', 'columbus', 'polo'],\n 'testing': ['pasteur', 'curie', 'fermi', 'bohr'],\n 'frontend': ['lovelace', 'hopper', 'babbage', 'backus'],\n 'backend': ['torvalds', 'stallman', 'von-neumann', 'backus'],\n 'database': ['turing', 'shannon', 'backus', 'knuth'],\n 'devops': ['tesla', 'edison', 'faraday', 'bell'],\n 'security-scanner': ['shannon', 'turing', 'lamarr', 'stallman'],\n 'refactor-planner': ['gauss', 'hilbert', 'planck', 'newton'],\n 'architect': ['von-neumann', 'turing', 'gauss', 'hilbert'],\n 'critic': ['einstein', 'feynman', 'dirac', 'bohr'],\n 'e2e': ['hopper', 'bell', 'marconi', 'tesla'],\n 'performance': ['knuth', 'gauss', 'planck', 'feynman'],\n 'chaos': ['tesla', 'edison', 'curie', 'fermi'],\n 'cost': ['ohm', 'bell', 'marconi', 'tesla'],\n // default fallback\n 'default': ['einstein', 'newton', 'curie', 'tesla', 'edison', 'turing', 'shannon', 'hopper', 'knuth', 'stallman'],\n};\n\ntype NicknameKey = keyof typeof NICKNAME_POOL;\n\n/** Result of a nickname assignment. */\nexport interface NicknameAssignment {\n /**\n * Canonical pool key (e.g. `von-neumann`). This — NOT the display string — is\n * what callers must add to their `used` set and later remove on release.\n * Deriving the key by parsing the display string is unsafe: multi-word names\n * like \"Von Neumann\" would be truncated to \"von\" and never dedupe correctly.\n */\n key: string;\n /** Human display string, e.g. `Von Neumann (Backend)`. */\n display: string;\n}\n\n/**\n * Assign a unique nickname to a subagent based on its role.\n *\n * Returns both the canonical pool `key` (for the `used` set) and the formatted\n * `display` string (`Name (Role)`, e.g. `Einstein (Bug Hunter)`).\n *\n * @param role - The subagent's role id (e.g. 'bug-hunter', 'security-scanner')\n * @param used - Set of nickname KEYS already assigned in this fleet\n * (so no two subagents share the same base name)\n */\nexport function assignNickname(role: string, used: ReadonlySet<string>): NicknameAssignment {\n // 1. Build preference list: role-specific → default fallback\n const preferences = [\n ...(DOMAIN_PREFERENCES[role] ?? []),\n ...(DOMAIN_PREFERENCES['default'] ?? []),\n ];\n\n // 2. Find the first unassigned nickname from preferences. Skip keys that are\n // not in the pool — preference lists can drift out of sync with the pool\n // (typos, removed names), and an unknown key must not crash assignment.\n for (const key of preferences) {\n const entry = NICKNAME_POOL[key as NicknameKey];\n if (entry && !used.has(key)) {\n return { key, display: `${entry.name} (${formatRole(role)})` };\n }\n }\n\n // 3. Exhausted preferences — pick the first unused name round-robin style.\n for (const [key, entry] of ALL_NICKNAMES) {\n if (!used.has(key)) {\n return { key, display: `${entry.name} (${formatRole(role)})` };\n }\n }\n\n // 4. Pool exhausted — synthesize a stable, unique key/display pair.\n const counter = used.size + 1;\n return { key: `scientist-${counter}`, display: `Scientist #${counter} (${formatRole(role)})` };\n}\n\n/**\n * Resolve a previously-assigned display string back to its canonical pool key,\n * for release paths that only retained the formatted name (e.g. a manifest\n * entry). Strips the trailing ` (Role)` suffix, then matches the base name\n * against the pool. Returns `undefined` when the name is not a known nickname.\n *\n * Use this instead of `name.split(' ')[0]` — the latter mangles multi-word\n * names like \"Von Neumann\" and \"Berners-Lee\".\n */\nexport function nicknameKeyFromDisplay(display: string): string | undefined {\n const base = display.replace(/\\s*\\([^)]*\\)\\s*$/, '').trim();\n const key = NAME_TO_KEY[base];\n if (key) return key;\n const synthesized = base.match(/^Scientist #(\\d+)$/);\n return synthesized ? `scientist-${synthesized[1]}` : undefined;\n}\n\n/** Format role id into human-readable title-case. */\nfunction formatRole(role: string): string {\n return role\n .split(/[-_]/)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\n/**\n * Returns all available nickname keys. Useful for testing or reset logic.\n */\nexport function getAllNicknameKeys(): string[] {\n return Object.keys(NICKNAME_POOL);\n}\n","import { randomUUID } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport type { AgentBridge, BridgeMessage } from '../types/agent-bridge.js';\nimport type {\n CoordinatorStatus,\n MultiAgentConfig,\n MultiAgentCoordinator,\n SpawnResult,\n SubagentConfig,\n SubagentContext,\n SubagentRunContext,\n SubagentRunner,\n TaskResult,\n TaskSpec,\n} from '../types/multi-agent.js';\nimport {\n type BudgetSessionIdSource,\n BudgetExceededError,\n DECISION_TIMEOUT_MS,\n SubagentBudget,\n TIMEOUT_PREEMPT_FRACTION as _preemptFraction,\n} from './subagent-budget.js';\nimport { classifySubagentError } from './coordinator/error-classifier.js';\nimport { applyRosterBudget } from './fleet.js';\nimport { assignNickname } from './subagent-nicknames.js';\n\ntype SubagentStatus = 'running' | 'idle' | 'stopped' | 'error';\n\ninterface SubagentEntry {\n config: SubagentConfig;\n context: SubagentContext;\n status: SubagentStatus;\n currentTask?: string | undefined;\n abortController: AbortController;\n /** Lazily created on first dispatch — budget is per-task, not per-subagent. */\n activeBudget?: SubagentBudget | undefined;\n}\n\nexport interface MultiAgentCoordinatorOptions {\n /**\n * Callback that executes a task on behalf of a subagent. Required for\n * `assign()` to actually run anything — without it, tasks queue forever.\n * The coordinator provides per-subagent isolation (own budget, own signal,\n * own bridge) and enforces timeout + concurrency.\n */\n runner?: SubagentRunner | undefined;\n /**\n * Session id for EventBus/FleetBus emissions produced by this coordinator.\n * Accepts a getter so a long-lived coordinator follows session resume/new.\n */\n sessionId?: BudgetSessionIdSource | undefined;\n}\n\nexport class DefaultMultiAgentCoordinator extends EventEmitter implements MultiAgentCoordinator {\n readonly coordinatorId: string;\n readonly config: MultiAgentConfig;\n private runner?: SubagentRunner | undefined;\n private readonly sessionId: BudgetSessionIdSource | undefined;\n private fleetBus?: import('./fleet-bus.js').FleetBus | undefined;\n\n private readonly subagents = new Map<string, SubagentEntry>();\n\n /**\n * Base nickname keys already handed out this run (e.g. `einstein`, `tesla`).\n * Prevents two workers sharing a name. Direct `coordinator.spawn()` callers\n * (parallel/eternal engine, SDD parallel run) don't go through\n * `Director.spawn()` where nicknames are normally assigned, so the\n * coordinator upgrades placeholder names (\"Executor\", \"slot-ab12cd\", role\n * names) to memorable ones here — that's what surfaces in the fleet monitor.\n */\n private readonly usedNicknames = new Set<string>();\n /** Maps subagentId → nickname key (e.g. 'einstein'). Used to free the slot on remove(). */\n private readonly subagentNicknames = new Map<string, string>();\n\n private pendingTasks: TaskSpec[] = [];\n private completedResults: TaskResult[] = [];\n /** Prevents completedResults from growing unbounded in long-running coordinators. */\n private static readonly MAX_COMPLETED_RESULTS = 10_000;\n private totalIterations = 0;\n private inFlight = 0;\n /**\n * Subagents currently being stopped. Set on entry to `stop()`, cleared\n * once `recordCompletion` lands the terminal TaskResult. Used by\n * `runDispatched` and `findIdleSubagent` to refuse mid-flight dispatch\n * to a subagent the caller has already asked to terminate — closes the\n * assign+terminate race where a fresh task could land on a worker that\n * was about to be killed.\n */\n private readonly terminating = new Set<string>();\n\n constructor(config: MultiAgentConfig, options: MultiAgentCoordinatorOptions = {}) {\n super();\n // awaitTasks() registers one short-lived 'task.completed' listener per\n // awaited id; a single call awaiting >10 ids (or several concurrent\n // callers) crosses Node's default 10-listener cap and prints a spurious\n // MaxListenersExceededWarning that also masks genuine leaks. These waiters\n // are bounded and self-removing, so lift the cap.\n this.setMaxListeners(0);\n this.coordinatorId = config.coordinatorId;\n this.config = config;\n this.runner = options.runner;\n this.sessionId = options.sessionId;\n }\n\n private currentSessionId(): string | undefined {\n const value = typeof this.sessionId === 'function' ? this.sessionId() : this.sessionId;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\n\n /**\n * Replace the runner after construction. Used when the runner depends\n * on infrastructure (e.g. FleetBus) that isn't available until after\n * the coordinator's owning Director is built.\n */\n setRunner(runner: SubagentRunner): void {\n this.runner = runner;\n }\n\n /**\n * Wire a FleetBus for director-mode event emission. Call after the\n * FleetManager is constructed so the coordinator can emit lifecycle\n * events the TUI and monitoring tools subscribe to.\n */\n setFleetBus(fleet: import('./fleet-bus.js').FleetBus): void {\n this.fleetBus = fleet;\n }\n\n /**\n * Change the in-flight dispatch ceiling at runtime. Lowering does NOT\n * preempt running tasks — already-dispatched subagents finish their\n * current task; only future dispatches respect the new cap. Raising\n * immediately tries to fill the freed slots from the pending queue.\n */\n setMaxConcurrent(n: number): void {\n if (!Number.isFinite(n) || n < 1) {\n throw new Error(`maxConcurrent must be a finite integer >= 1, got ${n}`);\n }\n this.config.maxConcurrent = Math.floor(n);\n this.tryDispatchNext();\n }\n\n /**\n * Upgrade a placeholder/role-derived name to a memorable scientist nickname\n * (e.g. \"Einstein (Executor)\"). A name is treated as a placeholder when it is\n * empty, equals the role (case-insensitive), is a generic default\n * (\"subagent\"/\"adhoc\"/\"generic\"), or is an auto-generated `slot-…` id.\n * Explicit, human-chosen names — including nicknames already assigned by\n * `Director.spawn()` — are left untouched, so this never double-assigns.\n */\n private withNickname(subagent: SubagentConfig, subagentId: string): SubagentConfig {\n const role = subagent.role ?? 'subagent';\n const name = subagent.name?.trim() ?? '';\n const isPlaceholder =\n name === '' ||\n name.toLowerCase() === role.toLowerCase() ||\n name === 'subagent' ||\n name === 'adhoc' ||\n name === 'generic' ||\n /^slot-/.test(name);\n if (!isPlaceholder) return subagent;\n const { key, display } = assignNickname(role, this.usedNicknames);\n this.usedNicknames.add(key);\n this.subagentNicknames.set(subagentId, key);\n return { ...subagent, name: display };\n }\n\n async spawn(subagent: SubagentConfig): Promise<SpawnResult> {\n const id = subagent.id || randomUUID();\n const cfg = this.withNickname(subagent, id);\n // Duplicate-id guard. Previously a second spawn({id}) with the\n // same id silently overwrote the existing entry — orphaning the\n // first subagent's AbortController, Context, and any in-flight\n // task referencing it. Two spawns with the same id are almost\n // always a bug at the caller; refuse and let them surface it.\n if (this.subagents.has(id)) {\n throw new Error(`Subagent id \"${id}\" already exists — refusing to overwrite`);\n }\n const context: SubagentContext = {\n subagentId: id,\n tasks: [],\n // Wired later by the caller via setSubagentBridge() once the\n // bidirectional bridge is created. Readers must null-check / use\n // hasParentBridge() — the type now reflects this.\n parentBridge: null,\n doneCondition: this.config.doneCondition,\n maxConcurrent: this.config.maxConcurrent ?? 16,\n };\n\n this.subagents.set(id, {\n config: { ...cfg, id },\n context,\n status: 'idle',\n abortController: new AbortController(),\n });\n\n this.emit('subagent.started', { subagent: { ...cfg, id } });\n\n this.fleetBus?.emit({\n subagentId: id,\n ts: Date.now(),\n type: 'subagent.assigned',\n payload: {\n subagentId: id,\n name: subagent.name,\n provider: subagent.provider,\n model: subagent.model,\n },\n });\n\n this.emitCoordinatorStats();\n\n return { subagentId: id, agentId: id };\n }\n\n async assign(task: TaskSpec): Promise<void> {\n this.pendingTasks.push(task);\n this.tryDispatchNext();\n }\n\n async delegate(to: string, msg: BridgeMessage): Promise<void> {\n const subagent = this.subagents.get(to);\n if (!subagent) throw new Error(`Subagent \"${to}\" not found`);\n if (!subagent.context.parentBridge) {\n throw new Error(`Subagent \"${to}\" has no parentBridge — call setSubagentBridge() first`);\n }\n await subagent.context.parentBridge.send(msg);\n }\n\n /**\n * Wire up the communication bridge for a subagent. Call after spawn() once\n * the caller has created the bidirectional connection.\n */\n setSubagentBridge(subagentId: string, bridge: AgentBridge): void {\n const subagent = this.subagents.get(subagentId);\n if (!subagent) throw new Error(`Subagent \"${subagentId}\" not found`);\n subagent.context.parentBridge = bridge;\n }\n\n async stop(subagentId: string): Promise<void> {\n const subagent = this.subagents.get(subagentId);\n if (!subagent) return;\n\n // Mark terminating BEFORE the abort so a synchronous tryDispatchNext\n // observation in another callback path sees the intent and skips\n // this subagent. Cleared by recordCompletion once the runner's\n // catch block lands the terminal TaskResult.\n this.terminating.add(subagentId);\n\n // Abort any in-flight run, then sever the bridge so further messages fail\n // fast instead of silently queueing on a dead subagent.\n subagent.abortController.abort();\n subagent.status = 'stopped';\n subagent.currentTask = undefined;\n subagent.context.parentBridge = null;\n\n this.emit('subagent.stopped', { subagentId, reason: 'stopped by coordinator' });\n\n this.fleetBus?.emit({\n subagentId,\n ts: Date.now(),\n type: 'subagent.stopped',\n payload: { subagentId, reason: 'stopped by coordinator' },\n });\n\n this.emitCoordinatorStats();\n }\n\n async stopAll(): Promise<void> {\n // Clear the queue FIRST so no new tasks land on subagents while\n // we're tearing them down. Each dropped task gets a synthetic\n // `aborted_by_parent` completion so any caller awaiting it (e.g.\n // delegate tool's awaitTasks) resolves instead of hanging.\n //\n // Pending tasks never reached `inFlight`, so we cannot route them\n // through `recordCompletion` — its underflow guard would short-\n // circuit on the second pending task and emit a warning instead\n // of the completion event. The shared helper inline-emits.\n this.drainPendingAsAborted('Coordinator stopAll() drained the pending queue');\n // allSettled so one failure doesn't leave other subagents un-stopped.\n await Promise.allSettled([...this.subagents.keys()].map((id) => this.stop(id)));\n }\n\n /**\n * Get current coordinator stats for monitoring/debugging.\n */\n getStats(): {\n total: number;\n running: number;\n idle: number;\n stopped: number;\n inFlight: number;\n pending: number;\n completed: number;\n } {\n let running = 0;\n let idle = 0;\n let stopped = 0;\n for (const [, entry] of this.subagents) {\n if (entry.status === 'running') running++;\n else if (entry.status === 'idle') idle++;\n else stopped++;\n }\n return {\n total: this.subagents.size,\n running,\n idle,\n stopped,\n inFlight: this.inFlight,\n pending: this.pendingTasks.length,\n completed: this.completedResults.length,\n };\n }\n\n /** Emit a reactive coordinator.stats event on FleetBus so the TUI can subscribe. */\n private emitCoordinatorStats(): void {\n const stats = this.getStats();\n const subagentStatuses = Array.from(this.subagents.entries()).map(([id, s]) => ({\n subagentId: id,\n taskId: s.currentTask ?? '',\n status: s.status,\n assigned: s.context.parentBridge !== null,\n }));\n const sessionId = this.currentSessionId();\n this.fleetBus?.emit({\n subagentId: this.coordinatorId,\n ts: Date.now(),\n type: 'coordinator.stats',\n payload: {\n ...(sessionId ? { sessionId } : {}),\n ...stats,\n subagentStatuses,\n },\n });\n }\n\n getStatus(): CoordinatorStatus {\n return {\n coordinatorId: this.coordinatorId,\n subagents: Array.from(this.subagents.entries()).map(([id, s]) => ({\n id,\n name: s.config.name,\n status: s.status,\n currentTask: s.currentTask,\n })),\n pendingTasks: this.pendingTasks.length,\n completedTasks: this.completedResults.length,\n totalIterations: this.totalIterations,\n done: this.isDone(),\n };\n }\n\n /** Expose snapshot of completed results — useful for callers awaiting all done. */\n results(): readonly TaskResult[] {\n return this.completedResults;\n }\n\n /**\n * Wait for one or more tasks to complete and return their results.\n * If a task is already done when called, returns immediately.\n * Resolves to an array in the same order as `taskIds`.\n */\n async awaitTasks(taskIds: string[]): Promise<TaskResult[]> {\n return Promise.all(\n taskIds.map((id) => {\n const cached = this.completedResults.find((r) => r.taskId === id);\n if (cached) return cached;\n // Fallback: poll until the task completes (up to timeoutMs).\n // The coordinator fires 'task.completed' on every result, so\n // we use a promise-based waiter tied to that event.\n return new Promise<TaskResult>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.off('task.completed', handler);\n reject(new Error(`awaitTasks timed out waiting for task \"${id}\"`));\n }, this.config.timeoutMs ?? 300_000);\n const handler = ({ result }: { task: TaskSpec; result: TaskResult }) => {\n if (result.taskId === id) {\n clearTimeout(timeout);\n this.off('task.completed', handler);\n resolve(result);\n }\n };\n this.on('task.completed', handler);\n });\n }),\n );\n }\n\n /**\n * Manual completion — for callers that drive subagents without a runner\n * (e.g. external orchestrators). When a runner is configured the coordinator\n * calls this itself.\n */\n completeTask(result: TaskResult): void {\n this.recordCompletion(result);\n }\n\n // --- internal dispatching ---------------------------------------------\n\n private tryDispatchNext(): void {\n while (this.canDispatch()) {\n const dispatchable = this.takeNextDispatchableTask();\n if (!dispatchable) {\n // No idle worker right now. If every spawned subagent is\n // stopped or mid-termination, the pending queue is dead —\n // a pending task can never start, so synthetic-complete it\n // as `aborted_by_parent`. Without this, an `assign()` after\n // `stop()` would hang forever waiting for `task.completed`.\n // We DO NOT drain when subagents are busy (status='running'):\n // those will free up and accept the work normally.\n if (this.pendingTasks.length > 0 && !this.hasLiveSubagent()) {\n this.drainPendingAsAborted(\n 'No live subagent available — all stopped or mid-termination',\n );\n }\n return;\n }\n const { subagentId, task } = dispatchable;\n // Attach a catch so a synchronous throw inside runDispatched (rare —\n // e.g. provider misconfiguration before the first await) becomes a\n // visible failed task instead of an unhandled rejection that leaves\n // `inFlight` permanently elevated.\n this.runDispatched(subagentId, task).catch((err) => {\n this.recordCompletion({\n subagentId,\n taskId: task.id,\n status: 'failed',\n error: classifySubagentError(err),\n iterations: 0,\n toolCalls: 0,\n durationMs: 0,\n });\n });\n }\n }\n\n private canDispatch(): boolean {\n const max = this.config.maxConcurrent ?? 16;\n return this.inFlight < max && this.pendingTasks.length > 0;\n }\n\n private takeNextDispatchableTask(): { subagentId: string; task: TaskSpec } | null {\n for (let i = 0; i < this.pendingTasks.length; i++) {\n const task = this.pendingTasks[i];\n if (!task) continue;\n const subagentId = task.subagentId\n ? this.isIdleSubagent(task.subagentId)\n ? task.subagentId\n : null\n : this.findIdleSubagent();\n if (!subagentId) continue;\n this.pendingTasks.splice(i, 1);\n return { subagentId, task };\n }\n return null;\n }\n\n private findIdleSubagent(): string | null {\n for (const [id, s] of this.subagents) {\n // Skip subagents that are mid-termination — `stop()` set the\n // `terminating` flag and aborted the controller, but the\n // status mutation happens synchronously after; checking both\n // is belt-and-suspenders against any race where status is\n // transiently still 'idle' while termination is in flight.\n if (s.status === 'idle' && !this.terminating.has(id)) return id;\n }\n return null;\n }\n\n private isIdleSubagent(id: string): boolean {\n const subagent = this.subagents.get(id);\n return !!subagent && subagent.status === 'idle' && !this.terminating.has(id);\n }\n\n /**\n * Returns true iff at least one spawned subagent could still\n * process a task. A \"live\" subagent is one that is not stopped\n * AND not mid-termination — `running` workers count because they\n * will eventually finish and become idle.\n *\n * When no subagent has ever been spawned, returns `true` so a\n * pre-spawn `assign()` simply queues (legacy behaviour). The\n * dead-end detection only fires after `stop()` has retired every\n * spawned worker.\n *\n * Used by `tryDispatchNext` to detect a dead-end pending queue.\n */\n private hasLiveSubagent(): boolean {\n if (this.subagents.size === 0) return true;\n for (const [id, s] of this.subagents) {\n if (s.status !== 'stopped' && !this.terminating.has(id)) return true;\n }\n return false;\n }\n\n /**\n * Drain every pending task with a synthetic `aborted_by_parent`\n * completion event. Same shape as the `stopAll()` drain — we go\n * around `recordCompletion` because pending tasks were never\n * counted in `inFlight` and routing them through would trip the\n * underflow guard on every task after the first.\n */\n private drainPendingAsAborted(message: string): void {\n const dropped = this.pendingTasks.splice(0, this.pendingTasks.length);\n for (const t of dropped) this.emitPendingAborted(t, message);\n }\n\n /**\n * Emit a synthetic `stopped`/`aborted_by_parent` completion for a single\n * PENDING task — one that was never counted in `inFlight`. This MUST bypass\n * `recordCompletion`: that path does `inFlight--`, which for a pending task\n * steals a decrement from a genuinely in-flight task and trips the underflow\n * guard — suppressing that real task's `task.completed` and hanging its\n * `awaitTasks()` caller. Pushes the result and fires the event directly.\n */\n private emitPendingAborted(task: TaskSpec, message: string): void {\n const synthetic: TaskResult = {\n subagentId: task.subagentId ?? 'unassigned',\n taskId: task.id,\n status: 'stopped',\n error: {\n kind: 'aborted_by_parent',\n message,\n retryable: false,\n },\n iterations: 0,\n toolCalls: 0,\n durationMs: 0,\n };\n this.completedResults.push(synthetic);\n this.emit('task.completed', { task, result: synthetic });\n }\n\n private async runDispatched(subagentId: string, task: TaskSpec): Promise<void> {\n const subagent = this.subagents.get(subagentId);\n if (!subagent) return;\n // Final race guard: if `stop(subagentId)` ran between dispatch\n // and us arriving here, refuse to start the task and surface it\n // as `aborted_by_parent` so any caller awaiting the task id\n // unblocks. Without this, the task would be marked 'running',\n // collide with the just-completed 'stopped' state, and leak\n // inFlight by 1 because no recordCompletion path covers it.\n if (this.terminating.has(subagentId) || subagent.status === 'stopped') {\n this.recordCompletion({\n subagentId,\n taskId: task.id,\n status: 'stopped',\n error: {\n kind: 'aborted_by_parent',\n message: 'Subagent was terminated before task could start',\n retryable: false,\n },\n iterations: 0,\n toolCalls: 0,\n durationMs: 0,\n });\n return;\n }\n\n subagent.status = 'running';\n subagent.currentTask = task.id;\n task.subagentId = subagentId;\n subagent.context.tasks.push(task);\n\n this.fleetBus?.emit({\n subagentId,\n taskId: task.id,\n ts: Date.now(),\n type: 'subagent.running',\n payload: { subagentId, taskId: task.id },\n });\n\n this.emit('task.assigned', { task, subagentId });\n this.emitCoordinatorStats();\n\n // Budget combines coordinator defaults with per-subagent and per-task overrides.\n // Precedence: task > subagent (raw, no roster fills) > coordinator default > roster default.\n // We intentionally call applyRosterBudget LATE — only as a final fallback after\n // the coordinator's defaultBudget has had a chance to apply. This prevents\n // GENERIC_SUBAGENT_BUDGET (5000 iter) from shadowing the coordinator's explicit default.\n const rawMaxIterations = subagent.config.maxIterations;\n const rawMaxToolCalls = subagent.config.maxToolCalls;\n const rawMaxTokens = subagent.config.maxTokens;\n const rawMaxCostUsd = subagent.config.maxCostUsd;\n const rawTimeoutMs = subagent.config.timeoutMs;\n const rawIdleTimeoutMs = subagent.config.idleTimeoutMs;\n const configWithRosterDefaults = applyRosterBudget(subagent.config);\n const budget = new SubagentBudget(\n {\n maxIterations:\n rawMaxIterations ?? this.config.defaultBudget?.maxIterations ?? configWithRosterDefaults.maxIterations,\n maxToolCalls:\n rawMaxToolCalls ??\n this.config.defaultBudget?.maxToolCalls ??\n configWithRosterDefaults.maxToolCalls,\n maxTokens:\n rawMaxTokens ?? this.config.defaultBudget?.maxTokens ?? configWithRosterDefaults.maxTokens,\n maxCostUsd:\n rawMaxCostUsd ?? this.config.defaultBudget?.maxCostUsd ?? configWithRosterDefaults.maxCostUsd,\n // Wall-clock cap is opt-in (explicit config / defaultBudget only); the\n // roster no longer supplies one. Idle is the default reaper.\n timeoutMs:\n rawTimeoutMs ?? this.config.defaultBudget?.timeoutMs ?? configWithRosterDefaults.timeoutMs,\n idleTimeoutMs:\n rawIdleTimeoutMs ??\n this.config.defaultBudget?.idleTimeoutMs ??\n configWithRosterDefaults.idleTimeoutMs,\n },\n 'auto',\n { sessionId: () => this.currentSessionId() },\n );\n subagent.activeBudget = budget;\n\n if (!this.runner) {\n // No runner wired — caller drives execution via completeTask(). Status\n // reverts when the caller reports. We intentionally don't bump\n // `inFlight` here: `completeTask` → `recordCompletion` would then\n // decrement an inFlight that runDispatched never incremented, masking\n // the \"no runner\" state. With this guard, `isDone()`'s all_tasks_done\n // check still settles correctly once the caller reports.\n return;\n }\n\n // Only count inFlight when we actually own the execution lifecycle.\n this.inFlight++;\n\n const startTime = Date.now();\n const runCtx: SubagentRunContext = {\n subagentId,\n config: subagent.config,\n budget,\n signal: subagent.abortController.signal,\n bridge: subagent.context.parentBridge || null,\n };\n\n let result: TaskResult;\n\n budget.start();\n try {\n const outcome = await this.executeWithTimeout(\n this.runner,\n task,\n runCtx,\n budget,\n subagent.config.preemptFraction,\n );\n result = {\n subagentId,\n taskId: task.id,\n status: 'success',\n result: outcome.result,\n iterations: outcome.iterations,\n toolCalls: outcome.toolCalls,\n durationMs: Date.now() - startTime,\n };\n } catch (err) {\n // Order matters: a timeout calls abort() to signal cooperative runners,\n // which also flips `signal.aborted=true`. Inspect the error first so we\n // surface 'timeout' rather than masking it as 'stopped'.\n const status: TaskResult['status'] =\n err instanceof BudgetExceededError && (err.kind === 'timeout' || err.kind === 'idle_timeout')\n ? 'timeout'\n : subagent.abortController.signal.aborted\n ? 'stopped'\n : 'failed';\n const usage = budget.usage();\n result = {\n subagentId,\n taskId: task.id,\n status,\n error: classifySubagentError(err, {\n parentAborted: subagent.abortController.signal.aborted,\n }),\n iterations: usage.iterations,\n toolCalls: usage.toolCalls,\n durationMs: Date.now() - startTime,\n };\n }\n\n this.recordCompletion(result);\n }\n\n private async executeWithTimeout(\n runner: SubagentRunner,\n task: TaskSpec,\n ctx: SubagentRunContext,\n budget: SubagentBudget,\n preemptFraction: number = _preemptFraction,\n ) {\n const initialTimeoutMs = budget.limits.timeoutMs;\n const idleLimitMs = budget.limits.idleTimeoutMs;\n if (initialTimeoutMs === undefined && idleLimitMs === undefined) {\n return runner(task, ctx);\n }\n\n // Re-armable watchdog. The default guard is IDLE-based: while the agent\n // keeps producing activity (iterations / tool calls / streamed progress),\n // `budget.idleMs()` stays below the window and we simply re-arm — an\n // actively-working subagent is never killed by the clock. Only a genuine\n // stall (no activity for `idleTimeoutMs`) reaps it. An explicit wall-clock\n // `timeoutMs` (rare, opt-in) keeps the original soft-warning behaviour: it\n // negotiates an extension via the Director's auto-extend listener and\n // re-arms rather than hard-killing a task solely for running long.\n const start = Date.now();\n let timer: ReturnType<typeof setTimeout> | null = null;\n // Pre-empt arm state machine:\n // ACTIVE — pre-empt can fire for the current ceiling window\n // LOCKED — pre-empt is locked; cannot fire until ceiling changes\n enum PreemptState {\n ACTIVE = 'active',\n LOCKED = 'locked',\n }\n // The wall-clock ceiling value at the moment the state was locked.\n // Compared against the current wallLimit to detect stale locks caused by\n // external calls to budget.patchLimits().\n let preemptedCeiling: number | null = null;\n let preemptState: PreemptState = PreemptState.ACTIVE;\n // Heartbeat gate for the proactive pre-empt: the timestamp of the subagent's\n // last activity at the moment of the most recent grant. A later pre-empt is\n // only negotiated if there has been NEW activity since then — a stalled\n // agent (no progress since its last grant) gets no further extension and is\n // left to the real deadline. `-1` until the first grant so the first\n // pre-empt always fires. Activity time is derived from `budget.idleMs()`\n // (reset by tool calls / iterations / streamed progress), so it works even\n // for runners that don't increment the budget's usage counters directly.\n let lastGrantActivityTs = -1;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n // Terminate the subagent, classifying by whether a negotiation listener\n // is wired. A listener-observed stop (explicit deny at the deadline, or an\n // idle reap while observed) surfaces as 'stopped' — reject with a\n // non-budget error so the coordinator's catch falls to `signal.aborted →\n // 'stopped'`. With no listener it is an unattended budget breach →\n // BudgetExceededError → 'timeout'. This keeps a bare /spawn reporting\n // 'timeout' while a director/observer-driven stop reads as 'stopped'.\n const terminate = (kind: 'timeout' | 'idle_timeout', limit: number, used: number) => {\n this.subagents.get(ctx.subagentId)?.abortController.abort();\n reject(\n budget._events?.hasListenerFor('budget.threshold_reached')\n ? new Error(`subagent stopped: budget ${kind} (limit=${limit}, used=${used})`)\n : new BudgetExceededError(kind, limit, used),\n );\n };\n const armFor = (ms: number) => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(onTick, Math.max(0, ms));\n };\n // Re-arm for whichever deadline is sooner — the idle window (counted\n // from last activity), the explicit wall-clock cap, or the PROACTIVE\n // pre-empt point (a fraction of the wall cap, see TIMEOUT_PREEMPT_FRACTION)\n // at which we negotiate an extension BEFORE the deadline is crossed. Any\n // being unset/already-asked drops out of the min, so single-limit configs\n // behave exactly as that limit alone.\n const scheduleNext = () => {\n const wallLimit = budget.limits.timeoutMs ?? initialTimeoutMs;\n const wallRemaining =\n initialTimeoutMs === undefined\n ? Number.POSITIVE_INFINITY\n : (wallLimit as number) - (Date.now() - start);\n const idleRemaining =\n idleLimitMs === undefined\n ? Number.POSITIVE_INFINITY\n : (budget.limits.idleTimeoutMs ?? idleLimitMs) - budget.idleMs();\n const preemptRemaining =\n initialTimeoutMs === undefined || preemptedCeiling === wallLimit\n ? Number.POSITIVE_INFINITY\n : (wallLimit as number) * preemptFraction - (Date.now() - start);\n // Floor at a small positive so a near-zero remainder can't busy-loop.\n armFor(Math.max(25, Math.min(wallRemaining, idleRemaining, preemptRemaining)));\n };\n\n // Drive a timeout extension negotiation (used by BOTH the proactive\n // pre-empt and the at-deadline path). Resolves to the coordinator's\n // verdict: `{ extend: { timeoutMs } }` to grant, or a string to decline.\n // The budget's requestDecision falls back to 'stop' on no response, so\n // this never hangs.\n // Safety net: if no listener responds to the budget.threshold_reached event\n // within DECISION_TIMEOUT_MS (60 s), default to 'stop' so the watchdog\n // never hangs. Uses the exported DECISION_TIMEOUT_MS so both paths share\n // the same value — coordinator and budget agree on the ceiling.\n const negotiateTimeout = async (\n used: number,\n limit: number,\n ): Promise<'stop' | 'continue' | 'throw' | { extend: { timeoutMs?: number | undefined } }> => {\n const handler = budget.onThreshold;\n if (!handler) return 'stop';\n const result = handler({\n kind: 'timeout',\n used,\n limit,\n requestDecision: () => {\n // No listener wired (bare /spawn, no director) → nobody can grant an\n // extension, so resolve to 'stop' immediately. Without this the emit\n // below goes unanswered and the run parks on the 60 s fallback timer\n // before stopping — the deadline must reap promptly instead. Mirrors\n // SubagentBudget._busRequestDecision so both agree on the default.\n if (!budget._events?.hasListenerFor('budget.threshold_reached')) {\n return Promise.resolve<'stop' | { extend: { timeoutMs?: number | undefined } }>('stop');\n }\n return new Promise<'stop' | { extend: { timeoutMs?: number | undefined } }>((resolveDecision) => {\n let settled = false;\n const resolve = (d: 'stop' | { extend: { timeoutMs?: number | undefined } }) => {\n if (settled) return;\n settled = true;\n resolveDecision(d);\n };\n const fallback = setTimeout(() => resolve('stop'), DECISION_TIMEOUT_MS);\n const sessionId = this.currentSessionId();\n budget._events?.emit('budget.threshold_reached', {\n ...(sessionId ? { sessionId } : {}),\n kind: 'timeout',\n used,\n limit,\n // Informational: the budget's own decision deadline. Listeners may use\n // this to display a countdown. The coordinator does NOT enforce it —\n // it is the budget's own `setTimeout(fallback)` that races against\n // the listener's `extend()`/`deny()` call to guarantee progress.\n timeoutMs: DECISION_TIMEOUT_MS,\n // deny() wins over a same-dispatch extend(): defer the grant a\n // microtask so a synchronous deny in the same emit pre-empts it\n // (a listener that both grants and denies, or two listeners\n // disagreeing, resolves as a stop). Async grants still resolve.\n extend: (extra) => {\n clearTimeout(fallback);\n queueMicrotask(() => resolve({ extend: extra }));\n },\n deny: () => {\n clearTimeout(fallback);\n resolve('stop');\n },\n });\n });\n },\n });\n return typeof result === 'string' ? result : await result;\n };\n\n const onTick = async () => {\n const elapsed = Date.now() - start;\n const wallLimit =\n initialTimeoutMs === undefined ? undefined : budget.limits.timeoutMs ?? initialTimeoutMs;\n const idleLimit =\n idleLimitMs === undefined ? undefined : budget.limits.idleTimeoutMs ?? idleLimitMs;\n const wallExceeded = wallLimit !== undefined && elapsed >= wallLimit;\n const idleExceeded = idleLimit !== undefined && budget.idleMs() >= idleLimit;\n\n // Idle stall with no wall-clock cap also due: a genuinely hung agent\n // (no activity for the whole window). Reap it directly — idle is NOT\n // negotiable; the point of the default is to free a stuck slot. We still\n // emit the threshold event first so observers (director / monitor) can\n // record the reap, but any extension a listener offers is ignored.\n if (idleExceeded && !wallExceeded) {\n const sessionId = this.currentSessionId();\n budget._events?.emit('budget.threshold_reached', {\n ...(sessionId ? { sessionId } : {}),\n kind: 'idle_timeout',\n used: budget.idleMs(),\n limit: idleLimit ?? 0,\n timeoutMs: DECISION_TIMEOUT_MS,\n extend: () => {},\n deny: () => {},\n });\n // An idle stall is a passive TIMEOUT (the agent hung), not an explicit\n // coordinator stop — surface it as 'timeout' regardless of any\n // listener. (Contrast the wall-clock deadline below, where an explicit\n // listener deny is a deliberate stop → 'stopped'.)\n this.subagents.get(ctx.subagentId)?.abortController.abort();\n reject(new BudgetExceededError('idle_timeout', idleLimit ?? 0, budget.idleMs()));\n return;\n }\n\n // PROACTIVE pre-empt: we've passed TIMEOUT_PREEMPT_FRACTION of the wall\n // window but NOT the deadline itself. Negotiate an extension now, while\n // the agent is still under its limit, so a progressing subagent gets its\n // ceiling raised and never enters a timed-out state. Heartbeat-gated on\n // the granting side (director / attachAutoExtend): no progress ⇒ decline,\n // and we fall through to the real-deadline behaviour below at the cap.\n // Asked at most once per window (preemptState === ACTIVE).\n if (\n wallLimit !== undefined &&\n !wallExceeded &&\n budget.onThreshold &&\n preemptState === PreemptState.ACTIVE &&\n elapsed >= wallLimit * preemptFraction\n ) {\n // Heartbeat gate: only negotiate a pre-empt extension if the agent has\n // made progress (a tool call / iteration / streamed output) SINCE the\n // last grant. A stalled agent — no new activity since its last\n // extension — gets no further pre-empt; we lock and let the real\n // deadline reap it. `activityTs` is the wall-clock time of the last\n // activity (now − idleMs). Without this gate an always-granting\n // listener would extend a wedged agent forever and the deadline would\n // never fire (T1).\n const activityTs = Date.now() - budget.idleMs();\n if (activityTs <= lastGrantActivityTs) {\n preemptState = PreemptState.LOCKED;\n preemptedCeiling = wallLimit;\n scheduleNext();\n return;\n }\n // C1 fix: register the watchdog as active BEFORE calling onThreshold so\n // that any concurrent tool.progress → checkTimeout() path sees the flag\n // and skips its own wall-clock emission. Cleared on every exit path so\n // checkTimeout() resumes normal operation after negotiation completes.\n budget.setWatchdogNegotiation(wallLimit);\n try {\n const decision = await negotiateTimeout(elapsed, wallLimit);\n if (typeof decision !== 'string' && decision.extend.timeoutMs !== undefined) {\n // Granted ahead of the deadline — raise the ceiling and open a\n // fresh window (a later pre-empt becomes eligible again, but only\n // if there is fresh activity by then — see the heartbeat gate).\n budget.patchLimits({ timeoutMs: decision.extend.timeoutMs });\n lastGrantActivityTs = Date.now() - budget.idleMs();\n preemptState = PreemptState.ACTIVE;\n preemptedCeiling = null;\n } else {\n // Declined proactively (no progress / no listener). Don't re-ask\n // until the real deadline — the wallExceeded path below handles the\n // at-cap behaviour (warn+continue or hard stop).\n preemptState = PreemptState.LOCKED;\n preemptedCeiling = wallLimit;\n }\n } catch {\n preemptState = PreemptState.LOCKED;\n preemptedCeiling = wallLimit;\n } finally {\n budget.clearWatchdogNegotiation();\n }\n scheduleNext();\n return;\n }\n\n // Neither deadline actually tripped — we woke early because activity\n // pushed the idle deadline out (or a pre-empt was just resolved).\n // Re-arm for the new soonest deadline.\n if (!wallExceeded) {\n scheduleNext();\n return;\n }\n\n // Wall-clock cap hit. This is opt-in and keeps the original\n // soft-warning behaviour: negotiate an extension rather than\n // hard-killing a task solely for running long.\n const limit = wallLimit ?? 0;\n // Without an onThreshold handler the original behaviour stands:\n // abort the signal and hard-reject. This preserves the contract\n // for direct SubagentBudget consumers that don't wire negotiation.\n if (!budget.onThreshold) {\n this.subagents.get(ctx.subagentId)?.abortController.abort();\n reject(new BudgetExceededError('timeout', limit, elapsed));\n return;\n }\n // C1 fix: same guard as the pre-empt branch — register before onThreshold\n // so concurrent tool.progress → checkTimeout() skips its wall-clock emission.\n budget.setWatchdogNegotiation(limit);\n try {\n const decision = await negotiateTimeout(elapsed, limit);\n if (decision === 'throw') {\n // 'throw' is an explicit signal from the handler: end now rather\n // than silently keeping the subagent alive past its deadline.\n terminate('timeout', limit, elapsed);\n return;\n }\n if (decision === 'continue') {\n // 'continue' — timeout denied but coordinator wants the agent to keep\n // running. Re-arm for a full wall window so we ask again later.\n // This makes wall-clock timeout a pure warning event: the subagent\n // keeps running until it naturally finishes, the next deadline fires,\n // or the user stops it.\n //\n // IMPORTANT: we must lock the pre-empt arm (set preemptState =\n // LOCKED) so it does NOT fire again until the ceiling changes.\n // The ceiling only changes if a future negotiation returns 'extend'\n // and patches budget.limits.timeoutMs. Without the lock, the\n // pre-empt would re-arm for ~1 s (Math.max(1_000, limit)) and\n // immediately fire again at elapsed > wallLimit × 0.85, creating\n // a ping-pong loop of spurious budget.threshold_reached events.\n preemptState = PreemptState.LOCKED;\n preemptedCeiling = wallLimit;\n armFor(Math.max(1_000, limit));\n return;\n }\n if (decision === 'stop') {\n // 'stop' — coordinator explicitly denied the extension and wants\n // the agent to end. This is a terminal decision: end now.\n terminate('timeout', limit, elapsed);\n return;\n }\n // 'extend' — patch budget and re-arm for the new remainder.\n if (decision.extend.timeoutMs !== undefined) {\n budget.patchLimits({ timeoutMs: decision.extend.timeoutMs });\n lastGrantActivityTs = Date.now() - budget.idleMs();\n preemptState = PreemptState.ACTIVE;\n preemptedCeiling = null;\n scheduleNext();\n return;\n }\n // No timeoutMs in extend — nothing to grant → end.\n terminate('timeout', limit, elapsed);\n return;\n } catch (err) {\n this.subagents.get(ctx.subagentId)?.abortController.abort();\n reject(\n err instanceof BudgetExceededError\n ? err\n : new BudgetExceededError('timeout', limit, elapsed),\n );\n return;\n } finally {\n // Always clear the watchdog flag so checkTimeout() resumes wall-clock\n // checking on the next tool.progress event.\n budget.clearWatchdogNegotiation();\n }\n };\n // First arm: whichever of the idle window / pre-empt point / wall cap is sooner.\n scheduleNext();\n });\n\n try {\n return await Promise.race([runner(task, ctx), timeoutPromise]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private recordCompletion(result: TaskResult): void {\n this.completedResults.push(result);\n // Trim oldest entries when the cap is exceeded — keep the most recent\n // results so /fleet and roll_up still have data to work with.\n if (this.completedResults.length > DefaultMultiAgentCoordinator.MAX_COMPLETED_RESULTS) {\n this.completedResults.splice(\n 0,\n this.completedResults.length - DefaultMultiAgentCoordinator.MAX_COMPLETED_RESULTS,\n );\n }\n this.totalIterations += result.iterations;\n if (this.inFlight > 0) {\n this.inFlight--;\n } else if (this.runner) {\n // Runner-driven path completed without an outstanding inFlight slot —\n // shouldn't happen unless completeTask was called externally.\n this.emit('warning', {\n type: 'inFlight_underflow',\n taskId: result.taskId,\n subagentId: result.subagentId,\n });\n return;\n }\n\n const subagent = this.subagents.get(result.subagentId);\n if (subagent && subagent.status !== 'stopped') {\n const failed = result.status === 'failed' || result.status === 'timeout';\n // Synchronously reset the worker to idle after either a clean\n // finish or a transient failure. The previous code parked the\n // subagent in 'error' and used a `queueMicrotask` to flip it\n // back to 'idle' — that opened a window where `assign()` +\n // `tryDispatchNext` could race the microtask, leaving the\n // worker stuck in 'running' state while actually idle. By\n // resetting now, no async gap can leak the state machine.\n subagent.status = 'idle';\n void failed; // kept for future telemetry hooks\n subagent.currentTask = undefined;\n // If the run aborted (timeout or explicit stop), the subagent's\n // signal is now permanently aborted — recycling the controller lets\n // the next dispatched task start with a fresh cancellation scope.\n if (subagent.abortController.signal.aborted) {\n subagent.abortController = new AbortController();\n }\n\n this.fleetBus?.emit({\n subagentId: result.subagentId,\n ts: Date.now(),\n type: 'subagent.idle',\n payload: { subagentId: result.subagentId },\n });\n }\n // Clear the terminating flag now that the worker has a terminal\n // TaskResult on record. Subsequent stop() calls re-add it; new\n // assign() calls can flow normally.\n this.terminating.delete(result.subagentId);\n\n this.emit('task.completed', {\n task: subagent?.context.tasks.find((t) => t.id === result.taskId) ?? { id: result.taskId },\n result,\n });\n\n this.fleetBus?.emit({\n subagentId: result.subagentId,\n taskId: result.taskId,\n ts: Date.now(),\n type: 'subagent.completed',\n payload: {\n subagentId: result.subagentId,\n taskId: result.taskId,\n status: result.status,\n result: result.result,\n iterations: result.iterations,\n toolCalls: result.toolCalls,\n durationMs: result.durationMs,\n },\n });\n\n this.tryDispatchNext();\n\n // Emit after tryDispatchNext so the stats reflect the post-dispatch\n // state (either a new running subagent, or idle if the queue is drained).\n this.emitCoordinatorStats();\n\n if (this.isDone()) {\n this.emit('done', {\n results: this.completedResults,\n totalIterations: this.totalIterations,\n });\n }\n }\n\n /**\n * Stop a subagent and remove it from the coordinator. Releases all\n * associated resources (AbortController, context, budget state).\n * The subagent entry is deleted so the id can be reused in a future spawn.\n */\n async remove(subagentId: string): Promise<void> {\n const subagent = this.subagents.get(subagentId);\n if (!subagent) return;\n\n // Gracefully stop first — same logic as stop() but don't block on it.\n if (subagent.status === 'running' || subagent.status === 'idle') {\n this.terminating.add(subagentId);\n subagent.abortController.abort();\n subagent.status = 'stopped';\n }\n\n // Release all resources associated with this subagent.\n this.subagents.delete(subagentId);\n this.terminating.delete(subagentId);\n // Free the nickname slot so the same name can be reused by a future spawn.\n const nicknameKey = this.subagentNicknames.get(subagentId);\n if (nicknameKey) {\n this.usedNicknames.delete(nicknameKey);\n this.subagentNicknames.delete(subagentId);\n }\n\n // Clean up any pending tasks assigned to this subagent — emit synthetic\n // 'stopped' completions so callers awaiting them via awaitTasks() unblock\n // instead of hanging forever. Without this, a task queued for a removed\n // subagent would leave its waiter permanently unresolved.\n const orphaned = this.pendingTasks.filter((t) => t.subagentId === subagentId);\n this.pendingTasks = this.pendingTasks.filter((t) => t.subagentId !== subagentId);\n for (const t of orphaned) {\n // Inline-emit, NOT recordCompletion: these are PENDING tasks that were\n // never counted in inFlight. Routing them through recordCompletion would\n // decrement inFlight on behalf of a still-running task and suppress that\n // task's own completion via the underflow guard, hanging its awaiter.\n this.emitPendingAborted(\n t,\n `Subagent \"${subagentId}\" was removed while task \"${t.id}\" was pending`,\n );\n }\n\n this.fleetBus?.emit({\n subagentId,\n ts: Date.now(),\n type: 'subagent.removed',\n payload: { subagentId },\n });\n\n this.emitCoordinatorStats();\n }\n\n private isDone(): boolean {\n if (this.config.doneCondition.type === 'all_tasks_done') {\n return this.pendingTasks.length === 0 && this.inFlight === 0;\n }\n if (\n this.config.doneCondition.maxIterations !== undefined &&\n this.totalIterations >= this.config.doneCondition.maxIterations\n ) {\n return true;\n }\n return false;\n }\n}\n\n/**\n * Map any raw exception thrown out of a subagent's runner into a\n * structured `SubagentError`. Delegates to the shared classifier.\n * Re-exported for backward compatibility.\n */\nexport { classifySubagentError } from './coordinator/error-classifier.js';\n","/**\n * SddTaskDecomposer\n *\n * Converts a TaskGraph (from SDD's TaskGenerator) into a dependency-aware\n * sequence of batches for ParallelEternalEngine.\n *\n * Key behaviour:\n * - Each `nextBatch()` call returns up to `parallelSlots` ready tasks\n * (all blockers completed, sorted by priority).\n * - Tasks that are blocked by an in-progress task are NOT included\n * in the batch — they wait for the blocker to complete.\n * - When `isDone()` returns true the whole graph is either completed\n * or deadlocked (all remaining tasks are blocked by failed tasks).\n *\n * Usage:\n * ```\n * const decomposer = new SddTaskDecomposer(tracker, graph, { parallelSlots: 4 });\n * while (!decomposer.isDone()) {\n * const batch = decomposer.nextBatch();\n * if (batch.length === 0) break; // deadlock\n * await fanOut(batch);\n * decomposer.acknowledgeBatch(batch.map(t => t.id));\n * }\n * ```\n */\n\nimport type { TaskNode, TaskGraph } from '../types/task-graph.js';\nimport type { TaskTracker } from './task-tracker.js';\n\nexport interface SddTaskDecomposerOptions {\n /** Max tasks per batch. Default: 4. Range 1–16. */\n parallelSlots?: number | undefined;\n}\n\nexport interface TaskBatch {\n /** Tasks ready to execute in this wave. */\n tasks: TaskNode[];\n /** 0-based wave number since the decomposer was constructed. */\n wave: number;\n /** True when every node in the graph is either completed or failed. */\n allDone: boolean;\n /** True when no batch was produced because remaining tasks are all blocked by failed nodes. */\n deadlocked: boolean;\n}\n\nexport class SddTaskDecomposer {\n private readonly slots: number;\n private wave = 0;\n\n constructor(\n private readonly tracker: TaskTracker,\n _graph: TaskGraph,\n opts: SddTaskDecomposerOptions = {},\n ) {\n this.slots = Math.min(16, Math.max(1, opts.parallelSlots ?? 4));\n }\n\n // -------------------------------------------------------------------\n // Public API\n // -------------------------------------------------------------------\n\n /**\n * Return the next batch of runnable tasks.\n * Returns `allDone: true` when every node is completed.\n * Returns `deadlocked: true` when no batch can be produced because\n * all remaining tasks are blocked by failed nodes.\n */\n nextBatch(): TaskBatch {\n if (this.isDone()) {\n return { tasks: [], wave: this.wave, allDone: true, deadlocked: false };\n }\n\n const pending = this.pendingReadyNodes();\n\n if (pending.length === 0) {\n // No runnable tasks — check for deadlock\n const hasBlockedTasks = this.hasAnyBlockedTasks();\n return { tasks: [], wave: this.wave, allDone: false, deadlocked: hasBlockedTasks };\n }\n\n const batch = pending.slice(0, this.slots);\n return { tasks: batch, wave: this.wave, allDone: false, deadlocked: false };\n }\n\n /**\n * Advance the wave counter after a batch completes.\n * Call this once per `nextBatch()` result that was fan-out.\n */\n acknowledgeBatch(_completedTaskIds: string[]): void {\n this.wave++;\n }\n\n /**\n * True when every node in the graph is completed.\n * Use this to exit the fan-out loop after `isDone() || deadlocked`.\n */\n isDone(): boolean {\n const progress = this.tracker.getProgress();\n return progress.total > 0 && progress.completed === progress.total;\n }\n\n /**\n * Total waves produced so far.\n */\n getWaveCount(): number {\n return this.wave;\n }\n\n /**\n * All ready (dependency-satisfied) pending tasks, priority-sorted — UNSLICED.\n * The continuous scheduler fills its own free slots from this list, so unlike\n * `nextBatch()` it does not cap at `slots`.\n */\n readyNodes(): TaskNode[] {\n return this.pendingReadyNodes();\n }\n\n /**\n * True when every node has reached a terminal state (completed or failed).\n * This — not `isDone()` (which requires ALL completed) — is the correct loop\n * exit for the continuous scheduler: a terminally-failed task must not keep\n * the run spinning to its backstop.\n */\n isSettled(): boolean {\n const nodes = this.tracker.getAllNodes();\n return nodes.length > 0 && nodes.every((n) => n.status === 'completed' || n.status === 'failed');\n }\n\n // -------------------------------------------------------------------\n // Internal helpers\n // -------------------------------------------------------------------\n\n /**\n * Return pending nodes whose blockers are all completed.\n * Sorted by priority (critical first), then by creation time.\n */\n private pendingReadyNodes(): TaskNode[] {\n const allPending = this.tracker.getAllNodes({ status: ['pending'] });\n const ready: TaskNode[] = [];\n\n for (const node of allPending) {\n if (this.tracker.canStart(node.id)) {\n ready.push(node);\n }\n }\n\n // Sort by priority first, then by createdAt\n const priorityRank: Record<TaskNode['priority'], number> = {\n critical: 0,\n high: 1,\n medium: 2,\n low: 3,\n };\n\n ready.sort((a, b) => {\n const pr = priorityRank[a.priority] - priorityRank[b.priority];\n if (pr !== 0) return pr;\n return a.createdAt - b.createdAt;\n });\n\n return ready;\n }\n\n /** True when at least one non-completed, non-failed task is blocked. */\n private hasAnyBlockedTasks(): boolean {\n const nodes = this.tracker.getAllNodes({\n status: ['pending', 'in_progress', 'blocked'],\n });\n return nodes.some((n) => n.status === 'blocked');\n }\n}","// startSddRun — the shared run-setup core for a multi-agent SDD parallel run.\n//\n// Extracted from the CLI `/sdd execute` handler so every surface (CLI slash\n// command + both WebUI servers) starts a run identically: orphan reset →\n// SddParallelRun → live board projector → run registry → cross-process control\n// drain → run, with deterministic cleanup. The only thing that differs per\n// surface is the `subagentFactory` (CLI's director-backed factory vs the\n// runtime light factory) and whether git worktrees are available — both are\n// passed in, keeping this helper free of CLI/host coupling.\n\nimport type { Agent } from '../core/agent.js';\nimport type { AgentFactory } from '../coordination/agent-subagent-runner.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { TaskGraph } from '../types/task-graph.js';\nimport type { TaskTracker } from './task-tracker.js';\nimport type { WorktreeManager } from '../worktree/worktree-manager.js';\nimport { SddBoardProjector } from './sdd-board-projector.js';\nimport type { SddBoardStore } from './sdd-board-store.js';\nimport type { SddRunRegistry } from './sdd-run-registry.js';\nimport {\n SddParallelRun,\n type RunResult,\n type SddProgress,\n type SddParallelRunOptions,\n} from './sdd-parallel-run.js';\n\nexport interface StartSddRunOptions {\n tracker: TaskTracker;\n graph: TaskGraph;\n /** Leader agent — seeds the default factory and the run's project context. */\n agent: Agent;\n projectRoot: string;\n events: EventBus;\n /** Parent session id for all SDD EventBus emissions. */\n sessionId?: string | (() => string | undefined) | undefined;\n /** Per-task agent factory. Omit to run every task on the leader agent. */\n subagentFactory?: AgentFactory | undefined;\n /** Board snapshot/event persistence (also drained for cross-process control). */\n boardStore: SddBoardStore;\n /** Registry the run is registered with for in-process control. */\n registry?: SddRunRegistry | undefined;\n parallelSlots?: number | undefined;\n /** Opt-in hard wall-clock cap per task (ms). Omit → no cap (idle reaper guards). */\n taskTimeoutMs?: number | undefined;\n /** Idle reaper per task (ms); resets on activity. Default 600_000 (10 min). */\n taskIdleTimeoutMs?: number | undefined;\n /** End-of-run failed-task auto-retry sweeps (bounded). Default 2. */\n maxFailedRetrySweeps?: number | undefined;\n /** Post-task verification gate (forwarded to SddParallelRun). Omit → no gate. */\n verifyTask?: SddParallelRunOptions['verifyTask'];\n /** Merge-conflict resolver (forwarded to SddParallelRun). Omit → retry-on-fresh-base then fail. */\n conflictResolver?: SddParallelRunOptions['conflictResolver'];\n /** Failure supervisor (forwarded to SddParallelRun). Omit → no rescue, plain terminal-fail. */\n superviseFailure?: SddParallelRunOptions['superviseFailure'];\n /** Run-level default worker model / provider / fallback chain (task overrides win). */\n defaultModel?: string | undefined;\n defaultProvider?: string | undefined;\n fallbackModels?: string[] | undefined;\n /** Per-task git worktree isolation. Omit → tasks share the working tree. */\n worktrees?: WorktreeManager | undefined;\n /** Bounded deadlock recovery rounds (default 1). */\n maxRecoveryRounds?: number | undefined;\n /** Progress callback (e.g. CLI renderer line). */\n onProgress?: ((p: SddProgress) => void) | undefined;\n /** Control-file drain interval in ms (default 500). */\n controlDrainMs?: number | undefined;\n}\n\nexport interface SddRunHandle {\n run: SddParallelRun;\n runId: string;\n projector: SddBoardProjector;\n /** Resolves when the run finishes AND all teardown (drain/dispose/clear) is done. */\n completion: Promise<RunResult>;\n /** Request a clean stop (idempotent). */\n stop(): void;\n}\n\n/**\n * Wire up and start an SDD parallel run. Returns immediately with a handle whose\n * `completion` promise resolves once the run finishes and teardown is complete.\n * Orphaned in_progress tasks are reset up-front so a crashed prior run re-executes.\n */\nexport function startSddRun(opts: StartSddRunOptions): SddRunHandle {\n // Resume safety: orphaned in_progress tasks (from a prior crash, no agent\n // running them) are reset to pending so the run re-executes them.\n SddParallelRun.resetOrphans(opts.tracker);\n\n const run = new SddParallelRun({\n tracker: opts.tracker,\n graph: opts.graph,\n agent: opts.agent,\n projectRoot: opts.projectRoot,\n sessionId: opts.sessionId,\n parallelSlots: opts.parallelSlots,\n taskTimeoutMs: opts.taskTimeoutMs,\n taskIdleTimeoutMs: opts.taskIdleTimeoutMs,\n maxFailedRetrySweeps: opts.maxFailedRetrySweeps,\n verifyTask: opts.verifyTask,\n conflictResolver: opts.conflictResolver,\n superviseFailure: opts.superviseFailure,\n subagentFactory: opts.subagentFactory,\n events: opts.events,\n worktrees: opts.worktrees,\n maxRecoveryRounds: opts.maxRecoveryRounds ?? 1,\n onProgress: opts.onProgress,\n defaultModel: opts.defaultModel,\n defaultProvider: opts.defaultProvider,\n fallbackModels: opts.fallbackModels,\n });\n\n // Live board projector: streams sdd.board.snapshot + persists JSON/JSONL.\n const projector = new SddBoardProjector({\n runId: run.runId,\n graph: opts.graph,\n tracker: opts.tracker,\n events: opts.events,\n store: opts.boardStore,\n sessionId: opts.sessionId,\n specId: opts.graph.specId,\n defaultModel: opts.defaultModel,\n defaultProvider: opts.defaultProvider,\n fallbackModels: opts.fallbackModels,\n });\n\n opts.registry?.register({\n runId: run.runId,\n specId: opts.graph.specId,\n pause: () => run.pause(),\n resume: () => run.resume(),\n stop: () => run.stop(),\n retryTask: (id) => run.retryTask(id),\n retryAllFailed: () => run.retryAllFailed(),\n reassignTask: (id, name) => run.reassignTask(id, name),\n setTaskModel: (id, model, provider) => run.setTaskModel(id, model, provider),\n setTaskFallbacks: (id, fb) => run.setTaskFallbacks(id, fb),\n setTaskVerification: (id, cmd) => run.setTaskVerification(id, cmd),\n cancelTask: (id) => run.cancelTask(id),\n deleteTask: (id) => run.deleteTask(id),\n splitTask: (id, subtasks) => run.splitTask(id, subtasks),\n cleanupWorktrees: () => run.cleanupWorktrees(),\n rollback: () => run.rollback(),\n getBaseBranch: () => run.getBaseBranch(),\n getMergedCommits: () => run.getMergedCommits(),\n snapshot: () => projector.snapshot(),\n isRunning: () => run.isRunning(),\n });\n\n // Cross-process control channel: any board surface (e.g. the standalone WebUI\n // in another process) appends a command to <runId>.control.jsonl; we drain +\n // apply it here so this run stays the single driver.\n const drainMs = opts.controlDrainMs ?? 500;\n const controlTimer = setInterval(() => {\n void opts.boardStore.drainControl(run.runId).then((cmds) => {\n for (const c of cmds) {\n const p = (c.payload ?? {}) as {\n taskId?: string;\n agentName?: string;\n model?: string;\n provider?: string;\n fallbackModels?: string[];\n verificationCommand?: string;\n subtasks?: import('./sdd-parallel-run.js').SddSubtaskSpec[];\n };\n if (c.type === 'pause') run.pause();\n else if (c.type === 'resume') run.resume();\n else if (c.type === 'stop') run.stop();\n else if (c.type === 'retry' && p.taskId) run.retryTask(p.taskId);\n else if (c.type === 'retry_all_failed') run.retryAllFailed();\n else if (c.type === 'reassign' && p.taskId) run.reassignTask(p.taskId, p.agentName ?? '');\n else if (c.type === 'set_task_model' && p.taskId) run.setTaskModel(p.taskId, p.model, p.provider);\n else if (c.type === 'set_task_fallbacks' && p.taskId) run.setTaskFallbacks(p.taskId, p.fallbackModels);\n else if (c.type === 'set_task_verification' && p.taskId)\n run.setTaskVerification(p.taskId, p.verificationCommand);\n else if (c.type === 'cancel_task' && p.taskId) void run.cancelTask(p.taskId).catch(() => {});\n else if (c.type === 'delete_task' && p.taskId) run.deleteTask(p.taskId);\n else if (c.type === 'split_task' && p.taskId && p.subtasks?.length) run.splitTask(p.taskId, p.subtasks);\n // Lifecycle: stop the run first, then sweep worktrees / revert commits.\n // (Both are no-ops while the run is still live — the user pairs them with\n // a prior `stop`.)\n else if (c.type === 'cleanup_worktrees') void run.cleanupWorktrees().catch(() => {});\n else if (c.type === 'rollback') void run.rollback().catch(() => {});\n }\n }).catch(() => {});\n }, drainMs);\n // Best-effort: don't keep the event loop alive solely for the drain timer.\n (controlTimer as { unref?: () => void }).unref?.();\n\n const completion = (async (): Promise<RunResult> => {\n try {\n return await run.run();\n } finally {\n clearInterval(controlTimer);\n await projector.drain().catch(() => {});\n projector.dispose();\n opts.registry?.clear(run.runId);\n }\n })();\n\n return {\n run,\n runId: run.runId,\n projector,\n completion,\n stop: () => run.stop(),\n };\n}\n","import { spawn } from 'node:child_process';\nimport { mkdir } from 'node:fs/promises';\nimport { join, resolve, sep } from 'node:path';\nimport type { EventBus } from '../kernel/events.js';\nimport { buildChildEnv } from '../utils/child-env.js';\nimport { toErrorMessage } from '../utils/error.js';\n\n/**\n * Lifecycle of a single worktree handle.\n *\n * allocating → active → committing → merging → merged\n * └─→ needs-review (conflict, kept)\n * (any) → failed\n */\nexport type WorktreeStatus =\n | 'allocating'\n | 'active'\n | 'committing'\n | 'merging'\n | 'merged'\n | 'needs-review'\n | 'failed';\n\nexport interface WorktreeHandle {\n /** Stable id (== slug). Used as the event `handleId`. */\n id: string;\n /** Caller-supplied owner (a phase id in AutoPhase). */\n ownerId: string;\n /** Human label for the owner (phase name). */\n ownerLabel: string;\n slug: string;\n /** Absolute path to the worktree checkout. */\n dir: string;\n /** Branch checked out in the worktree (`wstack/ap/<slug>`). */\n branch: string;\n /** Branch the worktree was forked from and merges back into. */\n baseBranch: string;\n status: WorktreeStatus;\n createdAt: number;\n updatedAt: number;\n /** Diff stats from the last commit. */\n insertions: number;\n deletions: number;\n files: number;\n sha?: string | undefined;\n lastError?: string | undefined;\n conflictFiles?: string[] | undefined;\n}\n\nexport interface AllocateOpts {\n /** Friendly basis for the slug/branch (e.g. the phase name). */\n slugHint?: string | undefined;\n ownerLabel?: string | undefined;\n /** Override the detected base branch. */\n baseBranch?: string | undefined;\n}\n\nexport interface MergeOpts {\n squash?: boolean | undefined;\n message?: string | undefined;\n /**\n * Optional conflict resolver. Invoked when the squash-merge conflicts, with\n * the conflicted paths and the base working tree (`cwd`). It must resolve the\n * conflict markers in place and return `true` when done. If it returns `true`\n * and no conflict markers remain, the merge is committed and `merge()` returns\n * `{ ok: true, resolved: true }`. Otherwise the merge is aborted (hard reset)\n * and the handle is parked `needs-review` — exactly as if no resolver were\n * provided, so the base tree is never left dirty.\n */\n resolve?: (info: { conflictFiles: string[]; cwd: string }) => Promise<boolean>;\n}\n\nexport interface MergeResult {\n ok: boolean;\n conflict?: boolean | undefined;\n conflictFiles?: string[] | undefined;\n stderr?: string | undefined;\n /** True when an initial conflict was successfully resolved by `opts.resolve`. */\n resolved?: boolean | undefined;\n}\n\nexport interface RunResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface WorktreeManagerOptions {\n projectRoot: string;\n events?: EventBus | undefined;\n sessionId?: string | (() => string | undefined) | undefined;\n gitBin?: string | undefined;\n /**\n * Test seam. When provided, replaces the real `git` spawn so the manager's\n * sequencing/arg vectors can be asserted without touching a repo.\n */\n run?: (args: string[], cwd: string) => Promise<RunResult>;\n}\n\nconst MAX_SLUG = 40;\n\n/**\n * Owns the git-worktree lifecycle for isolated, parallel work units. Shells out\n * to `git` directly (never via the `git` *tool*) so it can target arbitrary\n * worktree directories without the tool's permission gate or `findGitDir`\n * resolution, and so `@wrongstack/core` keeps no dependency on `@wrongstack/tools`.\n */\nexport class WorktreeManager {\n private readonly projectRoot: string;\n private readonly events?: EventBus | undefined;\n private readonly sessionIdSource: string | (() => string | undefined) | undefined;\n private readonly gitBin: string;\n private readonly runGit: (args: string[], cwd: string) => Promise<RunResult>;\n /** Keyed by ownerId. */\n private readonly handles = new Map<string, WorktreeHandle>();\n private readonly usedSlugs = new Set<string>();\n\n constructor(opts: WorktreeManagerOptions) {\n this.projectRoot = resolve(opts.projectRoot);\n this.events = opts.events;\n this.sessionIdSource = opts.sessionId;\n this.gitBin = opts.gitBin ?? 'git';\n this.runGit = opts.run ?? ((args, cwd) => this.defaultRun(args, cwd));\n }\n\n /** Create a fresh worktree + branch forked from the current base branch. */\n async allocate(ownerId: string, opts: AllocateOpts = {}): Promise<WorktreeHandle> {\n const existing = this.handles.get(ownerId);\n if (existing && (existing.status === 'allocating' || existing.status === 'active')) {\n return existing;\n }\n\n const slug = this.makeSlug(opts.slugHint ?? ownerId);\n const branch = `wstack/ap/${slug}`;\n const dir = join(this.worktreesRoot(), slug);\n // Guard: slug is generated by makeSlug() which strips non-alphanumeric\n // chars, but double-check the dir resolves inside projectRoot so a\n // malicious slugHint with path traversal can't escape the worktrees dir.\n const absDir = resolve(dir);\n const absRoot = resolve(this.projectRoot);\n if (!absDir.startsWith(absRoot + sep)) {\n throw new Error(`Worktree dir \"${absDir}\" resolves outside project root`);\n }\n\n const baseBranch = opts.baseBranch ?? (await this.detectBaseBranch());\n\n const handle: WorktreeHandle = {\n id: slug,\n ownerId,\n ownerLabel: opts.ownerLabel ?? opts.slugHint ?? ownerId,\n slug,\n dir,\n branch,\n baseBranch,\n status: 'allocating',\n createdAt: Date.now(),\n updatedAt: Date.now(),\n insertions: 0,\n deletions: 0,\n files: 0,\n };\n this.handles.set(ownerId, handle);\n\n try {\n await mkdir(this.worktreesRoot(), { recursive: true });\n // git worktree add -b <branch> <path> <base> — path before commit-ish.\n const res = await this.runGit(\n ['worktree', 'add', '-b', branch, dir, baseBranch],\n this.projectRoot,\n );\n if (res.code !== 0) {\n return this.fail(handle, res.stderr || 'git worktree add failed');\n }\n } catch (err) {\n return this.fail(handle, toErrorMessage(err));\n }\n\n this.setStatus(handle, 'active');\n this.emit('worktree.allocated', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n ownerLabel: handle.ownerLabel,\n slug: handle.slug,\n dir: handle.dir,\n branch: handle.branch,\n baseBranch: handle.baseBranch,\n });\n return handle;\n }\n\n /** Stage everything and commit inside the worktree. */\n async commitAll(handle: WorktreeHandle, message: string): Promise<{ committed: boolean }> {\n this.setStatus(handle, 'committing');\n await this.runGit(['add', '-A'], handle.dir);\n\n // `diff --cached --quiet` exits 1 when there are staged changes, 0 when none.\n const staged = await this.runGit(['diff', '--cached', '--quiet'], handle.dir);\n if (staged.code === 0) {\n this.emitCommitted(handle, false);\n return { committed: false };\n }\n\n const idArgs = await this.identityArgs(handle.dir);\n const committed = await this.runGit([...idArgs, 'commit', '-m', message], handle.dir);\n if (committed.code !== 0) {\n this.fail(handle, committed.stderr || 'git commit failed');\n return { committed: false };\n }\n\n const stats = await this.collectStats(handle.dir);\n handle.insertions = stats.insertions;\n handle.deletions = stats.deletions;\n handle.files = stats.files;\n handle.sha = stats.sha;\n handle.updatedAt = Date.now();\n this.emitCommitted(handle, true);\n return { committed: true };\n }\n\n /** Merge the worktree branch back into the base branch (squash by default). */\n async merge(handle: WorktreeHandle, opts: MergeOpts = {}): Promise<MergeResult> {\n const squash = opts.squash ?? true;\n this.setStatus(handle, 'merging');\n\n const checkout = await this.runGit(['checkout', handle.baseBranch], this.projectRoot);\n if (checkout.code !== 0) {\n this.fail(handle, checkout.stderr || `checkout ${handle.baseBranch} failed`);\n return { ok: false, stderr: checkout.stderr };\n }\n\n const mergeArgs = squash\n ? ['merge', '--squash', handle.branch]\n : ['merge', '--no-ff', handle.branch];\n const merged = await this.runGit(mergeArgs, this.projectRoot);\n\n if (merged.code !== 0) {\n // Prefer the conflicted paths git prints to stdout (\"CONFLICT (...):\n // Merge conflict in <path>\") — deterministic across platforms — and\n // union with the index probe, since `git diff --diff-filter=U` can come\n // back empty on some runners after a `--squash` conflict.\n const fromOutput = parseConflictPaths(`${merged.stdout}\\n${merged.stderr}`);\n const fromIndex = await this.unmergedFiles();\n const conflictFiles = [...new Set([...fromOutput, ...fromIndex])];\n\n // Caller-driven resolution: leave the conflicted tree in place, hand the\n // marked files to the resolver, and finalize the merge commit only if it\n // cleared every marker. Any failure falls through to the safe reset below,\n // so the base tree is never left dirty.\n if (opts.resolve) {\n const finalized = await this.tryResolveConflict(handle, conflictFiles, opts);\n if (finalized) return finalized;\n }\n\n // `merge --squash` leaves no MERGE_HEAD, so `merge --abort` won't work;\n // hard-reset the base tree — the work is safe on the branch.\n await this.runGit(['reset', '--hard', 'HEAD'], this.projectRoot);\n handle.conflictFiles = conflictFiles;\n this.setStatus(handle, 'needs-review', { lastError: merged.stderr });\n this.emit('worktree.conflict', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n conflictFiles,\n });\n return { ok: false, conflict: true, conflictFiles, stderr: merged.stderr };\n }\n\n if (squash) {\n // --squash stages the changes but does not commit; finish the commit.\n const msg = opts.message ?? `merge ${handle.branch} (squash)`;\n const idArgs = await this.identityArgs(this.projectRoot);\n const commit = await this.runGit([...idArgs, 'commit', '-m', msg], this.projectRoot);\n // A no-op squash (empty diff) returns nonzero \"nothing to commit\" — fine.\n if (commit.code !== 0 && !/nothing to commit/i.test(commit.stdout + commit.stderr)) {\n this.fail(handle, commit.stderr || 'squash commit failed');\n return { ok: false, stderr: commit.stderr };\n }\n }\n\n this.setStatus(handle, 'merged');\n this.emit('worktree.merged', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n baseBranch: handle.baseBranch,\n squash,\n });\n return { ok: true };\n }\n\n /**\n * Current tip SHA of a handle's base branch (without checking it out). Capture\n * this before a merge so a regressed merge can be reverted to exactly this\n * commit — unambiguous even when a squash produced no diff. Returns null on\n * failure (caller then skips the revert).\n */\n async baseHead(handle: WorktreeHandle): Promise<string | null> {\n const res = await this.runGit(['rev-parse', handle.baseBranch], this.projectRoot);\n const sha = res.stdout.trim();\n return res.code === 0 && sha ? sha : null;\n }\n\n /**\n * Hard-reset the base branch back to `sha` (a value previously returned by\n * {@link baseHead}). Used to undo a squash-merge whose integrated result failed\n * re-verification, so an auto-resolved-but-broken merge never sticks on base.\n * Safe because SDD merges are serialized — no other commit lands in between.\n */\n async revertBaseTo(handle: WorktreeHandle, sha: string): Promise<boolean> {\n const co = await this.runGit(['checkout', handle.baseBranch], this.projectRoot);\n if (co.code !== 0) return false;\n const reset = await this.runGit(['reset', '--hard', sha], this.projectRoot);\n return reset.code === 0;\n }\n\n /**\n * Current base branch + tip SHA, captured WITHOUT a handle. The SDD run calls\n * this once at start so a later rollback knows which branch the run's squash\n * commits landed on. Returns null when not in a usable git state.\n */\n async currentBase(): Promise<{ branch: string; sha: string } | null> {\n const branch = await this.detectBaseBranch();\n const head = await this.runGit(['rev-parse', 'HEAD'], this.projectRoot);\n const sha = head.stdout.trim();\n return head.code === 0 && sha ? { branch, sha } : null;\n }\n\n /**\n * Force-remove EVERY managed worktree + branch this project owns, without\n * relying on the in-memory `handles` map — so it works post-run (a fresh\n * manager can clean up a previous run's leftovers). Enumerates\n * `git worktree list --porcelain`, removes every checkout living under the\n * `.wrongstack/worktrees` root, deletes every `wstack/ap/*` branch, then prunes.\n * Returns the number of worktrees removed. Never throws — best-effort cleanup.\n */\n async cleanupAllManaged(): Promise<{ removed: number }> {\n const root = resolve(this.worktreesRoot());\n let removed = 0;\n try {\n const listed = await this.runGit(['worktree', 'list', '--porcelain'], this.projectRoot);\n // Porcelain emits a `worktree <abs-path>` line per checkout (blank-line\n // separated records). Match the ones under our worktrees root.\n for (const line of listed.stdout.split('\\n')) {\n const m = line.match(/^worktree\\s+(.+?)\\s*$/);\n if (!m?.[1]) continue;\n const dir = resolve(m[1]);\n if (dir !== root && (dir === root || dir.startsWith(root + sep))) {\n const rm = await this.runGit(['worktree', 'remove', '--force', dir], this.projectRoot);\n if (rm.code === 0) removed++;\n }\n }\n } catch {\n // best-effort\n }\n // Delete every wstack/ap/* branch (covers branches whose worktree was already\n // gone, e.g. a merged task whose checkout was released but branch lingered).\n try {\n const branches = await this.runGit(\n ['branch', '--list', '--format=%(refname:short)', 'wstack/ap/*'],\n this.projectRoot,\n );\n for (const b of branches.stdout.split('\\n').map((s) => s.trim()).filter(Boolean)) {\n await this.runGit(['branch', '-D', b], this.projectRoot);\n }\n } catch {\n // best-effort\n }\n await this.runGit(['worktree', 'prune'], this.projectRoot).catch(() => undefined);\n // Drop any in-memory handles too, so a still-live manager forgets them.\n this.handles.clear();\n this.usedSlugs.clear();\n this.emit('worktree.released', {\n handleId: 'cleanup-all',\n ownerId: 'cleanup-all',\n branch: 'wstack/ap/*',\n kept: false,\n });\n return { removed };\n }\n\n /**\n * Read-only inventory of this project's managed git artifacts: every worktree\n * checkout under the `.wrongstack/worktrees` root (with its branch, when the\n * checkout has one) plus every `wstack/ap/*` branch. Unlike `cleanupStale` /\n * `cleanupAllManaged` this removes nothing — it powers the WebUI worktree panel\n * so the user can SEE orphans before deciding to clean them. Never throws.\n */\n async listManaged(): Promise<{\n worktrees: Array<{ dir: string; branch?: string | undefined }>;\n branches: string[];\n }> {\n const root = resolve(this.worktreesRoot());\n const worktrees: Array<{ dir: string; branch?: string | undefined }> = [];\n try {\n const listed = await this.runGit(['worktree', 'list', '--porcelain'], this.projectRoot);\n // Porcelain emits blank-line-separated records: `worktree <dir>` then\n // optional `HEAD <sha>` / `branch refs/heads/<name>` lines.\n let curDir: string | null = null;\n let curBranch: string | undefined;\n const flush = (): void => {\n if (curDir) {\n const d = resolve(curDir);\n if (d !== root && d.startsWith(root + sep)) {\n worktrees.push({ dir: curDir, branch: curBranch });\n }\n }\n curDir = null;\n curBranch = undefined;\n };\n for (const line of listed.stdout.split('\\n')) {\n if (line.startsWith('worktree ')) {\n flush();\n curDir = line.slice('worktree '.length).trim();\n } else if (line.startsWith('branch ')) {\n curBranch = line.slice('branch '.length).trim().replace(/^refs\\/heads\\//, '');\n } else if (line.trim() === '') {\n flush();\n }\n }\n flush();\n } catch {\n // best-effort\n }\n let branches: string[] = [];\n try {\n const b = await this.runGit(\n ['branch', '--list', '--format=%(refname:short)', 'wstack/ap/*'],\n this.projectRoot,\n );\n branches = b.stdout.split('\\n').map((s) => s.trim()).filter(Boolean);\n } catch {\n // best-effort\n }\n return { worktrees, branches };\n }\n\n /**\n * Force-remove ONE managed worktree + (optionally) its branch — the targeted\n * counterpart to `cleanupAllManaged`. Used by the WebUI worktree panel's\n * per-row Remove/Discard. Path-guarded so only checkouts under the project's\n * worktrees root can be removed. Best-effort; never throws.\n */\n async removeOne(dir: string, branch?: string | undefined): Promise<{ removed: boolean }> {\n const root = resolve(this.worktreesRoot());\n const abs = resolve(dir);\n // Refuse anything outside the managed worktrees root (never the main checkout).\n if (abs === root || !abs.startsWith(root + sep)) {\n return { removed: false };\n }\n let removed = false;\n try {\n const rm = await this.runGit(['worktree', 'remove', '--force', abs], this.projectRoot);\n removed = rm.code === 0;\n } catch {\n // best-effort\n }\n // Defense-in-depth: never let a branch that could be parsed as a git flag\n // through (a leading `-`). `branch -D --` terminates option parsing.\n if (branch && !branch.startsWith('-')) {\n await this.runGit(['branch', '-D', '--', branch], this.projectRoot).catch(() => undefined);\n }\n await this.runGit(['worktree', 'prune'], this.projectRoot).catch(() => undefined);\n // Drop any in-memory handle pointing at this dir.\n for (const [ownerId, h] of [...this.handles]) {\n if (resolve(h.dir) === abs) this.handles.delete(ownerId);\n }\n return { removed };\n }\n\n /**\n * Squash-merge an arbitrary `wstack/ap/*` branch into the base branch from the\n * main checkout — the handle-free counterpart to {@link merge}, used by the\n * WebUI worktree panel's per-row \"Merge to base\". On conflict it hard-resets\n * the base tree (never leaves it dirty) and reports the conflicted paths.\n * Refuses on a dirty base tree so uncommitted work is never clobbered.\n */\n async mergeBranch(\n branch: string,\n baseBranch?: string | undefined,\n ): Promise<{ ok: boolean; conflict?: boolean; conflictFiles?: string[]; reason?: string }> {\n const base = baseBranch ?? (await this.detectBaseBranch());\n // Defense-in-depth: a ref that begins with `-` could be parsed as a git\n // flag (argv smuggling). The WebUI boundary already restricts to managed\n // branches; this guards every other caller too.\n if (branch.startsWith('-') || base.startsWith('-')) {\n return { ok: false, reason: 'invalid ref' };\n }\n\n const status = await this.runGit(['status', '--porcelain'], this.projectRoot);\n if (status.stdout.trim().length > 0) {\n return { ok: false, reason: 'working tree has uncommitted changes — commit or stash first' };\n }\n const co = await this.runGit(['checkout', base], this.projectRoot);\n if (co.code !== 0) {\n return { ok: false, reason: co.stderr || `checkout ${base} failed` };\n }\n const merged = await this.runGit(['merge', '--squash', branch], this.projectRoot);\n if (merged.code !== 0) {\n const fromOutput = parseConflictPaths(`${merged.stdout}\\n${merged.stderr}`);\n const fromIndex = await this.unmergedFiles();\n const conflictFiles = [...new Set([...fromOutput, ...fromIndex])];\n // `merge --squash` leaves no MERGE_HEAD — hard-reset to undo cleanly.\n await this.runGit(['reset', '--hard', 'HEAD'], this.projectRoot).catch(() => undefined);\n return { ok: false, conflict: true, conflictFiles, reason: merged.stderr || 'merge conflict' };\n }\n const idArgs = await this.identityArgs(this.projectRoot);\n const commit = await this.runGit(\n [...idArgs, 'commit', '-m', `merge ${branch} (squash)`],\n this.projectRoot,\n );\n if (commit.code !== 0 && !/nothing to commit/i.test(commit.stdout + commit.stderr)) {\n return { ok: false, reason: commit.stderr || 'squash commit failed' };\n }\n return { ok: true };\n }\n\n /**\n * Compact change summary for a worktree checkout: working-tree edits\n * (numstat vs HEAD) + commit count ahead of `baseBranch`. Powers the panel's\n * \"View changes\" without streaming a full diff. Never throws.\n */\n async diffSummary(\n dir: string,\n baseBranch?: string | undefined,\n ): Promise<{\n files: Array<{ path: string; insertions: number; deletions: number }>;\n insertions: number;\n deletions: number;\n commits: number;\n }> {\n const files: Array<{ path: string; insertions: number; deletions: number }> = [];\n let insertions = 0;\n let deletions = 0;\n let commits = 0;\n try {\n const numstat = await this.runGit(['diff', '--numstat', 'HEAD'], dir);\n for (const line of numstat.stdout.split('\\n')) {\n const m = line.trim().match(/^(\\d+|-)\\t(\\d+|-)\\t(.+)$/);\n if (!m) continue;\n const ins = m[1] === '-' ? 0 : Number(m[1]);\n const del = m[2] === '-' ? 0 : Number(m[2]);\n files.push({ path: m[3]!, insertions: ins, deletions: del });\n insertions += ins;\n deletions += del;\n }\n } catch {\n // best-effort\n }\n try {\n const base = baseBranch ?? (await this.detectBaseBranch());\n const count = await this.runGit(['rev-list', '--count', `${base}..HEAD`], dir);\n commits = Number(count.stdout.trim()) || 0;\n } catch {\n // best-effort\n }\n return { files, insertions, deletions, commits };\n }\n\n /**\n * Detect and clean up stale worktrees left behind by crashed subagents.\n *\n * P2 #B6 (sprint2 audit): when a subagent crashes (OOM, SIGKILL), its\n * worktree checkout and branch remain on disk. `cleanupAllManaged()`\n * sweeps everything, but is never called automatically — only via\n * `/worktree clean`. This method runs on Director boot (or any other\n * entry point) to clean up leftovers from a previous crashed run.\n *\n * Unlike `cleanupAllManaged()`, this method is a no-op when no stale\n * worktrees are detected — it doesn't clear in-memory handles or emit\n * events unnecessarily. When stale worktrees ARE found, it delegates\n * to `cleanupAllManaged()` for the actual removal.\n *\n * Returns the number of stale worktrees removed (0 = clean).\n */\n async cleanupStale(): Promise<{ removed: number; detected: number }> {\n const root = resolve(this.worktreesRoot());\n let detected = 0;\n try {\n const listed = await this.runGit(['worktree', 'list', '--porcelain'], this.projectRoot);\n for (const line of listed.stdout.split('\\n')) {\n const m = line.match(/^worktree\\s+(.+?)\\s*$/);\n if (!m?.[1]) continue;\n const dir = resolve(m[1]);\n if (dir !== root && (dir === root || dir.startsWith(root + sep))) {\n detected++;\n }\n }\n } catch {\n // git not available or not a repo — nothing to clean\n return { removed: 0, detected: 0 };\n }\n // Also catch dangling `wstack/ap/*` branches whose worktree checkout is\n // already gone (e.g. a crash between `worktree remove` and `branch -D`, or a\n // merged task whose checkout was released but the branch lingered). These\n // are orphans too — without this the worktree-dir-only probe would report\n // \"clean\" and the branch would accumulate across runs.\n if (detected === 0) {\n try {\n const branches = await this.runGit(\n ['branch', '--list', '--format=%(refname:short)', 'wstack/ap/*'],\n this.projectRoot,\n );\n detected += branches.stdout.split('\\n').map((s) => s.trim()).filter(Boolean).length;\n } catch {\n // best-effort\n }\n }\n if (detected === 0) {\n return { removed: 0, detected: 0 };\n }\n // Stale worktrees / branches found — delegate to the full sweep.\n const { removed } = await this.cleanupAllManaged();\n return { removed, detected };\n }\n\n /**\n * Undo a run's squash commits by reverting each (newest → oldest) on the base\n * branch — history-preserving, never a destructive reset. Refuses on a dirty\n * working tree (so uncommitted work is never clobbered) and aborts cleanly if a\n * revert conflicts, reporting which SHA. `shas` are the run commit SHAs in the\n * order they landed; this reverses them. Returns the count reverted.\n */\n async revertCommits(\n baseBranch: string,\n shas: string[],\n ): Promise<{ ok: boolean; reverted: number; reason?: string }> {\n if (shas.length === 0) return { ok: true, reverted: 0, reason: 'nothing to revert' };\n\n const status = await this.runGit(['status', '--porcelain'], this.projectRoot);\n if (status.stdout.trim().length > 0) {\n return { ok: false, reverted: 0, reason: 'working tree has uncommitted changes — commit or stash first' };\n }\n\n const co = await this.runGit(['checkout', baseBranch], this.projectRoot);\n if (co.code !== 0) {\n return { ok: false, reverted: 0, reason: co.stderr || `checkout ${baseBranch} failed` };\n }\n\n const idArgs = await this.identityArgs(this.projectRoot);\n let reverted = 0;\n // Newest commit first so each revert applies cleanly on top of the prior one.\n for (const sha of [...shas].reverse()) {\n const res = await this.runGit([...idArgs, 'revert', '--no-edit', sha], this.projectRoot);\n if (res.code !== 0) {\n // Conflict or bad ref — abort the in-progress revert so the tree is clean.\n await this.runGit(['revert', '--abort'], this.projectRoot).catch(() => undefined);\n return {\n ok: false,\n reverted,\n reason: `revert of ${sha.slice(0, 8)} failed: ${(res.stderr || res.stdout).trim().split('\\n')[0] ?? 'conflict'}`,\n };\n }\n reverted++;\n }\n return { ok: true, reverted };\n }\n\n /**\n * Run the caller-supplied resolver against a conflicted squash-merge, then\n * commit if it cleared every marker. Returns a successful `MergeResult` on a\n * clean resolution, or `null` to signal the caller should fall back to the\n * abort path. Never leaves the base tree committed-but-dirty: a partial or\n * failed resolution returns `null` and the caller hard-resets.\n */\n private async tryResolveConflict(\n handle: WorktreeHandle,\n conflictFiles: string[],\n opts: MergeOpts,\n ): Promise<MergeResult | null> {\n let resolved = false;\n try {\n resolved = opts.resolve ? await opts.resolve({ conflictFiles, cwd: this.projectRoot }) : false;\n } catch {\n resolved = false;\n }\n if (!resolved) return null;\n\n // Stage the resolver's edits, then refuse to commit if any conflict marker\n // survived (a half-resolved file is worse than a clean abort).\n await this.runGit(['add', '-A'], this.projectRoot);\n if (await this.hasConflictMarkers()) return null;\n\n const idArgs = await this.identityArgs(this.projectRoot);\n const msg = opts.message ?? `merge ${handle.branch} (squash, conflict resolved)`;\n const commit = await this.runGit([...idArgs, 'commit', '-m', msg], this.projectRoot);\n if (commit.code !== 0 && !/nothing to commit/i.test(commit.stdout + commit.stderr)) {\n return null;\n }\n\n handle.conflictFiles = conflictFiles;\n this.setStatus(handle, 'merged');\n this.emit('worktree.merged', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n baseBranch: handle.baseBranch,\n squash: true,\n });\n return { ok: true, resolved: true, conflictFiles };\n }\n\n /**\n * True when staged content still carries conflict markers. `git diff --cached\n * --check` exits nonzero and prints a \"leftover conflict marker\" line for each\n * survivor; whitespace-only errors (also flagged by --check) are ignored so a\n * clean resolution with unrelated whitespace is not rejected.\n */\n private async hasConflictMarkers(): Promise<boolean> {\n const check = await this.runGit(['diff', '--cached', '--check'], this.projectRoot);\n if (check.code === 0) return false;\n return /conflict marker/i.test(`${check.stdout}\\n${check.stderr}`);\n }\n\n /**\n * Remove the worktree + branch. Conflicted/failed handles (or `keep:true`)\n * are left on disk for inspection.\n */\n async release(handle: WorktreeHandle, opts: { keep?: boolean | undefined } = {}): Promise<void> {\n const keep = opts.keep || handle.status === 'needs-review' || handle.status === 'failed';\n if (!keep) {\n await this.runGit(['worktree', 'remove', '--force', handle.dir], this.projectRoot);\n await this.runGit(['branch', '-D', handle.branch], this.projectRoot);\n await this.runGit(['worktree', 'prune'], this.projectRoot);\n this.handles.delete(handle.ownerId);\n }\n this.emit('worktree.released', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n kept: keep,\n });\n }\n\n get(ownerId: string): WorktreeHandle | undefined {\n return this.handles.get(ownerId);\n }\n\n list(): WorktreeHandle[] {\n return [...this.handles.values()];\n }\n\n // ── internals ────────────────────────────────────────────────────────────\n\n private worktreesRoot(): string {\n return join(this.projectRoot, '.wrongstack', 'worktrees');\n }\n\n private async detectBaseBranch(): Promise<string> {\n const head = await this.runGit(['rev-parse', '--abbrev-ref', 'HEAD'], this.projectRoot);\n const name = head.stdout.trim();\n if (name && name !== 'HEAD') return name;\n // Detached HEAD — fall back to the commit SHA.\n const sha = await this.runGit(['rev-parse', 'HEAD'], this.projectRoot);\n return sha.stdout.trim() || 'HEAD';\n }\n\n private makeSlug(hint: string): string {\n let base = hint\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^[-.]+/, '')\n .replace(/[-.]+$/, '')\n .slice(0, MAX_SLUG)\n .replace(/[-.]+$/, '');\n if (!base) base = 'wt';\n let slug = `${base}-${crypto.randomUUID().slice(0, 6)}`;\n while (this.usedSlugs.has(slug)) slug = `${base}-${crypto.randomUUID().slice(0, 6)}`;\n this.usedSlugs.add(slug);\n return slug;\n }\n\n private async collectStats(\n dir: string,\n ): Promise<{ insertions: number; deletions: number; files: number; sha: string }> {\n const sha = (await this.runGit(['rev-parse', 'HEAD'], dir)).stdout.trim();\n const numstat = await this.runGit(['show', '--numstat', '--format=', 'HEAD'], dir);\n let insertions = 0;\n let deletions = 0;\n let files = 0;\n for (const line of numstat.stdout.split('\\n')) {\n const m = line.trim().match(/^(\\d+|-)\\t(\\d+|-)\\t(.+)$/);\n if (!m) continue;\n files++;\n if (m[1] !== '-') insertions += Number(m[1]);\n if (m[2] !== '-') deletions += Number(m[2]);\n }\n return { insertions, deletions, files, sha };\n }\n\n /**\n * `git -c user.*` fallback so commits succeed on machines and CI runners\n * that have no global git identity configured. Returns `[]` when both\n * `user.name` and `user.email` are already set (the common case), so a real\n * user's identity is never overridden. The worktree branch commits are\n * squashed away on merge, so the fallback identity never reaches the base\n * branch history.\n */\n private async identityArgs(cwd: string): Promise<string[]> {\n const name = (await this.runGit(['config', 'user.name'], cwd)).stdout.trim();\n const email = (await this.runGit(['config', 'user.email'], cwd)).stdout.trim();\n if (name && email) return [];\n return [\n '-c',\n `user.name=${name || 'AutoPhase'}`,\n '-c',\n `user.email=${email || 'autophase@agent.local'}`,\n ];\n }\n\n private async unmergedFiles(): Promise<string[]> {\n const res = await this.runGit(['diff', '--name-only', '--diff-filter=U'], this.projectRoot);\n return res.stdout\n .split('\\n')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n\n private emitCommitted(handle: WorktreeHandle, committed: boolean): void {\n this.emit('worktree.committed', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n committed,\n insertions: handle.insertions,\n deletions: handle.deletions,\n files: handle.files,\n sha: handle.sha,\n });\n }\n\n private fail(handle: WorktreeHandle, error: string): WorktreeHandle {\n this.setStatus(handle, 'failed', { lastError: error });\n this.emit('worktree.failed', {\n handleId: handle.id,\n ownerId: handle.ownerId,\n branch: handle.branch,\n error,\n });\n return handle;\n }\n\n private setStatus(\n handle: WorktreeHandle,\n status: WorktreeStatus,\n patch?: Partial<WorktreeHandle> | undefined,\n ): void {\n handle.status = status;\n handle.updatedAt = Date.now();\n if (patch) Object.assign(handle, patch);\n }\n\n private emit<E extends Parameters<EventBus['emit']>[0]>(\n event: E,\n payload: Parameters<EventBus['emit']>[1],\n ): void {\n const sessionId = this.currentSessionId();\n this.events?.emit(\n event,\n (sessionId && payload && typeof payload === 'object'\n ? { ...(payload as Record<string, unknown>), sessionId }\n : payload) as never,\n );\n }\n\n private currentSessionId(): string | undefined {\n const value =\n typeof this.sessionIdSource === 'function'\n ? this.sessionIdSource()\n : this.sessionIdSource;\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n }\n\n private defaultRun(args: string[], cwd: string): Promise<RunResult> {\n return new Promise((res) => {\n let stdout = '';\n let stderr = '';\n // Bound the captured output — a merge/status against a huge worktree\n // can emit MBs that nothing reads in full (parseConflictPaths only\n // scans for CONFLICT lines). 1 MB matches grep.ts's buffer cap.\n const MAX_GIT_OUTPUT = 1_000_000;\n const child = spawn(this.gitBin, args, {\n cwd,\n env: buildChildEnv(),\n stdio: ['ignore', 'pipe', 'pipe'],\n signal: AbortSignal.timeout(30_000),\n windowsHide: true,\n });\n child.stdout?.on('data', (c: Buffer) => {\n if (stdout.length < MAX_GIT_OUTPUT) stdout += c.toString();\n });\n child.stderr?.on('data', (c: Buffer) => {\n if (stderr.length < MAX_GIT_OUTPUT) stderr += c.toString();\n });\n child.on('error', (err) => res({ code: 1, stdout, stderr: err.message }));\n child.on('close', (code) => res({ code: code ?? 1, stdout, stderr }));\n });\n }\n}\n\n/**\n * Extract conflicted paths from git merge output. Git prints one\n * `CONFLICT (<kind>): Merge conflict in <path>` line per conflicted file to\n * stdout — a portable signal that doesn't depend on the post-merge index\n * state (which `git diff --diff-filter=U` can report as empty on some runners\n * after a `--squash` conflict).\n */\nexport function parseConflictPaths(output: string): string[] {\n const paths = new Set<string>();\n for (const line of output.split('\\n')) {\n const m = line.match(/^CONFLICT \\([^)]*\\): Merge conflict in (.+?)\\s*$/);\n if (m?.[1]) paths.add(m[1]);\n }\n return [...paths];\n}\n\n/** Throw if `dir` resolves outside `projectRoot`. */\nexport function assertSafePath(dir: string, projectRoot: string): void {\n const root = resolve(projectRoot);\n const abs = resolve(dir);\n if (abs !== root && !abs.startsWith(root + sep)) {\n throw new Error(`worktree path escapes project root: ${dir}`);\n }\n}\n","// SDD run lifecycle — post-run, disk-level operations.\n//\n// While a run is live, the in-process `SddRunControl` (registered in\n// `SddRunRegistry`) owns stop / cleanup / rollback. Once a run finishes the\n// registry is cleared and its `WorktreeManager` is gone, so these helpers\n// re-derive everything from disk: a fresh `WorktreeManager` for git surgery and\n// the persisted board snapshot for the run's base branch + merged commits.\n//\n// Used by the CLI/WebUI when there is no active run (e.g. `/sdd rollback` after\n// the run already settled, or `/sdd destroy` to wipe the project).\n\nimport * as fsp from 'node:fs/promises';\nimport { WorktreeManager } from '../worktree/worktree-manager.js';\nimport { SddBoardStore } from './sdd-board-store.js';\n\n/** Force-remove every git worktree + branch a previous run left behind. */\nexport async function cleanupSddWorktrees(projectRoot: string): Promise<{ removed: number }> {\n const wt = new WorktreeManager({ projectRoot });\n return wt.cleanupAllManaged();\n}\n\n/**\n * Detect and clean up stale worktrees from a crashed previous run.\n * No-op when the project is clean. Called on SDD/Director boot to\n * prevent orphaned worktrees from conflicting with the next run's\n * `allocate()`.\n *\n * P2 #B6 (sprint2 audit).\n */\nexport async function cleanupStaleWorktrees(projectRoot: string): Promise<{ removed: number; detected: number }> {\n const wt = new WorktreeManager({ projectRoot });\n return wt.cleanupStale();\n}\n\nexport interface CleanupStaleSddOptions {\n projectRoot: string;\n /** Board snapshot dir (`wpaths.projectSddBoards`) — read for the liveness guard. */\n boardsDir: string;\n /** A `running` board updated within this window is treated as live → skip. Default 120_000 (2 min). */\n runningLiveMs?: number | undefined;\n /** A `paused` board updated within this window is treated as live → skip. Default 1_800_000 (30 min). */\n pausedLiveMs?: number | undefined;\n /** Injectable clock for tests. */\n now?: (() => number) | undefined;\n}\n\nexport interface CleanupStaleSddResult {\n /** True when a sweep ran (orphans were found and removed). */\n swept: boolean;\n removed: number;\n detected: number;\n /** Set when the sweep was skipped because a run appears live. */\n skippedReason?: string | undefined;\n}\n\n/**\n * Liveness-guarded stale-worktree sweep for boot + run-start. Worktrees live\n * under `<projectRoot>/.wrongstack/worktrees` and a sweep force-removes ALL of\n * them — so it must NEVER run under a genuinely live run (possibly in another\n * process). The guard reads the latest board: a `running` board updated within\n * `runningLiveMs`, or a `paused` one within `pausedLiveMs`, is treated as live\n * and the sweep is skipped. A crashed run leaves its board frozen as `running`\n * → once it ages past the window it is correctly swept. Any other status\n * (completed / failed / stopped / deadlocked / idle) is always sweepable.\n * Never throws — best-effort cleanup.\n */\nexport async function cleanupStaleSddWorktrees(\n opts: CleanupStaleSddOptions,\n): Promise<CleanupStaleSddResult> {\n const now = opts.now?.() ?? Date.now();\n try {\n const store = new SddBoardStore({ baseDir: opts.boardsDir });\n const latest = (await store.list())[0];\n if (latest) {\n const age = now - latest.updatedAt;\n if (latest.status === 'running' && age < (opts.runningLiveMs ?? 120_000)) {\n return { swept: false, removed: 0, detected: 0, skippedReason: 'a run appears live (running)' };\n }\n if (latest.status === 'paused' && age < (opts.pausedLiveMs ?? 1_800_000)) {\n return { swept: false, removed: 0, detected: 0, skippedReason: 'a run is paused' };\n }\n }\n } catch {\n // No/unreadable board → nothing claims the worktrees; safe to sweep.\n }\n try {\n const wt = new WorktreeManager({ projectRoot: opts.projectRoot });\n const { removed, detected } = await wt.cleanupStale();\n return { swept: detected > 0, removed, detected };\n } catch {\n return { swept: false, removed: 0, detected: 0 };\n }\n}\n\nexport interface RollbackFromDiskOptions {\n projectRoot: string;\n /** Directory holding persisted board snapshots (`wpaths.projectSddBoards`). */\n boardsDir: string;\n /** Specific run to roll back. Omit → the most recently updated board. */\n runId?: string | undefined;\n}\n\n/**\n * Roll back a finished run's merged commits by reading its persisted board\n * snapshot (base branch + commit SHAs) and reverting each. History-preserving;\n * refuses on a dirty tree or revert conflict (surfaced in `reason`). Returns\n * `ok:false` with a reason when there is no board, no base branch, or nothing to\n * revert.\n */\nexport async function rollbackSddRunFromDisk(\n opts: RollbackFromDiskOptions,\n): Promise<{ ok: boolean; reverted: number; reason?: string }> {\n const store = new SddBoardStore({ baseDir: opts.boardsDir });\n const runId = opts.runId ?? (await store.list())[0]?.runId;\n if (!runId) return { ok: false, reverted: 0, reason: 'no SDD board found to roll back' };\n\n const snap = await store.load(runId);\n if (!snap) return { ok: false, reverted: 0, reason: `board \"${runId}\" not found` };\n if (!snap.baseBranch) {\n return { ok: false, reverted: 0, reason: 'this run did not record a base branch (no worktree run)' };\n }\n const shas = (snap.mergedCommits ?? []).map((c) => c.sha);\n if (shas.length === 0) {\n return { ok: false, reverted: 0, reason: 'no merged commits recorded for this run' };\n }\n\n const wt = new WorktreeManager({ projectRoot: opts.projectRoot });\n return wt.revertCommits(snap.baseBranch, shas);\n}\n\nexport interface DestroySddProjectOptions {\n projectRoot: string;\n /** Resolved wstack paths to delete. */\n paths: {\n projectSpecs: string;\n projectTaskGraphs: string;\n projectSddSession: string;\n projectSddBoards: string;\n };\n /**\n * Also revert this run's already-merged squash commits (history-preserving\n * `git revert`) BEFORE deleting the board that records them. Off by default —\n * a plain destroy wipes worktrees + artifacts but leaves merged commits on the\n * base branch (un-merged worktree work is destroyed regardless, since its\n * branch is force-removed). When on and the working tree is dirty, the revert\n * is refused and surfaced in `revertReason` (the destroy still proceeds).\n */\n revertMerged?: boolean | undefined;\n /** Which run's merged commits to revert. Omit → the most recently updated board. */\n runId?: string | undefined;\n}\n\nexport interface DestroySddProjectResult {\n worktreesRemoved: number;\n /** Human labels of the artifacts that were deleted. */\n deleted: string[];\n /** Number of merged commits reverted (only when `revertMerged` was set). */\n reverted: number;\n /** Whether the optional merged-commit revert succeeded (undefined → not requested). */\n revertOk?: boolean | undefined;\n /** Why the revert did not fully apply (dirty tree, conflict, nothing to revert). */\n revertReason?: string | undefined;\n}\n\n/**\n * Destroy an SDD project: optionally revert its merged commits, then clean every\n * worktree + branch, then delete the on-disk artifacts (specs, task-graphs,\n * session, boards). The revert is opt-in (`revertMerged`) and runs FIRST — it\n * reads the board snapshot that the artifact deletion removes. Best-effort: a\n * missing path is simply skipped. The caller is responsible for stopping any\n * active run first.\n */\nexport async function destroySddProject(\n opts: DestroySddProjectOptions,\n): Promise<DestroySddProjectResult> {\n // 1. Optional merged-commit revert — must read the board before we delete it.\n let reverted = 0;\n let revertOk: boolean | undefined;\n let revertReason: string | undefined;\n if (opts.revertMerged) {\n const r = await rollbackSddRunFromDisk({\n projectRoot: opts.projectRoot,\n boardsDir: opts.paths.projectSddBoards,\n runId: opts.runId,\n }).catch((err) => ({ ok: false, reverted: 0, reason: toReason(err) }));\n reverted = r.reverted;\n revertOk = r.ok;\n revertReason = r.reason;\n }\n\n // 2. Force-remove every worktree + branch (incl. un-merged work).\n const { removed } = await cleanupSddWorktrees(opts.projectRoot).catch(() => ({ removed: 0 }));\n\n // 3. Delete the on-disk artifacts.\n const deleted: string[] = [];\n const rmDir = async (dir: string, label: string) => {\n try {\n await fsp.rm(dir, { recursive: true, force: true });\n deleted.push(label);\n } catch {\n // already gone\n }\n };\n const rmFile = async (file: string, label: string) => {\n try {\n await fsp.unlink(file);\n deleted.push(label);\n } catch {\n // already gone\n }\n };\n\n await rmFile(opts.paths.projectSddSession, 'session');\n await rmDir(opts.paths.projectSpecs, 'specs');\n await rmDir(opts.paths.projectTaskGraphs, 'task-graphs');\n await rmDir(opts.paths.projectSddBoards, 'boards');\n\n return { worktreesRemoved: removed, deleted, reverted, revertOk, revertReason };\n}\n\nfunction toReason(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/** Lifecycle operation kinds shared by every surface (WebUI / TUI / CLI). */\nexport type SddLifecycleOp = 'cleanup_worktrees' | 'rollback' | 'destroy';\n\nexport interface SddLifecycleOptions {\n projectRoot: string;\n /** Resolved wstack paths (required for `destroy`; boards dir is enough for `rollback`). */\n paths: {\n projectSpecs: string;\n projectTaskGraphs: string;\n projectSddSession: string;\n projectSddBoards: string;\n };\n /** Target a specific run (rollback / destroy). Omit → most recently updated board. */\n runId?: string | undefined;\n /** `destroy` only: also revert merged commits before wiping. */\n revertMerged?: boolean | undefined;\n}\n\n/** Uniform result for any lifecycle op — drives identical UI wording everywhere. */\nexport interface SddLifecycleResult {\n op: SddLifecycleOp;\n ok: boolean;\n /** Worktrees removed (cleanup_worktrees / destroy). */\n removed?: number | undefined;\n /** Merged commits reverted (rollback / destroy with revertMerged). */\n reverted?: number | undefined;\n /** Artifact labels deleted (destroy). */\n deleted?: string[] | undefined;\n /** Failure / partial reason, surfaced verbatim in the UI. */\n reason?: string | undefined;\n}\n\n/**\n * Apply a post-run SDD lifecycle operation from disk and return a uniform result.\n * The single entry point shared by the WebUI board handler, the TUI overlay, and\n * the CLI `/sdd` host so every surface reports the same thing. The caller must\n * ensure no run is active (these operate on git + on-disk state, not the live\n * run) — `cleanup`/`destroy` force-remove worktrees, `rollback` refuses on a\n * dirty tree. Never throws.\n */\nexport async function applySddLifecycle(\n op: SddLifecycleOp,\n opts: SddLifecycleOptions,\n): Promise<SddLifecycleResult> {\n try {\n if (op === 'cleanup_worktrees') {\n const { removed } = await cleanupSddWorktrees(opts.projectRoot);\n return { op, ok: true, removed };\n }\n if (op === 'rollback') {\n const r = await rollbackSddRunFromDisk({\n projectRoot: opts.projectRoot,\n boardsDir: opts.paths.projectSddBoards,\n runId: opts.runId,\n });\n return { op, ok: r.ok, reverted: r.reverted, reason: r.reason };\n }\n // destroy\n const r = await destroySddProject({\n projectRoot: opts.projectRoot,\n paths: opts.paths,\n revertMerged: opts.revertMerged,\n runId: opts.runId,\n });\n return {\n op,\n // The wipe itself is best-effort and always \"ok\"; a requested-but-refused\n // revert is surfaced via reason without failing the destroy.\n ok: true,\n removed: r.worktreesRemoved,\n reverted: r.reverted,\n deleted: r.deleted,\n reason: r.revertOk === false ? r.revertReason : undefined,\n };\n } catch (err) {\n return { op, ok: false, reason: toReason(err) };\n }\n}\n","import type { SpecTemplate } from '../types/spec.js';\n\n/**\n * Built-in spec templates for common development scenarios.\n */\nexport const SPEC_TEMPLATES: SpecTemplate[] = [\n {\n id: 'feature',\n name: 'New Feature',\n description: 'Template for new feature development',\n sections: [\n { type: 'overview', title: 'Overview', level: 2 },\n { type: 'requirements', title: 'Requirements', level: 2 },\n { type: 'architecture', title: 'Architecture', level: 2 },\n { type: 'api', title: 'API Design', level: 2 },\n { type: 'data', title: 'Data Model', level: 2 },\n { type: 'security', title: 'Security', level: 2 },\n { type: 'acceptance', title: 'Acceptance Criteria', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'non-functional', priority: 'medium', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'bugfix',\n name: 'Bug Fix',\n description: 'Template for bug fix specifications',\n sections: [\n { type: 'overview', title: 'Bug Description', level: 2 },\n { type: 'requirements', title: 'Root Cause Analysis', level: 2 },\n { type: 'acceptance', title: 'Fix Verification', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'critical', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'refactor',\n name: 'Refactor',\n description: 'Template for code refactoring',\n sections: [\n { type: 'overview', title: 'Current State', level: 2 },\n { type: 'requirements', title: 'Refactoring Goals', level: 2 },\n { type: 'architecture', title: 'Target Architecture', level: 2 },\n { type: 'acceptance', title: 'Verification', level: 2 },\n ],\n defaultRequirements: [\n { type: 'non-functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'infra',\n name: 'Infrastructure',\n description: 'Template for infrastructure/tooling changes',\n sections: [\n { type: 'overview', title: 'What and Why', level: 2 },\n { type: 'requirements', title: 'Requirements', level: 2 },\n { type: 'architecture', title: 'Design', level: 2 },\n { type: 'security', title: 'Security Impact', level: 2 },\n { type: 'acceptance', title: 'Rollout Plan', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'security', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'integration',\n name: 'Integration',\n description: 'Template for integrating external services or APIs',\n sections: [\n { type: 'overview', title: 'Integration Overview', level: 2 },\n { type: 'requirements', title: 'Integration Requirements', level: 2 },\n { type: 'api', title: 'API Contract', level: 2 },\n { type: 'architecture', title: 'Architecture', level: 2 },\n { type: 'security', title: 'Auth & Security', level: 2 },\n { type: 'acceptance', title: 'Testing Strategy', level: 2 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'security', priority: 'critical', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'performance', priority: 'medium', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n {\n id: 'cli-command',\n name: 'CLI Command',\n description: 'Template for new CLI commands/slash commands',\n sections: [\n { type: 'overview', title: 'Command Overview', level: 2 },\n { type: 'requirements', title: 'Command Requirements', level: 2 },\n { type: 'api', title: 'Command Interface', level: 2 },\n { type: 'acceptance', title: 'Usage Examples', level: 2 },\n ],\n defaultRequirements: [\n { type: 'ux', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n },\n];\n\n/**\n * Get a template by ID.\n */\nexport function getTemplate(id: string): SpecTemplate | undefined {\n return SPEC_TEMPLATES.find((t) => t.id === id);\n}\n\n/**\n * List all available templates.\n */\nexport function listTemplates(): Array<{ id: string; name: string; description: string }> {\n return SPEC_TEMPLATES.map((t) => ({ id: t.id, name: t.name, description: t.description }));\n}\n\n/**\n * Generate a markdown skeleton from a template.\n */\nexport function templateToMarkdown(template: SpecTemplate, title?: string): string {\n const lines: string[] = [];\n lines.push(`# ${title ?? 'Untitled Specification'}`);\n lines.push('Version: 0.1.0');\n lines.push('');\n\n for (const section of template.sections) {\n lines.push(`${'#'.repeat(section.level + 1)} ${section.title}`);\n lines.push(`_<!-- ${section.type} section content -->_`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import type { TaskGraph, TaskNode, TaskProgress } from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\nimport type { Specification } from '../types/spec.js';\nimport { truncate } from '../utils/string.js';\n\nconst STATUS_ICON: Record<TaskNode['status'], string> = {\n pending: '○',\n in_progress: '◐',\n blocked: '⊘',\n failed: '✗',\n review: '◑',\n completed: '●',\n};\n\nconst PRIORITY_ICON: Record<TaskNode['priority'], string> = {\n critical: '🔴',\n high: '🟠',\n medium: '🟡',\n low: '🟢',\n};\n\nconst TYPE_ICON: Record<TaskNode['type'], string> = {\n feature: '⚡',\n bugfix: '🐛',\n refactor: '♻️',\n docs: '📝',\n test: '🧪',\n chore: '🔧',\n};\n\n/**\n * Render a task graph as ASCII art for terminal display.\n */\nexport function renderTaskGraph(graph: TaskGraph, opts?: { compact?: boolean | undefined }): string {\n const lines: string[] = [];\n const compact = opts?.compact ?? false;\n\n // Header\n lines.push(`╭─ Task Graph: ${graph.title} ─╮`);\n lines.push(`│ Spec: ${graph.specId.slice(0, 8)}... │ Nodes: ${graph.nodes.size} │ Edges: ${graph.edges.length} │`);\n lines.push('╰' + '─'.repeat(Math.max(50, graph.title.length + 30)) + '╯');\n lines.push('');\n\n // Progress bar\n const progress = computeTaskProgress(graph);\n lines.push(renderProgress(progress));\n lines.push('');\n\n // Build adjacency for display\n const childrenMap = new Map<string, string[]>();\n for (const edge of graph.edges) {\n if (edge.type === 'depends_on') {\n // edge.from depends on edge.to → edge.to is a blocker\n const deps = childrenMap.get(edge.from) ?? [];\n deps.push(edge.to);\n childrenMap.set(edge.from, deps);\n }\n }\n\n // Render root nodes and their dependents\n const rendered = new Set<string>();\n const rootNodes = graph.rootNodes.filter((id) => graph.nodes.has(id));\n\n // If no root nodes, use all nodes\n const startNodes = rootNodes.length > 0\n ? rootNodes\n : Array.from(graph.nodes.keys()).filter((id) => {\n const deps = childrenMap.get(id);\n return !deps || deps.length === 0;\n });\n\n for (const rootId of startNodes) {\n renderNode(graph, rootId, lines, rendered, childrenMap, compact, '');\n }\n\n // Render any orphan nodes\n for (const [id] of graph.nodes) {\n if (!rendered.has(id)) {\n renderNode(graph, id, lines, rendered, childrenMap, compact, '');\n }\n }\n\n // Legend\n lines.push('');\n lines.push('Legend: ● done ◐ in-progress ○ pending ⊗ blocked ✗ failed ◒ review');\n\n return lines.join('\\n');\n}\n\nfunction renderNode(\n graph: TaskGraph,\n nodeId: string,\n lines: string[],\n rendered: Set<string>,\n childrenMap: Map<string, string[]>,\n compact: boolean,\n prefix: string,\n): void {\n if (rendered.has(nodeId)) return;\n rendered.add(nodeId);\n\n const node = graph.nodes.get(nodeId);\n if (!node) return;\n\n const icon = STATUS_ICON[node.status];\n const prioIcon = PRIORITY_ICON[node.priority];\n const typeIcon = TYPE_ICON[node.type];\n const title = compact ? truncate(node.title, 40) : node.title;\n\n const blockedBy = childrenMap.get(nodeId) ?? [];\n const depsStr = blockedBy.length > 0\n ? ` ← [${blockedBy.map((d) => graph.nodes.get(d)?.title?.slice(0, 12) ?? '?').join(', ')}]`\n : '';\n\n lines.push(`${prefix}${icon} ${typeIcon} ${prioIcon} ${title}${depsStr}`);\n\n if (!compact && node.description) {\n const descLines = node.description.split('\\n').slice(0, 3);\n for (const dl of descLines) {\n lines.push(`${prefix} └ ${truncate(dl, 60)}`);\n }\n }\n\n // Render nodes that depend on this one\n const dependents = graph.edges\n .filter((e) => e.type === 'depends_on' && e.to === nodeId)\n .map((e) => e.from)\n .filter((id) => graph.nodes.has(id));\n\n for (const depId of dependents) {\n renderNode(graph, depId, lines, rendered, childrenMap, compact, prefix + ' ');\n }\n}\n\n/**\n * Render a progress bar.\n */\nexport function renderProgress(progress: TaskProgress): string {\n const barWidth = 30;\n const filled = Math.round((progress.percentComplete / 100) * barWidth);\n const empty = barWidth - filled;\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n\n return [\n `Progress: [${bar}] ${progress.percentComplete}%`,\n ` ${progress.completed} done │ ${progress.inProgress} active │ ${progress.pending} pending │ ${progress.blocked} blocked │ ${progress.failed} failed`,\n ].join('\\n');\n}\n\n/**\n * Render a compact task list (for quick status checks).\n */\nexport function renderTaskList(graph: TaskGraph): string {\n const lines: string[] = [];\n const nodes = Array.from(graph.nodes.values());\n\n // Group by status\n const groups: Record<string, TaskNode[]> = {\n in_progress: [],\n pending: [],\n blocked: [],\n review: [],\n failed: [],\n completed: [],\n };\n\n for (const node of nodes) {\n groups[node.status]?.push(node);\n }\n\n for (const [status, group] of Object.entries(groups)) {\n if (group.length === 0) continue;\n const icon = STATUS_ICON[status as TaskNode['status']];\n lines.push(`${icon} ${status.toUpperCase()} (${group.length})`);\n for (const node of group) {\n const prio = PRIORITY_ICON[node.priority];\n const type = TYPE_ICON[node.type];\n lines.push(` ${type} ${prio} ${node.title}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Render spec analysis summary.\n */\nexport function renderSpecAnalysis(\n spec: Specification,\n analysis: { completeness: number; gaps: string[]; risks: string[]; suggestions: string[] },\n): string {\n const lines: string[] = [];\n\n lines.push(`╭─ Spec Analysis: ${spec.title} ─╮`);\n lines.push('');\n\n // Completeness\n const barWidth = 20;\n const filled = Math.round((analysis.completeness / 100) * barWidth);\n const bar = '█'.repeat(filled) + '░'.repeat(barWidth - filled);\n lines.push(`Completeness: [${bar}] ${analysis.completeness}%`);\n lines.push('');\n\n if (analysis.gaps.length > 0) {\n lines.push('⚠ Gaps:');\n for (const gap of analysis.gaps) {\n lines.push(` • ${gap}`);\n }\n lines.push('');\n }\n\n if (analysis.risks.length > 0) {\n lines.push('🔴 Risks:');\n for (const risk of analysis.risks) {\n lines.push(` • ${risk}`);\n }\n lines.push('');\n }\n\n if (analysis.suggestions.length > 0) {\n lines.push('💡 Suggestions:');\n for (const sug of analysis.suggestions) {\n lines.push(` • ${sug}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n","import { expectDefined } from '../utils/expect-defined.js';\nimport type { TaskGraph } from '../types/task-graph.js';\nimport { topologicalSort } from '../types/task-graph.js';\n/**\n * Enhanced critical path analysis with bottleneck detection,\n * parallel execution groups, and time estimation.\n */\nexport interface CriticalPathAnalysis {\n /** Ordered list of critical path task IDs. */\n criticalPath: string[];\n /** Total estimated hours for the critical path. */\n totalHours: number;\n /** Tasks that block the most downstream work. */\n bottlenecks: BottleneckTask[];\n /** Groups of tasks that can run in parallel. */\n parallelGroups: string[][];\n /** Recommended execution order respecting dependencies. */\n executionOrder: string[];\n /** Tasks with no blockers (can start immediately). */\n readyTasks: string[];\n /** Tasks that are blocked and cannot start. */\n blockedTasks: string[];\n}\n\nexport interface BottleneckTask {\n taskId: string;\n title: string;\n /** Number of tasks directly or transitively blocked by this task. */\n blockedCount: number;\n /** Total estimated hours of blocked downstream work. */\n blockedHours: number;\n /** Severity score (0-100). */\n severity: number;\n}\n\n/**\n * Analyze a task graph and return critical path analysis.\n */\nexport function analyzeCriticalPath(graph: TaskGraph): CriticalPathAnalysis {\n const nodes = Array.from(graph.nodes.values());\n const topoOrder = topologicalSort(graph);\n\n // Build adjacency: blocker → blocked tasks\n const blockedByMap = new Map<string, Set<string>>();\n const blocksMap = new Map<string, Set<string>>();\n\n for (const edge of graph.edges) {\n if (edge.type === 'depends_on') {\n // edge.from depends on edge.to\n if (!blockedByMap.has(edge.from)) blockedByMap.set(edge.from, new Set());\n blockedByMap.get(edge.from)?.add(edge.to);\n\n if (!blocksMap.has(edge.to)) blocksMap.set(edge.to, new Set());\n blocksMap.get(edge.to)?.add(edge.from);\n }\n }\n\n // Find ready tasks (no blockers or all blockers completed)\n const readyTasks: string[] = [];\n const blockedTasks: string[] = [];\n\n for (const node of nodes) {\n if (node.status === 'completed') continue;\n const blockers = blockedByMap.get(node.id);\n if (!blockers || blockers.size === 0) {\n readyTasks.push(node.id);\n } else {\n const allCompleted = Array.from(blockers).every((id) => {\n const n = graph.nodes.get(id);\n return n?.status === 'completed';\n });\n if (allCompleted) {\n readyTasks.push(node.id);\n } else {\n blockedTasks.push(node.id);\n }\n }\n }\n\n // Compute bottleneck scores\n const bottlenecks: BottleneckTask[] = [];\n for (const node of nodes) {\n if (node.status === 'completed') continue;\n const downstream = getTransitiveBlocked(graph, node.id, blocksMap);\n if (downstream.size > 0) {\n const blockedHours = Array.from(downstream).reduce((sum, id) => {\n const n = graph.nodes.get(id);\n return sum + (n?.estimateHours ?? 0);\n }, 0);\n bottlenecks.push({\n taskId: node.id,\n title: node.title,\n blockedCount: downstream.size,\n blockedHours,\n severity: Math.min(100, Math.round((downstream.size / nodes.length) * 100)),\n });\n }\n }\n\n bottlenecks.sort((a, b) => b.severity - a.severity);\n\n // Compute critical path (longest path by estimated hours)\n const criticalPath = computeCriticalPath(graph, topoOrder, blockedByMap);\n\n // Total hours on critical path\n const totalHours = criticalPath.reduce((sum, id) => {\n const n = graph.nodes.get(id);\n return sum + (n?.estimateHours ?? 0);\n }, 0);\n\n // Parallel execution groups\n const parallelGroups = computeParallelGroups(graph, blockedByMap);\n\n // Execution order: topo sort filtered to non-completed tasks\n const executionOrder = topoOrder.filter((id) => {\n const n = graph.nodes.get(id);\n return n && n.status !== 'completed';\n });\n\n return {\n criticalPath,\n totalHours,\n bottlenecks,\n parallelGroups,\n executionOrder,\n readyTasks,\n blockedTasks,\n };\n}\n\n/**\n * Get all tasks transitively blocked by a given task.\n */\nfunction getTransitiveBlocked(\n _graph: TaskGraph,\n taskId: string,\n blocksMap: Map<string, Set<string>>,\n): Set<string> {\n const visited = new Set<string>();\n const queue = [taskId];\n\n while (queue.length > 0) {\n const current = expectDefined(queue.shift());\n const blocked = blocksMap.get(current);\n if (!blocked) continue;\n for (const id of blocked) {\n if (!visited.has(id) && id !== taskId) {\n visited.add(id);\n queue.push(id);\n }\n }\n }\n\n return visited;\n}\n\n/**\n * Compute the critical path (longest path by estimated hours).\n */\nfunction computeCriticalPath(\n graph: TaskGraph,\n _topoOrder: string[],\n blockedByMap: Map<string, Set<string>>,\n): string[] {\n // Use all nodes in the graph, not just topo-reachable ones\n const allIds = Array.from(graph.nodes.keys());\n if (allIds.length === 0) return [];\n\n const dist = new Map<string, number>();\n const prev = new Map<string, string | null>();\n\n // Initialize each node's distance to its own estimate\n for (const id of allIds) {\n dist.set(id, graph.nodes.get(id)?.estimateHours ?? 1);\n prev.set(id, null);\n }\n\n // Build reverse map: blocker → tasks it blocks\n const blocksMap = new Map<string, Set<string>>();\n for (const [taskId, blockers] of blockedByMap) {\n for (const blockerId of blockers) {\n if (!blocksMap.has(blockerId)) blocksMap.set(blockerId, new Set());\n blocksMap.get(blockerId)?.add(taskId);\n }\n }\n\n // Relax edges repeatedly (Bellman-Ford style) since topoOrder may be incomplete.\n // Run N-1 iterations to handle longest path in DAG.\n const n = allIds.length;\n for (let i = 0; i < n - 1; i++) {\n let changed = false;\n for (const id of allIds) {\n const blocked = blocksMap.get(id);\n if (!blocked) continue;\n for (const blockedId of blocked) {\n const candidateDist = (dist.get(id) ?? 0) + (graph.nodes.get(blockedId)?.estimateHours ?? 1);\n if (candidateDist > (dist.get(blockedId) ?? 0)) {\n dist.set(blockedId, candidateDist);\n prev.set(blockedId, id);\n changed = true;\n }\n }\n }\n if (!changed) break;\n }\n\n // Find the node with maximum distance (end of critical path)\n let maxDist = 0;\n let maxId = expectDefined(allIds[0]);\n for (const id of allIds) {\n const d = dist.get(id) ?? 0;\n if (d > maxDist) {\n maxDist = d;\n maxId = id;\n }\n }\n\n // Trace back the critical path\n const path: string[] = [];\n let current: string | null = maxId;\n const visited = new Set<string>();\n while (current && !visited.has(current)) {\n visited.add(current);\n path.unshift(current);\n current = prev.get(current) ?? null;\n }\n\n return path;\n}\n\n/**\n * Compute groups of tasks that can run in parallel.\n * Tasks in the same group have no dependencies on each other.\n */\nfunction computeParallelGroups(\n graph: TaskGraph,\n blockedByMap: Map<string, Set<string>>,\n): string[][] {\n const groups: string[][] = [];\n const assigned = new Set<string>();\n const nodes = Array.from(graph.nodes.values()).filter((n) => n.status !== 'completed');\n\n // Topological levels\n const remaining = new Set(nodes.map((n) => n.id));\n\n while (remaining.size > 0) {\n const group: string[] = [];\n for (const id of remaining) {\n const blockers = blockedByMap.get(id);\n if (!blockers || blockers.size === 0) {\n group.push(id);\n } else {\n const allAssigned = Array.from(blockers).every((b) => assigned.has(b));\n if (allAssigned) {\n group.push(id);\n }\n }\n }\n\n if (group.length === 0) {\n // Circular dependency or all remaining are blocked by non-completed\n // Just take the first remaining\n const first = Array.from(remaining)[0];\n if (first) group.push(first);\n }\n\n for (const id of group) {\n assigned.add(id);\n remaining.delete(id);\n }\n groups.push(group);\n }\n\n return groups;\n}\n","import type { Specification, SpecRequirement } from '../types/spec.js';\nimport type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport { assertNever } from '../utils/assert-never.js';\n\nexport interface SpecVersion {\n version: string;\n spec: Specification;\n timestamp: number;\n changeDescription?: string | undefined;\n}\n\nexport interface SpecDiff {\n added: SpecRequirement[];\n removed: SpecRequirement[];\n modified: Array<{\n requirement: SpecRequirement;\n previousVersion: SpecRequirement;\n changes: string[];\n }>;\n summary: string;\n}\n\n/**\n * Track spec versions and compute diffs between versions.\n */\nexport class SpecVersioning {\n private versions = new Map<string, SpecVersion[]>();\n\n /** Record a new version of a spec. */\n recordVersion(spec: Specification, changeDescription?: string): SpecVersion {\n const version: SpecVersion = {\n version: spec.version,\n spec: { ...spec },\n timestamp: Date.now(),\n changeDescription,\n };\n\n const history = this.versions.get(spec.id) ?? [];\n history.push(version);\n this.versions.set(spec.id, history);\n\n return version;\n }\n\n /** Get version history for a spec. */\n getHistory(specId: string): SpecVersion[] {\n return this.versions.get(specId) ?? [];\n }\n\n /** Get a specific version of a spec. */\n getVersion(specId: string, version: string): SpecVersion | undefined {\n const history = this.versions.get(specId) ?? [];\n return history.find((v) => v.version === version);\n }\n\n /** Get the latest version of a spec. */\n getLatest(specId: string): SpecVersion | undefined {\n const history = this.versions.get(specId) ?? [];\n return history[history.length - 1];\n }\n\n /** Compute diff between two versions of a spec. */\n diff(oldSpec: Specification, newSpec: Specification): SpecDiff {\n const oldReqs = new Map(oldSpec.requirements.map((r) => [r.id, r]));\n const newReqs = new Map(newSpec.requirements.map((r) => [r.id, r]));\n\n const added: SpecRequirement[] = [];\n const removed: SpecRequirement[] = [];\n const modified: SpecDiff['modified'] = [];\n\n // Find added and modified\n for (const [id, newReq] of newReqs) {\n const oldReq = oldReqs.get(id);\n if (!oldReq) {\n added.push(newReq);\n } else {\n const changes = this.compareRequirements(oldReq, newReq);\n if (changes.length > 0) {\n modified.push({\n requirement: newReq,\n previousVersion: oldReq,\n changes,\n });\n }\n }\n }\n\n // Find removed\n for (const [id, oldReq] of oldReqs) {\n if (!newReqs.has(id)) {\n removed.push(oldReq);\n }\n }\n\n const parts: string[] = [];\n if (added.length > 0) parts.push(`${added.length} added`);\n if (removed.length > 0) parts.push(`${removed.length} removed`);\n if (modified.length > 0) parts.push(`${modified.length} modified`);\n\n return {\n added,\n removed,\n modified,\n summary: parts.length > 0 ? parts.join(', ') : 'No changes',\n };\n }\n\n /**\n * Update a task graph incrementally based on spec changes.\n * - Added requirements → new tasks\n * - Removed requirements → remove tasks\n * - Modified requirements → update task descriptions\n * Returns the updated graph and list of changes made.\n */\n updateTaskGraph(\n graph: TaskGraph,\n oldSpec: Specification,\n newSpec: Specification,\n ): { graph: TaskGraph; changes: string[] } {\n const specDiff = this.diff(oldSpec, newSpec);\n const changes: string[] = [];\n\n // Map requirement IDs to task nodes\n const reqToTask = new Map<string, TaskNode>();\n for (const node of graph.nodes.values()) {\n if (node.specRequirementId) {\n reqToTask.set(node.specRequirementId, node);\n }\n }\n\n // Remove tasks for removed requirements\n for (const req of specDiff.removed) {\n const task = reqToTask.get(req.id);\n if (task) {\n graph.nodes.delete(task.id);\n graph.edges = graph.edges.filter((e) => e.from !== task.id && e.to !== task.id);\n changes.push(`Removed task: ${task.title}`);\n }\n }\n\n // Update tasks for modified requirements\n for (const mod of specDiff.modified) {\n const task = reqToTask.get(mod.requirement.id);\n if (task) {\n task.title = mod.requirement.description;\n task.description = this.buildTaskDescription(mod.requirement);\n task.priority = mod.requirement.priority;\n task.updatedAt = Date.now();\n changes.push(`Updated task: ${task.title} (${mod.changes.join(', ')})`);\n }\n }\n\n // Add tasks for new requirements\n for (const req of specDiff.added) {\n const now = Date.now();\n const newTask: TaskNode = {\n id: crypto.randomUUID(),\n title: req.description,\n description: this.buildTaskDescription(req),\n type: this.mapReqType(req.type),\n priority: req.priority,\n status: 'pending',\n specRequirementId: req.id,\n tags: [req.type, req.priority],\n createdAt: now,\n updatedAt: now,\n };\n graph.nodes.set(newTask.id, newTask);\n graph.rootNodes.push(newTask.id);\n changes.push(`Added task: ${newTask.title}`);\n }\n\n graph.updatedAt = Date.now();\n return { graph, changes };\n }\n\n private compareRequirements(old: SpecRequirement, current: SpecRequirement): string[] {\n const changes: string[] = [];\n if (old.description !== current.description) changes.push('description');\n if (old.priority !== current.priority) changes.push('priority');\n if (old.type !== current.type) changes.push('type');\n if (JSON.stringify(old.acceptanceCriteria) !== JSON.stringify(current.acceptanceCriteria)) {\n changes.push('acceptance criteria');\n }\n if (JSON.stringify(old.blockedBy) !== JSON.stringify(current.blockedBy)) {\n changes.push('dependencies');\n }\n return changes;\n }\n\n private buildTaskDescription(req: SpecRequirement): string {\n const lines = [req.description, '', `**Type:** ${req.type}`, `**Priority:** ${req.priority}`];\n if (req.acceptanceCriteria.length > 0) {\n lines.push('', '**Acceptance Criteria:**');\n for (const ac of req.acceptanceCriteria) {\n lines.push(`- ${ac}`);\n }\n }\n return lines.join('\\n');\n }\n\n private mapReqType(type: SpecRequirement['type']): TaskNode['type'] {\n switch (type) {\n case 'functional':\n return 'feature';\n case 'non-functional':\n return 'feature';\n case 'security':\n return 'feature';\n case 'performance':\n return 'feature';\n case 'ux':\n return 'feature';\n default:\n return assertNever(type);\n }\n }\n}\n","import type { TaskGraph, TaskNode } from '../types/task-graph.js';\nimport type { Specification } from '../types/spec.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { TaskTracker } from './task-tracker.js';\nimport { analyzeCriticalPath } from './critical-path.js';\n\nexport interface AutoExecutorOptions {\n tracker: TaskTracker;\n events: EventBus;\n /** Maximum concurrent tasks. Defaults to 1 (sequential). */\n maxConcurrent?: number | undefined;\n /** Maximum retry attempts for failed tasks. */\n maxRetries?: number | undefined;\n /** Custom task executor function. */\n executeTask: (task: TaskNode, context: TaskExecutionContext) => Promise<TaskExecutionResult>;\n /** Called before each task starts. */\n onTaskStart?: (((task: TaskNode) => void)) | undefined;\n /** Called after each task completes. */\n onTaskComplete?: (task: TaskNode, result: TaskExecutionResult) => void;\n /** Called when a task fails. */\n onTaskFail?: (task: TaskNode, error: Error, retryCount: number) => void;\n /** Called when all tasks are done or no more can execute. */\n onDone?: (((summary: ExecutionSummary) => void)) | undefined;\n}\n\nexport interface TaskExecutionContext {\n /** The spec being implemented. */\n spec: Specification;\n /** The full task graph. */\n graph: TaskGraph;\n /** The current task being executed. */\n task: TaskNode;\n /** Tasks that this task depends on. */\n dependencies: TaskNode[];\n /** Tasks that depend on this task. */\n dependents: TaskNode[];\n /** Retry count for this task (0 = first attempt). */\n retryCount: number;\n}\n\nexport interface TaskExecutionResult {\n success: boolean;\n output?: string | undefined;\n error?: string | undefined;\n /** If true, the task will be retried. */\n retry?: boolean | undefined;\n}\n\nexport interface ExecutionSummary {\n total: number;\n completed: number;\n failed: number;\n skipped: number;\n retried: number;\n duration: number;\n criticalPath: string[];\n}\n\n/**\n * Auto-executor that drives task execution with dependency resolution,\n * retry logic, and critical path awareness.\n */\nexport class AutoExecutor {\n private readonly opts: AutoExecutorOptions;\n private stopped = false;\n private retryMap = new Map<string, number>();\n\n constructor(opts: AutoExecutorOptions) {\n this.opts = opts;\n }\n\n /**\n * Execute all tasks in the graph, respecting dependencies.\n */\n async execute(graph: TaskGraph, spec: Specification): Promise<ExecutionSummary> {\n this.stopped = false;\n this.retryMap.clear();\n const startTime = Date.now();\n\n const critical = analyzeCriticalPath(graph);\n let completed = 0;\n let failed = 0;\n const skipped = 0;\n let retried = 0;\n\n while (!this.stopped) {\n const readyTasks = this.getReadyTasks(graph);\n\n if (readyTasks.length === 0) {\n // Check if all tasks are done\n const allDone = Array.from(graph.nodes.values()).every(\n (n) => n.status === 'completed' || n.status === 'failed',\n );\n if (allDone) break;\n\n // Check for deadlock (all remaining tasks are blocked by failed tasks)\n const hasDeadlock = this.detectDeadlock(graph);\n if (hasDeadlock) break;\n\n break;\n }\n\n // Execute batch\n const batch = readyTasks.slice(0, this.opts.maxConcurrent ?? 1);\n\n const results = await Promise.allSettled(\n batch.map((task) => this.executeTaskWithRetry(task, graph, spec)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n if (!result || !task) continue;\n\n if (result.status === 'fulfilled') {\n const { result: execResult, retries } = result.value;\n if (execResult.success) {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n completed++;\n if (retries > 0) retried++;\n this.opts.onTaskComplete?.(task, execResult);\n } else if (execResult.retry) {\n retried++;\n // Task will be retried on next iteration\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'failed', execResult.error);\n failed++;\n }\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'failed', String(result.reason));\n failed++;\n this.opts.onTaskFail?.(task, result.reason as Error, 0);\n }\n }\n }\n\n const duration = Date.now() - startTime;\n const summary: ExecutionSummary = {\n total: graph.nodes.size,\n completed,\n failed,\n skipped,\n retried,\n duration,\n criticalPath: critical.criticalPath,\n };\n\n this.opts.onDone?.(summary);\n return summary;\n }\n\n /** Stop execution. */\n stop(): void {\n this.stopped = true;\n }\n\n /** Get tasks that are ready to execute (all dependencies completed). */\n private getReadyTasks(graph: TaskGraph): TaskNode[] {\n const ready: TaskNode[] = [];\n\n for (const node of graph.nodes.values()) {\n if (node.status !== 'pending') continue;\n\n // Check if all blockers are completed\n const blockers = graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === node.id)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n\n const allBlockersDone = blockers.every((b) => b.status === 'completed');\n if (allBlockersDone) {\n ready.push(node);\n }\n }\n\n // Sort by priority\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n ready.sort((a, b) => (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4));\n\n return ready;\n }\n\n /** Execute a single task with retry logic. */\n private async executeTaskWithRetry(\n task: TaskNode,\n graph: TaskGraph,\n spec: Specification,\n ): Promise<{ result: TaskExecutionResult; retries: number }> {\n const maxRetries = this.opts.maxRetries ?? 2;\n let retryCount = this.retryMap.get(task.id) ?? 0;\n\n while (retryCount <= maxRetries) {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.opts.onTaskStart?.(task);\n\n const dependencies = this.getTaskDependencies(task.id, graph);\n const dependents = this.getTaskDependents(task.id, graph);\n\n const context: TaskExecutionContext = {\n spec,\n graph,\n task,\n dependencies,\n dependents,\n retryCount,\n };\n\n try {\n const result = await this.opts.executeTask(task, context);\n\n if (result.success) {\n const retriesForTask = this.retryMap.get(task.id) ?? 0;\n this.retryMap.delete(task.id);\n return { result, retries: retriesForTask };\n }\n\n if (result.retry && retryCount < maxRetries) {\n retryCount++;\n this.retryMap.set(task.id, retryCount);\n this.opts.tracker.updateNodeStatus(task.id, 'pending');\n continue;\n }\n\n return { result, retries: retryCount };\n } catch (error) {\n if (retryCount < maxRetries) {\n retryCount++;\n this.retryMap.set(task.id, retryCount);\n this.opts.tracker.updateNodeStatus(task.id, 'pending');\n this.opts.onTaskFail?.(task, error as Error, retryCount);\n continue;\n }\n\n return {\n result: {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n },\n retries: retryCount,\n };\n }\n }\n\n return { result: { success: false, error: 'Max retries exceeded' }, retries: retryCount };\n }\n\n /** Get tasks that this task depends on. */\n private getTaskDependencies(taskId: string, graph: TaskGraph): TaskNode[] {\n return graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === taskId)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n }\n\n /** Get tasks that depend on this task. */\n private getTaskDependents(taskId: string, graph: TaskGraph): TaskNode[] {\n return graph.edges\n .filter((e) => e.type === 'depends_on' && e.to === taskId)\n .map((e) => graph.nodes.get(e.from))\n .filter(Boolean) as TaskNode[];\n }\n\n /** Detect deadlock: all remaining tasks are blocked by failed tasks. */\n private detectDeadlock(graph: TaskGraph): boolean {\n const remaining = Array.from(graph.nodes.values()).filter(\n (n) => n.status === 'pending' || n.status === 'blocked',\n );\n\n if (remaining.length === 0) return false;\n\n return remaining.every((node) => {\n const blockers = graph.edges\n .filter((e) => e.type === 'depends_on' && e.from === node.id)\n .map((e) => graph.nodes.get(e.to))\n .filter(Boolean) as TaskNode[];\n\n return blockers.some((b) => b.status === 'failed');\n });\n }\n}\n\n/**\n * Create an auto-executor that works with TaskFlow.\n */\nexport function createAutoExecutor(opts: {\n tracker: TaskTracker;\n events: EventBus;\n executeTask: AutoExecutorOptions['executeTask'];\n maxConcurrent?: number | undefined;\n maxRetries?: number | undefined;\n}): AutoExecutor {\n return new AutoExecutor({\n tracker: opts.tracker,\n events: opts.events,\n executeTask: opts.executeTask,\n maxConcurrent: opts.maxConcurrent,\n maxRetries: opts.maxRetries,\n });\n}\n","/**\n * Cross-provider fallback model extension.\n *\n * Lives in core so EVERY agent surface can reuse it: the CLI leader, the CLI\n * director/host subagent factory, and the runtime light subagent factory (used\n * by standalone SDD runs). It wraps the provider runner and, when the active\n * model 429s / overloads / stream-hangs, rotates through a fallback chain. The\n * chain is recomputed from live config every turn, so changes take effect\n * without a restart; an empty chain makes the wrapper a no-op.\n *\n * Moved here from `@wrongstack/cli` (it only ever depended on core types) so the\n * runtime light factory can wire fallbacks for SDD worker subagents.\n */\nimport type { AgentExtension } from '../extension/extension-points.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { Config, ProviderConfig } from '../types/config.js';\n\nfunction visibleProviderModels(config: Config, providerId: string, providerModels: string[]): string[] {\n const entry = config.providers?.[providerId];\n return entry?.models !== undefined ? [...entry.models] : providerModels;\n}\nimport type { Logger } from '../types/logger.js';\nimport { type Provider, ProviderError, StreamHangError } from '../types/provider.js';\n\nexport interface FallbackModelDeps {\n /** Returns the live config (re-read each turn so `/model` switches are honored). */\n getConfig: () => Config;\n /**\n * Builds a credential-resolved Provider for a provider id (alias-resolved),\n * WITHOUT persisting anything to config/configStore. Supplied by the boot\n * path, which shares this with the `/model` switch logic. May be async — the\n * subagent host resolves a provider's real context window asynchronously.\n */\n buildProvider: (providerId: string, modelId?: string | undefined) => Provider | Promise<Provider>;\n /**\n * Called after the active model changes (a fallback hop or the primary\n * restore) so the host can refresh the auto-compaction / context-window\n * denominator — important when a fallback crosses to a smaller-window model.\n */\n onModelSwitch?: (providerId: string, modelId: string) => void | Promise<void>;\n events: EventBus;\n /** Optional — warnings about un-buildable fallback providers. */\n logger?: Logger | undefined;\n /**\n * Base cooldown after the configured primary fails with a fallback-worthy\n * error. While active, `beforeRun` leaves the context on the working fallback\n * instead of retrying the primary at the start of every turn. Default: 60s.\n * Set 0 to preserve the legacy \"probe primary every turn\" behavior.\n */\n primaryCooldownMs?: number | undefined;\n /**\n * Maximum exponential cooldown for repeated failed primary probes. Default:\n * 10 minutes. Ignored when `primaryCooldownMs` is 0.\n */\n primaryCooldownMaxMs?: number | undefined;\n /** Test hook for deterministic cooldown assertions. */\n now?: (() => number) | undefined;\n}\n\ninterface ModelRef {\n provider?: string | undefined;\n model: string;\n}\n\n/** Parse a fallback entry: `model`, `provider/model`, or `provider model`. */\nexport function parseModelRef(ref: string): ModelRef {\n const trimmed = ref.trim();\n const slash = trimmed.indexOf('/');\n if (slash !== -1) {\n // An empty provider (leading slash, e.g. \"/gpt\") means \"use the primary\n // provider\" — collapse to undefined so the `?? cfg.provider` fallback fires.\n return {\n provider: trimmed.slice(0, slash) || undefined,\n model: trimmed.slice(slash + 1).trim(),\n };\n }\n const parts = trimmed.split(/\\s+/);\n if (parts.length >= 2) {\n return { provider: parts[0], model: parts.slice(1).join(' ') };\n }\n return { model: trimmed };\n}\n\nexport function formatModelRef(ref: ModelRef, defaultProvider?: string | undefined): string {\n const provider = ref.provider ?? defaultProvider;\n return provider ? `${provider}/${ref.model}` : ref.model;\n}\n\nexport function normalizeModelRef(ref: string, defaultProvider?: string | undefined): string {\n const parsed = parseModelRef(ref);\n return formatModelRef(parsed, defaultProvider);\n}\n\nexport function fallbackProfileChain(config: Config, profileName: string | undefined): string[] {\n if (!profileName) return [];\n const chain = config.fallbackProfiles?.[profileName];\n return Array.isArray(chain) ? chain.filter((ref) => parseModelRef(ref).model) : [];\n}\n\n/**\n * Check if an error should trigger a fallback. Returns the status for\n * logging, or null if the error doesn't warrant a fallback attempt.\n *\n * Triggers on:\n * - StreamHangError (always — the upstream endpoint stalled mid-response)\n * - HTTP 429 (rate limited)\n * - HTTP 529 (overloaded)\n * - HTTP 5xx (server error)\n * - HTTP 0 / network error (connection failure, DNS failure, etc.)\n */\nfunction shouldFallback(err: unknown): number | null {\n if (err instanceof StreamHangError) {\n // Stream hangs are always worth falling back — the endpoint is\n // likely overloaded or has a routing issue.\n return 599;\n }\n if (!(err instanceof ProviderError)) return null;\n const s = err.status;\n // Network errors (status 0) — connection couldn't be established\n if (s === 0) return s;\n // Rate limits, overload, and server errors\n if (s === 429 || s === 529 || s >= 500) return s;\n return null;\n}\n\n/** A provider is usable as a fallback target when it has a stored key, a key\n * list, or a populated env var. Mirrors `setmodel.providerHasKey`. */\nfunction providerHasKey(entry: ProviderConfig | undefined): boolean {\n if (!entry) return false;\n if (typeof entry.apiKey === 'string' && entry.apiKey.length > 0) return true;\n if (Array.isArray(entry.apiKeys) && entry.apiKeys.some((k) => k?.apiKey)) return true;\n if (Array.isArray(entry.envVars) && entry.envVars.some((v) => !!process.env[v])) return true;\n return false;\n}\n\n/** Hard ceiling on the auto-derived chain so we don't burn through a dozen\n * models on a transient blip. */\nconst SMART_DEFAULT_MAX = 4;\n\n/**\n * Derive a fallback chain from the configured providers when the user has not\n * set an explicit `fallbackModels` list. Picks declared models from every\n * keyed provider — same-provider alternatives first (same key, cheapest\n * failover), then cross-provider — excluding the active leader model. Returns\n * `[]` when nothing usable is configured (e.g. providers with no `models`\n * list), in which case the extension is a no-op.\n */\nexport function smartDefaultFallbackChain(config: Config): string[] {\n const leaderProvider = config.provider;\n const leaderModel = config.model;\n const providers = config.providers ?? {};\n const favoriteSet = new Set(\n (config.favoriteModels ?? []).map((ref) => normalizeModelRef(ref, leaderProvider)),\n );\n const hasFavorites = favoriteSet.size > 0;\n const favoritesOnly = config.favoriteModelsOnly === true;\n const seen = new Set<string>();\n const favoriteRefs: string[] = [];\n const sameProvider: string[] = [];\n const crossProvider: string[] = [];\n\n // Leader provider first so its other models lead the chain.\n const ids = Object.keys(providers).sort((a, b) =>\n a === leaderProvider ? -1 : b === leaderProvider ? 1 : a.localeCompare(b),\n );\n\n for (const id of ids) {\n const entry = providers[id];\n if (!providerHasKey(entry)) continue;\n const models = visibleProviderModels(config, id, entry?.models ?? []);\n for (const model of models) {\n if (id === leaderProvider && model === leaderModel) continue;\n const ref = `${id}/${model}`;\n if (seen.has(ref)) continue;\n seen.add(ref);\n if (favoriteSet.has(ref)) {\n favoriteRefs.push(ref);\n continue;\n }\n if (favoritesOnly && hasFavorites) continue;\n (id === leaderProvider ? sameProvider : crossProvider).push(ref);\n }\n }\n return [...favoriteRefs, ...sameProvider, ...crossProvider].slice(0, SMART_DEFAULT_MAX);\n}\n\n/**\n * The effective fallback chain for a turn: the explicit `fallbackModels` list\n * when non-empty, otherwise the smart default (unless `fallbackAuto` is off).\n */\nexport function effectiveFallbackChain(config: Config): string[] {\n const explicit = config.fallbackModels ?? [];\n const filteredExplicit = explicit.filter((ref) => {\n const parsed = parseModelRef(ref);\n if (!parsed.model) return false;\n const providerId = parsed.provider ?? config.provider;\n const entry = config.providers?.[providerId];\n if (!entry?.models) return true;\n return entry.models.includes(parsed.model);\n });\n if (filteredExplicit.length > 0) return filteredExplicit;\n if (config.fallbackAuto === false) return [];\n return smartDefaultFallbackChain(config);\n}\n\nconst DEFAULT_PRIMARY_COOLDOWN_MS = 60_000;\nconst DEFAULT_PRIMARY_COOLDOWN_MAX_MS = 10 * 60_000;\n\nfunction sameTarget(\n a: { providerId: string; model: string } | undefined,\n b: { providerId: string; model: string },\n): boolean {\n return !!a && a.providerId === b.providerId && a.model === b.model;\n}\n\n/**\n * Build the cross-provider fallback extension. Always returns an extension —\n * the effective chain (`effectiveFallbackChain`) is recomputed every turn from\n * the live config, so a chain that is empty at boot but populated later (via\n * `/fallback add` or the smart default kicking in once a key is added) takes\n * effect WITHOUT a restart. An empty chain makes the wrapper a no-op (it just\n * rethrows the original error).\n *\n * Mechanism (see plan): wraps the provider runner. The inner runner already\n * applies the per-model retry policy (backoff, up to 5 tries for 429), so the\n * fallback only engages AFTER the active model's own retries are exhausted.\n * Because the wrapper resolves within a single provider call, it does not\n * consume the agent loop's `recoveryRetries` budget — chains longer than two\n * entries work. `beforeRun` keeps the last working fallback while the primary\n * is cooling down, then restores the configured primary for a half-open probe.\n */\nexport function createFallbackModelExtension(deps: FallbackModelDeps): AgentExtension {\n // True when a prior turn left the live context on a fallback model.\n let dirty = false;\n let primaryFailureStreak = 0;\n let blockedPrimary: { providerId: string; model: string } | undefined;\n let primaryBlockedUntil = 0;\n\n const now = () => deps.now?.() ?? Date.now();\n const primaryTarget = (cfg: Config) => ({ providerId: cfg.provider, model: cfg.model });\n const cooldownBase = () => Math.max(0, deps.primaryCooldownMs ?? DEFAULT_PRIMARY_COOLDOWN_MS);\n const cooldownMax = () => Math.max(cooldownBase(), deps.primaryCooldownMaxMs ?? DEFAULT_PRIMARY_COOLDOWN_MAX_MS);\n const primaryInCooldown = (cfg: Config) =>\n sameTarget(blockedPrimary, primaryTarget(cfg)) && now() < primaryBlockedUntil;\n\n const markPrimaryFailure = (cfg: Config) => {\n const primary = primaryTarget(cfg);\n primaryFailureStreak = sameTarget(blockedPrimary, primary) ? primaryFailureStreak + 1 : 1;\n blockedPrimary = primary;\n const base = cooldownBase();\n if (base <= 0) {\n primaryBlockedUntil = 0;\n return;\n }\n const multiplier = 2 ** Math.max(0, primaryFailureStreak - 1);\n primaryBlockedUntil = now() + Math.min(cooldownMax(), base * multiplier);\n };\n\n const resetPrimaryLadder = (cfg: Config) => {\n if (!sameTarget(blockedPrimary, primaryTarget(cfg))) return;\n primaryFailureStreak = 0;\n blockedPrimary = undefined;\n primaryBlockedUntil = 0;\n };\n\n return {\n name: 'fallback-model',\n\n beforeRun: async (ctx) => {\n if (!dirty) return;\n const cfg = deps.getConfig();\n if (primaryInCooldown(cfg)) return;\n try {\n ctx.provider = await deps.buildProvider(cfg.provider, cfg.model);\n ctx.model = cfg.model;\n await deps.onModelSwitch?.(cfg.provider, cfg.model);\n // The next provider call is the half-open primary probe. If it\n // succeeds, the wrapper resets the ladder; if it fails, the catch path\n // marks a longer cooldown and rotates back through the chain.\n primaryBlockedUntil = 0;\n } catch (err) {\n deps.logger?.warn(\n `fallback-model: could not restore primary \"${cfg.provider}/${cfg.model}\": ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n markPrimaryFailure(cfg);\n return;\n }\n dirty = false;\n },\n\n wrapProviderRunner: async (ctx, request, inner) => {\n try {\n const response = await inner(ctx, request);\n const cfg = deps.getConfig();\n if (ctx.provider.id === cfg.provider && ctx.model === cfg.model) {\n resetPrimaryLadder(cfg);\n }\n return response;\n } catch (firstErr) {\n let lastErr: unknown = firstErr;\n const cfg = deps.getConfig();\n const chain = effectiveFallbackChain(cfg);\n if (shouldFallback(firstErr) !== null && ctx.provider.id === cfg.provider && ctx.model === cfg.model) {\n markPrimaryFailure(cfg);\n }\n\n for (const ref of chain) {\n const status = shouldFallback(lastErr);\n if (status === null) break; // not a fallback-worthy error\n\n const parsed = parseModelRef(ref);\n if (!parsed.model) continue;\n const targetProviderId = parsed.provider ?? cfg.provider;\n if (targetProviderId === ctx.provider.id && parsed.model === ctx.model) continue;\n if (\n primaryInCooldown(cfg) &&\n targetProviderId === cfg.provider &&\n parsed.model === cfg.model\n ) {\n continue;\n }\n\n const from = { providerId: ctx.provider.id, model: ctx.model };\n\n let nextProvider: Provider;\n try {\n nextProvider = await deps.buildProvider(targetProviderId, parsed.model);\n } catch (err) {\n deps.logger?.warn(\n `fallback-model: skipping \"${ref}\" — cannot build provider \"${targetProviderId}\": ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n continue;\n }\n\n const providerSwitched = nextProvider.id !== from.providerId;\n ctx.provider = nextProvider;\n ctx.model = parsed.model;\n request.model = parsed.model;\n dirty = true;\n await deps.onModelSwitch?.(targetProviderId, parsed.model);\n\n deps.events.emit('provider.fallback', {\n sessionId: ctx.session?.id,\n from,\n to: { providerId: nextProvider.id, model: parsed.model },\n status,\n providerSwitched,\n });\n\n try {\n return await inner(ctx, request);\n } catch (err) {\n lastErr = err;\n }\n }\n\n throw lastErr;\n }\n },\n };\n}\n","// SddSupervisor — a decision agent over an SDD parallel run.\n//\n// When a task has exhausted its retries and is about to go terminal, the\n// SddParallelRun consults `superviseFailure` (see SddParallelRunOptions). This\n// supervisor answers that consult by asking a BrainArbiter (policy → LLM →\n// human, reused from the coordination layer) whether to retry, reassign to a\n// different model, split the task into sub-tasks, or give up. The goal is the\n// user's: a run should \"decide\" rather than dead-end — never silently get stuck.\n//\n// Safe by default: with the conservative DefaultBrainArbiter (no LLM) the\n// `fallback: 'continue'` policy resolves to a plain retry, so wiring a supervisor\n// never makes a run worse — it only adds intelligence when an LLM brain is wired.\n\nimport type { BrainArbiter } from '../coordination/brain.js';\nimport { parseModelRef } from '../core/fallback-model.js';\nimport type { TaskNode } from '../types/task-graph.js';\nimport type { SddSubtaskSpec, SddSupervisorVerdict } from './sdd-parallel-run.js';\n\nexport interface SddSupervisorOptions {\n /** Decision authority (policy/LLM/human). Reuse the session's TOKENS.BrainArbiter. */\n brain: BrainArbiter;\n /**\n * Models to rotate through on a `reassign` verdict (e.g. the run's fallback\n * chain). Omit to drop the reassign option entirely.\n */\n reassignModels?: string[] | undefined;\n /**\n * Optional sub-task generator for a `split` verdict — typically an LLM call\n * that decomposes the failing task into smaller pieces. Omit to drop the split\n * option. Returning an empty array degrades the split into a retry.\n */\n generateSubtasks?:\n | ((info: { task: TaskNode; error: string }) => Promise<SddSubtaskSpec[]>)\n | undefined;\n /**\n * Let the tiered brain's LLM layer actually pick the verdict.\n *\n * Default (false) requests `fallback: 'continue'`, which the policy layer\n * answers immediately (a bounded retry) — the LLM never runs, so `reassign`/\n * `split` can't be chosen. Set true to request `fallback: 'ask_human'`, which\n * makes the policy escalate so the autonomous (LLM) layer decides.\n *\n * ONLY enable this when the supplied `brain` will NOT block on a human prompt\n * for an unresolved decision (i.e. it has an autonomous layer and is NOT\n * wrapped in `HumanEscalatingBrainArbiter`). When the LLM can't decide (no\n * autonomous layer / over the risk ceiling / LLM down) the brain returns\n * `ask_human`, which the supervisor degrades to a **bounded retry** (never a\n * block, never a dead-end). A human-escalating brain would instead block\n * inside `decide()` and wedge the run — keep this false there.\n */\n requestLlmVerdict?: boolean | undefined;\n}\n\nexport class SddSupervisor {\n constructor(private readonly opts: SddSupervisorOptions) {}\n\n /**\n * Bind this as `SddParallelRunOptions.superviseFailure`. Returns a verdict the\n * run applies, or `undefined`/`{action:'fail'}` to let the task terminal-fail.\n */\n readonly superviseFailure = async (info: {\n task: TaskNode;\n error: string;\n attempts: number;\n }): Promise<SddSupervisorVerdict | undefined> => {\n const { task, error, attempts } = info;\n const canReassign = (this.opts.reassignModels?.length ?? 0) > 0;\n const canSplit = Boolean(this.opts.generateSubtasks);\n\n const decision = await this.opts.brain.decide({\n id: `sdd-supervisor-${task.id}-${attempts}`,\n source: 'system',\n question: `SDD task \"${task.title}\" exhausted its retries. How should the run proceed?`,\n context: `Error: ${error}\\nSupervisor rescues already used: ${attempts}`,\n options: [\n { id: 'retry', label: 'Retry the task as-is', recommended: true },\n ...(canReassign ? [{ id: 'reassign', label: 'Reassign to a different model' }] : []),\n ...(canSplit ? [{ id: 'split', label: 'Split into smaller sub-tasks' }] : []),\n { id: 'fail', label: 'Give up and mark the task failed' },\n ],\n // Higher risk once we've already rescued it once — pushes a wired LLM/human\n // toward a decisive verdict instead of looping retries.\n risk: attempts >= 1 ? 'high' : 'medium',\n // `continue` → policy answers in place (bounded retry, LLM never runs).\n // `ask_human` → policy escalates so the autonomous LLM layer can actually\n // pick reassign/split (see requestLlmVerdict's safety contract).\n fallback: this.opts.requestLlmVerdict ? 'ask_human' : 'continue',\n });\n\n // A hard deny is a decisive \"give up\" → terminal fail. An unresolved\n // escalation (`ask_human`: the LLM declined / was unavailable / over the\n // ceiling) degrades to a bounded retry so the run keeps moving rather than\n // dead-ending — the never-stuck invariant. (A human-escalating brain would\n // have blocked inside decide() already; requestLlmVerdict forbids that.)\n if (decision.type === 'deny') return { action: 'fail' };\n if (decision.type !== 'answer') return { action: 'retry' };\n // DefaultBrainArbiter's 'continue' answer carries no optionId → retry.\n const choice = decision.optionId ?? 'retry';\n\n if (choice === 'fail') return { action: 'fail' };\n if (choice === 'reassign' && canReassign) {\n const models = this.opts.reassignModels as string[];\n // Rotate through the chain by rescue count; a `provider/model` entry sets\n // both fields so the worker dispatches on the right provider (a bare model\n // keeps the task's current provider).\n const ref = models[attempts % models.length];\n const parsed = ref ? parseModelRef(ref) : undefined;\n return { action: 'reassign', model: parsed?.model, provider: parsed?.provider };\n }\n if (choice === 'split' && this.opts.generateSubtasks) {\n const subtasks = await this.opts\n .generateSubtasks({ task, error })\n .catch(() => [] as SddSubtaskSpec[]);\n return subtasks.length ? { action: 'split', subtasks } : { action: 'retry' };\n }\n return { action: 'retry' };\n };\n}\n","// makeCommandVerifier — the shared completion-gate verifier for an SDD parallel\n// run. Both surfaces that start a run (the CLI `/sdd parallel` handler and the\n// standalone WebUI wizard) need an identical `verifyTask`: when a task declares\n// `metadata.verificationCommand`, run it in the task's worktree cwd and only let\n// the task complete on exit 0. No command → no-op. Bounded by a timeout so a\n// hung verifier can't wedge the run.\n//\n// core may use node:child_process directly — it already does for git detection.\n\nimport { spawn } from 'node:child_process';\nimport type { TaskNode } from '../types/task-graph.js';\nimport type { TaskResult } from '../types/multi-agent.js';\n\nexport interface CommandVerifierOptions {\n /** Metadata key holding the shell command to run. Default 'verificationCommand'. */\n metadataKey?: string;\n /** Kill + fail the verification after this many ms. Default 180_000 (3 min). */\n timeoutMs?: number;\n}\n\n/**\n * Build a `verifyTask` closure (shape matches {@link SddParallelRunOptions.verifyTask}).\n * Returns `{ ok: true }` immediately when the task carries no verification command,\n * otherwise spawns the command in `cwd` (shell, output discarded) and resolves\n * `{ ok: false, reason }` on non-zero exit, spawn error, or timeout.\n */\nexport function makeCommandVerifier(options: CommandVerifierOptions = {}) {\n const metadataKey = options.metadataKey ?? 'verificationCommand';\n const timeoutMs = options.timeoutMs ?? 180_000;\n\n return async function verifyTask(info: {\n task: TaskNode;\n result: TaskResult;\n cwd: string;\n }): Promise<{ ok: boolean; reason?: string }> {\n const cmd = info.task.metadata?.[metadataKey];\n if (typeof cmd !== 'string' || !cmd.trim()) return { ok: true };\n\n return await new Promise((resolve) => {\n // Parse the command string through an explicit shell invocation rather than\n // spawn(..., { shell: true }), which lets Node interpolate the whole string\n // and exposes any metacharacters (; && | $() etc.) as injection vectors\n // in the command itself. sh -c \"cmd\" / cmd /s /c \"cmd\" passes the full string\n // to the shell as a single positional argument — the shell interprets it, not Node.\n const isWindows = process.platform === 'win32';\n const [shell, ...shellArgs] = isWindows\n ? ['cmd', '/d', '/c'] satisfies [string, ...string[]]\n : ['sh', '-c'] satisfies [string, ...string[]];\n const child = spawn(shell, [...shellArgs, cmd], {\n cwd: info.cwd,\n shell: false,\n windowsHide: true,\n stdio: 'ignore',\n });\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill();\n resolve({ ok: false, reason: `verification timed out: ${cmd}` });\n }, timeoutMs);\n child.on('exit', (code) => {\n clearTimeout(timer);\n // Don't overwrite the timeout reason once the timer has fired.\n if (timedOut) return;\n resolve(\n code === 0 ? { ok: true } : { ok: false, reason: `verification failed (exit ${code}): ${cmd}` },\n );\n });\n child.on('error', (err) => {\n clearTimeout(timer);\n // Don't overwrite the timeout reason once the timer has fired.\n if (timedOut) return;\n resolve({ ok: false, reason: `verification spawn error: ${String(err)}` });\n });\n });\n };\n}\n","import { readFileSync, statSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function readBundledInstructionText(relativePath: string): string {\n for (const root of instructionRootCandidates()) {\n try {\n return readFileSync(path.join(root, relativePath), 'utf8').trimEnd();\n } catch {\n // try next candidate\n }\n }\n return '';\n}\n\nexport function renderInstructionTemplate(\n template: string,\n values: Record<string, string>,\n): string {\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_.-]+)\\s*\\}\\}/g, (match, key: string) =>\n Object.hasOwn(values, key) ? values[key] ?? '' : match,\n );\n}\n\nfunction instructionRootCandidates(): string[] {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, '../../instructions'),\n path.resolve(here, '../instructions'),\n path.resolve(here, 'instructions'),\n ];\n return candidates.sort((a, b) => Number(!isDirectory(a)) - Number(!isDirectory(b)));\n}\n\nfunction isDirectory(candidate: string): boolean {\n try {\n return statSync(candidate).isDirectory();\n } catch {\n return false;\n }\n}\n","// makeLlmSubtaskGenerator — the LLM auto-split backing for the SDD supervisor.\n//\n// When the supervisor's brain returns a `split` verdict for a retry-exhausted\n// task, it calls `generateSubtasks(task, error)` to decompose the failing task\n// into smaller pieces. This helper produces that closure from a single `run`\n// callback (one isolated LLM turn → text), so core stays free of agent-spawning\n// coupling: each surface supplies the runner via its own subagent factory (the\n// same isolated-turn pattern as the interview driver).\n//\n// Safety: the result is heavily validated and bounded. A leaf can only be split\n// into ≥2 well-formed sub-tasks; anything else (parse failure, 0/1 items, junk)\n// returns [] and the supervisor degrades the split into a bounded retry. The\n// per-task `maxSupervisorEscalations` guard already caps how often this runs, so\n// recursive splitting can't run away.\n\nimport type { TaskNode, TaskPriority, TaskType } from '../types/task-graph.js';\nimport {\n readBundledInstructionText,\n renderInstructionTemplate,\n} from '../utils/instruction-file.js';\nimport type { SddSubtaskSpec } from './sdd-parallel-run.js';\n\nconst TASK_TYPES = new Set<TaskType>(['feature', 'bugfix', 'refactor', 'docs', 'test', 'chore']);\nconst PRIORITIES = new Set<TaskPriority>(['critical', 'high', 'medium', 'low']);\n\nexport interface SubtaskGeneratorOptions {\n /** Runs one self-contained, isolated LLM turn and resolves its final text. */\n run: (prompt: string) => Promise<string>;\n /** Minimum well-formed sub-tasks required to accept a split. Default 2. */\n minSubtasks?: number;\n /** Maximum sub-tasks kept (excess is dropped). Default 4. */\n maxSubtasks?: number;\n}\n\n/** Extract a JSON array from model output (```json fence or first bare `[...]`). */\nfunction extractJsonArray(text: string): string | null {\n const fence = text.match(/```(?:json)?\\s*(\\[[\\s\\S]*?\\])\\s*```/);\n if (fence?.[1]) return fence[1].trim();\n const bare = text.match(/(\\[[\\s\\S]*\\])/);\n if (bare?.[1]) {\n try {\n if (Array.isArray(JSON.parse(bare[1]))) return bare[1];\n } catch {\n // not valid JSON — fall through\n }\n }\n return null;\n}\n\nfunction buildPrompt(task: TaskNode, error: string, min: number, max: number): string {\n return renderInstructionTemplate(readBundledInstructionText('sdd/decompose-task.md'), {\n minSubtasks: String(min),\n maxSubtasks: String(max),\n title: task.title,\n description: task.description,\n error: error || '(none recorded)',\n });\n}\n\n/**\n * Build a `SddSupervisorOptions.generateSubtasks` closure backed by an LLM turn.\n * Returns [] on any failure (parse error, too few valid items, runner throw), so\n * the supervisor safely degrades a `split` verdict into a retry.\n */\nexport function makeLlmSubtaskGenerator(opts: SubtaskGeneratorOptions) {\n const min = Math.max(2, opts.minSubtasks ?? 2);\n const max = Math.max(min, opts.maxSubtasks ?? 4);\n\n return async function generateSubtasks(info: {\n task: TaskNode;\n error: string;\n }): Promise<SddSubtaskSpec[]> {\n let text: string;\n try {\n text = await opts.run(buildPrompt(info.task, info.error, min, max));\n } catch {\n return [];\n }\n\n const json = extractJsonArray(text ?? '');\n if (!json) return [];\n\n let raw: unknown;\n try {\n raw = JSON.parse(json);\n } catch {\n return [];\n }\n if (!Array.isArray(raw)) return [];\n\n const specs: SddSubtaskSpec[] = [];\n for (const item of raw) {\n if (!item || typeof item !== 'object') continue;\n const r = item as Record<string, unknown>;\n const title = typeof r['title'] === 'string' ? r['title'].trim() : '';\n const description = typeof r['description'] === 'string' ? r['description'].trim() : '';\n if (!title || !description) continue;\n const type = TASK_TYPES.has(r['type'] as TaskType) ? (r['type'] as TaskType) : undefined;\n const priority = PRIORITIES.has(r['priority'] as TaskPriority)\n ? (r['priority'] as TaskPriority)\n : undefined;\n specs.push({ title, description, type, priority });\n if (specs.length >= max) break;\n }\n\n // A split must yield at least `min` genuinely smaller pieces — otherwise it's\n // not a decomposition and we let the supervisor retry instead.\n return specs.length >= min ? specs : [];\n };\n}\n","// makePreferSideConflictResolver — a conservative, opt-in merge-conflict resolver\n// for an SDD parallel run's worktree integration.\n//\n// Wired as `SddParallelRunOptions.conflictResolver`, it is consulted when a\n// completed task's worktree can't squash-merge cleanly. It rewrites each\n// conflicted file by keeping ONE side of every conflict hunk:\n// • 'incoming' — the worktree's changes (theirs); good for generated artefacts\n// a worker is expected to regenerate wholesale.\n// • 'base' — the already-merged base (ours); discards the worktree's edit.\n// The WorktreeManager re-stages and REJECTS the resolution if any conflict marker\n// survives (`git diff --cached --check`), so a malformed rewrite degrades safely\n// to the conservative retry-on-fresh-base path rather than corrupting the base.\n//\n// This is intentionally blunt (no semantic merge). It is OFF by default — callers\n// opt in explicitly — because auto-picking a side can silently drop work.\n\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join, isAbsolute } from 'node:path';\nimport type { TaskNode } from '../types/task-graph.js';\nimport {\n readBundledInstructionText,\n renderInstructionTemplate,\n} from '../utils/instruction-file.js';\n\nexport type ConflictSide = 'incoming' | 'base';\n\nconst START = '<<<<<<<';\nconst BASE = '|||||||';\nconst SEP = '=======';\nconst END = '>>>>>>>';\n\n/**\n * Resolve every standard git conflict hunk in `text` by keeping `side`. Handles\n * both 2-way (`<<<<<<< / ======= / >>>>>>>`) and diff3 (`||||||| base`) markers.\n * Returns the rewritten text (markers removed).\n */\nexport function resolveConflictText(text: string, side: ConflictSide): string {\n const out: string[] = [];\n // 'normal' | 'ours' | 'base' | 'theirs'\n let state: 'normal' | 'ours' | 'base' | 'theirs' = 'normal';\n for (const line of text.split('\\n')) {\n const marker = line.slice(0, 7);\n if (state === 'normal' && marker === START) {\n state = 'ours';\n continue;\n }\n if (state !== 'normal' && marker === BASE) {\n state = 'base';\n continue;\n }\n if (state !== 'normal' && marker === SEP) {\n state = 'theirs';\n continue;\n }\n if (state !== 'normal' && marker === END) {\n state = 'normal';\n continue;\n }\n if (state === 'normal') out.push(line);\n else if (state === 'ours' && side === 'base') out.push(line);\n else if (state === 'theirs' && side === 'incoming') out.push(line);\n // 'base' section + the non-selected side are dropped.\n }\n return out.join('\\n');\n}\n\n/** True when `text` still contains a git conflict marker line. */\nexport function hasConflictMarkers(text: string): boolean {\n return text.split('\\n').some((l) => {\n const m = l.slice(0, 7);\n return m === START || m === SEP || m === END || m === BASE;\n });\n}\n\n/**\n * Build a `conflictResolver` that keeps `side` of every hunk in each conflicted\n * file. Returns false (abort → conservative fail) if any file can't be read,\n * written, or still has markers after the rewrite.\n */\nexport function makePreferSideConflictResolver(side: ConflictSide) {\n return async function conflictResolver(info: {\n task: TaskNode;\n conflictFiles: string[];\n cwd: string;\n }): Promise<boolean> {\n if (info.conflictFiles.length === 0) return false;\n for (const rel of info.conflictFiles) {\n const abs = isAbsolute(rel) ? rel : join(info.cwd, rel);\n let content: string;\n try {\n content = await readFile(abs, 'utf8');\n } catch {\n return false; // can't read → don't risk a partial resolution\n }\n const resolved = resolveConflictText(content, side);\n if (hasConflictMarkers(resolved)) return false; // refuse a half-resolved file\n try {\n await writeFile(abs, resolved, 'utf8');\n } catch {\n return false;\n }\n }\n return true;\n };\n}\n\nexport interface LlmConflictResolverOptions {\n /** Runs one self-contained, isolated LLM turn and resolves its final text. */\n run: (prompt: string) => Promise<string>;\n /**\n * Reject a resolution that shrinks the file below this fraction of its original\n * non-marker line count — a crude guard against the model dropping content.\n * Default 0.5.\n */\n minRetainedFraction?: number;\n}\n\n/** Strip a single surrounding ``` code fence (any/no language) if present. */\nfunction unfence(text: string): string {\n const m = text.match(/^[\\s\\S]*?```[^\\n]*\\n([\\s\\S]*?)\\n```[\\s\\S]*$/);\n return m?.[1] !== undefined ? m[1] : text.trim();\n}\n\n/** Original line count ignoring conflict-marker lines (the resolution baseline). */\nfunction nonMarkerLineCount(text: string): number {\n return text.split('\\n').filter((l) => {\n const m = l.slice(0, 7);\n return m !== START && m !== SEP && m !== END && m !== BASE;\n }).length;\n}\n\n/**\n * Build an LLM-backed `conflictResolver`: for each conflicted file it asks the\n * model (via one isolated `run` turn) to produce the fully resolved file and\n * writes it back. Heavily guarded — returns false (→ conservative abort/retry)\n * if the model leaves a marker, returns junk, or drops too much content. The\n * WorktreeManager STILL rejects any surviving marker, and (when a `verifyTask`\n * is configured) the run re-verifies the integrated base and reverts a\n * regression — so a bad LLM merge can never silently stick. OFF by default.\n */\nexport function makeLlmConflictResolver(opts: LlmConflictResolverOptions) {\n const minFraction = opts.minRetainedFraction ?? 0.5;\n\n return async function conflictResolver(info: {\n task: TaskNode;\n conflictFiles: string[];\n cwd: string;\n }): Promise<boolean> {\n if (info.conflictFiles.length === 0) return false;\n for (const rel of info.conflictFiles) {\n const abs = isAbsolute(rel) ? rel : join(info.cwd, rel);\n let content: string;\n try {\n content = await readFile(abs, 'utf8');\n } catch {\n return false;\n }\n if (!hasConflictMarkers(content)) continue; // already clean — nothing to do\n\n const prompt = renderInstructionTemplate(\n readBundledInstructionText('sdd/merge-conflict-resolver.md'),\n {\n file: rel,\n content,\n },\n );\n\n let out: string;\n try {\n out = await opts.run(prompt);\n } catch {\n return false;\n }\n const resolved = unfence(out ?? '');\n if (!resolved.trim() || hasConflictMarkers(resolved)) return false;\n // Content-drop guard: a resolution far smaller than the original almost\n // certainly lost real work — abort rather than write it.\n if (resolved.split('\\n').length < Math.floor(nonMarkerLineCount(content) * minFraction)) {\n return false;\n }\n try {\n await writeFile(abs, resolved, 'utf8');\n } catch {\n return false;\n }\n }\n return true;\n };\n}\n"]}
|