@ordewell/web 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -930,6 +930,7 @@ function editFailure(c, err) {
930
930
  console.error("[plans] task edit failed:", err);
931
931
  return c.json({ error: e.message || "Internal error" }, 500);
932
932
  }
933
+ var NO_CHECKPOINT = "The task is not waiting at a checkpoint \u2014 it was answered already, withdrawn, or has no runner left to hear it.";
933
934
  function conversationFailure(c, err) {
934
935
  const e = err;
935
936
  if (e.message === "Session not found") return c.json({ error: e.message }, 404);
@@ -1020,6 +1021,25 @@ function plansRoute(pool2) {
1020
1021
  return editFailure(c, err);
1021
1022
  }
1022
1023
  });
1024
+ router.post("/:sessionId/tasks/:taskId/messages/now", async (c) => {
1025
+ try {
1026
+ const body = await c.req.json().catch(() => ({}));
1027
+ const text = typeof body === "object" && body !== null && "text" in body ? body.text : void 0;
1028
+ if (typeof text !== "string" || !text.trim()) return c.json({ error: "text is required" }, 400);
1029
+ const id = pool2.session(c.req.param("sessionId")).forceSendTaskMessage(c.req.param("taskId"), text);
1030
+ return c.json({ id });
1031
+ } catch (err) {
1032
+ return editFailure(c, err);
1033
+ }
1034
+ });
1035
+ router.post("/:sessionId/tasks/:taskId/messages/:messageId/now", (c) => {
1036
+ try {
1037
+ const sent = pool2.session(c.req.param("sessionId")).forceSendQueuedTaskMessage(c.req.param("taskId"), c.req.param("messageId"));
1038
+ return c.json({ sent });
1039
+ } catch (err) {
1040
+ return editFailure(c, err);
1041
+ }
1042
+ });
1023
1043
  router.post("/:sessionId/tasks/:taskId/continue", async (c) => {
1024
1044
  try {
1025
1045
  const body = await c.req.json().catch(() => ({}));
@@ -1047,6 +1067,30 @@ function plansRoute(pool2) {
1047
1067
  return editFailure(c, err);
1048
1068
  }
1049
1069
  });
1070
+ router.post("/:sessionId/tasks/:taskId/checkpoint/approve", (c) => {
1071
+ try {
1072
+ const session = pool2.session(c.req.param("sessionId"));
1073
+ const taskId = c.req.param("taskId");
1074
+ if (!session.awaitsCheckpoint(taskId)) return c.json({ error: NO_CHECKPOINT }, 409);
1075
+ session.approveCheckpoint(taskId);
1076
+ return c.json({ ok: true });
1077
+ } catch (err) {
1078
+ return editFailure(c, err);
1079
+ }
1080
+ });
1081
+ router.post("/:sessionId/tasks/:taskId/checkpoint/reject", async (c) => {
1082
+ try {
1083
+ const body = await c.req.json().catch(() => ({}));
1084
+ const reason = typeof body === "object" && body !== null && "reason" in body && typeof body.reason === "string" ? body.reason.trim() : "";
1085
+ const session = pool2.session(c.req.param("sessionId"));
1086
+ const taskId = c.req.param("taskId");
1087
+ if (!session.awaitsCheckpoint(taskId)) return c.json({ error: NO_CHECKPOINT }, 409);
1088
+ session.rejectCheckpoint(taskId, reason || void 0);
1089
+ return c.json({ ok: true });
1090
+ } catch (err) {
1091
+ return editFailure(c, err);
1092
+ }
1093
+ });
1050
1094
  router.get("/:sessionId/tasks/:taskId/merge-gate", (c) => {
1051
1095
  try {
1052
1096
  const session = pool2.session(c.req.param("sessionId"));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../server/adapters/WebConfig.ts","../../server/utils/workspaceScanner.ts","../../server/adapters/run.ts","../../server/adapters/PoolFileSystem.ts","../../server/adapters/PoolAwareRunner.ts","../../server/adapters/TerminalHost.ts","../../server/pool/orchestratorPool.ts","../../server/routes/sessions.ts","../../server/routes/plans.ts","../../server/routes/runners.ts","../../server/routes/models.ts","../../server/routes/workspaces.ts","../../server/routes/approvals.ts","../../server/routes/settings.ts","../../server/routes/commands.ts","../../server/ws/stream.ts","../../server/security/admission.ts","../../server/app.ts","../../server/nodeAdapter.ts","../../server/main.ts"],"names":["BaseConfig","isCliProvider","resolveProvider","normalizeGeminiModel","fs","path","args","resolve","execFile","BaseFileSystem","researchToolsPath","withPath","GREP_PCRE_PROBE_ARGS","grepRegexFromProbe","result","buildGlobArgs","capped","applyHeadLimit","formatSearchOutput","SEARCH_EXCLUSIONS","path2","buildGrepArgs","buildFallbackGrepArgs","filterFallbackByAnchoredInclude","STOPPED_TOOL_RESULT","HeadlessRunner","port","hasTmux","TmuxRunner","RunnerRegistry","RunnerInstallation","SettingsService","PlannerModelMemory","StructuredRunner","ModelResolver","sessionRuntimeSettings","assertWorkspaceExists","assertWorkspaceIsProject","WorkspaceNotAProjectError","ensureStateDirIgnored","TransportRouter","createSession","runnerForProvider","admission","admitSettingsEnv","isRunnerTransport","PROVIDER_CREDENTIAL_ENV","PROVIDER_PRIORITY","runnerModesFrom","migratePlanState","ConversationBusyError","loadSession","scanWorkspaces","listSessions","deleteSession","pool","Hono","loadSessionPlanState","WorkspaceNotFoundError","listTaskLogAttempts","readTaskLog","PlanEditError","TaskControlError","ConversationEditError","run","flattenTasks","toApprovalDecision","isGranted","WebSocketServer","DAEMON_SUBPROTOCOL","tokensMatch","extractPresentedToken","app","server","mintDaemonToken","createServer","clearDaemonToken"],"mappings":"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","file":"main.js","sourcesContent":["import { AiProvider, BaseConfig, isCliProvider, normalizeGeminiModel, resolveProvider } from '@ordewell/core';\nimport type { ProviderModelLists } from '@ordewell/core';\n\ninterface WebConfigOpts {\n enabledRunners?: string[];\n providerModelLists?: ProviderModelLists;\n modelOverride?: string;\n}\n\nexport class WebConfig extends BaseConfig {\n private _provider: AiProvider | null = null;\n private _providerCacheKey: string | null = null;\n private _providerCacheLists: ProviderModelLists | undefined = undefined;\n private _enabledRunnersOverride: string[] | undefined;\n private _providerModelLists: ProviderModelLists | undefined;\n private _modelOverride: string | undefined;\n\n constructor(opts?: WebConfigOpts) {\n super();\n this._enabledRunnersOverride = opts?.enabledRunners;\n this._providerModelLists = opts?.providerModelLists;\n this._modelOverride = opts?.modelOverride;\n }\n\n setProviderModelLists(lists: ProviderModelLists): void {\n this._providerModelLists = lists;\n this._provider = null;\n }\n\n get orchestratorModel(): string {\n return this._modelOverride || process.env.ORCHESTRATOR_MODEL || '';\n }\n\n get aiProvider(): AiProvider {\n // Memoized by cache key rather than forever: a session's WebConfig lives\n // for the whole session, but /model and /planner switches mutate process.env\n // mid-session, so a permanent cache would strand the transport on the old\n // provider (mirrors the live-read behavior of `orchestratorModel` above).\n const explicitEnv = process.env.AI_PROVIDER;\n const model = this._modelOverride || process.env.ORCHESTRATOR_MODEL;\n const cacheKey = `${explicitEnv ?? ''}|${model ?? ''}`;\n if (\n this._provider &&\n this._providerCacheKey === cacheKey &&\n this._providerCacheLists === this._providerModelLists\n ) {\n return this._provider;\n }\n\n // An explicitly chosen harness planner (ADR-0009) wins over model-based\n // resolution: its model ids are the agent's own (`sonnet`, `gpt-5.6-sol`)\n // and can collide with a vendor catalog, which would silently route the\n // planner back to an API the user may not even have a key for.\n const explicit = explicitEnv as AiProvider | undefined;\n if (explicit && isCliProvider(explicit)) {\n this._provider = explicit;\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n\n if (model && this._providerModelLists) {\n const resolved = resolveProvider(model, this._providerModelLists);\n if (resolved) {\n this._provider = resolved;\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n }\n\n this._provider = BaseConfig.detectProvider('openrouter');\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n\n get apiKey(): string {\n return this.getProviderApiKey(this.aiProvider);\n }\n\n get planningModel(): string {\n if (this.aiProvider === 'google')\n return normalizeGeminiModel(process.env.GEMINI_MODEL || process.env.ORCHESTRATOR_MODEL || super.geminiModel);\n return process.env.ORCHESTRATOR_MODEL || '';\n }\n\n get enabledRunners(): string[] {\n if (this._enabledRunnersOverride) return this._enabledRunnersOverride;\n\n const envRunners = process.env.ORDEWELL_ENABLED_RUNNERS;\n if (envRunners) {\n const parsed = envRunners.split(',').map((s) => s.trim()).filter(Boolean);\n if (parsed.length > 0) return parsed;\n }\n\n const out: string[] = [];\n if (process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== 'false' && process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== '0') {\n out.push('claude-code');\n }\n if (process.env.ORDEWELL_CODEX_ENABLED === 'true' || process.env.ORDEWELL_CODEX_ENABLED === '1') {\n out.push('codex');\n }\n if (process.env.ORDEWELL_OPENCODE_ENABLED === 'true' || process.env.ORDEWELL_OPENCODE_ENABLED === '1') {\n out.push('opencode');\n }\n return out.length > 0 ? out : ['claude-code'];\n }\n\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface WorkspaceScannerDeps {\n fsModule: typeof fs;\n pathModule: typeof path;\n cwd: string;\n home: string;\n projectDir: string;\n}\n\nexport function scanWorkspacesImpl(deps: WorkspaceScannerDeps): string[] {\n const { fsModule, pathModule, cwd, home, projectDir } = deps;\n const paths = new Set<string>();\n const searchRoots = [\n cwd,\n home,\n pathModule.join(home, 'projects'),\n pathModule.join(home, 'dev'),\n pathModule.join(home, 'code'),\n pathModule.join(home, 'src'),\n pathModule.join(home, 'Desktop'),\n pathModule.join(home, 'Documents'),\n ];\n for (const root of searchRoots) {\n try {\n if (fsModule.existsSync(pathModule.join(root, '.ordewell'))) paths.add(root);\n const entries = fsModule.readdirSync(root, { withFileTypes: true }).filter(e => e.isDirectory());\n for (const e of entries.slice(0, 50)) {\n const sub = pathModule.join(root, e.name);\n if (fsModule.existsSync(pathModule.join(sub, '.ordewell'))) paths.add(sub);\n }\n } catch { /* empty */ }\n }\n return [...paths].filter(p => p !== pathModule.resolve(projectDir)).sort();\n}\n\nexport function scanWorkspaces(): string[] {\n return scanWorkspacesImpl({\n fsModule: fs,\n pathModule: path,\n cwd: process.cwd(),\n home: process.env.HOME || '/root',\n projectDir: path.resolve(__dirname, '..', '..', '..', '..'),\n });\n}\n","import { execFile } from 'child_process';\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n code: number | null;\n}\n\n/**\n * Cap on a single child's buffered output. Above this, Node kills the child\n * and invokes the callback with `err.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER'`\n * — a string, so the coercion below maps it to `1` (see `run`).\n */\nexport const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;\n\n/**\n * The single primitive every search/inspection adapter in this package is\n * built on: spawn a child, never reject. Kept in its own module so the\n * contract that the planner depends on — synchronous spawn failures degrade\n * to a failed tool call, never a rejected promise that aborts the whole\n * planner turn — can be pinned by a focused test rather than exercised only\n * incidentally through the public adapter API.\n *\n * Node hands only ENOENT/EAGAIN/EMFILE/ENFILE from spawn(2) to the\n * callback; every other errno — ENOTDIR for a `cwd` that is a file, EACCES\n * for one it cannot enter — is thrown synchronously. Thrown in here that\n * rejects the promise, and no caller of `run` catches, so a single bad\n * search argument aborted the entire planner turn as \"Plan generation\n * failed: spawn ENOTDIR\". A failed spawn is a failed tool call, never a\n * failed plan.\n */\nexport function run(\n file: string,\n args: string[],\n opts: { cwd?: string; timeout: number; shell?: boolean; env?: NodeJS.ProcessEnv; signal?: AbortSignal },\n): Promise<ExecResult> {\n return new Promise((resolve) => {\n try {\n execFile(file, args, {\n cwd: opts.cwd,\n timeout: opts.timeout,\n maxBuffer: MAX_OUTPUT_BYTES,\n encoding: 'utf8',\n shell: opts.shell,\n env: opts.env,\n // Node kills the child when this aborts, and calls back with an\n // ABORT_ERR — which lands on the `code: 1` branch below, i.e. a\n // failed tool call, exactly like any other command that did not\n // finish. Stopping the planner must not leave a research `bash`\n // running out its own timeout on the server.\n signal: opts.signal,\n }, (err, stdout, stderr) => {\n const code = err && typeof (err as { code?: unknown }).code === 'number' ? (err as { code: number }).code : err ? 1 : 0;\n resolve({ stdout: stdout ?? '', stderr: stderr ?? '', code });\n });\n } catch (err) {\n // `code: null` rather than 1 on purpose: the search adapters read 0 and 1\n // as \"ran, possibly no matches\", so a 1 here would report a confident\n // \"No matches found.\" for a search that never executed.\n resolve({ stdout: '', stderr: (err as Error).message, code: null });\n }\n });\n}","import {\n BaseFileSystem,\n buildGrepArgs,\n buildGlobArgs,\n buildFallbackGrepArgs,\n GREP_PCRE_PROBE_ARGS,\n grepRegexFromProbe,\n type GrepRegex,\n filterFallbackByAnchoredInclude,\n applyHeadLimit,\n formatSearchOutput,\n researchToolsPath,\n withPath,\n SEARCH_EXCLUSIONS,\n STOPPED_TOOL_RESULT,\n type GrepOptions,\n type ReadFileOpts,\n type ToolOutcome,\n} from '@ordewell/core';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { run } from './run';\n\n/**\n * Everything here is async. It used to be `execSync`/`readFileSync`, which on\n * the web server blocked the entire Node event loop: one session running\n * `tree -L 4` over a monorepo stalled every other session's WebSocket\n * streaming, HTTP API, and plan-token delivery. It also makes the parallel\n * tool-round pre-pass in BaseAiService pointless, since concurrent calls into\n * a synchronous adapter still serialize.\n */\n\nconst SEARCH_TIMEOUT_MS = 20_000;\n/** Generous, because an approved `bash` call may legitimately be a test suite. */\nconst BASH_TIMEOUT_MS = 120_000;\n\nexport class PoolFileSystem extends BaseFileSystem {\n constructor(private workspaceRoot: string) { super(); }\n getWorkspaceRoot(): string { return this.workspaceRoot; }\n\n /**\n * PATH for the search subprocesses. `execFile` starts them with no shell, so\n * on a Windows box whose POSIX tools live in the Git tree (`grep.exe` beside\n * the research shell) they are only resolvable with that directory prepended.\n * Identity on POSIX, where `utilsDir` is null. Kept in step with\n * VsCodeFileSystem.searchEnv.\n */\n private searchEnv(): NodeJS.ProcessEnv | undefined {\n const resolved = researchToolsPath(this.researchShell, process.env.PATH);\n // `withPath`, not a `PATH:` spread: on Windows the spread of `process.env`\n // carries `Path`, so adding `PATH` hands the child two and lets the OS pick.\n return resolved === (process.env.PATH ?? '') ? undefined : withPath(process.env, resolved);\n }\n\n private grepRegex: Promise<GrepRegex> | null = null;\n private fallbackGrepRegex(): Promise<GrepRegex> {\n this.grepRegex ??= run('grep', GREP_PCRE_PROBE_ARGS, { timeout: 5_000, env: this.searchEnv() })\n .then((r) => grepRegexFromProbe(r.code))\n .catch(() => 'ere' as const);\n return this.grepRegex;\n }\n\n private rgAvailable: Promise<boolean> | null = null;\n private hasRg(): Promise<boolean> {\n this.rgAvailable ??= run('rg', ['--version'], { timeout: 5_000, env: this.searchEnv() }).then((r) => r.code === 0).catch(() => false);\n return this.rgAvailable;\n }\n\n protected async readFileImpl(absPath: string, opts?: ReadFileOpts): Promise<ToolOutcome> {\n try {\n const stat = await fs.stat(absPath);\n if (!stat.isFile()) return { success: false, output: `Not a file: ${absPath}`, truncated: false };\n\n // Hard file-size cap — return an actionable error so the model switches to grep\n const maxBytes = opts?.maxBytes ?? 1024;\n if (stat.size > maxBytes * 1024) {\n const sizeMB = (stat.size / (1024 * 1024)).toFixed(1);\n return {\n success: true,\n output: `File too large (${sizeMB} MB). Maximum is ${maxBytes} KB. Use grep to search for specific patterns instead.`,\n truncated: false,\n };\n }\n\n const content = await fs.readFile(absPath, 'utf8');\n const allLines = content.split('\\n');\n // Discard the empty element from a trailing newline\n if (allLines.length > 0 && allLines[allLines.length - 1] === '') allLines.pop();\n const totalLines = allLines.length;\n\n const startLine = opts?.offset ?? 0;\n const maxLines = opts?.limit ?? 2000;\n\n if (startLine >= totalLines) return { success: true, output: '', truncated: false };\n\n const selectedLines = allLines.slice(startLine, startLine + maxLines);\n const truncated = (startLine + maxLines) < totalLines;\n\n // Right-align line numbers so columns stay aligned across calls\n const lineWidth = String(totalLines).length;\n let output = selectedLines.map((line, i) => {\n const lineNum = String(startLine + i + 1).padStart(lineWidth);\n return `${lineNum}|${line}`;\n }).join('\\n');\n\n // Actionable hint so the model knows how to continue\n if (truncated) {\n const nextOffset = startLine + maxLines;\n output += `\\n\\n(File has more lines — use offset=${nextOffset} to read beyond line ${nextOffset})\\n`;\n }\n\n return { success: true, output, truncated };\n } catch (err) {\n return { success: false, output: `Error reading ${absPath}: ${(err as Error).message}`, truncated: false };\n }\n }\n\n protected async globImpl(pattern: string, absRoot: string, headLimit: number): Promise<ToolOutcome> {\n if (await this.hasRg()) {\n // ripgrep resolves a `--glob` pattern that contains a `/` against its own\n // cwd, not the `--` search path — without this, a daemon started outside\n // the workspace silently drops every anchored pattern (\"src/**/*\") to a\n // false \"No files matched.\".\n const anchor = await this.searchAnchor(absRoot);\n const result = await run('rg', buildGlobArgs(pattern, absRoot), { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() });\n // rg exits 1 for \"no files matched\", which is a valid empty answer.\n if (result.code !== 0 && result.code !== 1 && !result.stdout) {\n return { success: false, output: `Glob failed: ${result.stderr.trim() || 'ripgrep error'}`, truncated: false };\n }\n const capped = applyHeadLimit(result.stdout, headLimit);\n return {\n success: true,\n output: formatSearchOutput(capped, anchor, { emptyMessage: 'No files matched.', hint: 'Narrow the pattern.' }),\n truncated: capped.truncated,\n };\n }\n\n // `find -path` treats `*` as crossing `/`, so `**` is not recursive there.\n // Translating to `-name` on the basename keeps the common cases honest\n // rather than silently returning a different result set than ripgrep would.\n const basename = pattern.split('/').pop() || pattern;\n const excludeArgs = SEARCH_EXCLUSIONS.flatMap((dir) => ['-not', '-path', `*/${dir}/*`]);\n const result = await run('find', [absRoot, '-type', 'f', '-name', basename, ...excludeArgs], { timeout: SEARCH_TIMEOUT_MS, env: this.searchEnv() });\n if (result.code !== 0 && !result.stdout) {\n return { success: false, output: `Glob failed: ${result.stderr.trim() || 'find error'}`, truncated: false };\n }\n const capped = applyHeadLimit(result.stdout, headLimit);\n return {\n success: true,\n output: formatSearchOutput(capped, absRoot, { emptyMessage: 'No files matched.' }),\n truncated: capped.truncated,\n };\n }\n\n /**\n * A directory to anchor a search in. `cwd` exists only so anchored\n * `--glob`/`--include` patterns resolve against the search root (see\n * globImpl), and spawn(2) rejects a `cwd` that is a file with ENOTDIR.\n *\n * `grep`'s `path` is documented as a directory, but the tool description\n * tells the model to survey with output_mode=\"files\" and then re-run \"on a\n * narrower path\" — and what that survey hands back are files. rg and grep\n * both search a single file happily, so anchor at the parent rather than\n * failing a legitimately file-scoped search.\n */\n private async searchAnchor(absRoot: string): Promise<string> {\n try {\n return (await fs.stat(absRoot)).isDirectory() ? absRoot : path.dirname(absRoot);\n } catch {\n return absRoot;\n }\n }\n\n protected async grepImpl(pattern: string, absRoot: string, opts: GrepOptions): Promise<ToolOutcome> {\n const headLimit = opts.headLimit ?? 100;\n const useRg = await this.hasRg();\n // Same anchored-glob-vs-cwd hazard as globImpl: an `include` filter with a\n // `/` in it would otherwise resolve against the daemon's cwd, not absRoot.\n const anchor = await this.searchAnchor(absRoot);\n // GNU grep's `--include` only matches a basename, so an anchored pattern\n // like `subdir/*.txt` never matches there — strip it from the grep call\n // and filter matches by relative path afterward instead.\n const anchoredInclude = !useRg && opts.include?.includes('/') ? opts.include : undefined;\n const result = useRg\n ? await run('rg', buildGrepArgs(pattern, opts, absRoot).args, { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() })\n : await run('grep', buildFallbackGrepArgs(pattern, anchoredInclude ? { ...opts, include: undefined } : opts, absRoot, await this.fallbackGrepRegex()), { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() });\n\n // Exit 1 is \"no matches\" for both tools — a successful search with an empty\n // result, not a failure. Anything else with no stdout is a real error.\n if (result.code !== 0 && result.code !== 1 && !result.stdout) {\n return { success: false, output: `Search failed: ${result.stderr.trim() || 'search error'}`, truncated: false };\n }\n\n const filteredStdout = anchoredInclude\n ? filterFallbackByAnchoredInclude(result.stdout, anchoredInclude, anchor, opts.outputMode)\n : result.stdout;\n const capped = applyHeadLimit(filteredStdout, headLimit);\n const hint = opts.outputMode === 'content'\n ? 'Re-run with output_mode=\"files\" to see the full breadth, or narrow with include/path.'\n : 'Narrow with include/path.';\n return {\n success: true,\n output: formatSearchOutput(capped, anchor, { emptyMessage: 'No matches found.', hint }),\n truncated: capped.truncated,\n };\n }\n\n protected async listDirImpl(absPath: string, depth: number): Promise<ToolOutcome> {\n if (depth > 1) {\n const result = await run('tree', ['-L', String(depth), '-I', 'node_modules|.git|dist|build', absPath], { timeout: 10_000, env: this.searchEnv() });\n if (result.code === 0 && result.stdout.trim()) {\n const lines = result.stdout.trim().split('\\n');\n return { success: true, output: lines.slice(0, 300).join('\\n'), truncated: lines.length > 300 };\n }\n // `tree` is not installed everywhere; fall through to a flat listing.\n }\n try {\n const entries = await fs.readdir(absPath, { withFileTypes: true });\n const lines = entries.slice(0, 200).map((e) => `${e.isDirectory() ? 'D' : 'F'} ${e.name}`);\n return { success: true, output: lines.join('\\n') || '(empty directory)', truncated: entries.length > 200 };\n } catch (err) {\n return { success: false, output: `Error listing ${absPath}: ${(err as Error).message}`, truncated: false };\n }\n }\n\n protected async execBashImpl(command: string, signal?: AbortSignal): Promise<ToolOutcome> {\n // `shell: true` is required now that approved commands may legitimately\n // contain pipes; the tier classifier in core (not string filtering here)\n // is what decides whether this command was allowed to reach the shell.\n //\n // `file: null` is that host default, unchanged on POSIX. A resolved file is\n // the POSIX shell found on a Windows box, invoked explicitly so the command\n // runs in the dialect `BaseFileSystem` classified it under.\n const { file, args } = this.researchShell;\n const result = file === null\n ? await run(command, [], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, shell: true, signal })\n : await run(file, [...args, command], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, signal });\n const out = (result.stdout || '').trim();\n const err = (result.stderr || '').trim();\n\n // A stopped turn reports as a stop, not as a mysterious non-zero exit: the\n // child was killed on purpose and there is nothing here to diagnose.\n if (signal?.aborted) return { success: false, output: STOPPED_TOOL_RESULT, truncated: false };\n\n if (result.code !== 0) {\n const detail = err || out || `exited with code ${result.code}`;\n // A failing command is still research: the model asked to diagnose, and\n // the failure output is usually the answer. Report it, do not swallow it.\n return { success: false, output: `Command exited ${result.code}:\\n${detail.slice(0, 20_000)}`, truncated: detail.length > 20_000 };\n }\n\n const combined = err ? `${out}\\n[stderr]\\n${err}` : out;\n return { success: true, output: combined || '(no output)', truncated: combined.length > 20_000 };\n }\n}\n","import { HeadlessRunner, type ITerminalRunner, type ITerminalSession, type RunnerSpawnOptions } from '@ordewell/core';\nimport type { SessionBroadcaster } from '@ordewell/core';\n\nexport class PoolAwareRunner implements ITerminalRunner {\n private inner: ITerminalRunner;\n /**\n * Sessions this plan spawned. The inner runner may be shared by every plan\n * in the pool (one tmux session per daemon), so \"stop everything\" and\n * \"how many are running\" must be answered from this set, never delegated —\n * delegating would let one plan's /stop kill another plan's tasks.\n */\n private owned = new Set<string>();\n\n constructor(\n private sessionId: string,\n private broadcast: SessionBroadcaster,\n inner?: ITerminalRunner,\n ) {\n this.inner = inner ?? new HeadlessRunner();\n }\n\n get activeCount(): number { return this.owned.size; }\n\n async spawn(opts: RunnerSpawnOptions): Promise<ITerminalSession> {\n const session = await this.inner.spawn({ ...opts, planSessionId: this.sessionId });\n this.owned.add(session.id);\n session.onExit(() => this.owned.delete(session.id));\n this.broadcast({ type: 'task_started', taskId: opts.taskId, order: opts.order ?? 0, title: opts.title ?? '', runner: opts.runner, modelId: opts.modelId });\n session.onOutput((text) => {\n this.broadcast({ type: 'task_output', taskId: opts.taskId, text });\n });\n return session;\n }\n\n stop(sessionId: string): void {\n this.inner.stop(sessionId);\n this.owned.delete(sessionId);\n }\n\n stopAll(): void {\n for (const id of this.owned) this.inner.stop(id);\n this.owned.clear();\n }\n}\n","import { hasTmux, TmuxRunner, type ITerminalRunner, type ITerminalSession, type RunnerSpawnOptions } from '@ordewell/core';\n\nexport const TMUX_MISSING_ADVICE =\n 'tmux is not installed, so terminal-transport tasks run without a terminal window you can open or type into. Install tmux, or keep the structured transport (/transport structured).';\n\nexport interface TerminalHostDeps {\n hasTmuxImpl?: () => boolean;\n createTmuxRunner?: (port: number) => TmuxRunner;\n}\n\nexport interface TerminalHost {\n /** Undefined when the host has no tmux: each plan then falls back to its own headless runner. */\n runner?: TmuxRunner;\n /** Set only when a terminal-transport run will lack what tmux gives it; structured runs never need it. */\n advice?: string;\n}\n\n/**\n * The daemon's start-up check for tmux. A missing tmux is never fatal and is\n * not reported here: the structured transport (the default) needs none, so the\n * word only reaches the user, via {@link AdvisingRunner}, if a run actually\n * uses the terminal.\n */\nexport function startTerminalHost(port: number, deps: TerminalHostDeps = {}): TerminalHost {\n const hasTmuxImpl = deps.hasTmuxImpl ?? hasTmux;\n if (!hasTmuxImpl()) return { advice: TMUX_MISSING_ADVICE };\n const runner = (deps.createTmuxRunner ?? ((p) => new TmuxRunner({ port: p })))(port);\n // Failure is not fatal here: ensureSession is memoized and each spawn\n // re-awaits it, so the next task retries the setup rather than giving up.\n runner.ensureSession().catch((err) => {\n console.error(`[web] tmux session setup failed (will retry on next task spawn): ${err?.message ?? err}`);\n });\n return { runner };\n}\n\n/**\n * Wraps the runner a plan's terminal-transport tasks run on, so the first one\n * says what the host lacks. It sits below the transport router, which only\n * sends terminal-transport spawns here.\n */\nexport class AdvisingRunner implements ITerminalRunner {\n private advised = false;\n\n constructor(\n private readonly inner: ITerminalRunner,\n private readonly advice: string,\n private readonly advise: (message: string) => void,\n ) {}\n\n get activeCount(): number { return this.inner.activeCount; }\n\n spawn(opts: RunnerSpawnOptions): Promise<ITerminalSession> {\n if (!this.advised) {\n this.advised = true;\n this.advise(this.advice);\n }\n return this.inner.spawn(opts);\n }\n\n stop(sessionId: string): void { this.inner.stop(sessionId); }\n\n stopAll(): void { this.inner.stopAll(); }\n}\n","import { WebSocket } from 'ws';\nimport {\n Session,\n createSession,\n ConversationBusyError,\n type ConversationCompaction,\n type ConversationFork,\n type SessionMessage,\n type SessionNotice,\n type SessionRuntimeSettings,\n ModelResolver,\n RunnerRegistry,\n RunnerInstallation,\n listSessions,\n loadSession,\n deleteSession,\n SettingsService,\n sessionRuntimeSettings,\n type PlanState,\n type LegacyPlanState,\n migratePlanState,\n type RunnerId,\n type DiscoveredModel,\n type OrchestratorOption,\n type RunnerModeInfo,\n runnerModesFrom,\n PROVIDER_PRIORITY,\n assertWorkspaceExists,\n assertWorkspaceIsProject,\n WorkspaceNotAProjectError,\n ensureStateDirIgnored,\n runnerForProvider,\n PlannerModelMemory,\n admitSettingsEnv,\n PROVIDER_CREDENTIAL_ENV,\n type AiProvider,\n type PlannerModelCandidate,\n isRunnerTransport,\n HeadlessRunner,\n StructuredRunner,\n TransportRouter,\n} from '@ordewell/core';\nimport { WebConfig } from '../adapters/WebConfig';\nimport { scanWorkspaces as scanWorkspacesImpl } from '../utils/workspaceScanner';\nimport { PoolFileSystem } from '../adapters/PoolFileSystem';\nimport { PoolAwareRunner } from '../adapters/PoolAwareRunner';\nimport { AdvisingRunner } from '../adapters/TerminalHost';\nimport type { ApprovalAnswer, RunnerRegistry as CoreRunnerRegistry, ITerminalRunner } from '@ordewell/core';\n\n/** A fork the pool has adopted: addressable at once, its plan read back from the file it was written to. */\nexport interface AdoptedFork {\n sessionId: string;\n goal: string;\n plan: LegacyPlanState;\n}\n\nexport interface OrchestratorPoolDeps {\n /**\n * Shared across every session instead of each `PoolAwareRunner` defaulting\n * to its own `HeadlessRunner` — needed so a tmux-backed runner's one\n * session/many-windows lifecycle outlives any single planning session.\n * Left undefined, behavior is unchanged from before this existed.\n */\n runner?: ITerminalRunner;\n /**\n * Where a task on the structured transport runs (ADR-0018). Shared like\n * `runner`, and defaulted to a real one; tests inject a fake.\n */\n structuredRunner?: ITerminalRunner;\n /** What a plan's first terminal-transport task tells the user the host lacks; structured tasks never trigger it. */\n terminalAdvice?: string;\n /**\n * Overrides the pool's own `ModelResolver`. Left undefined, behavior is\n * unchanged; tests inject one built with fake exec/fetch impls so a\n * planner-switch catalog lookup can be seeded without spawning real CLIs.\n */\n modelResolver?: ModelResolver;\n}\n\nexport class OrchestratorPool {\n private sessions = new Map<string, Session>();\n private clients = new Map<string, Set<WebSocket>>();\n /** The in-flight planning turn's abort controller, one per session — see `cancelPlanning`. */\n private planningAborts = new Map<string, AbortController>();\n /** Sessions whose planning slot a compaction holds; a reply must not take it over. */\n private compacting = new Set<string>();\n private registry: CoreRunnerRegistry = (() => { const r = new RunnerRegistry(); r.loadUserPlugins(); return r; })();\n private modelResolver: ModelResolver;\n private runnerInstallation = new RunnerInstallation(this.registry);\n private cachedProviderLists: Record<string, string[]> | undefined;\n private settingsService = new SettingsService();\n private plannerModelMemory = new PlannerModelMemory(this.settingsService);\n private sharedRunner?: ITerminalRunner;\n private structuredRunner: ITerminalRunner;\n private terminalAdvice?: string;\n\n constructor(deps: OrchestratorPoolDeps = {}) {\n this.sharedRunner = deps.runner;\n this.structuredRunner = deps.structuredRunner ?? new StructuredRunner();\n this.terminalAdvice = deps.terminalAdvice;\n this.modelResolver = deps.modelResolver ?? new ModelResolver(this.registry, new WebConfig());\n }\n\n subscribe(sessionId: string, ws: WebSocket): void {\n if (!this.clients.has(sessionId)) this.clients.set(sessionId, new Set());\n this.clients.get(sessionId)!.add(ws);\n }\n\n unsubscribe(sessionId: string, ws: WebSocket): void {\n this.clients.get(sessionId)?.delete(ws);\n if (this.clients.get(sessionId)?.size === 0) this.clients.delete(sessionId);\n }\n\n private broadcast(sessionId: string, msg: SessionMessage | SessionNotice): void {\n const payload = JSON.stringify(msg);\n for (const ws of this.clients.get(sessionId) ?? []) {\n if (ws.readyState === ws.OPEN) ws.send(payload);\n }\n }\n\n hasSession(sessionId: string): boolean { return this.sessions.has(sessionId); }\n\n /** Answer an approval prompt, the planner's or a task runner's. False means the id was unknown or already settled. */\n resolveApproval(sessionId: string, approvalId: string, answer: ApprovalAnswer): boolean {\n return this.sessions.get(sessionId)?.resolveApproval(approvalId, answer) ?? false;\n }\n\n outstandingApprovals(sessionId: string) {\n return this.sessions.get(sessionId)?.outstandingApprovals() ?? [];\n }\n\n approvedScopes(sessionId: string): string[] {\n return this.sessions.get(sessionId)?.approvedScopes() ?? [];\n }\n isExecuting(sessionId: string): boolean { return this.sessions.get(sessionId)?.isExecuting ?? false; }\n getPlan(sessionId: string): LegacyPlanState | null { return this.sessions.get(sessionId)?.planState ?? null; }\n /**\n * The plan of a session this process is holding, straight from its store —\n * null for an id the pool never adopted. Reading it through the saved file\n * instead answers as if nothing were running.\n */\n getPlanState(sessionId: string): PlanState | null {\n return this.sessions.get(sessionId)?.currentPlanState ?? null;\n }\n getGoal(sessionId: string): string { return this.sessions.get(sessionId)?.currentGoal ?? ''; }\n\n private runtimeSettings(): SessionRuntimeSettings {\n return sessionRuntimeSettings(this.settingsService.getAll());\n }\n\n private createSessionFor(sessionId: string, workspace: string, modelOverride?: string, options: { allowInit?: boolean } = {}): Session {\n // Rejected here rather than left to the planner: a non-existent workspace\n // otherwise reaches the harness adapter's `spawn` as an ENOENT that reads\n // as a missing agent binary, not a missing directory.\n assertWorkspaceExists(workspace);\n // Rejected here too: without a project marker, the filesystem root or an\n // arbitrary system directory becomes the confinement boundary for every\n // read, search and permitted command the planner runs. `allowInit` only\n // ever arrives here on the retry of a call the user already saw and\n // explicitly confirmed (the TUI's \"initialize this as a new workspace?\"\n // prompt) — never as a default, so an unmarked directory is still never\n // admitted silently.\n try {\n assertWorkspaceIsProject(workspace);\n } catch (err) {\n if (!(err instanceof WorkspaceNotAProjectError) || !options.allowInit) throw err;\n ensureStateDirIgnored(workspace);\n assertWorkspaceIsProject(workspace);\n }\n const config = new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n modelOverride,\n providerModelLists: this.cachedProviderLists,\n });\n const fsAdapter = new PoolFileSystem(workspace);\n const broadcast = (msg: SessionMessage) => this.broadcast(sessionId, msg);\n // The router sits under the per-plan wrapper, so a plan's /stop still\n // reaches only its own tasks, on either transport.\n const terminal = this.sharedRunner ?? new HeadlessRunner();\n const router = new TransportRouter({\n terminal: this.terminalAdvice\n ? new AdvisingRunner(terminal, this.terminalAdvice, (message) => this.broadcast(sessionId, { type: 'notice', level: 'warn', message }))\n : terminal,\n structured: this.structuredRunner,\n });\n const runner = new PoolAwareRunner(sessionId, broadcast, router);\n return createSession({\n config,\n notifications: { info() {}, warn() {}, error() {}, async confirm() { return undefined; } },\n runner,\n registry: this.registry,\n workspaceRoot: () => workspace,\n fsAdapter,\n broadcast,\n // The notification channel above is silent here; this is how a client hears how the run isolates.\n onNotice: (notice) => this.broadcast(sessionId, notice),\n modelResolver: this.modelResolver,\n settings: () => this.runtimeSettings(),\n sessionId,\n });\n }\n\n /**\n * The user's runner choice, or undefined when they have never made one —\n * which is what lets `WebConfig` fall back to the environment's defaults.\n * Read per call rather than cached: the settings file is shared with the\n * VS Code extension host, and `getAll()` already invalidates on mtime.\n */\n private enabledRunnerOverride(): string[] | undefined {\n return this.settingsService.getEnabledRunners();\n }\n\n /**\n * Persisted, not held in memory: the daemon dies with the TUI, and a\n * process-local override meant every reopen silently reinstated the\n * environment's defaults over what the user had chosen.\n */\n setRunnerEnabled(id: string, enabled: boolean): void {\n const current = this.enabledRunnerOverride() ?? new WebConfig().enabledRunners;\n const next = enabled\n ? (current.includes(id) ? current : [...current, id])\n : current.filter((r) => r !== id);\n this.settingsService.setEnabledRunners(next);\n }\n\n getSettings() {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const userSettings = this.settingsService.getAll();\n return {\n orchestratorModel: config.orchestratorModel,\n // Who plans (ADR-0009) — a vendor id, or one of the three harness\n // planners. Surfaces need it to render the planner picker and to know\n // whether the planner model comes from a runner catalog or a vendor one.\n aiProvider: config.aiProvider,\n // A harness planner's thinking effort (ADR-0009). Surfaces need it back\n // to render the current level; without it the picker shows \"default\"\n // for a planner that is running at \"high\".\n plannerThinkingEffort: config.plannerThinkingEffort ?? '',\n maxParallel: config.maxParallelSessions,\n tdd: userSettings.tdd,\n verification: userSettings.verification,\n modelAllowlist: userSettings.modelAllowlist,\n // The model remembered per planner backend (this task), so a surface can\n // render what's remembered without a second round-trip.\n plannerModels: userSettings.plannerModels,\n // ADR-0018; a run copies it when it starts.\n runnerTransport: userSettings.runnerTransport,\n };\n }\n\n /**\n * The catalog `PlannerModelMemory.recall` should judge `provider`'s\n * remembered model against — a harness planner's own runner catalog, or the\n * cross-provider picker list for a vendor (ADR-0009), same split as\n * `plannerModelItems` in the TUI reducer. Read from whatever the resolver\n * has already cached so this stays synchronous; a cold cache degrades to an\n * empty catalog rather than kicking off discovery mid-settings-write.\n */\n private plannerCatalogFor(provider: AiProvider): PlannerModelCandidate[] {\n const runner = runnerForProvider(provider);\n if (runner) {\n return this.modelResolver.getCachedRunnerModels(runner).map((m) => ({ id: m.modelId, variants: m.variants }));\n }\n return this.modelResolver.getCachedPickerOptions().map((o) => ({ id: o.id }));\n }\n\n updateSettings(changes: Record<string, unknown>) {\n // Read before any of this call's changes land, so a switch is judged\n // against what was actually in effect a moment ago.\n const providerBefore = new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n providerModelLists: this.cachedProviderLists,\n }).aiProvider;\n\n // Only allowlisted keys reach `process.env`, and everything else comes back\n // to the caller by name — the daemon's environment is inherited by every\n // runner it spawns, so this write is the whole of `admitSettingsEnv`'s\n // reason to exist. All downstream reads below use `envChanges`, which is\n // the admitted subset, never the raw body.\n const rawEnv = changes.env && typeof changes.env === 'object' && !Array.isArray(changes.env)\n ? (changes.env as Record<string, unknown>)\n : undefined;\n const admission = rawEnv ? admitSettingsEnv(rawEnv) : undefined;\n const envChanges = admission ? admission.accepted : undefined;\n const incomingAiProvider = typeof envChanges?.AI_PROVIDER === 'string' ? envChanges.AI_PROVIDER : undefined;\n // The name the client sent wins over re-deriving it from `config.aiProvider`\n // later: for a vendor pick that resolution reads the model id, and a switch\n // may have just cleared it — model-based resolution would misfire on the\n // very call meant to establish the new provider.\n const switchedToProvider: AiProvider | undefined =\n incomingAiProvider && incomingAiProvider !== providerBefore ? (incomingAiProvider as AiProvider) : undefined;\n // Read the incoming provider's catalog now, before the env-touched refresh\n // below clears the resolver's cache — recall must judge the memory against\n // what was already discovered, not force a fresh (async) discovery here.\n const switchRecall = switchedToProvider\n ? this.plannerModelMemory.recall(switchedToProvider, this.plannerCatalogFor(switchedToProvider))\n : undefined;\n\n if (typeof changes.orchestratorModel === 'string') {\n process.env.ORCHESTRATOR_MODEL = changes.orchestratorModel;\n }\n if (typeof changes.plannerThinkingEffort === 'string') {\n process.env.ORDEWELL_PLANNER_EFFORT = changes.plannerThinkingEffort;\n }\n if (changes.tdd && typeof (changes.tdd as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setTdd((changes.tdd as Record<string, unknown>).enabled as boolean);\n }\n if (changes.verification && typeof (changes.verification as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setVerification((changes.verification as Record<string, unknown>).enabled as boolean);\n }\n if (isRunnerTransport(changes.runnerTransport)) {\n this.settingsService.setRunnerTransport(changes.runnerTransport);\n }\n if (envChanges) {\n let touched = false;\n for (const [key, value] of Object.entries(envChanges)) {\n process.env[key] = value;\n // Only a credential or endpoint change touches what a catalog\n // contains. A planner, model or effort pick does not, and invalidating\n // on one would wipe the very cache `plannerCatalogFor` reads\n // synchronously below, right before the next call's switch needs it.\n if (PROVIDER_CREDENTIAL_ENV.has(key)) touched = true;\n }\n // The scheduler reads the limit on every tick, but a raised one would\n // only be seen at the next verdict; the runs waiting for a slot start now.\n if (envChanges.ORDEWELL_MAX_PARALLEL !== undefined) {\n for (const session of this.sessions.values()) void session.reschedule();\n }\n // A new/changed provider key or base URL must re-probe the catalog;\n // without this the picker keeps serving the pre-key cache until restart.\n if (touched) {\n this.modelResolver.invalidate();\n this.modelResolver.refreshRunnerModels();\n }\n }\n\n // A planner switch resolves through memory rather than whatever the\n // client's env carried for the model/effort — an older client still sends\n // a blind `ORCHESTRATOR_MODEL: ''` clear here, and even a current one\n // should land on the model this provider was last using, not nothing.\n // Applied after the env loop above so it overrides that clear rather than\n // being overwritten by it.\n if (switchRecall) {\n process.env.ORCHESTRATOR_MODEL = switchRecall.model;\n process.env.ORDEWELL_PLANNER_EFFORT = switchRecall.effort;\n }\n\n if (changes.modelAllowlist && typeof changes.modelAllowlist === 'object') {\n const allowlist = changes.modelAllowlist as Record<string, unknown>;\n for (const [runner, ids] of Object.entries(allowlist)) {\n if (Array.isArray(ids)) {\n this.settingsService.setModelAllowlist(runner, ids.map(String));\n } else if (ids === null) {\n this.settingsService.setModelAllowlist(runner, undefined);\n }\n }\n }\n\n // An explicit model/effort pick is remembered against whichever provider\n // is in effect: the one this same call just switched to, or — resolved\n // fresh, now that ORCHESTRATOR_MODEL reflects this call's changes —\n // today's, so a vendor pick keys correctly off its model id. The pick\n // arrives either as a top-level field (a vendor model, `ordewell model\n // set`) or through env (`ordewell planner-effort`, the TUI's effort\n // picker send ORDEWELL_PLANNER_EFFORT this way) — both are a real pick,\n // never the switch's own env, which always carries AI_PROVIDER too.\n const envCarriesModelOrEffort = envChanges?.AI_PROVIDER === undefined &&\n (typeof envChanges?.ORCHESTRATOR_MODEL === 'string' || typeof envChanges?.ORDEWELL_PLANNER_EFFORT === 'string');\n if (typeof changes.orchestratorModel === 'string' || typeof changes.plannerThinkingEffort === 'string' || envCarriesModelOrEffort) {\n const rememberProvider = switchedToProvider ?? new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n providerModelLists: this.cachedProviderLists,\n }).aiProvider;\n this.plannerModelMemory.remember(\n rememberProvider,\n process.env.ORCHESTRATOR_MODEL || '',\n process.env.ORDEWELL_PLANNER_EFFORT || '',\n );\n }\n\n // Refused keys are named back rather than dropped: a client that sent one\n // wrote it to `.env` on the strength of this response, and would otherwise\n // reinstate the refusal as the next daemon's startup environment.\n const rejectedEnvKeys = admission?.rejected ?? [];\n const settings: ReturnType<OrchestratorPool['getSettings']> & { rejectedEnvKeys?: string[] } = this.getSettings();\n if (rejectedEnvKeys.length > 0) settings.rejectedEnvKeys = rejectedEnvKeys;\n return settings;\n }\n\n setOrchestratorModel(model: string): string {\n process.env.ORCHESTRATOR_MODEL = model;\n return model;\n }\n\n async getProviderModels(): Promise<{\n models: DiscoveredModel[];\n modelsByRunner: Record<string, DiscoveredModel[]>;\n /** Each runner's manifest modes, so a surface can offer a per-task mode picker. */\n modesByRunner: Record<string, RunnerModeInfo[]>;\n orchestratorModel: string;\n providers: string[];\n /** Full cross-provider catalog for the orchestrator (planner) model picker. */\n orchestratorModels: OrchestratorOption[];\n /** Per-provider catalog-fetch failures, keyed by provider id. */\n providerErrors: Record<string, string>;\n }> {\n const config = new WebConfig();\n\n const runnerIds = this.registry.list().map((p) => p.manifest.name);\n const [runnerModels, providerLists] = await Promise.all([\n this.modelResolver.modelsForRunners(runnerIds),\n this.modelResolver.refresh(),\n ]);\n\n // `refresh()` populates the picker cache, so this is the same fetch — no\n // second network round-trip. Errors are whatever that fetch recorded.\n const orchestratorModels = await this.modelResolver.pickerOptions();\n const providerErrors = this.modelResolver.getDiscoveryErrors();\n\n this.cachedProviderLists = providerLists;\n\n const allModels: DiscoveredModel[] = [];\n const seen = new Set<string>();\n const modelsByRunner: Record<string, DiscoveredModel[]> = {};\n\n for (const id of runnerIds) {\n modelsByRunner[id] = runnerModels[id] ?? [];\n for (const m of modelsByRunner[id]) {\n if (!seen.has(m.modelId)) {\n seen.add(m.modelId);\n allModels.push(m);\n }\n }\n }\n\n const providers: string[] = [];\n for (const provider of PROVIDER_PRIORITY) {\n if (provider === 'openai_compatible') {\n if (config.openaiCompatibleBaseUrl) providers.push(provider);\n } else if (provider === 'openrouter') {\n if (config.openrouterKey) providers.push(provider);\n } else if (provider === 'google') {\n if (config.geminiKey) providers.push(provider);\n } else if (config.getProviderApiKey(provider)) {\n providers.push(provider);\n }\n }\n\n return {\n models: allModels,\n modelsByRunner,\n modesByRunner: runnerModesFrom(this.registry, runnerIds),\n orchestratorModel: process.env.ORCHESTRATOR_MODEL || '',\n providers,\n orchestratorModels,\n providerErrors,\n };\n }\n\n getRunnerState(): { enabledRunners: RunnerId[]; orchestratorModel: string } {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n return { enabledRunners: config.enabledRunners, orchestratorModel: config.orchestratorModel };\n }\n\n /**\n * Runners whose CLI is actually installed on the host, with display name and\n * enabled state. Only these should be offered for selection — an uninstalled\n * runner can't be spawned.\n */\n async getInstalledRunners(): Promise<{ id: string; name: string; enabled: boolean }[]> {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const enabled = new Set(config.enabledRunners);\n const plugins = this.registry.list();\n const installedIds = new Set(\n await this.runnerInstallation.filterInstalled(plugins.map((p) => p.manifest.name)),\n );\n return plugins\n .filter((p) => installedIds.has(p.manifest.name))\n .map((p) => ({\n id: p.manifest.name,\n name: p.manifest.displayName,\n enabled: enabled.has(p.manifest.name),\n }));\n }\n\n async generatePlan(sessionId: string, goal: string, runners: RunnerId[], workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<PlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride, options);\n // Registered before the blocking call, not after: research inside\n // generatePlan can raise an approval and await the answer, and that\n // answer arrives over POST /api/approvals/:sessionId — which 404s until\n // the session is in this map. Registering only on return made the first\n // approval of every session unanswerable until its 5-minute timeout.\n this.sessions.set(sessionId, session);\n const controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n try {\n const plan = await session.generatePlan(goal, runners, { signal: controller.signal });\n return migratePlanState(plan);\n } finally {\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /**\n * Conversational planning (ADR-0002): start the planner dialogue for a\n * session. Returns the current plan state — a committed plan when the\n * planner had enough context, otherwise the dialogue so far (last\n * assistant message lives in conversationHistory).\n */\n async startPlanning(sessionId: string, goal: string, runners: RunnerId[], workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<LegacyPlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride, options);\n // See generatePlan: must be registered before the blocking call so a\n // mid-research approval is answerable rather than 404ing until timeout.\n this.sessions.set(sessionId, session);\n const controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n try {\n return await session.startPlanning(goal, runners, { signal: controller.signal });\n } finally {\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /**\n * Continue the planner dialogue with the user's reply. Refused during a\n * compaction before the abort slot is touched: the session refuses the reply\n * too, but by then the compaction's controller would be gone and a stop could\n * no longer reach its summary turn.\n */\n async continuePlanning(sessionId: string, message: string): Promise<LegacyPlanState> {\n if (this.compacting.has(sessionId)) throw new ConversationBusyError('send a message');\n const controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n try {\n return await this.session(sessionId).continueConversation(message, { signal: controller.signal });\n } finally {\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /**\n * Condense a session's conversation. The summary turn is a planning turn as\n * far as a surface is concerned, so it registers the same abort controller\n * and `cancelPlanning` stops it — but only when no turn holds that slot\n * already: taking it over would leave the reply in flight beyond stopping.\n */\n async compactConversation(sessionId: string): Promise<ConversationCompaction & { plan: LegacyPlanState }> {\n const session = this.session(sessionId);\n if (this.planningAborts.has(sessionId)) throw new ConversationBusyError('condense the conversation');\n const controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n this.compacting.add(sessionId);\n try {\n const compaction = await session.compactConversation(controller.signal);\n return { ...compaction, plan: session.planState! };\n } finally {\n this.compacting.delete(sessionId);\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /**\n * Abort the planning turn in flight for a session, if any. Answers whether\n * there was one to cancel — the route reports that rather than 404ing a\n * session that simply is not planning right now.\n */\n cancelPlanning(sessionId: string): boolean {\n const controller = this.planningAborts.get(sessionId);\n if (!controller) return false;\n controller.abort();\n return true;\n }\n\n /**\n * Only clears the map entry if it still holds the controller this turn\n * created — a later turn may already have installed its own by the time\n * this one's `finally` runs (a fresh request racing a slow abort).\n */\n private clearPlanningAbort(sessionId: string, controller: AbortController): void {\n if (this.planningAborts.get(sessionId) === controller) this.planningAborts.delete(sessionId);\n }\n\n /**\n * Register a session persisted on disk so its plan becomes executable and\n * editable. Only sessions planned in this process are otherwise addressable,\n * which left a restored plan readable but inert — every task endpoint\n * answered \"Session not found\".\n *\n * No LLM call happens here: the plan is adopted as saved, and the planner is\n * only contacted when the user next sends a message.\n */\n adoptSavedSession(sessionId: string, workspace: string): LegacyPlanState {\n // Re-adopting would clear the execution log and drop a running plan back to\n // its saved state, so a live session wins over the file.\n const live = this.sessions.get(sessionId);\n if (live?.planState) return live.planState;\n\n const saved = loadSession(sessionId, workspace);\n if (!saved) throw new Error('Session not found');\n\n const session = this.createSessionFor(sessionId, workspace);\n // The saved id is adopted too, so later persists rewrite the same file\n // instead of forking the session under a fresh identity.\n session.loadPlan(saved.plan, saved.meta.goal, workspace, { sessionId: saved.meta.id });\n this.sessions.set(sessionId, session);\n\n return session.planState ?? saved.plan;\n }\n\n /**\n * Fork a session's conversation into a new session and adopt it, so the\n * fork is addressable at once — through the same path a saved session is\n * adopted by, reading back the file the fork was written to. The original\n * keeps running, or planning, untouched.\n */\n forkConversation(sessionId: string): AdoptedFork {\n return this.adoptFork(this.session(sessionId).forkConversation());\n }\n\n /** A rewind is a fork from an earlier point, so it is adopted the same way. */\n rewindConversation(sessionId: string, index: number): AdoptedFork & { rewoundMessage: string } {\n const fork = this.session(sessionId).rewindConversation(index);\n return { ...this.adoptFork(fork), rewoundMessage: fork.rewoundMessage };\n }\n\n private adoptFork(fork: ConversationFork): AdoptedFork {\n return { sessionId: fork.sessionId, goal: fork.goal, plan: this.adoptSavedSession(fork.sessionId, fork.workspace) };\n }\n\n /**\n * Direct access to a session's interface — routes call the Session; the\n * pool only registers sessions and fans broadcasts out to WS clients.\n */\n session(sessionId: string): Session {\n const session = this.sessions.get(sessionId);\n if (!session) throw new Error('Session not found');\n return session;\n }\n\n // The Session drops its planner context, but the model call in flight is\n // the pool's to abort: it holds the only signal that reaches it.\n destroy(sessionId: string): void {\n this.planningAborts.get(sessionId)?.abort();\n this.planningAborts.delete(sessionId);\n this.sessions.get(sessionId)?.destroy();\n this.sessions.delete(sessionId);\n }\n\n destroyAll(): void { for (const id of this.sessions.keys()) this.destroy(id); }\n}\n\nexport const scanWorkspaces = scanWorkspacesImpl;\n\nexport function getSessionList(workspace: string) { return listSessions(workspace); }\nexport function getSession(sessionId: string, workspace: string) { return loadSession(sessionId, workspace); }\nexport function removeSession(sessionId: string, workspace: string) { return deleteSession(sessionId, workspace); }\n","import { Hono } from 'hono';\nimport { OrchestratorPool, getSessionList, removeSession } from '../pool/orchestratorPool';\nimport { listTaskLogAttempts, loadSessionPlanState, readTaskLog, WorkspaceNotFoundError } from '@ordewell/core';\n\nexport function sessionsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const sessions = getSessionList(ws);\n return c.json(sessions);\n });\n\n /**\n * The saved file answers for a session nobody is holding. While the pool has\n * one, its store is the only honest source of task status: the file is\n * normalized as if nothing were running (`in_progress` → `pending`), so\n * serving it mid-run told every surface that the tasks it is watching had\n * never started.\n */\n router.get('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const id = c.req.param('id');\n const saved = loadSessionPlanState(id, ws);\n if (!saved) return c.json({ error: 'Session not found' }, 404);\n return c.json({ meta: saved.meta, plan: pool.getPlanState(id) ?? saved.plan });\n });\n\n /**\n * Adopt a saved session into the running server. `GET /:id` only reads the\n * file; until a session is registered with the pool there is no orchestrator\n * behind it, so execution and task control answer \"Session not found\".\n */\n router.post('/:id/load', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n try {\n const id = c.req.param('id');\n const plan = pool.adoptSavedSession(id, ws);\n return c.json({ ok: true, plan, goal: pool.getGoal(id) });\n } catch (err: unknown) {\n if (err instanceof WorkspaceNotFoundError) return c.json({ error: err.message }, 400);\n const message = err instanceof Error ? err.message : undefined;\n const status = message === 'Session not found' ? 404 : 500;\n return c.json({ error: message ?? 'Failed to load session' }, status);\n }\n });\n\n /**\n * A structured task's saved log (ADR-0018, P1), read off disk whether or\n * not the pool holds the session: every attempt is written as it happens,\n * so the file is as current as the stream a reopened view catches up with.\n */\n router.get('/:id/tasks/:taskId/log', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n return c.json({ attempts: listTaskLogAttempts({ baseDir: ws, sessionId: c.req.param('id') }, c.req.param('taskId')) });\n });\n\n router.get('/:id/tasks/:taskId/log/:attempt', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const attempt = Number(c.req.param('attempt'));\n if (!Number.isInteger(attempt) || attempt < 1) return c.json({ error: 'attempt must be a positive integer' }, 400);\n return c.json({ attempt, events: readTaskLog({ baseDir: ws, sessionId: c.req.param('id') }, c.req.param('taskId'), attempt) });\n });\n\n router.delete('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const ok = removeSession(c.req.param('id'), ws);\n return c.json({ ok });\n });\n\n // Stops the orchestrator (killing every tmux window it spawned) and drops\n // the in-memory planner conversation. No-op if already closed/unregistered.\n router.post('/:id/close', (c) => {\n pool.destroy(c.req.param('id'));\n return c.json({ ok: true });\n });\n\n return router;\n}\n","import { Hono, type Context } from 'hono';\nimport { ConversationBusyError, ConversationEditError, flattenTasks, PlanEditError, TaskControlError, WorkspaceNotFoundError, WorkspaceNotAProjectError } from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\n/**\n * The three answers a task edit can have. A refusal is the request being wrong\n * (400), a missing session is 404, and only a real fault is 500 — collapsing\n * all three into 404/500 gave the TUI and VS Code nothing to show but \"Internal\n * error\", which reads as the edit having silently done nothing.\n */\nfunction editFailure(c: Context, err: unknown) {\n const e = err as Error;\n if (e.message === 'Session not found') return c.json({ error: e.message }, 404);\n if (e instanceof PlanEditError || e instanceof TaskControlError) return c.json({ error: e.message }, 400);\n console.error('[plans] task edit failed:', err);\n return c.json({ error: e.message || 'Internal error' }, 500);\n}\n\n/**\n * A refused conversation edit is either the request being wrong (400) or\n * arriving mid-turn (409) — the same call succeeds once the reply lands, and a\n * surface should say \"wait\", not \"invalid\".\n */\nfunction conversationFailure(c: Context, err: unknown) {\n const e = err as Error;\n if (e.message === 'Session not found') return c.json({ error: e.message }, 404);\n if (e instanceof ConversationBusyError) return c.json({ error: e.message }, 409);\n if (e instanceof ConversationEditError) return c.json({ error: e.message }, 400);\n console.error('[plans] conversation edit failed:', err);\n return c.json({ error: e.message || 'Internal error' }, 500);\n}\n\nexport function plansRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.post('/:sessionId/generate', async (c) => {\n try {\n const { goal, runners, workspace, model, allowInit } = await c.req.json();\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n const queryRunners = c.req.query('runners');\n // No runners in the request means \"whatever is enabled\", not claude-code:\n // a hard-coded default here contradicts the /runners toggle state and\n // fails planning for anyone who disabled claude-code.\n const runnerList: string[] = Array.isArray(runners) ? runners : (runners ? [runners] : (queryRunners ? queryRunners.split(',').map(s => s.trim()).filter(Boolean) : pool.getRunnerState().enabledRunners));\n const plan = await pool.generatePlan(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n const { models, modelsByRunner } = await pool.getProviderModels();\n return c.json({ plan, models, modelsByRunner });\n } catch (err) {\n if (err instanceof WorkspaceNotFoundError) return c.json({ error: err.message }, 400);\n if (err instanceof WorkspaceNotAProjectError) {\n return c.json({ error: err.message, code: 'workspace_not_a_project', workspace: err.workspace }, 400);\n }\n // Log before returning: the message alone travels to the client, so an\n // unexpected throw in here (a research tool crashing the whole turn, say)\n // left no stack anywhere — server.log showed nothing and the CLI showed\n // one line. Diagnosing that cost far more than this console.error.\n console.error('[plans] generate failed:', err);\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Plan generation failed' }, 500);\n }\n });\n\n router.post('/:sessionId/execute', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).executePlan();\n return c.json({ status: 'running' });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : e.message === 'No plan to execute' ? 400 : e.message === 'Session already executing' ? 409 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/stop', (c) => {\n if (pool.hasSession(c.req.param('sessionId'))) pool.session(c.req.param('sessionId')).stopExecution();\n return c.json({ status: 'stopped' });\n });\n\n // Distinct from the stop route above, which halts *execution* (running\n // tasks). This aborts a planning turn in flight — a harmless no-op, not a\n // 404, when the session simply isn't planning right now.\n router.post('/:sessionId/planning/stop', (c) => {\n const cancelled = pool.cancelPlanning(c.req.param('sessionId'));\n return c.json({ cancelled });\n });\n\n router.post('/:sessionId/tasks/:taskId/complete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskComplete(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Not found' }, 404);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/uncomplete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskIncomplete(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Not found' }, 404);\n }\n });\n\n // Orchestrator controls — these spawn or kill runner processes, so they are\n // deliberately separate from the generic `PUT tasks/:taskId` status patch.\n for (const [segment, run] of [\n ['run', (s: ReturnType<typeof pool.session>, id: string) => s.runTask(id)],\n ['force-start', (s: ReturnType<typeof pool.session>, id: string) => s.forceStartTask(id)],\n ['retry', (s: ReturnType<typeof pool.session>, id: string) => s.retryTask(id)],\n ['cancel', (s: ReturnType<typeof pool.session>, id: string) => s.cancelTask(id)],\n ] as const) {\n router.post(`/:sessionId/tasks/:taskId/${segment}`, async (c) => {\n try {\n await run(pool.session(c.req.param('sessionId')), c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n const status = (err as Error).message === 'Session not found' ? 404 : 500;\n return c.json({ error: (err as Error).message }, status as never);\n }\n });\n }\n\n // Talking to a structured task (ADR-0018, M1). A terminal task, or one not\n // running, is refused with the reason rather than typed at.\n router.post('/:sessionId/tasks/:taskId/messages', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const text = typeof body === 'object' && body !== null && 'text' in body ? body.text : undefined;\n if (typeof text !== 'string' || !text.trim()) return c.json({ error: 'text is required' }, 400);\n const id = pool.session(c.req.param('sessionId')).sendTaskMessage(c.req.param('taskId'), text);\n return c.json({ id });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n // Continue a finished structured task in its saved session (ADR-0018, K1).\n // A task that cannot be continued is refused with the reason.\n router.post('/:sessionId/tasks/:taskId/continue', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const text = typeof body === 'object' && body !== null && 'text' in body ? body.text : undefined;\n if (typeof text !== 'string' || !text.trim()) return c.json({ error: 'text is required' }, 400);\n await pool.session(c.req.param('sessionId')).continueTask(c.req.param('taskId'), text);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId/messages/:messageId', (c) => {\n try {\n const removed = pool.session(c.req.param('sessionId')).removeQueuedTaskMessage(c.req.param('taskId'), c.req.param('messageId'));\n return c.json({ removed });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/interrupt', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).interruptTask(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n // What a task waits on at its merge gate (ADR-0020), for a surface that asks\n // before a force start passes it. Empty when nothing gates the task.\n router.get('/:sessionId/tasks/:taskId/merge-gate', (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n const tasks = flattenTasks(session.planState?.tasks ?? []);\n const mergeGate = session.mergeGate(c.req.param('taskId')).map((id) => {\n const dep = tasks.find((t) => t.id === id);\n return { id, order: dep?.order ?? 0, title: dep?.title ?? id };\n });\n return c.json({ mergeGate });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n // Isolated-run handoff (ADR-0013). A merge that conflicts or fails is an\n // outcome the surface reports, not a malformed request, so it answers 200.\n router.get('/:sessionId/isolation/diff', async (c) => {\n try {\n return c.json({ diff: await pool.session(c.req.param('sessionId')).reviewRunDiff() });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/isolation/merge', async (c) => {\n try {\n return c.json(await pool.session(c.req.param('sessionId')).mergeRun());\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n for (const [segment, run] of [\n ['discard', (s: ReturnType<typeof pool.session>) => s.discardRun()],\n ['cleanup', (s: ReturnType<typeof pool.session>) => s.cleanupRun()],\n ['stash-and-continue', (s: ReturnType<typeof pool.session>) => s.continueWithStash()],\n ['run-without', (s: ReturnType<typeof pool.session>) => s.continueWithoutIsolation()],\n ] as const) {\n router.post(`/:sessionId/isolation/${segment}`, async (c) => {\n try {\n await run(pool.session(c.req.param('sessionId')));\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n }\n\n router.post('/:sessionId/tasks/:taskId/resolve-conflict', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).resolveConflictAsTask(c.req.param('taskId'));\n return c.json({ plan });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.put('/:sessionId/tasks/:taskId', async (c) => {\n try {\n const { assignedRunner, dependencies, ...rest } = await c.req.json();\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n\n // Two fields are not field writes. A runner change carries the task's\n // model, effort and mode with it, and a dependency list has to be\n // validated against the whole graph — each has one owner on the session.\n // The runner goes first: its retarget derives a model, and an explicit\n // model in the same patch must win over that derived one.\n const hasRunner = typeof assignedRunner === 'string';\n const hasDeps = Array.isArray(dependencies);\n\n let result = null;\n if (hasRunner) result = await session.setTaskRunner(taskId, assignedRunner);\n if (hasDeps) {\n try {\n result = await session.setTaskDependencies(taskId, dependencies.map(String));\n } catch (err) {\n // A rejected dependency edit is the client's mistake, not a fault.\n return c.json({ error: (err as Error).message }, 400);\n }\n }\n // An empty patch still reaches updateTask — that is how a caller asks\n // whether the task exists at all.\n if (Object.keys(rest).length > 0 || (!hasRunner && !hasDeps)) result = await session.updateTask(taskId, rest);\n\n if (!result) return c.json({ error: 'Task not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId', async (c) => {\n try {\n const result = await pool.session(c.req.param('sessionId')).removeTask(c.req.param('taskId'));\n if (!result) return c.json({ error: 'Task not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/tasks', async (c) => {\n try {\n const body = await c.req.json();\n const result = await pool.session(c.req.param('sessionId')).addTask(body);\n if (!result) return c.json({ error: 'Session not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/review/approve', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).approveReview();\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404\n : e.message === 'No plan to review' ? 400\n : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/tasks/merge', async (c) => {\n try {\n const { taskIds } = await c.req.json();\n if (!taskIds || !Array.isArray(taskIds) || taskIds.length < 2) {\n return c.json({ error: 'taskIds array with at least two ids is required' }, 400);\n }\n const plan = await pool.session(c.req.param('sessionId')).requestMerge(taskIds);\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 400;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/split', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).requestSplit(c.req.param('taskId'));\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 400;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n // Conversational planning (ADR-0002): start the planner dialogue. The\n // response's plan carries conversationHistory; when tasks are non-empty the\n // planner committed the plan.\n router.post('/:sessionId/converse/start', async (c) => {\n try {\n const { goal, runners, workspace, model, allowInit } = await c.req.json();\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n const runnerList: string[] = Array.isArray(runners) ? runners : (runners ? [runners] : pool.getRunnerState().enabledRunners);\n const plan = await pool.startPlanning(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n return c.json({ plan });\n } catch (err) {\n if (err instanceof WorkspaceNotFoundError) return c.json({ error: err.message }, 400);\n if (err instanceof WorkspaceNotAProjectError) {\n return c.json({ error: err.message, code: 'workspace_not_a_project', workspace: err.workspace }, 400);\n }\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Planning failed' }, 500);\n }\n });\n\n // One branch for every user reply — clarifying answers, outline confirm.\n // The planner decides what happens next.\n router.post('/:sessionId/converse/message', async (c) => {\n try {\n const { message } = await c.req.json();\n if (!message) return c.json({ error: 'message is required' }, 400);\n const plan = await pool.continuePlanning(c.req.param('sessionId'), message);\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n if (e instanceof ConversationBusyError) return c.json({ error: e.message }, 409);\n const status = e.message === 'Session not found' ? 404 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n // Fork and rewind act on the conversation, never on the plan: the task list\n // rides along as-is (ADR-0002, update of 2026-09-25). A rewind is a fork from\n // just before a user message; the original session is left as it was.\n router.post('/:sessionId/conversation/fork', (c) => {\n try {\n return c.json(pool.forkConversation(c.req.param('sessionId')));\n } catch (err) {\n return conversationFailure(c, err);\n }\n });\n\n router.get('/:sessionId/conversation/rewind-targets', (c) => {\n try {\n return c.json({ targets: pool.session(c.req.param('sessionId')).rewindTargets() });\n } catch (err) {\n return conversationFailure(c, err);\n }\n });\n\n router.post('/:sessionId/conversation/rewind', async (c) => {\n try {\n const { index } = await c.req.json();\n if (!Number.isInteger(index) || index < 0) return c.json({ error: 'index must be a non-negative integer' }, 400);\n return c.json(pool.rewindConversation(c.req.param('sessionId'), index));\n } catch (err) {\n return conversationFailure(c, err);\n }\n });\n\n // The summary is one planner call, so this can take as long as a reply and\n // fail like one — a failure leaves the conversation exactly as it was.\n router.post('/:sessionId/conversation/compact', async (c) => {\n try {\n return c.json(await pool.compactConversation(c.req.param('sessionId')));\n } catch (err) {\n return conversationFailure(c, err);\n }\n });\n\n // Drain queued structural edits between task batches. The orchestrator pauses\n // fan-out while a message is queued (so an edit can't race a spawn) and emits\n // `queue_ready` once no task is active; a surface calls this to apply the edit\n // via the planner and resume scheduling. Without a route the TUI/CLI could\n // never clear the queue, permanently suppressing dependents after one edit.\n router.post('/:sessionId/process-queued', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).processQueuedMessages();\n return c.json({ ok: true });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.get('/:sessionId/prd', (c) => {\n const plan = pool.getPlan(c.req.param('sessionId'));\n if (!plan?.prdMarkdown) return c.json({ error: 'No PRD found' }, 404);\n return c.json({ prdMarkdown: plan.prdMarkdown });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function runnersRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n const state = pool.getRunnerState();\n const runners = await pool.getInstalledRunners();\n return c.json({\n runners,\n orchestratorModel: state.orchestratorModel,\n });\n });\n\n router.put('/:id', async (c) => {\n const id = c.req.param('id');\n const body = await c.req.json();\n pool.setRunnerEnabled(id, body.enabled);\n return c.json({ ok: true });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function modelsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n const result = await pool.getProviderModels();\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { scanWorkspaces } from '../pool/orchestratorPool';\n\nexport function workspacesRoute() {\n const router = new Hono();\n\n router.get('/', (c) => {\n const workspaces = scanWorkspaces();\n return c.json({ workspaces });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { isGranted, toApprovalDecision, type ApprovalAnswer } from '@ordewell/core';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\n/**\n * A body's answer. `{ decision, note? }` carries a runner request's whole\n * answer (ADR-0018, A1); `{ granted }` is the planner prompt's yes/no.\n * Anything else — absent, malformed, an unknown decision — is a denial,\n * never consent.\n */\nfunction answerOf(body: unknown): ApprovalAnswer {\n if (typeof body !== 'object' || body === null) return false;\n const { decision, note, granted } = body as { decision?: unknown; note?: unknown; granted?: unknown };\n if (decision === undefined) return granted === true;\n if (decision === 'allow' || decision === 'allowForTask') return { decision };\n if (decision === 'deny' && typeof note === 'string' && note.trim()) return { decision, note: note.trim() };\n return { decision: 'deny' };\n}\n\n/**\n * The answer channel for approval prompts — the planner's, and a task\n * runner's tool requests.\n *\n * Requests go out over the session WebSocket (they are ordinary\n * SessionMessages), but answers come back here rather than over the socket:\n * the CLI and TUI already speak HTTP to this server, a prompt can outlive the\n * socket that announced it, and a plain POST is answerable from any surface —\n * including `curl` in a pinch.\n */\nexport function approvalsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/:sessionId', (c) => {\n const sessionId = c.req.param('sessionId');\n if (!pool.hasSession(sessionId)) return c.json({ error: `Unknown session: ${sessionId}` }, 404);\n\n return c.json({\n pending: pool.outstandingApprovals(sessionId),\n approvedScopes: pool.approvedScopes(sessionId),\n });\n });\n\n router.post('/:sessionId/:approvalId', async (c) => {\n const sessionId = c.req.param('sessionId');\n const approvalId = c.req.param('approvalId');\n if (!pool.hasSession(sessionId)) return c.json({ error: `Unknown session: ${sessionId}` }, 404);\n\n const answer = answerOf(await c.req.json().catch(() => null));\n\n if (!pool.resolveApproval(sessionId, approvalId, answer)) {\n return c.json({ error: 'Approval is no longer outstanding — it timed out or was already answered.' }, 409);\n }\n const { decision } = toApprovalDecision(answer);\n return c.json({ ok: true, granted: isGranted({ decision }), decision });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function settingsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n return c.json(pool.getSettings());\n });\n\n router.patch('/', async (c) => {\n const body = await c.req.json();\n if (!body || typeof body !== 'object' || Object.keys(body).length === 0) {\n return c.json({ error: 'At least one setting field is required' }, 400);\n }\n const result = pool.updateSettings(body);\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\ninterface CommandDescriptor {\n name: string;\n description: string;\n}\n\nconst COMMANDS: CommandDescriptor[] = [\n { name: 'tdd', description: 'Toggle Test-Driven Development mode (on|off|status)' },\n { name: 'verify', description: 'Toggle verification mode — adds a final evidence-based verification task that runs the full suite (on|off|status)' },\n { name: 'transport', description: 'Drive tasks through each runner\\'s protocol (structured) or a terminal, from the next run (terminal|structured|status)' },\n];\n\nexport function commandsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n return c.json({ commands: COMMANDS });\n });\n\n router.post('/:name', async (c) => {\n const name = c.req.param('name');\n const body = await c.req.json().catch(() => ({}));\n const args: Record<string, string> = body?.args || {};\n\n const command = COMMANDS.find((cmd) => cmd.name === name);\n if (!command) {\n return c.json({ error: `Unknown command: ${name}` }, 404);\n }\n\n if (name === 'tdd') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ tdd: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ tdd: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'verify') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ verification: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ verification: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'transport') {\n const action = args.action || 'status';\n if (action === 'terminal' || action === 'structured') {\n pool.updateSettings({ runnerTransport: action });\n } else if (action !== 'status') {\n return c.json({ error: `Unknown transport: ${action} (terminal|structured)` }, 400);\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n return c.json({ error: `Unknown command: ${name}` }, 404);\n });\n\n return router;\n}\n","import { WebSocketServer, WebSocket } from 'ws';\nimport type { IncomingMessage } from 'http';\nimport type { Duplex } from 'stream';\nimport { DAEMON_SUBPROTOCOL } from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function createWsHandler(pool: OrchestratorPool) {\n const wss = new WebSocketServer({\n noServer: true,\n // Select the plain subprotocol explicitly. Left to itself `ws` echoes back\n // whichever was offered first, which would put the token in the 101\n // response; selecting nothing makes the client fail the handshake.\n handleProtocols: (protocols) => (protocols.has(DAEMON_SUBPROTOCOL) ? DAEMON_SUBPROTOCOL : false),\n });\n\n wss.on('connection', (ws: WebSocket, request: IncomingMessage) => {\n const url = new URL(request.url ?? '', `http://${request.headers.host}`);\n const sessionId = url.pathname.split('/').pop() || '';\n\n ws.on('close', () => {\n pool.unsubscribe(sessionId, ws);\n });\n\n ws.on('error', () => {\n pool.unsubscribe(sessionId, ws);\n });\n\n ws.send(JSON.stringify({ type: 'connected', sessionId }));\n pool.subscribe(sessionId, ws);\n });\n\n return (request: IncomingMessage, socket: Duplex, head: Buffer) => {\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit('connection', ws, request);\n });\n };\n}\n","/**\n * The single admission decision for the daemon.\n *\n * Both the HTTP middleware and the WebSocket upgrade handler call this. The\n * sharing is the point: the two paths drifting apart is how the upgrade ended\n * up validating nothing while the HTTP routes had a CORS allowlist.\n */\n\nimport { extractPresentedToken, tokensMatch } from '@ordewell/core';\n\n/** `localhost` is included because clients dial it by name; the daemon binds loopback only. */\nconst LOOPBACK_HOSTNAMES = new Set(['localhost', '127.0.0.1', '::1']);\n\nexport interface AdmissionHeaders {\n /** `null`/`undefined` mean absent. An empty string still counts as present. */\n origin?: string | null;\n host?: string | null;\n /** `Authorization: Bearer <token>` — how the token travels on HTTP routes. */\n authorization?: string | null;\n /** `Sec-WebSocket-Protocol` — how it travels on the upgrade, so it stays out of logs. */\n secWebSocketProtocol?: string | null;\n}\n\n/** What this daemon is: which port it bound, and which token it minted. */\nexport interface AdmissionContext {\n port: number;\n token: string;\n /** Named in a token rejection, so a stale token is diagnosable rather than a bare failure. */\n tokenFile: string;\n}\n\nexport type AdmissionDecision =\n | { admit: true }\n | { admit: false; status: number; reason: string };\n\nconst ADMIT: AdmissionDecision = { admit: true };\n\nexport function decideAdmission(\n headers: AdmissionHeaders,\n context: AdmissionContext,\n): AdmissionDecision {\n if (headers.origin !== undefined && headers.origin !== null) {\n return {\n admit: false,\n status: 403,\n reason: 'Refused: requests carrying an Origin header are not accepted. The Ordewell daemon has no browser client.',\n };\n }\n\n if (!isOwnLoopbackAuthority(headers.host, context.port)) {\n return {\n admit: false,\n status: 403,\n reason: `Refused: the Host header must name loopback (localhost, 127.0.0.1 or [::1]) at port ${context.port}.`,\n };\n }\n\n if (!tokensMatch(extractPresentedToken(headers), context.token)) {\n return {\n admit: false,\n status: 401,\n reason:\n 'Unauthenticated: this request did not present the daemon\\'s bearer token. '\n + `Ordewell clients read it from ${context.tokenFile}; if that file is stale, `\n + 'restart the daemon (`ordewell web --daemon`) to mint a fresh one.',\n };\n }\n\n return ADMIT;\n}\n\n/**\n * Rejecting anything but our own loopback authority is what closes DNS\n * rebinding: a page rebinding a hostname it controls to 127.0.0.1 still sends\n * that hostname in `Host`, and same-origin requests to it carry no `Origin`.\n */\nfunction isOwnLoopbackAuthority(host: string | null | undefined, port: number): boolean {\n if (!host) return false;\n const authority = splitAuthority(host);\n if (!authority) return false;\n if (!LOOPBACK_HOSTNAMES.has(authority.hostname.toLowerCase())) return false;\n return authority.port === port;\n}\n\n/** Absent port means the scheme default; the daemon only ever speaks http. */\nconst DEFAULT_HTTP_PORT = 80;\n\nfunction splitAuthority(host: string): { hostname: string; port: number } | undefined {\n const value = host.trim();\n if (value === '') return undefined;\n\n if (value.startsWith('[')) {\n const close = value.indexOf(']');\n if (close === -1) return undefined;\n const hostname = value.slice(1, close);\n const rest = value.slice(close + 1);\n if (rest === '') return { hostname, port: DEFAULT_HTTP_PORT };\n if (!rest.startsWith(':')) return undefined;\n return withPort(hostname, rest.slice(1));\n }\n\n const colon = value.indexOf(':');\n if (colon === -1) return { hostname: value, port: DEFAULT_HTTP_PORT };\n // An unbracketed second colon is a bare IPv6 literal, which is malformed in a\n // Host header — refuse rather than guess where the port starts.\n if (value.indexOf(':', colon + 1) !== -1) return undefined;\n return withPort(value.slice(0, colon), value.slice(colon + 1));\n}\n\nfunction withPort(hostname: string, port: string): { hostname: string; port: number } | undefined {\n if (!/^\\d+$/.test(port)) return undefined;\n return { hostname, port: Number(port) };\n}\n","import { Hono } from 'hono';\nimport type { Server } from 'http';\nimport type { Duplex } from 'stream';\nimport { sessionsRoute } from './routes/sessions';\nimport { plansRoute } from './routes/plans';\nimport { runnersRoute } from './routes/runners';\nimport { modelsRoute } from './routes/models';\nimport { workspacesRoute } from './routes/workspaces';\nimport { approvalsRoute } from './routes/approvals';\nimport { settingsRoute } from './routes/settings';\nimport { commandsRoute } from './routes/commands';\nimport { createWsHandler } from './ws/stream';\nimport {\n decideAdmission,\n type AdmissionContext,\n type AdmissionDecision,\n} from './security/admission';\nimport { OrchestratorPool } from './pool/orchestratorPool';\n\nexport function createApp(pool: OrchestratorPool, admission: AdmissionContext) {\n const app = new Hono();\n\n // There is no CORS allowlist: the daemon ships no browser front end, so a\n // browser has no legitimate reason to reach it at all. The bearer token\n // supersedes it, and covers every local caller rather than only browsers.\n app.use('*', async (c, next) => {\n const decision = decideAdmission({\n origin: c.req.header('origin') ?? null,\n // The request URL's authority is built from the Host header upstream, so\n // it is the same value; the fallback only matters when the header is\n // absent entirely, which fails the check anyway.\n host: c.req.header('host') ?? new URL(c.req.url).host,\n authorization: c.req.header('authorization') ?? null,\n }, admission);\n if (!decision.admit) return c.json({ error: decision.reason }, decision.status as 401 | 403);\n await next();\n });\n\n app.route('/api/sessions', sessionsRoute(pool));\n app.route('/api/plans', plansRoute(pool));\n app.route('/api/runners', runnersRoute(pool));\n app.route('/api/models', modelsRoute(pool));\n app.route('/api/settings', settingsRoute(pool));\n app.route('/api/commands', commandsRoute(pool));\n app.route('/api/workspaces', workspacesRoute());\n app.route('/api/approvals', approvalsRoute(pool));\n\n return app;\n}\n\nexport function attachWsHandler(server: Server, pool: OrchestratorPool, admission: AdmissionContext) {\n const handler = createWsHandler(pool);\n server.on('upgrade', (request, socket, head) => {\n const decision = decideAdmission({\n origin: request.headers.origin ?? null,\n host: request.headers.host ?? null,\n authorization: request.headers.authorization ?? null,\n secWebSocketProtocol: request.headers['sec-websocket-protocol'] ?? null,\n }, admission);\n if (!decision.admit) {\n refuseUpgrade(socket, decision);\n return;\n }\n\n const url = new URL(request.url ?? '', `http://${request.headers.host}`);\n if (url.pathname.startsWith('/ws/session/')) {\n handler(request, socket, head);\n } else {\n socket.destroy();\n }\n });\n}\n\nconst REASON_PHRASE: Record<number, string> = { 401: 'Unauthorized', 403: 'Forbidden' };\n\nfunction refuseUpgrade(socket: Duplex, decision: Extract<AdmissionDecision, { admit: false }>): void {\n const body = JSON.stringify({ error: decision.reason });\n socket.end(\n `HTTP/1.1 ${decision.status} ${REASON_PHRASE[decision.status] ?? 'Forbidden'}\\r\\n` +\n 'Connection: close\\r\\n' +\n 'Content-Type: application/json\\r\\n' +\n `Content-Length: ${Buffer.byteLength(body)}\\r\\n` +\n `\\r\\n${body}`,\n );\n socket.destroy();\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport type { Hono } from 'hono';\n\n/**\n * Bridges node's http server onto the Hono app. Kept out of `main.ts` so the\n * real request path — including the Host header the admission check reads — is\n * testable against a listening server.\n */\nexport function createRequestListener(app: Hono) {\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const bufs: Buffer[] = [];\n for await (const chunk of req) bufs.push(chunk as Buffer);\n const body = bufs.length > 0 ? Buffer.concat(bufs).toString() : undefined;\n\n const url = `http://${req.headers.host || 'localhost'}${req.url}`;\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers)) {\n if (v) {\n if (Array.isArray(v)) v.forEach(vv => headers.append(k, vv));\n else headers.set(k, v as string);\n }\n }\n if (body && !headers.has('content-type')) headers.set('content-type', 'application/json');\n\n const webReq = new Request(url, {\n method: req.method || 'GET',\n headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? body : undefined,\n });\n\n try {\n const webRes = await app.fetch(webReq);\n res.writeHead(webRes.status, Object.fromEntries(webRes.headers.entries()));\n if (webRes.body) {\n const reader = webRes.body.getReader();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n }\n res.end();\n } catch (err) {\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: err instanceof Error ? (err as Error).message : 'Internal server error' }));\n }\n }\n };\n}\n","#!/usr/bin/env node\nimport { createApp, attachWsHandler } from './app';\nimport { createRequestListener } from './nodeAdapter';\nimport { OrchestratorPool } from './pool/orchestratorPool';\nimport { createServer } from 'http';\nimport { clearDaemonToken, mintDaemonToken, StructuredRunner } from '@ordewell/core';\nimport { startTerminalHost } from './adapters/TerminalHost';\n\nconst args = process.argv.slice(2);\nlet port = 3742;\n\nconst portIdx = args.indexOf('--port');\nif (portIdx !== -1 && args[portIdx + 1]) {\n port = parseInt(args[portIdx + 1], 10) || 3742;\n}\n\n// Set only for a daemon owned by one CLI invocation (e.g. `ordewell tui`),\n// which spawns it non-detached expecting it to die with the caller. A\n// closed terminal delivers SIGHUP to both via the shared process group, but\n// that misses a caller killed by PID directly or a multiplexer that doesn't\n// relay the signal — this poll is the fallback so an owned daemon never\n// outlives its CLI and orphans don't accumulate.\nconst watchParentIdx = args.indexOf('--watch-parent');\nconst watchParentPid = watchParentIdx !== -1 ? parseInt(args[watchParentIdx + 1], 10) : undefined;\n\n// Terminal-transport tasks run in a real tmux window (so `ordewell tui` can\n// open a genuine interactive terminal on them) whenever tmux is on the host;\n// otherwise they fall back to the headless-per-session runner (see\n// OrchestratorPool's `runner` dep) and the first such run says so.\nconst { runner: tmuxRunner, advice: terminalAdvice } = startTerminalHost(port);\n\n// Minted before the socket is listening, so no request can arrive before there\n// is a token to check it against.\nconst { token, file: tokenFile } = mintDaemonToken(port);\nconst admission = { port, token, tokenFile };\n\n// Tasks of a plan run on the structured transport (ADR-0018) are plain child\n// processes: no tmux, so one runner serves every plan whatever the host has.\nconst pool = new OrchestratorPool({ runner: tmuxRunner, terminalAdvice, structuredRunner: new StructuredRunner() });\nconst app = createApp(pool, admission);\n\n// Warm the model caches at startup (same as the VS Code extension's activation\n// refresh): runner model discovery + provider routing lists, so the first\n// request/plan doesn't pay the discovery latency and stale caches are rebuilt.\npool.getProviderModels().catch((err) => {\n console.error(`[web] model discovery warmup failed: ${err?.message ?? err}`);\n});\n\napp.get('/', (c) => c.json({ message: 'Ordewell API', docs: '/api/workspaces' }));\n\nconst server = createServer(createRequestListener(app));\n\nattachWsHandler(server, pool, admission);\n\nserver.listen(port, '127.0.0.1', () => {\n console.error(`[web] Ordewell API server: http://localhost:${port}`);\n});\n\nasync function shutdown(): Promise<void> {\n clearDaemonToken(port);\n pool.destroyAll();\n // The one cleanup guarantee against leaked tmux processes: killing the\n // shared session takes every window (and whatever's running in it) with it.\n if (tmuxRunner) await tmuxRunner.killSession().catch(() => {});\n server.close();\n process.exit(0);\n}\n\nprocess.on('SIGINT', () => { shutdown(); });\nprocess.on('SIGTERM', () => { shutdown(); });\nprocess.on('SIGHUP', () => { shutdown(); });\n\nif (watchParentPid) {\n const parentCheck = setInterval(() => {\n try {\n process.kill(watchParentPid, 0);\n } catch {\n clearInterval(parentCheck);\n shutdown();\n }\n }, 5000);\n}\n"]}
1
+ {"version":3,"sources":["../../server/adapters/WebConfig.ts","../../server/utils/workspaceScanner.ts","../../server/adapters/run.ts","../../server/adapters/PoolFileSystem.ts","../../server/adapters/PoolAwareRunner.ts","../../server/adapters/TerminalHost.ts","../../server/pool/orchestratorPool.ts","../../server/routes/sessions.ts","../../server/routes/plans.ts","../../server/routes/runners.ts","../../server/routes/models.ts","../../server/routes/workspaces.ts","../../server/routes/approvals.ts","../../server/routes/settings.ts","../../server/routes/commands.ts","../../server/ws/stream.ts","../../server/security/admission.ts","../../server/app.ts","../../server/nodeAdapter.ts","../../server/main.ts"],"names":["BaseConfig","isCliProvider","resolveProvider","normalizeGeminiModel","fs","path","args","resolve","execFile","BaseFileSystem","researchToolsPath","withPath","GREP_PCRE_PROBE_ARGS","grepRegexFromProbe","result","buildGlobArgs","capped","applyHeadLimit","formatSearchOutput","SEARCH_EXCLUSIONS","path2","buildGrepArgs","buildFallbackGrepArgs","filterFallbackByAnchoredInclude","STOPPED_TOOL_RESULT","HeadlessRunner","port","hasTmux","TmuxRunner","RunnerRegistry","RunnerInstallation","SettingsService","PlannerModelMemory","StructuredRunner","ModelResolver","sessionRuntimeSettings","assertWorkspaceExists","assertWorkspaceIsProject","WorkspaceNotAProjectError","ensureStateDirIgnored","TransportRouter","createSession","runnerForProvider","admission","admitSettingsEnv","isRunnerTransport","PROVIDER_CREDENTIAL_ENV","PROVIDER_PRIORITY","runnerModesFrom","migratePlanState","ConversationBusyError","loadSession","scanWorkspaces","listSessions","deleteSession","pool","Hono","loadSessionPlanState","WorkspaceNotFoundError","listTaskLogAttempts","readTaskLog","PlanEditError","TaskControlError","ConversationEditError","run","flattenTasks","toApprovalDecision","isGranted","WebSocketServer","DAEMON_SUBPROTOCOL","tokensMatch","extractPresentedToken","app","server","mintDaemonToken","createServer","clearDaemonToken"],"mappings":"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","file":"main.js","sourcesContent":["import { AiProvider, BaseConfig, isCliProvider, normalizeGeminiModel, resolveProvider } from '@ordewell/core';\nimport type { ProviderModelLists } from '@ordewell/core';\n\ninterface WebConfigOpts {\n enabledRunners?: string[];\n providerModelLists?: ProviderModelLists;\n modelOverride?: string;\n}\n\nexport class WebConfig extends BaseConfig {\n private _provider: AiProvider | null = null;\n private _providerCacheKey: string | null = null;\n private _providerCacheLists: ProviderModelLists | undefined = undefined;\n private _enabledRunnersOverride: string[] | undefined;\n private _providerModelLists: ProviderModelLists | undefined;\n private _modelOverride: string | undefined;\n\n constructor(opts?: WebConfigOpts) {\n super();\n this._enabledRunnersOverride = opts?.enabledRunners;\n this._providerModelLists = opts?.providerModelLists;\n this._modelOverride = opts?.modelOverride;\n }\n\n setProviderModelLists(lists: ProviderModelLists): void {\n this._providerModelLists = lists;\n this._provider = null;\n }\n\n get orchestratorModel(): string {\n return this._modelOverride || process.env.ORCHESTRATOR_MODEL || '';\n }\n\n get aiProvider(): AiProvider {\n // Memoized by cache key rather than forever: a session's WebConfig lives\n // for the whole session, but /model and /planner switches mutate process.env\n // mid-session, so a permanent cache would strand the transport on the old\n // provider (mirrors the live-read behavior of `orchestratorModel` above).\n const explicitEnv = process.env.AI_PROVIDER;\n const model = this._modelOverride || process.env.ORCHESTRATOR_MODEL;\n const cacheKey = `${explicitEnv ?? ''}|${model ?? ''}`;\n if (\n this._provider &&\n this._providerCacheKey === cacheKey &&\n this._providerCacheLists === this._providerModelLists\n ) {\n return this._provider;\n }\n\n // An explicitly chosen harness planner (ADR-0009) wins over model-based\n // resolution: its model ids are the agent's own (`sonnet`, `gpt-5.6-sol`)\n // and can collide with a vendor catalog, which would silently route the\n // planner back to an API the user may not even have a key for.\n const explicit = explicitEnv as AiProvider | undefined;\n if (explicit && isCliProvider(explicit)) {\n this._provider = explicit;\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n\n if (model && this._providerModelLists) {\n const resolved = resolveProvider(model, this._providerModelLists);\n if (resolved) {\n this._provider = resolved;\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n }\n\n this._provider = BaseConfig.detectProvider('openrouter');\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n\n get apiKey(): string {\n return this.getProviderApiKey(this.aiProvider);\n }\n\n get planningModel(): string {\n if (this.aiProvider === 'google')\n return normalizeGeminiModel(process.env.GEMINI_MODEL || process.env.ORCHESTRATOR_MODEL || super.geminiModel);\n return process.env.ORCHESTRATOR_MODEL || '';\n }\n\n get enabledRunners(): string[] {\n if (this._enabledRunnersOverride) return this._enabledRunnersOverride;\n\n const envRunners = process.env.ORDEWELL_ENABLED_RUNNERS;\n if (envRunners) {\n const parsed = envRunners.split(',').map((s) => s.trim()).filter(Boolean);\n if (parsed.length > 0) return parsed;\n }\n\n const out: string[] = [];\n if (process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== 'false' && process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== '0') {\n out.push('claude-code');\n }\n if (process.env.ORDEWELL_CODEX_ENABLED === 'true' || process.env.ORDEWELL_CODEX_ENABLED === '1') {\n out.push('codex');\n }\n if (process.env.ORDEWELL_OPENCODE_ENABLED === 'true' || process.env.ORDEWELL_OPENCODE_ENABLED === '1') {\n out.push('opencode');\n }\n return out.length > 0 ? out : ['claude-code'];\n }\n\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface WorkspaceScannerDeps {\n fsModule: typeof fs;\n pathModule: typeof path;\n cwd: string;\n home: string;\n projectDir: string;\n}\n\nexport function scanWorkspacesImpl(deps: WorkspaceScannerDeps): string[] {\n const { fsModule, pathModule, cwd, home, projectDir } = deps;\n const paths = new Set<string>();\n const searchRoots = [\n cwd,\n home,\n pathModule.join(home, 'projects'),\n pathModule.join(home, 'dev'),\n pathModule.join(home, 'code'),\n pathModule.join(home, 'src'),\n pathModule.join(home, 'Desktop'),\n pathModule.join(home, 'Documents'),\n ];\n for (const root of searchRoots) {\n try {\n if (fsModule.existsSync(pathModule.join(root, '.ordewell'))) paths.add(root);\n const entries = fsModule.readdirSync(root, { withFileTypes: true }).filter(e => e.isDirectory());\n for (const e of entries.slice(0, 50)) {\n const sub = pathModule.join(root, e.name);\n if (fsModule.existsSync(pathModule.join(sub, '.ordewell'))) paths.add(sub);\n }\n } catch { /* empty */ }\n }\n return [...paths].filter(p => p !== pathModule.resolve(projectDir)).sort();\n}\n\nexport function scanWorkspaces(): string[] {\n return scanWorkspacesImpl({\n fsModule: fs,\n pathModule: path,\n cwd: process.cwd(),\n home: process.env.HOME || '/root',\n projectDir: path.resolve(__dirname, '..', '..', '..', '..'),\n });\n}\n","import { execFile } from 'child_process';\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n code: number | null;\n}\n\n/**\n * Cap on a single child's buffered output. Above this, Node kills the child\n * and invokes the callback with `err.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER'`\n * — a string, so the coercion below maps it to `1` (see `run`).\n */\nexport const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;\n\n/**\n * The single primitive every search/inspection adapter in this package is\n * built on: spawn a child, never reject. Kept in its own module so the\n * contract that the planner depends on — synchronous spawn failures degrade\n * to a failed tool call, never a rejected promise that aborts the whole\n * planner turn — can be pinned by a focused test rather than exercised only\n * incidentally through the public adapter API.\n *\n * Node hands only ENOENT/EAGAIN/EMFILE/ENFILE from spawn(2) to the\n * callback; every other errno — ENOTDIR for a `cwd` that is a file, EACCES\n * for one it cannot enter — is thrown synchronously. Thrown in here that\n * rejects the promise, and no caller of `run` catches, so a single bad\n * search argument aborted the entire planner turn as \"Plan generation\n * failed: spawn ENOTDIR\". A failed spawn is a failed tool call, never a\n * failed plan.\n */\nexport function run(\n file: string,\n args: string[],\n opts: { cwd?: string; timeout: number; shell?: boolean; env?: NodeJS.ProcessEnv; signal?: AbortSignal },\n): Promise<ExecResult> {\n return new Promise((resolve) => {\n try {\n execFile(file, args, {\n cwd: opts.cwd,\n timeout: opts.timeout,\n maxBuffer: MAX_OUTPUT_BYTES,\n encoding: 'utf8',\n shell: opts.shell,\n env: opts.env,\n // Node kills the child when this aborts, and calls back with an\n // ABORT_ERR — which lands on the `code: 1` branch below, i.e. a\n // failed tool call, exactly like any other command that did not\n // finish. Stopping the planner must not leave a research `bash`\n // running out its own timeout on the server.\n signal: opts.signal,\n }, (err, stdout, stderr) => {\n const code = err && typeof (err as { code?: unknown }).code === 'number' ? (err as { code: number }).code : err ? 1 : 0;\n resolve({ stdout: stdout ?? '', stderr: stderr ?? '', code });\n });\n } catch (err) {\n // `code: null` rather than 1 on purpose: the search adapters read 0 and 1\n // as \"ran, possibly no matches\", so a 1 here would report a confident\n // \"No matches found.\" for a search that never executed.\n resolve({ stdout: '', stderr: (err as Error).message, code: null });\n }\n });\n}","import {\n BaseFileSystem,\n buildGrepArgs,\n buildGlobArgs,\n buildFallbackGrepArgs,\n GREP_PCRE_PROBE_ARGS,\n grepRegexFromProbe,\n type GrepRegex,\n filterFallbackByAnchoredInclude,\n applyHeadLimit,\n formatSearchOutput,\n researchToolsPath,\n withPath,\n SEARCH_EXCLUSIONS,\n STOPPED_TOOL_RESULT,\n type GrepOptions,\n type ReadFileOpts,\n type ToolOutcome,\n} from '@ordewell/core';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { run } from './run';\n\n/**\n * Everything here is async. It used to be `execSync`/`readFileSync`, which on\n * the web server blocked the entire Node event loop: one session running\n * `tree -L 4` over a monorepo stalled every other session's WebSocket\n * streaming, HTTP API, and plan-token delivery. It also makes the parallel\n * tool-round pre-pass in BaseAiService pointless, since concurrent calls into\n * a synchronous adapter still serialize.\n */\n\nconst SEARCH_TIMEOUT_MS = 20_000;\n/** Generous, because an approved `bash` call may legitimately be a test suite. */\nconst BASH_TIMEOUT_MS = 120_000;\n\nexport class PoolFileSystem extends BaseFileSystem {\n constructor(private workspaceRoot: string) { super(); }\n getWorkspaceRoot(): string { return this.workspaceRoot; }\n\n /**\n * PATH for the search subprocesses. `execFile` starts them with no shell, so\n * on a Windows box whose POSIX tools live in the Git tree (`grep.exe` beside\n * the research shell) they are only resolvable with that directory prepended.\n * Identity on POSIX, where `utilsDir` is null. Kept in step with\n * VsCodeFileSystem.searchEnv.\n */\n private searchEnv(): NodeJS.ProcessEnv | undefined {\n const resolved = researchToolsPath(this.researchShell, process.env.PATH);\n // `withPath`, not a `PATH:` spread: on Windows the spread of `process.env`\n // carries `Path`, so adding `PATH` hands the child two and lets the OS pick.\n return resolved === (process.env.PATH ?? '') ? undefined : withPath(process.env, resolved);\n }\n\n private grepRegex: Promise<GrepRegex> | null = null;\n private fallbackGrepRegex(): Promise<GrepRegex> {\n this.grepRegex ??= run('grep', GREP_PCRE_PROBE_ARGS, { timeout: 5_000, env: this.searchEnv() })\n .then((r) => grepRegexFromProbe(r.code))\n .catch(() => 'ere' as const);\n return this.grepRegex;\n }\n\n private rgAvailable: Promise<boolean> | null = null;\n private hasRg(): Promise<boolean> {\n this.rgAvailable ??= run('rg', ['--version'], { timeout: 5_000, env: this.searchEnv() }).then((r) => r.code === 0).catch(() => false);\n return this.rgAvailable;\n }\n\n protected async readFileImpl(absPath: string, opts?: ReadFileOpts): Promise<ToolOutcome> {\n try {\n const stat = await fs.stat(absPath);\n if (!stat.isFile()) return { success: false, output: `Not a file: ${absPath}`, truncated: false };\n\n // Hard file-size cap — return an actionable error so the model switches to grep\n const maxBytes = opts?.maxBytes ?? 1024;\n if (stat.size > maxBytes * 1024) {\n const sizeMB = (stat.size / (1024 * 1024)).toFixed(1);\n return {\n success: true,\n output: `File too large (${sizeMB} MB). Maximum is ${maxBytes} KB. Use grep to search for specific patterns instead.`,\n truncated: false,\n };\n }\n\n const content = await fs.readFile(absPath, 'utf8');\n const allLines = content.split('\\n');\n // Discard the empty element from a trailing newline\n if (allLines.length > 0 && allLines[allLines.length - 1] === '') allLines.pop();\n const totalLines = allLines.length;\n\n const startLine = opts?.offset ?? 0;\n const maxLines = opts?.limit ?? 2000;\n\n if (startLine >= totalLines) return { success: true, output: '', truncated: false };\n\n const selectedLines = allLines.slice(startLine, startLine + maxLines);\n const truncated = (startLine + maxLines) < totalLines;\n\n // Right-align line numbers so columns stay aligned across calls\n const lineWidth = String(totalLines).length;\n let output = selectedLines.map((line, i) => {\n const lineNum = String(startLine + i + 1).padStart(lineWidth);\n return `${lineNum}|${line}`;\n }).join('\\n');\n\n // Actionable hint so the model knows how to continue\n if (truncated) {\n const nextOffset = startLine + maxLines;\n output += `\\n\\n(File has more lines — use offset=${nextOffset} to read beyond line ${nextOffset})\\n`;\n }\n\n return { success: true, output, truncated };\n } catch (err) {\n return { success: false, output: `Error reading ${absPath}: ${(err as Error).message}`, truncated: false };\n }\n }\n\n protected async globImpl(pattern: string, absRoot: string, headLimit: number): Promise<ToolOutcome> {\n if (await this.hasRg()) {\n // ripgrep resolves a `--glob` pattern that contains a `/` against its own\n // cwd, not the `--` search path — without this, a daemon started outside\n // the workspace silently drops every anchored pattern (\"src/**/*\") to a\n // false \"No files matched.\".\n const anchor = await this.searchAnchor(absRoot);\n const result = await run('rg', buildGlobArgs(pattern, absRoot), { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() });\n // rg exits 1 for \"no files matched\", which is a valid empty answer.\n if (result.code !== 0 && result.code !== 1 && !result.stdout) {\n return { success: false, output: `Glob failed: ${result.stderr.trim() || 'ripgrep error'}`, truncated: false };\n }\n const capped = applyHeadLimit(result.stdout, headLimit);\n return {\n success: true,\n output: formatSearchOutput(capped, anchor, { emptyMessage: 'No files matched.', hint: 'Narrow the pattern.' }),\n truncated: capped.truncated,\n };\n }\n\n // `find -path` treats `*` as crossing `/`, so `**` is not recursive there.\n // Translating to `-name` on the basename keeps the common cases honest\n // rather than silently returning a different result set than ripgrep would.\n const basename = pattern.split('/').pop() || pattern;\n const excludeArgs = SEARCH_EXCLUSIONS.flatMap((dir) => ['-not', '-path', `*/${dir}/*`]);\n const result = await run('find', [absRoot, '-type', 'f', '-name', basename, ...excludeArgs], { timeout: SEARCH_TIMEOUT_MS, env: this.searchEnv() });\n if (result.code !== 0 && !result.stdout) {\n return { success: false, output: `Glob failed: ${result.stderr.trim() || 'find error'}`, truncated: false };\n }\n const capped = applyHeadLimit(result.stdout, headLimit);\n return {\n success: true,\n output: formatSearchOutput(capped, absRoot, { emptyMessage: 'No files matched.' }),\n truncated: capped.truncated,\n };\n }\n\n /**\n * A directory to anchor a search in. `cwd` exists only so anchored\n * `--glob`/`--include` patterns resolve against the search root (see\n * globImpl), and spawn(2) rejects a `cwd` that is a file with ENOTDIR.\n *\n * `grep`'s `path` is documented as a directory, but the tool description\n * tells the model to survey with output_mode=\"files\" and then re-run \"on a\n * narrower path\" — and what that survey hands back are files. rg and grep\n * both search a single file happily, so anchor at the parent rather than\n * failing a legitimately file-scoped search.\n */\n private async searchAnchor(absRoot: string): Promise<string> {\n try {\n return (await fs.stat(absRoot)).isDirectory() ? absRoot : path.dirname(absRoot);\n } catch {\n return absRoot;\n }\n }\n\n protected async grepImpl(pattern: string, absRoot: string, opts: GrepOptions): Promise<ToolOutcome> {\n const headLimit = opts.headLimit ?? 100;\n const useRg = await this.hasRg();\n // Same anchored-glob-vs-cwd hazard as globImpl: an `include` filter with a\n // `/` in it would otherwise resolve against the daemon's cwd, not absRoot.\n const anchor = await this.searchAnchor(absRoot);\n // GNU grep's `--include` only matches a basename, so an anchored pattern\n // like `subdir/*.txt` never matches there — strip it from the grep call\n // and filter matches by relative path afterward instead.\n const anchoredInclude = !useRg && opts.include?.includes('/') ? opts.include : undefined;\n const result = useRg\n ? await run('rg', buildGrepArgs(pattern, opts, absRoot).args, { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() })\n : await run('grep', buildFallbackGrepArgs(pattern, anchoredInclude ? { ...opts, include: undefined } : opts, absRoot, await this.fallbackGrepRegex()), { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() });\n\n // Exit 1 is \"no matches\" for both tools — a successful search with an empty\n // result, not a failure. Anything else with no stdout is a real error.\n if (result.code !== 0 && result.code !== 1 && !result.stdout) {\n return { success: false, output: `Search failed: ${result.stderr.trim() || 'search error'}`, truncated: false };\n }\n\n const filteredStdout = anchoredInclude\n ? filterFallbackByAnchoredInclude(result.stdout, anchoredInclude, anchor, opts.outputMode)\n : result.stdout;\n const capped = applyHeadLimit(filteredStdout, headLimit);\n const hint = opts.outputMode === 'content'\n ? 'Re-run with output_mode=\"files\" to see the full breadth, or narrow with include/path.'\n : 'Narrow with include/path.';\n return {\n success: true,\n output: formatSearchOutput(capped, anchor, { emptyMessage: 'No matches found.', hint }),\n truncated: capped.truncated,\n };\n }\n\n protected async listDirImpl(absPath: string, depth: number): Promise<ToolOutcome> {\n if (depth > 1) {\n const result = await run('tree', ['-L', String(depth), '-I', 'node_modules|.git|dist|build', absPath], { timeout: 10_000, env: this.searchEnv() });\n if (result.code === 0 && result.stdout.trim()) {\n const lines = result.stdout.trim().split('\\n');\n return { success: true, output: lines.slice(0, 300).join('\\n'), truncated: lines.length > 300 };\n }\n // `tree` is not installed everywhere; fall through to a flat listing.\n }\n try {\n const entries = await fs.readdir(absPath, { withFileTypes: true });\n const lines = entries.slice(0, 200).map((e) => `${e.isDirectory() ? 'D' : 'F'} ${e.name}`);\n return { success: true, output: lines.join('\\n') || '(empty directory)', truncated: entries.length > 200 };\n } catch (err) {\n return { success: false, output: `Error listing ${absPath}: ${(err as Error).message}`, truncated: false };\n }\n }\n\n protected async execBashImpl(command: string, signal?: AbortSignal): Promise<ToolOutcome> {\n // `shell: true` is required now that approved commands may legitimately\n // contain pipes; the tier classifier in core (not string filtering here)\n // is what decides whether this command was allowed to reach the shell.\n //\n // `file: null` is that host default, unchanged on POSIX. A resolved file is\n // the POSIX shell found on a Windows box, invoked explicitly so the command\n // runs in the dialect `BaseFileSystem` classified it under.\n const { file, args } = this.researchShell;\n const result = file === null\n ? await run(command, [], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, shell: true, signal })\n : await run(file, [...args, command], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, signal });\n const out = (result.stdout || '').trim();\n const err = (result.stderr || '').trim();\n\n // A stopped turn reports as a stop, not as a mysterious non-zero exit: the\n // child was killed on purpose and there is nothing here to diagnose.\n if (signal?.aborted) return { success: false, output: STOPPED_TOOL_RESULT, truncated: false };\n\n if (result.code !== 0) {\n const detail = err || out || `exited with code ${result.code}`;\n // A failing command is still research: the model asked to diagnose, and\n // the failure output is usually the answer. Report it, do not swallow it.\n return { success: false, output: `Command exited ${result.code}:\\n${detail.slice(0, 20_000)}`, truncated: detail.length > 20_000 };\n }\n\n const combined = err ? `${out}\\n[stderr]\\n${err}` : out;\n return { success: true, output: combined || '(no output)', truncated: combined.length > 20_000 };\n }\n}\n","import { HeadlessRunner, type ITerminalRunner, type ITerminalSession, type RunnerSpawnOptions } from '@ordewell/core';\nimport type { SessionBroadcaster } from '@ordewell/core';\n\nexport class PoolAwareRunner implements ITerminalRunner {\n private inner: ITerminalRunner;\n /**\n * Sessions this plan spawned. The inner runner may be shared by every plan\n * in the pool (one tmux session per daemon), so \"stop everything\" and\n * \"how many are running\" must be answered from this set, never delegated —\n * delegating would let one plan's /stop kill another plan's tasks.\n */\n private owned = new Set<string>();\n\n constructor(\n private sessionId: string,\n private broadcast: SessionBroadcaster,\n inner?: ITerminalRunner,\n ) {\n this.inner = inner ?? new HeadlessRunner();\n }\n\n get activeCount(): number { return this.owned.size; }\n\n async spawn(opts: RunnerSpawnOptions): Promise<ITerminalSession> {\n const session = await this.inner.spawn({ ...opts, planSessionId: this.sessionId });\n this.owned.add(session.id);\n session.onExit(() => this.owned.delete(session.id));\n this.broadcast({ type: 'task_started', taskId: opts.taskId, order: opts.order ?? 0, title: opts.title ?? '', runner: opts.runner, modelId: opts.modelId });\n session.onOutput((text) => {\n this.broadcast({ type: 'task_output', taskId: opts.taskId, text });\n });\n return session;\n }\n\n stop(sessionId: string): void {\n this.inner.stop(sessionId);\n this.owned.delete(sessionId);\n }\n\n stopAll(): void {\n for (const id of this.owned) this.inner.stop(id);\n this.owned.clear();\n }\n}\n","import { hasTmux, TmuxRunner, type ITerminalRunner, type ITerminalSession, type RunnerSpawnOptions } from '@ordewell/core';\n\nexport const TMUX_MISSING_ADVICE =\n 'tmux is not installed, so terminal-transport tasks run without a terminal window you can open or type into. Install tmux, or keep the structured transport (/transport structured).';\n\nexport interface TerminalHostDeps {\n hasTmuxImpl?: () => boolean;\n createTmuxRunner?: (port: number) => TmuxRunner;\n}\n\nexport interface TerminalHost {\n /** Undefined when the host has no tmux: each plan then falls back to its own headless runner. */\n runner?: TmuxRunner;\n /** Set only when a terminal-transport run will lack what tmux gives it; structured runs never need it. */\n advice?: string;\n}\n\n/**\n * The daemon's start-up check for tmux. A missing tmux is never fatal and is\n * not reported here: the structured transport (the default) needs none, so the\n * word only reaches the user, via {@link AdvisingRunner}, if a run actually\n * uses the terminal.\n */\nexport function startTerminalHost(port: number, deps: TerminalHostDeps = {}): TerminalHost {\n const hasTmuxImpl = deps.hasTmuxImpl ?? hasTmux;\n if (!hasTmuxImpl()) return { advice: TMUX_MISSING_ADVICE };\n const runner = (deps.createTmuxRunner ?? ((p) => new TmuxRunner({ port: p })))(port);\n // Failure is not fatal here: ensureSession is memoized and each spawn\n // re-awaits it, so the next task retries the setup rather than giving up.\n runner.ensureSession().catch((err) => {\n console.error(`[web] tmux session setup failed (will retry on next task spawn): ${err?.message ?? err}`);\n });\n return { runner };\n}\n\n/**\n * Wraps the runner a plan's terminal-transport tasks run on, so the first one\n * says what the host lacks. It sits below the transport router, which only\n * sends terminal-transport spawns here.\n */\nexport class AdvisingRunner implements ITerminalRunner {\n private advised = false;\n\n constructor(\n private readonly inner: ITerminalRunner,\n private readonly advice: string,\n private readonly advise: (message: string) => void,\n ) {}\n\n get activeCount(): number { return this.inner.activeCount; }\n\n spawn(opts: RunnerSpawnOptions): Promise<ITerminalSession> {\n if (!this.advised) {\n this.advised = true;\n this.advise(this.advice);\n }\n return this.inner.spawn(opts);\n }\n\n stop(sessionId: string): void { this.inner.stop(sessionId); }\n\n stopAll(): void { this.inner.stopAll(); }\n}\n","import { WebSocket } from 'ws';\nimport {\n Session,\n createSession,\n ConversationBusyError,\n type ConversationCompaction,\n type ConversationFork,\n type SessionMessage,\n type SessionNotice,\n type SessionRuntimeSettings,\n ModelResolver,\n RunnerRegistry,\n RunnerInstallation,\n listSessions,\n loadSession,\n deleteSession,\n SettingsService,\n sessionRuntimeSettings,\n type PlanState,\n type LegacyPlanState,\n migratePlanState,\n type RunnerId,\n type DiscoveredModel,\n type OrchestratorOption,\n type RunnerModeInfo,\n runnerModesFrom,\n PROVIDER_PRIORITY,\n assertWorkspaceExists,\n assertWorkspaceIsProject,\n WorkspaceNotAProjectError,\n ensureStateDirIgnored,\n runnerForProvider,\n PlannerModelMemory,\n admitSettingsEnv,\n PROVIDER_CREDENTIAL_ENV,\n type AiProvider,\n type PlannerModelCandidate,\n isRunnerTransport,\n HeadlessRunner,\n StructuredRunner,\n TransportRouter,\n} from '@ordewell/core';\nimport { WebConfig } from '../adapters/WebConfig';\nimport { scanWorkspaces as scanWorkspacesImpl } from '../utils/workspaceScanner';\nimport { PoolFileSystem } from '../adapters/PoolFileSystem';\nimport { PoolAwareRunner } from '../adapters/PoolAwareRunner';\nimport { AdvisingRunner } from '../adapters/TerminalHost';\nimport type { ApprovalAnswer, RunnerRegistry as CoreRunnerRegistry, ITerminalRunner } from '@ordewell/core';\n\n/** A fork the pool has adopted: addressable at once, its plan read back from the file it was written to. */\nexport interface AdoptedFork {\n sessionId: string;\n goal: string;\n plan: LegacyPlanState;\n}\n\nexport interface OrchestratorPoolDeps {\n /**\n * Shared across every session instead of each `PoolAwareRunner` defaulting\n * to its own `HeadlessRunner` — needed so a tmux-backed runner's one\n * session/many-windows lifecycle outlives any single planning session.\n * Left undefined, behavior is unchanged from before this existed.\n */\n runner?: ITerminalRunner;\n /**\n * Where a task on the structured transport runs (ADR-0018). Shared like\n * `runner`, and defaulted to a real one; tests inject a fake.\n */\n structuredRunner?: ITerminalRunner;\n /** What a plan's first terminal-transport task tells the user the host lacks; structured tasks never trigger it. */\n terminalAdvice?: string;\n /**\n * Overrides the pool's own `ModelResolver`. Left undefined, behavior is\n * unchanged; tests inject one built with fake exec/fetch impls so a\n * planner-switch catalog lookup can be seeded without spawning real CLIs.\n */\n modelResolver?: ModelResolver;\n}\n\nexport class OrchestratorPool {\n private sessions = new Map<string, Session>();\n private clients = new Map<string, Set<WebSocket>>();\n /** The in-flight planning turn's abort controller, one per session — see `cancelPlanning`. */\n private planningAborts = new Map<string, AbortController>();\n /** Sessions whose planning slot a compaction holds; a reply must not take it over. */\n private compacting = new Set<string>();\n private registry: CoreRunnerRegistry = (() => { const r = new RunnerRegistry(); r.loadUserPlugins(); return r; })();\n private modelResolver: ModelResolver;\n private runnerInstallation = new RunnerInstallation(this.registry);\n private cachedProviderLists: Record<string, string[]> | undefined;\n private settingsService = new SettingsService();\n private plannerModelMemory = new PlannerModelMemory(this.settingsService);\n private sharedRunner?: ITerminalRunner;\n private structuredRunner: ITerminalRunner;\n private terminalAdvice?: string;\n\n constructor(deps: OrchestratorPoolDeps = {}) {\n this.sharedRunner = deps.runner;\n this.structuredRunner = deps.structuredRunner ?? new StructuredRunner();\n this.terminalAdvice = deps.terminalAdvice;\n this.modelResolver = deps.modelResolver ?? new ModelResolver(this.registry, new WebConfig());\n }\n\n subscribe(sessionId: string, ws: WebSocket): void {\n if (!this.clients.has(sessionId)) this.clients.set(sessionId, new Set());\n this.clients.get(sessionId)!.add(ws);\n }\n\n unsubscribe(sessionId: string, ws: WebSocket): void {\n this.clients.get(sessionId)?.delete(ws);\n if (this.clients.get(sessionId)?.size === 0) this.clients.delete(sessionId);\n }\n\n private broadcast(sessionId: string, msg: SessionMessage | SessionNotice): void {\n const payload = JSON.stringify(msg);\n for (const ws of this.clients.get(sessionId) ?? []) {\n if (ws.readyState === ws.OPEN) ws.send(payload);\n }\n }\n\n hasSession(sessionId: string): boolean { return this.sessions.has(sessionId); }\n\n /** Answer an approval prompt, the planner's or a task runner's. False means the id was unknown or already settled. */\n resolveApproval(sessionId: string, approvalId: string, answer: ApprovalAnswer): boolean {\n return this.sessions.get(sessionId)?.resolveApproval(approvalId, answer) ?? false;\n }\n\n outstandingApprovals(sessionId: string) {\n return this.sessions.get(sessionId)?.outstandingApprovals() ?? [];\n }\n\n approvedScopes(sessionId: string): string[] {\n return this.sessions.get(sessionId)?.approvedScopes() ?? [];\n }\n isExecuting(sessionId: string): boolean { return this.sessions.get(sessionId)?.isExecuting ?? false; }\n getPlan(sessionId: string): LegacyPlanState | null { return this.sessions.get(sessionId)?.planState ?? null; }\n /**\n * The plan of a session this process is holding, straight from its store —\n * null for an id the pool never adopted. Reading it through the saved file\n * instead answers as if nothing were running.\n */\n getPlanState(sessionId: string): PlanState | null {\n return this.sessions.get(sessionId)?.currentPlanState ?? null;\n }\n getGoal(sessionId: string): string { return this.sessions.get(sessionId)?.currentGoal ?? ''; }\n\n private runtimeSettings(): SessionRuntimeSettings {\n return sessionRuntimeSettings(this.settingsService.getAll());\n }\n\n private createSessionFor(sessionId: string, workspace: string, modelOverride?: string, options: { allowInit?: boolean } = {}): Session {\n // Rejected here rather than left to the planner: a non-existent workspace\n // otherwise reaches the harness adapter's `spawn` as an ENOENT that reads\n // as a missing agent binary, not a missing directory.\n assertWorkspaceExists(workspace);\n // Rejected here too: without a project marker, the filesystem root or an\n // arbitrary system directory becomes the confinement boundary for every\n // read, search and permitted command the planner runs. `allowInit` only\n // ever arrives here on the retry of a call the user already saw and\n // explicitly confirmed (the TUI's \"initialize this as a new workspace?\"\n // prompt) — never as a default, so an unmarked directory is still never\n // admitted silently.\n try {\n assertWorkspaceIsProject(workspace);\n } catch (err) {\n if (!(err instanceof WorkspaceNotAProjectError) || !options.allowInit) throw err;\n ensureStateDirIgnored(workspace);\n assertWorkspaceIsProject(workspace);\n }\n const config = new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n modelOverride,\n providerModelLists: this.cachedProviderLists,\n });\n const fsAdapter = new PoolFileSystem(workspace);\n const broadcast = (msg: SessionMessage) => this.broadcast(sessionId, msg);\n // The router sits under the per-plan wrapper, so a plan's /stop still\n // reaches only its own tasks, on either transport.\n const terminal = this.sharedRunner ?? new HeadlessRunner();\n const router = new TransportRouter({\n terminal: this.terminalAdvice\n ? new AdvisingRunner(terminal, this.terminalAdvice, (message) => this.broadcast(sessionId, { type: 'notice', level: 'warn', message }))\n : terminal,\n structured: this.structuredRunner,\n });\n const runner = new PoolAwareRunner(sessionId, broadcast, router);\n return createSession({\n config,\n notifications: { info() {}, warn() {}, error() {}, async confirm() { return undefined; } },\n runner,\n registry: this.registry,\n workspaceRoot: () => workspace,\n fsAdapter,\n broadcast,\n // The notification channel above is silent here; this is how a client hears how the run isolates.\n onNotice: (notice) => this.broadcast(sessionId, notice),\n modelResolver: this.modelResolver,\n settings: () => this.runtimeSettings(),\n sessionId,\n });\n }\n\n /**\n * The user's runner choice, or undefined when they have never made one —\n * which is what lets `WebConfig` fall back to the environment's defaults.\n * Read per call rather than cached: the settings file is shared with the\n * VS Code extension host, and `getAll()` already invalidates on mtime.\n */\n private enabledRunnerOverride(): string[] | undefined {\n return this.settingsService.getEnabledRunners();\n }\n\n /**\n * Persisted, not held in memory: the daemon dies with the TUI, and a\n * process-local override meant every reopen silently reinstated the\n * environment's defaults over what the user had chosen.\n */\n setRunnerEnabled(id: string, enabled: boolean): void {\n const current = this.enabledRunnerOverride() ?? new WebConfig().enabledRunners;\n const next = enabled\n ? (current.includes(id) ? current : [...current, id])\n : current.filter((r) => r !== id);\n this.settingsService.setEnabledRunners(next);\n }\n\n getSettings() {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const userSettings = this.settingsService.getAll();\n return {\n orchestratorModel: config.orchestratorModel,\n // Who plans (ADR-0009) — a vendor id, or one of the three harness\n // planners. Surfaces need it to render the planner picker and to know\n // whether the planner model comes from a runner catalog or a vendor one.\n aiProvider: config.aiProvider,\n // A harness planner's thinking effort (ADR-0009). Surfaces need it back\n // to render the current level; without it the picker shows \"default\"\n // for a planner that is running at \"high\".\n plannerThinkingEffort: config.plannerThinkingEffort ?? '',\n maxParallel: config.maxParallelSessions,\n tdd: userSettings.tdd,\n verification: userSettings.verification,\n modelAllowlist: userSettings.modelAllowlist,\n // The model remembered per planner backend (this task), so a surface can\n // render what's remembered without a second round-trip.\n plannerModels: userSettings.plannerModels,\n // ADR-0018; a run copies it when it starts.\n runnerTransport: userSettings.runnerTransport,\n };\n }\n\n /**\n * The catalog `PlannerModelMemory.recall` should judge `provider`'s\n * remembered model against — a harness planner's own runner catalog, or the\n * cross-provider picker list for a vendor (ADR-0009), same split as\n * `plannerModelItems` in the TUI reducer. Read from whatever the resolver\n * has already cached so this stays synchronous; a cold cache degrades to an\n * empty catalog rather than kicking off discovery mid-settings-write.\n */\n private plannerCatalogFor(provider: AiProvider): PlannerModelCandidate[] {\n const runner = runnerForProvider(provider);\n if (runner) {\n return this.modelResolver.getCachedRunnerModels(runner).map((m) => ({ id: m.modelId, variants: m.variants }));\n }\n return this.modelResolver.getCachedPickerOptions().map((o) => ({ id: o.id }));\n }\n\n updateSettings(changes: Record<string, unknown>) {\n // Read before any of this call's changes land, so a switch is judged\n // against what was actually in effect a moment ago.\n const providerBefore = new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n providerModelLists: this.cachedProviderLists,\n }).aiProvider;\n\n // Only allowlisted keys reach `process.env`, and everything else comes back\n // to the caller by name — the daemon's environment is inherited by every\n // runner it spawns, so this write is the whole of `admitSettingsEnv`'s\n // reason to exist. All downstream reads below use `envChanges`, which is\n // the admitted subset, never the raw body.\n const rawEnv = changes.env && typeof changes.env === 'object' && !Array.isArray(changes.env)\n ? (changes.env as Record<string, unknown>)\n : undefined;\n const admission = rawEnv ? admitSettingsEnv(rawEnv) : undefined;\n const envChanges = admission ? admission.accepted : undefined;\n const incomingAiProvider = typeof envChanges?.AI_PROVIDER === 'string' ? envChanges.AI_PROVIDER : undefined;\n // The name the client sent wins over re-deriving it from `config.aiProvider`\n // later: for a vendor pick that resolution reads the model id, and a switch\n // may have just cleared it — model-based resolution would misfire on the\n // very call meant to establish the new provider.\n const switchedToProvider: AiProvider | undefined =\n incomingAiProvider && incomingAiProvider !== providerBefore ? (incomingAiProvider as AiProvider) : undefined;\n // Read the incoming provider's catalog now, before the env-touched refresh\n // below clears the resolver's cache — recall must judge the memory against\n // what was already discovered, not force a fresh (async) discovery here.\n const switchRecall = switchedToProvider\n ? this.plannerModelMemory.recall(switchedToProvider, this.plannerCatalogFor(switchedToProvider))\n : undefined;\n\n if (typeof changes.orchestratorModel === 'string') {\n process.env.ORCHESTRATOR_MODEL = changes.orchestratorModel;\n }\n if (typeof changes.plannerThinkingEffort === 'string') {\n process.env.ORDEWELL_PLANNER_EFFORT = changes.plannerThinkingEffort;\n }\n if (changes.tdd && typeof (changes.tdd as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setTdd((changes.tdd as Record<string, unknown>).enabled as boolean);\n }\n if (changes.verification && typeof (changes.verification as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setVerification((changes.verification as Record<string, unknown>).enabled as boolean);\n }\n if (isRunnerTransport(changes.runnerTransport)) {\n this.settingsService.setRunnerTransport(changes.runnerTransport);\n }\n if (envChanges) {\n let touched = false;\n for (const [key, value] of Object.entries(envChanges)) {\n process.env[key] = value;\n // Only a credential or endpoint change touches what a catalog\n // contains. A planner, model or effort pick does not, and invalidating\n // on one would wipe the very cache `plannerCatalogFor` reads\n // synchronously below, right before the next call's switch needs it.\n if (PROVIDER_CREDENTIAL_ENV.has(key)) touched = true;\n }\n // The scheduler reads the limit on every tick, but a raised one would\n // only be seen at the next verdict; the runs waiting for a slot start now.\n if (envChanges.ORDEWELL_MAX_PARALLEL !== undefined) {\n for (const session of this.sessions.values()) void session.reschedule();\n }\n // A new/changed provider key or base URL must re-probe the catalog;\n // without this the picker keeps serving the pre-key cache until restart.\n if (touched) {\n this.modelResolver.invalidate();\n this.modelResolver.refreshRunnerModels();\n }\n }\n\n // A planner switch resolves through memory rather than whatever the\n // client's env carried for the model/effort — an older client still sends\n // a blind `ORCHESTRATOR_MODEL: ''` clear here, and even a current one\n // should land on the model this provider was last using, not nothing.\n // Applied after the env loop above so it overrides that clear rather than\n // being overwritten by it.\n if (switchRecall) {\n process.env.ORCHESTRATOR_MODEL = switchRecall.model;\n process.env.ORDEWELL_PLANNER_EFFORT = switchRecall.effort;\n }\n\n if (changes.modelAllowlist && typeof changes.modelAllowlist === 'object') {\n const allowlist = changes.modelAllowlist as Record<string, unknown>;\n for (const [runner, ids] of Object.entries(allowlist)) {\n if (Array.isArray(ids)) {\n this.settingsService.setModelAllowlist(runner, ids.map(String));\n } else if (ids === null) {\n this.settingsService.setModelAllowlist(runner, undefined);\n }\n }\n }\n\n // An explicit model/effort pick is remembered against whichever provider\n // is in effect: the one this same call just switched to, or — resolved\n // fresh, now that ORCHESTRATOR_MODEL reflects this call's changes —\n // today's, so a vendor pick keys correctly off its model id. The pick\n // arrives either as a top-level field (a vendor model, `ordewell model\n // set`) or through env (`ordewell planner-effort`, the TUI's effort\n // picker send ORDEWELL_PLANNER_EFFORT this way) — both are a real pick,\n // never the switch's own env, which always carries AI_PROVIDER too.\n const envCarriesModelOrEffort = envChanges?.AI_PROVIDER === undefined &&\n (typeof envChanges?.ORCHESTRATOR_MODEL === 'string' || typeof envChanges?.ORDEWELL_PLANNER_EFFORT === 'string');\n if (typeof changes.orchestratorModel === 'string' || typeof changes.plannerThinkingEffort === 'string' || envCarriesModelOrEffort) {\n const rememberProvider = switchedToProvider ?? new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n providerModelLists: this.cachedProviderLists,\n }).aiProvider;\n this.plannerModelMemory.remember(\n rememberProvider,\n process.env.ORCHESTRATOR_MODEL || '',\n process.env.ORDEWELL_PLANNER_EFFORT || '',\n );\n }\n\n // Refused keys are named back rather than dropped: a client that sent one\n // wrote it to `.env` on the strength of this response, and would otherwise\n // reinstate the refusal as the next daemon's startup environment.\n const rejectedEnvKeys = admission?.rejected ?? [];\n const settings: ReturnType<OrchestratorPool['getSettings']> & { rejectedEnvKeys?: string[] } = this.getSettings();\n if (rejectedEnvKeys.length > 0) settings.rejectedEnvKeys = rejectedEnvKeys;\n return settings;\n }\n\n setOrchestratorModel(model: string): string {\n process.env.ORCHESTRATOR_MODEL = model;\n return model;\n }\n\n async getProviderModels(): Promise<{\n models: DiscoveredModel[];\n modelsByRunner: Record<string, DiscoveredModel[]>;\n /** Each runner's manifest modes, so a surface can offer a per-task mode picker. */\n modesByRunner: Record<string, RunnerModeInfo[]>;\n orchestratorModel: string;\n providers: string[];\n /** Full cross-provider catalog for the orchestrator (planner) model picker. */\n orchestratorModels: OrchestratorOption[];\n /** Per-provider catalog-fetch failures, keyed by provider id. */\n providerErrors: Record<string, string>;\n }> {\n const config = new WebConfig();\n\n const runnerIds = this.registry.list().map((p) => p.manifest.name);\n const [runnerModels, providerLists] = await Promise.all([\n this.modelResolver.modelsForRunners(runnerIds),\n this.modelResolver.refresh(),\n ]);\n\n // `refresh()` populates the picker cache, so this is the same fetch — no\n // second network round-trip. Errors are whatever that fetch recorded.\n const orchestratorModels = await this.modelResolver.pickerOptions();\n const providerErrors = this.modelResolver.getDiscoveryErrors();\n\n this.cachedProviderLists = providerLists;\n\n const allModels: DiscoveredModel[] = [];\n const seen = new Set<string>();\n const modelsByRunner: Record<string, DiscoveredModel[]> = {};\n\n for (const id of runnerIds) {\n modelsByRunner[id] = runnerModels[id] ?? [];\n for (const m of modelsByRunner[id]) {\n if (!seen.has(m.modelId)) {\n seen.add(m.modelId);\n allModels.push(m);\n }\n }\n }\n\n const providers: string[] = [];\n for (const provider of PROVIDER_PRIORITY) {\n if (provider === 'openai_compatible') {\n if (config.openaiCompatibleBaseUrl) providers.push(provider);\n } else if (provider === 'openrouter') {\n if (config.openrouterKey) providers.push(provider);\n } else if (provider === 'google') {\n if (config.geminiKey) providers.push(provider);\n } else if (config.getProviderApiKey(provider)) {\n providers.push(provider);\n }\n }\n\n return {\n models: allModels,\n modelsByRunner,\n modesByRunner: runnerModesFrom(this.registry, runnerIds),\n orchestratorModel: process.env.ORCHESTRATOR_MODEL || '',\n providers,\n orchestratorModels,\n providerErrors,\n };\n }\n\n getRunnerState(): { enabledRunners: RunnerId[]; orchestratorModel: string } {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n return { enabledRunners: config.enabledRunners, orchestratorModel: config.orchestratorModel };\n }\n\n /**\n * Runners whose CLI is actually installed on the host, with display name and\n * enabled state. Only these should be offered for selection — an uninstalled\n * runner can't be spawned.\n */\n async getInstalledRunners(): Promise<{ id: string; name: string; enabled: boolean }[]> {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const enabled = new Set(config.enabledRunners);\n const plugins = this.registry.list();\n const installedIds = new Set(\n await this.runnerInstallation.filterInstalled(plugins.map((p) => p.manifest.name)),\n );\n return plugins\n .filter((p) => installedIds.has(p.manifest.name))\n .map((p) => ({\n id: p.manifest.name,\n name: p.manifest.displayName,\n enabled: enabled.has(p.manifest.name),\n }));\n }\n\n async generatePlan(sessionId: string, goal: string, runners: RunnerId[], workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<PlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride, options);\n // Registered before the blocking call, not after: research inside\n // generatePlan can raise an approval and await the answer, and that\n // answer arrives over POST /api/approvals/:sessionId — which 404s until\n // the session is in this map. Registering only on return made the first\n // approval of every session unanswerable until its 5-minute timeout.\n this.sessions.set(sessionId, session);\n const controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n try {\n const plan = await session.generatePlan(goal, runners, { signal: controller.signal });\n return migratePlanState(plan);\n } finally {\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /**\n * Conversational planning (ADR-0002): start the planner dialogue for a\n * session. Returns the current plan state — a committed plan when the\n * planner had enough context, otherwise the dialogue so far (last\n * assistant message lives in conversationHistory).\n */\n async startPlanning(sessionId: string, goal: string, runners: RunnerId[], workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<LegacyPlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride, options);\n // See generatePlan: must be registered before the blocking call so a\n // mid-research approval is answerable rather than 404ing until timeout.\n this.sessions.set(sessionId, session);\n const controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n try {\n return await session.startPlanning(goal, runners, { signal: controller.signal });\n } finally {\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /**\n * Continue the planner dialogue with the user's reply. Refused during a\n * compaction before the abort slot is touched: the session refuses the reply\n * too, but by then the compaction's controller would be gone and a stop could\n * no longer reach its summary turn.\n */\n async continuePlanning(sessionId: string, message: string): Promise<LegacyPlanState> {\n if (this.compacting.has(sessionId)) throw new ConversationBusyError('send a message');\n const controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n try {\n return await this.session(sessionId).continueConversation(message, { signal: controller.signal });\n } finally {\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /**\n * Condense a session's conversation. The summary turn is a planning turn as\n * far as a surface is concerned, so it registers the same abort controller\n * and `cancelPlanning` stops it — but only when no turn holds that slot\n * already: taking it over would leave the reply in flight beyond stopping.\n */\n async compactConversation(sessionId: string): Promise<ConversationCompaction & { plan: LegacyPlanState }> {\n const session = this.session(sessionId);\n if (this.planningAborts.has(sessionId)) throw new ConversationBusyError('condense the conversation');\n const controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n this.compacting.add(sessionId);\n try {\n const compaction = await session.compactConversation(controller.signal);\n return { ...compaction, plan: session.planState! };\n } finally {\n this.compacting.delete(sessionId);\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /**\n * Abort the planning turn in flight for a session, if any. Answers whether\n * there was one to cancel — the route reports that rather than 404ing a\n * session that simply is not planning right now.\n */\n cancelPlanning(sessionId: string): boolean {\n const controller = this.planningAborts.get(sessionId);\n if (!controller) return false;\n controller.abort();\n return true;\n }\n\n /**\n * Only clears the map entry if it still holds the controller this turn\n * created — a later turn may already have installed its own by the time\n * this one's `finally` runs (a fresh request racing a slow abort).\n */\n private clearPlanningAbort(sessionId: string, controller: AbortController): void {\n if (this.planningAborts.get(sessionId) === controller) this.planningAborts.delete(sessionId);\n }\n\n /**\n * Register a session persisted on disk so its plan becomes executable and\n * editable. Only sessions planned in this process are otherwise addressable,\n * which left a restored plan readable but inert — every task endpoint\n * answered \"Session not found\".\n *\n * No LLM call happens here: the plan is adopted as saved, and the planner is\n * only contacted when the user next sends a message.\n */\n adoptSavedSession(sessionId: string, workspace: string): LegacyPlanState {\n // Re-adopting would clear the execution log and drop a running plan back to\n // its saved state, so a live session wins over the file.\n const live = this.sessions.get(sessionId);\n if (live?.planState) return live.planState;\n\n const saved = loadSession(sessionId, workspace);\n if (!saved) throw new Error('Session not found');\n\n const session = this.createSessionFor(sessionId, workspace);\n // The saved id is adopted too, so later persists rewrite the same file\n // instead of forking the session under a fresh identity.\n session.loadPlan(saved.plan, saved.meta.goal, workspace, { sessionId: saved.meta.id });\n this.sessions.set(sessionId, session);\n\n return session.planState ?? saved.plan;\n }\n\n /**\n * Fork a session's conversation into a new session and adopt it, so the\n * fork is addressable at once — through the same path a saved session is\n * adopted by, reading back the file the fork was written to. The original\n * keeps running, or planning, untouched.\n */\n forkConversation(sessionId: string): AdoptedFork {\n return this.adoptFork(this.session(sessionId).forkConversation());\n }\n\n /** A rewind is a fork from an earlier point, so it is adopted the same way. */\n rewindConversation(sessionId: string, index: number): AdoptedFork & { rewoundMessage: string } {\n const fork = this.session(sessionId).rewindConversation(index);\n return { ...this.adoptFork(fork), rewoundMessage: fork.rewoundMessage };\n }\n\n private adoptFork(fork: ConversationFork): AdoptedFork {\n return { sessionId: fork.sessionId, goal: fork.goal, plan: this.adoptSavedSession(fork.sessionId, fork.workspace) };\n }\n\n /**\n * Direct access to a session's interface — routes call the Session; the\n * pool only registers sessions and fans broadcasts out to WS clients.\n */\n session(sessionId: string): Session {\n const session = this.sessions.get(sessionId);\n if (!session) throw new Error('Session not found');\n return session;\n }\n\n // The Session drops its planner context, but the model call in flight is\n // the pool's to abort: it holds the only signal that reaches it.\n destroy(sessionId: string): void {\n this.planningAborts.get(sessionId)?.abort();\n this.planningAborts.delete(sessionId);\n this.sessions.get(sessionId)?.destroy();\n this.sessions.delete(sessionId);\n }\n\n destroyAll(): void { for (const id of this.sessions.keys()) this.destroy(id); }\n}\n\nexport const scanWorkspaces = scanWorkspacesImpl;\n\nexport function getSessionList(workspace: string) { return listSessions(workspace); }\nexport function getSession(sessionId: string, workspace: string) { return loadSession(sessionId, workspace); }\nexport function removeSession(sessionId: string, workspace: string) { return deleteSession(sessionId, workspace); }\n","import { Hono } from 'hono';\nimport { OrchestratorPool, getSessionList, removeSession } from '../pool/orchestratorPool';\nimport { listTaskLogAttempts, loadSessionPlanState, readTaskLog, WorkspaceNotFoundError } from '@ordewell/core';\n\nexport function sessionsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const sessions = getSessionList(ws);\n return c.json(sessions);\n });\n\n /**\n * The saved file answers for a session nobody is holding. While the pool has\n * one, its store is the only honest source of task status: the file is\n * normalized as if nothing were running (`in_progress` → `pending`), so\n * serving it mid-run told every surface that the tasks it is watching had\n * never started.\n */\n router.get('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const id = c.req.param('id');\n const saved = loadSessionPlanState(id, ws);\n if (!saved) return c.json({ error: 'Session not found' }, 404);\n return c.json({ meta: saved.meta, plan: pool.getPlanState(id) ?? saved.plan });\n });\n\n /**\n * Adopt a saved session into the running server. `GET /:id` only reads the\n * file; until a session is registered with the pool there is no orchestrator\n * behind it, so execution and task control answer \"Session not found\".\n */\n router.post('/:id/load', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n try {\n const id = c.req.param('id');\n const plan = pool.adoptSavedSession(id, ws);\n return c.json({ ok: true, plan, goal: pool.getGoal(id) });\n } catch (err: unknown) {\n if (err instanceof WorkspaceNotFoundError) return c.json({ error: err.message }, 400);\n const message = err instanceof Error ? err.message : undefined;\n const status = message === 'Session not found' ? 404 : 500;\n return c.json({ error: message ?? 'Failed to load session' }, status);\n }\n });\n\n /**\n * A structured task's saved log (ADR-0018, P1), read off disk whether or\n * not the pool holds the session: every attempt is written as it happens,\n * so the file is as current as the stream a reopened view catches up with.\n */\n router.get('/:id/tasks/:taskId/log', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n return c.json({ attempts: listTaskLogAttempts({ baseDir: ws, sessionId: c.req.param('id') }, c.req.param('taskId')) });\n });\n\n router.get('/:id/tasks/:taskId/log/:attempt', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const attempt = Number(c.req.param('attempt'));\n if (!Number.isInteger(attempt) || attempt < 1) return c.json({ error: 'attempt must be a positive integer' }, 400);\n return c.json({ attempt, events: readTaskLog({ baseDir: ws, sessionId: c.req.param('id') }, c.req.param('taskId'), attempt) });\n });\n\n router.delete('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const ok = removeSession(c.req.param('id'), ws);\n return c.json({ ok });\n });\n\n // Stops the orchestrator (killing every tmux window it spawned) and drops\n // the in-memory planner conversation. No-op if already closed/unregistered.\n router.post('/:id/close', (c) => {\n pool.destroy(c.req.param('id'));\n return c.json({ ok: true });\n });\n\n return router;\n}\n","import { Hono, type Context } from 'hono';\nimport { ConversationBusyError, ConversationEditError, flattenTasks, PlanEditError, TaskControlError, WorkspaceNotFoundError, WorkspaceNotAProjectError } from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\n/**\n * The three answers a task edit can have. A refusal is the request being wrong\n * (400), a missing session is 404, and only a real fault is 500 — collapsing\n * all three into 404/500 gave the TUI and VS Code nothing to show but \"Internal\n * error\", which reads as the edit having silently done nothing.\n */\nfunction editFailure(c: Context, err: unknown) {\n const e = err as Error;\n if (e.message === 'Session not found') return c.json({ error: e.message }, 404);\n if (e instanceof PlanEditError || e instanceof TaskControlError) return c.json({ error: e.message }, 400);\n console.error('[plans] task edit failed:', err);\n return c.json({ error: e.message || 'Internal error' }, 500);\n}\n\nconst NO_CHECKPOINT = 'The task is not waiting at a checkpoint — it was answered already, withdrawn, or has no runner left to hear it.';\n\n/**\n * A refused conversation edit is either the request being wrong (400) or\n * arriving mid-turn (409) — the same call succeeds once the reply lands, and a\n * surface should say \"wait\", not \"invalid\".\n */\nfunction conversationFailure(c: Context, err: unknown) {\n const e = err as Error;\n if (e.message === 'Session not found') return c.json({ error: e.message }, 404);\n if (e instanceof ConversationBusyError) return c.json({ error: e.message }, 409);\n if (e instanceof ConversationEditError) return c.json({ error: e.message }, 400);\n console.error('[plans] conversation edit failed:', err);\n return c.json({ error: e.message || 'Internal error' }, 500);\n}\n\nexport function plansRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.post('/:sessionId/generate', async (c) => {\n try {\n const { goal, runners, workspace, model, allowInit } = await c.req.json();\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n const queryRunners = c.req.query('runners');\n // No runners in the request means \"whatever is enabled\", not claude-code:\n // a hard-coded default here contradicts the /runners toggle state and\n // fails planning for anyone who disabled claude-code.\n const runnerList: string[] = Array.isArray(runners) ? runners : (runners ? [runners] : (queryRunners ? queryRunners.split(',').map(s => s.trim()).filter(Boolean) : pool.getRunnerState().enabledRunners));\n const plan = await pool.generatePlan(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n const { models, modelsByRunner } = await pool.getProviderModels();\n return c.json({ plan, models, modelsByRunner });\n } catch (err) {\n if (err instanceof WorkspaceNotFoundError) return c.json({ error: err.message }, 400);\n if (err instanceof WorkspaceNotAProjectError) {\n return c.json({ error: err.message, code: 'workspace_not_a_project', workspace: err.workspace }, 400);\n }\n // Log before returning: the message alone travels to the client, so an\n // unexpected throw in here (a research tool crashing the whole turn, say)\n // left no stack anywhere — server.log showed nothing and the CLI showed\n // one line. Diagnosing that cost far more than this console.error.\n console.error('[plans] generate failed:', err);\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Plan generation failed' }, 500);\n }\n });\n\n router.post('/:sessionId/execute', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).executePlan();\n return c.json({ status: 'running' });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : e.message === 'No plan to execute' ? 400 : e.message === 'Session already executing' ? 409 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/stop', (c) => {\n if (pool.hasSession(c.req.param('sessionId'))) pool.session(c.req.param('sessionId')).stopExecution();\n return c.json({ status: 'stopped' });\n });\n\n // Distinct from the stop route above, which halts *execution* (running\n // tasks). This aborts a planning turn in flight — a harmless no-op, not a\n // 404, when the session simply isn't planning right now.\n router.post('/:sessionId/planning/stop', (c) => {\n const cancelled = pool.cancelPlanning(c.req.param('sessionId'));\n return c.json({ cancelled });\n });\n\n router.post('/:sessionId/tasks/:taskId/complete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskComplete(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Not found' }, 404);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/uncomplete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskIncomplete(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Not found' }, 404);\n }\n });\n\n // Orchestrator controls — these spawn or kill runner processes, so they are\n // deliberately separate from the generic `PUT tasks/:taskId` status patch.\n for (const [segment, run] of [\n ['run', (s: ReturnType<typeof pool.session>, id: string) => s.runTask(id)],\n ['force-start', (s: ReturnType<typeof pool.session>, id: string) => s.forceStartTask(id)],\n ['retry', (s: ReturnType<typeof pool.session>, id: string) => s.retryTask(id)],\n ['cancel', (s: ReturnType<typeof pool.session>, id: string) => s.cancelTask(id)],\n ] as const) {\n router.post(`/:sessionId/tasks/:taskId/${segment}`, async (c) => {\n try {\n await run(pool.session(c.req.param('sessionId')), c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n const status = (err as Error).message === 'Session not found' ? 404 : 500;\n return c.json({ error: (err as Error).message }, status as never);\n }\n });\n }\n\n // Talking to a structured task (ADR-0018, M1). A terminal task, or one not\n // running, is refused with the reason rather than typed at.\n router.post('/:sessionId/tasks/:taskId/messages', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const text = typeof body === 'object' && body !== null && 'text' in body ? body.text : undefined;\n if (typeof text !== 'string' || !text.trim()) return c.json({ error: 'text is required' }, 400);\n const id = pool.session(c.req.param('sessionId')).sendTaskMessage(c.req.param('taskId'), text);\n return c.json({ id });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n // Force send (ADR-0023, F1): interrupt the running turn and deliver this\n // message next, ahead of anything queued. Refused like a message is, and on\n // a terminal task, with the reason.\n router.post('/:sessionId/tasks/:taskId/messages/now', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const text = typeof body === 'object' && body !== null && 'text' in body ? body.text : undefined;\n if (typeof text !== 'string' || !text.trim()) return c.json({ error: 'text is required' }, 400);\n const id = pool.session(c.req.param('sessionId')).forceSendTaskMessage(c.req.param('taskId'), text);\n return c.json({ id });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n // Force send a message still queued; `sent` is false once the runner has it.\n router.post('/:sessionId/tasks/:taskId/messages/:messageId/now', (c) => {\n try {\n const sent = pool.session(c.req.param('sessionId')).forceSendQueuedTaskMessage(c.req.param('taskId'), c.req.param('messageId'));\n return c.json({ sent });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n // Continue a finished structured task in its saved session (ADR-0018, K1).\n // A task that cannot be continued is refused with the reason.\n router.post('/:sessionId/tasks/:taskId/continue', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const text = typeof body === 'object' && body !== null && 'text' in body ? body.text : undefined;\n if (typeof text !== 'string' || !text.trim()) return c.json({ error: 'text is required' }, 400);\n await pool.session(c.req.param('sessionId')).continueTask(c.req.param('taskId'), text);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId/messages/:messageId', (c) => {\n try {\n const removed = pool.session(c.req.param('sessionId')).removeQueuedTaskMessage(c.req.param('taskId'), c.req.param('messageId'));\n return c.json({ removed });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/interrupt', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).interruptTask(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n // Answer the checkpoint a task waits at: approve lets it go on, reject sends\n // it the reason. Nothing waiting — settled elsewhere, withdrawn, or no runner\n // left to hear it — is a 409, so a surface says so instead of claiming success.\n router.post('/:sessionId/tasks/:taskId/checkpoint/approve', (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n if (!session.awaitsCheckpoint(taskId)) return c.json({ error: NO_CHECKPOINT }, 409);\n session.approveCheckpoint(taskId);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/checkpoint/reject', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const reason = typeof body === 'object' && body !== null && 'reason' in body && typeof body.reason === 'string' ? body.reason.trim() : '';\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n if (!session.awaitsCheckpoint(taskId)) return c.json({ error: NO_CHECKPOINT }, 409);\n session.rejectCheckpoint(taskId, reason || undefined);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n // What a task waits on at its merge gate (ADR-0020), for a surface that asks\n // before a force start passes it. Empty when nothing gates the task.\n router.get('/:sessionId/tasks/:taskId/merge-gate', (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n const tasks = flattenTasks(session.planState?.tasks ?? []);\n const mergeGate = session.mergeGate(c.req.param('taskId')).map((id) => {\n const dep = tasks.find((t) => t.id === id);\n return { id, order: dep?.order ?? 0, title: dep?.title ?? id };\n });\n return c.json({ mergeGate });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n // Isolated-run handoff (ADR-0013). A merge that conflicts or fails is an\n // outcome the surface reports, not a malformed request, so it answers 200.\n router.get('/:sessionId/isolation/diff', async (c) => {\n try {\n return c.json({ diff: await pool.session(c.req.param('sessionId')).reviewRunDiff() });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/isolation/merge', async (c) => {\n try {\n return c.json(await pool.session(c.req.param('sessionId')).mergeRun());\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n for (const [segment, run] of [\n ['discard', (s: ReturnType<typeof pool.session>) => s.discardRun()],\n ['cleanup', (s: ReturnType<typeof pool.session>) => s.cleanupRun()],\n ['stash-and-continue', (s: ReturnType<typeof pool.session>) => s.continueWithStash()],\n ['run-without', (s: ReturnType<typeof pool.session>) => s.continueWithoutIsolation()],\n ] as const) {\n router.post(`/:sessionId/isolation/${segment}`, async (c) => {\n try {\n await run(pool.session(c.req.param('sessionId')));\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n }\n\n router.post('/:sessionId/tasks/:taskId/resolve-conflict', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).resolveConflictAsTask(c.req.param('taskId'));\n return c.json({ plan });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.put('/:sessionId/tasks/:taskId', async (c) => {\n try {\n const { assignedRunner, dependencies, ...rest } = await c.req.json();\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n\n // Two fields are not field writes. A runner change carries the task's\n // model, effort and mode with it, and a dependency list has to be\n // validated against the whole graph — each has one owner on the session.\n // The runner goes first: its retarget derives a model, and an explicit\n // model in the same patch must win over that derived one.\n const hasRunner = typeof assignedRunner === 'string';\n const hasDeps = Array.isArray(dependencies);\n\n let result = null;\n if (hasRunner) result = await session.setTaskRunner(taskId, assignedRunner);\n if (hasDeps) {\n try {\n result = await session.setTaskDependencies(taskId, dependencies.map(String));\n } catch (err) {\n // A rejected dependency edit is the client's mistake, not a fault.\n return c.json({ error: (err as Error).message }, 400);\n }\n }\n // An empty patch still reaches updateTask — that is how a caller asks\n // whether the task exists at all.\n if (Object.keys(rest).length > 0 || (!hasRunner && !hasDeps)) result = await session.updateTask(taskId, rest);\n\n if (!result) return c.json({ error: 'Task not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId', async (c) => {\n try {\n const result = await pool.session(c.req.param('sessionId')).removeTask(c.req.param('taskId'));\n if (!result) return c.json({ error: 'Task not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/tasks', async (c) => {\n try {\n const body = await c.req.json();\n const result = await pool.session(c.req.param('sessionId')).addTask(body);\n if (!result) return c.json({ error: 'Session not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/review/approve', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).approveReview();\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404\n : e.message === 'No plan to review' ? 400\n : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/tasks/merge', async (c) => {\n try {\n const { taskIds } = await c.req.json();\n if (!taskIds || !Array.isArray(taskIds) || taskIds.length < 2) {\n return c.json({ error: 'taskIds array with at least two ids is required' }, 400);\n }\n const plan = await pool.session(c.req.param('sessionId')).requestMerge(taskIds);\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 400;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/split', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).requestSplit(c.req.param('taskId'));\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 400;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n // Conversational planning (ADR-0002): start the planner dialogue. The\n // response's plan carries conversationHistory; when tasks are non-empty the\n // planner committed the plan.\n router.post('/:sessionId/converse/start', async (c) => {\n try {\n const { goal, runners, workspace, model, allowInit } = await c.req.json();\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n const runnerList: string[] = Array.isArray(runners) ? runners : (runners ? [runners] : pool.getRunnerState().enabledRunners);\n const plan = await pool.startPlanning(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n return c.json({ plan });\n } catch (err) {\n if (err instanceof WorkspaceNotFoundError) return c.json({ error: err.message }, 400);\n if (err instanceof WorkspaceNotAProjectError) {\n return c.json({ error: err.message, code: 'workspace_not_a_project', workspace: err.workspace }, 400);\n }\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Planning failed' }, 500);\n }\n });\n\n // One branch for every user reply — clarifying answers, outline confirm.\n // The planner decides what happens next.\n router.post('/:sessionId/converse/message', async (c) => {\n try {\n const { message } = await c.req.json();\n if (!message) return c.json({ error: 'message is required' }, 400);\n const plan = await pool.continuePlanning(c.req.param('sessionId'), message);\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n if (e instanceof ConversationBusyError) return c.json({ error: e.message }, 409);\n const status = e.message === 'Session not found' ? 404 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n // Fork and rewind act on the conversation, never on the plan: the task list\n // rides along as-is (ADR-0002, update of 2026-09-25). A rewind is a fork from\n // just before a user message; the original session is left as it was.\n router.post('/:sessionId/conversation/fork', (c) => {\n try {\n return c.json(pool.forkConversation(c.req.param('sessionId')));\n } catch (err) {\n return conversationFailure(c, err);\n }\n });\n\n router.get('/:sessionId/conversation/rewind-targets', (c) => {\n try {\n return c.json({ targets: pool.session(c.req.param('sessionId')).rewindTargets() });\n } catch (err) {\n return conversationFailure(c, err);\n }\n });\n\n router.post('/:sessionId/conversation/rewind', async (c) => {\n try {\n const { index } = await c.req.json();\n if (!Number.isInteger(index) || index < 0) return c.json({ error: 'index must be a non-negative integer' }, 400);\n return c.json(pool.rewindConversation(c.req.param('sessionId'), index));\n } catch (err) {\n return conversationFailure(c, err);\n }\n });\n\n // The summary is one planner call, so this can take as long as a reply and\n // fail like one — a failure leaves the conversation exactly as it was.\n router.post('/:sessionId/conversation/compact', async (c) => {\n try {\n return c.json(await pool.compactConversation(c.req.param('sessionId')));\n } catch (err) {\n return conversationFailure(c, err);\n }\n });\n\n // Drain queued structural edits between task batches. The orchestrator pauses\n // fan-out while a message is queued (so an edit can't race a spawn) and emits\n // `queue_ready` once no task is active; a surface calls this to apply the edit\n // via the planner and resume scheduling. Without a route the TUI/CLI could\n // never clear the queue, permanently suppressing dependents after one edit.\n router.post('/:sessionId/process-queued', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).processQueuedMessages();\n return c.json({ ok: true });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.get('/:sessionId/prd', (c) => {\n const plan = pool.getPlan(c.req.param('sessionId'));\n if (!plan?.prdMarkdown) return c.json({ error: 'No PRD found' }, 404);\n return c.json({ prdMarkdown: plan.prdMarkdown });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function runnersRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n const state = pool.getRunnerState();\n const runners = await pool.getInstalledRunners();\n return c.json({\n runners,\n orchestratorModel: state.orchestratorModel,\n });\n });\n\n router.put('/:id', async (c) => {\n const id = c.req.param('id');\n const body = await c.req.json();\n pool.setRunnerEnabled(id, body.enabled);\n return c.json({ ok: true });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function modelsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n const result = await pool.getProviderModels();\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { scanWorkspaces } from '../pool/orchestratorPool';\n\nexport function workspacesRoute() {\n const router = new Hono();\n\n router.get('/', (c) => {\n const workspaces = scanWorkspaces();\n return c.json({ workspaces });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { isGranted, toApprovalDecision, type ApprovalAnswer } from '@ordewell/core';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\n/**\n * A body's answer. `{ decision, note? }` carries a runner request's whole\n * answer (ADR-0018, A1); `{ granted }` is the planner prompt's yes/no.\n * Anything else — absent, malformed, an unknown decision — is a denial,\n * never consent.\n */\nfunction answerOf(body: unknown): ApprovalAnswer {\n if (typeof body !== 'object' || body === null) return false;\n const { decision, note, granted } = body as { decision?: unknown; note?: unknown; granted?: unknown };\n if (decision === undefined) return granted === true;\n if (decision === 'allow' || decision === 'allowForTask') return { decision };\n if (decision === 'deny' && typeof note === 'string' && note.trim()) return { decision, note: note.trim() };\n return { decision: 'deny' };\n}\n\n/**\n * The answer channel for approval prompts — the planner's, and a task\n * runner's tool requests.\n *\n * Requests go out over the session WebSocket (they are ordinary\n * SessionMessages), but answers come back here rather than over the socket:\n * the CLI and TUI already speak HTTP to this server, a prompt can outlive the\n * socket that announced it, and a plain POST is answerable from any surface —\n * including `curl` in a pinch.\n */\nexport function approvalsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/:sessionId', (c) => {\n const sessionId = c.req.param('sessionId');\n if (!pool.hasSession(sessionId)) return c.json({ error: `Unknown session: ${sessionId}` }, 404);\n\n return c.json({\n pending: pool.outstandingApprovals(sessionId),\n approvedScopes: pool.approvedScopes(sessionId),\n });\n });\n\n router.post('/:sessionId/:approvalId', async (c) => {\n const sessionId = c.req.param('sessionId');\n const approvalId = c.req.param('approvalId');\n if (!pool.hasSession(sessionId)) return c.json({ error: `Unknown session: ${sessionId}` }, 404);\n\n const answer = answerOf(await c.req.json().catch(() => null));\n\n if (!pool.resolveApproval(sessionId, approvalId, answer)) {\n return c.json({ error: 'Approval is no longer outstanding — it timed out or was already answered.' }, 409);\n }\n const { decision } = toApprovalDecision(answer);\n return c.json({ ok: true, granted: isGranted({ decision }), decision });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function settingsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n return c.json(pool.getSettings());\n });\n\n router.patch('/', async (c) => {\n const body = await c.req.json();\n if (!body || typeof body !== 'object' || Object.keys(body).length === 0) {\n return c.json({ error: 'At least one setting field is required' }, 400);\n }\n const result = pool.updateSettings(body);\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\ninterface CommandDescriptor {\n name: string;\n description: string;\n}\n\nconst COMMANDS: CommandDescriptor[] = [\n { name: 'tdd', description: 'Toggle Test-Driven Development mode (on|off|status)' },\n { name: 'verify', description: 'Toggle verification mode — adds a final evidence-based verification task that runs the full suite (on|off|status)' },\n { name: 'transport', description: 'Drive tasks through each runner\\'s protocol (structured) or a terminal, from the next run (terminal|structured|status)' },\n];\n\nexport function commandsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n return c.json({ commands: COMMANDS });\n });\n\n router.post('/:name', async (c) => {\n const name = c.req.param('name');\n const body = await c.req.json().catch(() => ({}));\n const args: Record<string, string> = body?.args || {};\n\n const command = COMMANDS.find((cmd) => cmd.name === name);\n if (!command) {\n return c.json({ error: `Unknown command: ${name}` }, 404);\n }\n\n if (name === 'tdd') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ tdd: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ tdd: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'verify') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ verification: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ verification: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'transport') {\n const action = args.action || 'status';\n if (action === 'terminal' || action === 'structured') {\n pool.updateSettings({ runnerTransport: action });\n } else if (action !== 'status') {\n return c.json({ error: `Unknown transport: ${action} (terminal|structured)` }, 400);\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n return c.json({ error: `Unknown command: ${name}` }, 404);\n });\n\n return router;\n}\n","import { WebSocketServer, WebSocket } from 'ws';\nimport type { IncomingMessage } from 'http';\nimport type { Duplex } from 'stream';\nimport { DAEMON_SUBPROTOCOL } from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function createWsHandler(pool: OrchestratorPool) {\n const wss = new WebSocketServer({\n noServer: true,\n // Select the plain subprotocol explicitly. Left to itself `ws` echoes back\n // whichever was offered first, which would put the token in the 101\n // response; selecting nothing makes the client fail the handshake.\n handleProtocols: (protocols) => (protocols.has(DAEMON_SUBPROTOCOL) ? DAEMON_SUBPROTOCOL : false),\n });\n\n wss.on('connection', (ws: WebSocket, request: IncomingMessage) => {\n const url = new URL(request.url ?? '', `http://${request.headers.host}`);\n const sessionId = url.pathname.split('/').pop() || '';\n\n ws.on('close', () => {\n pool.unsubscribe(sessionId, ws);\n });\n\n ws.on('error', () => {\n pool.unsubscribe(sessionId, ws);\n });\n\n ws.send(JSON.stringify({ type: 'connected', sessionId }));\n pool.subscribe(sessionId, ws);\n });\n\n return (request: IncomingMessage, socket: Duplex, head: Buffer) => {\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit('connection', ws, request);\n });\n };\n}\n","/**\n * The single admission decision for the daemon.\n *\n * Both the HTTP middleware and the WebSocket upgrade handler call this. The\n * sharing is the point: the two paths drifting apart is how the upgrade ended\n * up validating nothing while the HTTP routes had a CORS allowlist.\n */\n\nimport { extractPresentedToken, tokensMatch } from '@ordewell/core';\n\n/** `localhost` is included because clients dial it by name; the daemon binds loopback only. */\nconst LOOPBACK_HOSTNAMES = new Set(['localhost', '127.0.0.1', '::1']);\n\nexport interface AdmissionHeaders {\n /** `null`/`undefined` mean absent. An empty string still counts as present. */\n origin?: string | null;\n host?: string | null;\n /** `Authorization: Bearer <token>` — how the token travels on HTTP routes. */\n authorization?: string | null;\n /** `Sec-WebSocket-Protocol` — how it travels on the upgrade, so it stays out of logs. */\n secWebSocketProtocol?: string | null;\n}\n\n/** What this daemon is: which port it bound, and which token it minted. */\nexport interface AdmissionContext {\n port: number;\n token: string;\n /** Named in a token rejection, so a stale token is diagnosable rather than a bare failure. */\n tokenFile: string;\n}\n\nexport type AdmissionDecision =\n | { admit: true }\n | { admit: false; status: number; reason: string };\n\nconst ADMIT: AdmissionDecision = { admit: true };\n\nexport function decideAdmission(\n headers: AdmissionHeaders,\n context: AdmissionContext,\n): AdmissionDecision {\n if (headers.origin !== undefined && headers.origin !== null) {\n return {\n admit: false,\n status: 403,\n reason: 'Refused: requests carrying an Origin header are not accepted. The Ordewell daemon has no browser client.',\n };\n }\n\n if (!isOwnLoopbackAuthority(headers.host, context.port)) {\n return {\n admit: false,\n status: 403,\n reason: `Refused: the Host header must name loopback (localhost, 127.0.0.1 or [::1]) at port ${context.port}.`,\n };\n }\n\n if (!tokensMatch(extractPresentedToken(headers), context.token)) {\n return {\n admit: false,\n status: 401,\n reason:\n 'Unauthenticated: this request did not present the daemon\\'s bearer token. '\n + `Ordewell clients read it from ${context.tokenFile}; if that file is stale, `\n + 'restart the daemon (`ordewell web --daemon`) to mint a fresh one.',\n };\n }\n\n return ADMIT;\n}\n\n/**\n * Rejecting anything but our own loopback authority is what closes DNS\n * rebinding: a page rebinding a hostname it controls to 127.0.0.1 still sends\n * that hostname in `Host`, and same-origin requests to it carry no `Origin`.\n */\nfunction isOwnLoopbackAuthority(host: string | null | undefined, port: number): boolean {\n if (!host) return false;\n const authority = splitAuthority(host);\n if (!authority) return false;\n if (!LOOPBACK_HOSTNAMES.has(authority.hostname.toLowerCase())) return false;\n return authority.port === port;\n}\n\n/** Absent port means the scheme default; the daemon only ever speaks http. */\nconst DEFAULT_HTTP_PORT = 80;\n\nfunction splitAuthority(host: string): { hostname: string; port: number } | undefined {\n const value = host.trim();\n if (value === '') return undefined;\n\n if (value.startsWith('[')) {\n const close = value.indexOf(']');\n if (close === -1) return undefined;\n const hostname = value.slice(1, close);\n const rest = value.slice(close + 1);\n if (rest === '') return { hostname, port: DEFAULT_HTTP_PORT };\n if (!rest.startsWith(':')) return undefined;\n return withPort(hostname, rest.slice(1));\n }\n\n const colon = value.indexOf(':');\n if (colon === -1) return { hostname: value, port: DEFAULT_HTTP_PORT };\n // An unbracketed second colon is a bare IPv6 literal, which is malformed in a\n // Host header — refuse rather than guess where the port starts.\n if (value.indexOf(':', colon + 1) !== -1) return undefined;\n return withPort(value.slice(0, colon), value.slice(colon + 1));\n}\n\nfunction withPort(hostname: string, port: string): { hostname: string; port: number } | undefined {\n if (!/^\\d+$/.test(port)) return undefined;\n return { hostname, port: Number(port) };\n}\n","import { Hono } from 'hono';\nimport type { Server } from 'http';\nimport type { Duplex } from 'stream';\nimport { sessionsRoute } from './routes/sessions';\nimport { plansRoute } from './routes/plans';\nimport { runnersRoute } from './routes/runners';\nimport { modelsRoute } from './routes/models';\nimport { workspacesRoute } from './routes/workspaces';\nimport { approvalsRoute } from './routes/approvals';\nimport { settingsRoute } from './routes/settings';\nimport { commandsRoute } from './routes/commands';\nimport { createWsHandler } from './ws/stream';\nimport {\n decideAdmission,\n type AdmissionContext,\n type AdmissionDecision,\n} from './security/admission';\nimport { OrchestratorPool } from './pool/orchestratorPool';\n\nexport function createApp(pool: OrchestratorPool, admission: AdmissionContext) {\n const app = new Hono();\n\n // There is no CORS allowlist: the daemon ships no browser front end, so a\n // browser has no legitimate reason to reach it at all. The bearer token\n // supersedes it, and covers every local caller rather than only browsers.\n app.use('*', async (c, next) => {\n const decision = decideAdmission({\n origin: c.req.header('origin') ?? null,\n // The request URL's authority is built from the Host header upstream, so\n // it is the same value; the fallback only matters when the header is\n // absent entirely, which fails the check anyway.\n host: c.req.header('host') ?? new URL(c.req.url).host,\n authorization: c.req.header('authorization') ?? null,\n }, admission);\n if (!decision.admit) return c.json({ error: decision.reason }, decision.status as 401 | 403);\n await next();\n });\n\n app.route('/api/sessions', sessionsRoute(pool));\n app.route('/api/plans', plansRoute(pool));\n app.route('/api/runners', runnersRoute(pool));\n app.route('/api/models', modelsRoute(pool));\n app.route('/api/settings', settingsRoute(pool));\n app.route('/api/commands', commandsRoute(pool));\n app.route('/api/workspaces', workspacesRoute());\n app.route('/api/approvals', approvalsRoute(pool));\n\n return app;\n}\n\nexport function attachWsHandler(server: Server, pool: OrchestratorPool, admission: AdmissionContext) {\n const handler = createWsHandler(pool);\n server.on('upgrade', (request, socket, head) => {\n const decision = decideAdmission({\n origin: request.headers.origin ?? null,\n host: request.headers.host ?? null,\n authorization: request.headers.authorization ?? null,\n secWebSocketProtocol: request.headers['sec-websocket-protocol'] ?? null,\n }, admission);\n if (!decision.admit) {\n refuseUpgrade(socket, decision);\n return;\n }\n\n const url = new URL(request.url ?? '', `http://${request.headers.host}`);\n if (url.pathname.startsWith('/ws/session/')) {\n handler(request, socket, head);\n } else {\n socket.destroy();\n }\n });\n}\n\nconst REASON_PHRASE: Record<number, string> = { 401: 'Unauthorized', 403: 'Forbidden' };\n\nfunction refuseUpgrade(socket: Duplex, decision: Extract<AdmissionDecision, { admit: false }>): void {\n const body = JSON.stringify({ error: decision.reason });\n socket.end(\n `HTTP/1.1 ${decision.status} ${REASON_PHRASE[decision.status] ?? 'Forbidden'}\\r\\n` +\n 'Connection: close\\r\\n' +\n 'Content-Type: application/json\\r\\n' +\n `Content-Length: ${Buffer.byteLength(body)}\\r\\n` +\n `\\r\\n${body}`,\n );\n socket.destroy();\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport type { Hono } from 'hono';\n\n/**\n * Bridges node's http server onto the Hono app. Kept out of `main.ts` so the\n * real request path — including the Host header the admission check reads — is\n * testable against a listening server.\n */\nexport function createRequestListener(app: Hono) {\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const bufs: Buffer[] = [];\n for await (const chunk of req) bufs.push(chunk as Buffer);\n const body = bufs.length > 0 ? Buffer.concat(bufs).toString() : undefined;\n\n const url = `http://${req.headers.host || 'localhost'}${req.url}`;\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers)) {\n if (v) {\n if (Array.isArray(v)) v.forEach(vv => headers.append(k, vv));\n else headers.set(k, v as string);\n }\n }\n if (body && !headers.has('content-type')) headers.set('content-type', 'application/json');\n\n const webReq = new Request(url, {\n method: req.method || 'GET',\n headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? body : undefined,\n });\n\n try {\n const webRes = await app.fetch(webReq);\n res.writeHead(webRes.status, Object.fromEntries(webRes.headers.entries()));\n if (webRes.body) {\n const reader = webRes.body.getReader();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n }\n res.end();\n } catch (err) {\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: err instanceof Error ? (err as Error).message : 'Internal server error' }));\n }\n }\n };\n}\n","#!/usr/bin/env node\nimport { createApp, attachWsHandler } from './app';\nimport { createRequestListener } from './nodeAdapter';\nimport { OrchestratorPool } from './pool/orchestratorPool';\nimport { createServer } from 'http';\nimport { clearDaemonToken, mintDaemonToken, StructuredRunner } from '@ordewell/core';\nimport { startTerminalHost } from './adapters/TerminalHost';\n\nconst args = process.argv.slice(2);\nlet port = 3742;\n\nconst portIdx = args.indexOf('--port');\nif (portIdx !== -1 && args[portIdx + 1]) {\n port = parseInt(args[portIdx + 1], 10) || 3742;\n}\n\n// Set only for a daemon owned by one CLI invocation (e.g. `ordewell tui`),\n// which spawns it non-detached expecting it to die with the caller. A\n// closed terminal delivers SIGHUP to both via the shared process group, but\n// that misses a caller killed by PID directly or a multiplexer that doesn't\n// relay the signal — this poll is the fallback so an owned daemon never\n// outlives its CLI and orphans don't accumulate.\nconst watchParentIdx = args.indexOf('--watch-parent');\nconst watchParentPid = watchParentIdx !== -1 ? parseInt(args[watchParentIdx + 1], 10) : undefined;\n\n// Terminal-transport tasks run in a real tmux window (so `ordewell tui` can\n// open a genuine interactive terminal on them) whenever tmux is on the host;\n// otherwise they fall back to the headless-per-session runner (see\n// OrchestratorPool's `runner` dep) and the first such run says so.\nconst { runner: tmuxRunner, advice: terminalAdvice } = startTerminalHost(port);\n\n// Minted before the socket is listening, so no request can arrive before there\n// is a token to check it against.\nconst { token, file: tokenFile } = mintDaemonToken(port);\nconst admission = { port, token, tokenFile };\n\n// Tasks of a plan run on the structured transport (ADR-0018) are plain child\n// processes: no tmux, so one runner serves every plan whatever the host has.\nconst pool = new OrchestratorPool({ runner: tmuxRunner, terminalAdvice, structuredRunner: new StructuredRunner() });\nconst app = createApp(pool, admission);\n\n// Warm the model caches at startup (same as the VS Code extension's activation\n// refresh): runner model discovery + provider routing lists, so the first\n// request/plan doesn't pay the discovery latency and stale caches are rebuilt.\npool.getProviderModels().catch((err) => {\n console.error(`[web] model discovery warmup failed: ${err?.message ?? err}`);\n});\n\napp.get('/', (c) => c.json({ message: 'Ordewell API', docs: '/api/workspaces' }));\n\nconst server = createServer(createRequestListener(app));\n\nattachWsHandler(server, pool, admission);\n\nserver.listen(port, '127.0.0.1', () => {\n console.error(`[web] Ordewell API server: http://localhost:${port}`);\n});\n\nasync function shutdown(): Promise<void> {\n clearDaemonToken(port);\n pool.destroyAll();\n // The one cleanup guarantee against leaked tmux processes: killing the\n // shared session takes every window (and whatever's running in it) with it.\n if (tmuxRunner) await tmuxRunner.killSession().catch(() => {});\n server.close();\n process.exit(0);\n}\n\nprocess.on('SIGINT', () => { shutdown(); });\nprocess.on('SIGTERM', () => { shutdown(); });\nprocess.on('SIGHUP', () => { shutdown(); });\n\nif (watchParentPid) {\n const parentCheck = setInterval(() => {\n try {\n process.kill(watchParentPid, 0);\n } catch {\n clearInterval(parentCheck);\n shutdown();\n }\n }, 5000);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ordewell/web",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "Ordewell local API server — the daemon the Ordewell CLI and TUI talk to.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Alessandro Costanzo Ciano",
@@ -37,7 +37,7 @@
37
37
  "typecheck": "tsc --noEmit"
38
38
  },
39
39
  "dependencies": {
40
- "@ordewell/core": "^0.7.0",
40
+ "@ordewell/core": "^0.7.1",
41
41
  "hono": "^4.6.0",
42
42
  "@hono/node-server": "^1.13.0",
43
43
  "ws": "^8.18.0"