@ordewell/web 0.11.1 → 0.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AUTHORS.md +4 -0
- package/dist/server/main.js +177 -55
- package/dist/server/main.js.map +1 -1
- package/package.json +2 -2
package/dist/server/main.js.map
CHANGED
|
@@ -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/pool/orchestratorPool.ts","../../server/routes/errors.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","isApiProvider","normalizeGeminiModel","defaultEnabledRunners","DEFAULT_RUNNERS","fs","path","args","resolve","execFile","BaseFileSystem","researchToolsPath","withPath","GREP_PCRE_PROBE_ARGS","grepRegexFromProbe","result","buildGlobArgs","capped","applyHeadLimit","formatSearchOutput","SEARCH_EXCLUSIONS","path2","buildGrepArgs","buildFallbackGrepArgs","filterFallbackByAnchoredInclude","listTree","STOPPED_TOOL_RESULT","randomUUID","RunnerRegistry","SettingsService","PlannerModelMemory","removedPluginNotice","StructuredRunner","RunnerInstallation","workspaceEnvOf","ModelResolver","CodexSandboxAvailability","nodeSpawn","createIsolationPreview","server","claudeAccountLimitCollector","codexAccountLimitCollector","openCodeGoAccountLimitCollector","detectInstalledPlanner","assertWorkspaceExists","PlannerNotReadyError","PlannerTurnStoppedError","PlannerTurnDiscardedError","AccountLimitMonitor","flattenTasks","task","assignedRunnerOf","sessionRuntimeSettings","assertWorkspaceIsProject","WorkspaceNotAProjectError","ensureStateDirIgnored","createSession","runnerForProvider","admitSettingsEnv","selectPlanner","PROVIDER_CREDENTIAL_ENV","configuredProviders","runnerModesFrom","migratePlanState","recordedRunnerAuth","installedPlannerAnswered","loadSession","SessionNotFoundError","scanWorkspaces","listSessions","deleteSession","SessionHeldError","NoPlanError","AlreadyExecutingError","WorkspaceNotFoundError","ConversationBusyError","ConversationEditError","PlanEditError","TaskControlError","pool","Hono","loadSessionPlanState","run","surfacePlanState","surfacePlan","listTaskLogAttempts","taskLogForSurface","readTaskLog","resolveUserTaskRef","parseExecutionCommand","installedPlannerDetected","toApprovalDecision","isGranted","RunSettingsError","WebSocketServer","DAEMON_SUBPROTOCOL","tokensMatch","extractPresentedToken","port","refuse","processLeaseHost","createServer","mintDaemonToken","mkdirSync","dirname","writeFileSync","unlinkSync"],"mappings":"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","file":"main.js","sourcesContent":["import { type PlannerBackendId, BaseConfig, DEFAULT_RUNNERS, defaultEnabledRunners, isApiProvider, normalizeGeminiModel } from '@ordewell/core';\nimport type { ConfiguredPlanner, ProviderModelLists, ResolvedPlanner } from '@ordewell/core';\n\nexport interface PlannerPick {\n model: string;\n provider: PlannerBackendId;\n}\n\ninterface WebConfigOpts {\n enabledRunners?: string[];\n /**\n * The lists that route a model id to its vendor. A function is read on every\n * resolution, so a long-lived config (a session's) never routes on lists its\n * owner has since dropped for a removed key.\n */\n providerModelLists?: ProviderModelLists | (() => ProviderModelLists | undefined);\n modelOverride?: string;\n /** The model a settings write picked in this daemon and the planner it was for, read live; absent when none has. */\n pickedModel?: () => PlannerPick | undefined;\n /** The model ids a coding agent's discovery last listed, read live; empty while it is cold. */\n agentCatalog?: (provider: PlannerBackendId) => readonly string[];\n}\n\nexport class WebConfig extends BaseConfig {\n private _enabledRunnersOverride: string[] | undefined;\n private _providerModelLists: () => ProviderModelLists | undefined;\n private _modelOverride: string | undefined;\n private _pickedModel: () => PlannerPick | undefined;\n private _agentCatalog: (provider: PlannerBackendId) => readonly string[];\n\n constructor(opts?: WebConfigOpts) {\n super();\n this._enabledRunnersOverride = opts?.enabledRunners;\n const lists = opts?.providerModelLists;\n this._providerModelLists = typeof lists === 'function' ? lists : () => lists;\n this._modelOverride = opts?.modelOverride;\n this._pickedModel = opts?.pickedModel ?? (() => undefined);\n this._agentCatalog = opts?.agentCatalog ?? (() => []);\n }\n\n protected agentCatalog(provider: PlannerBackendId): readonly string[] {\n return this._agentCatalog(provider);\n }\n\n setProviderModelLists(lists: ProviderModelLists): void {\n this._providerModelLists = () => lists;\n }\n\n /**\n * Read live, not fixed at construction: a session's WebConfig lives for the\n * whole session while /planner and /key (or the headless `ordewell model`)\n * mutate process.env under it. `routedProvider` keeps that cheap.\n */\n get planner(): ResolvedPlanner {\n return this.resolvePlanner({ ...this.configuredPlanner(), override: this._modelOverride }, this._providerModelLists());\n }\n\n /**\n * What the daemon inherited at startup, or what a settings write has set\n * since; the model counts as picked only while it is the one a write picked.\n */\n private configuredPlanner(): ConfiguredPlanner {\n const model = process.env.ORCHESTRATOR_MODEL || '';\n const pick = this._pickedModel();\n return { model, effort: process.env.ORDEWELL_PLANNER_EFFORT || '', pickedFor: pick?.model === model ? pick.provider : undefined };\n }\n\n get orchestratorModel(): string {\n return this.planner.model;\n }\n\n get aiProvider(): PlannerBackendId {\n return this.planner.provider;\n }\n\n get plannerThinkingEffort(): string | undefined {\n return this.planner.effort || undefined;\n }\n\n get apiKey(): string {\n const provider = this.aiProvider;\n return isApiProvider(provider) ? this.getProviderApiKey(provider) : '';\n }\n\n get planningModel(): string {\n const model = this.plannerChoiceFor(this.aiProvider, this.configuredPlanner()).model;\n return this.aiProvider === 'google' ? normalizeGeminiModel(process.env.GEMINI_MODEL || model) : 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 // The per-runner toggles that predate ORDEWELL_ENABLED_RUNNERS: three fixed\n // variables, named by runner id on purpose; a newer runner is enabled\n // through the list above. Only a toggle that is set is a choice: with none,\n // claude-code's default-on toggle would hide a Codex- or OpenCode-only host.\n const toggles = ['ORDEWELL_CLAUDE_CODE_ENABLED', 'ORDEWELL_CODEX_ENABLED', 'ORDEWELL_OPENCODE_ENABLED'];\n if (toggles.every((name) => process.env[name] === undefined)) return defaultEnabledRunners();\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 : [...DEFAULT_RUNNERS];\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 /** The child was killed at the call's time limit, rather than exiting on its own. */\n timedOut: boolean;\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/** How long a sealed run's output may trail its exit. */\nconst SEALED_OUTPUT_GRACE_MS = 1_000;\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; sealed?: boolean },\n): Promise<ExecResult> {\n return new Promise((resolve) => {\n try {\n const child = 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 // A sealed run's wall-time limit is a kill, not a request it may trap\n // (ADR-0036 S1); the sandbox takes the processes it started down with it.\n ...(opts.sealed ? { killSignal: 'SIGKILL' as const } : {}),\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 // Only Node's own timeout sets `killed`; an abort and a stdout overflow do not, so this names the limit exactly.\n resolve({ stdout: stdout ?? '', stderr: stderr ?? '', code, timedOut: err?.killed === true });\n });\n // A process that left a sealed run's process group can hold its output\n // open after the run has ended: the result is what arrived by then.\n if (opts.sealed) child.once('exit', () => setTimeout(() => { child.stdout?.destroy(); child.stderr?.destroy(); }, SEALED_OUTPUT_GRACE_MS).unref());\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, timedOut: false });\n }\n });\n}","import {\n BaseFileSystem,\n buildGrepArgs,\n buildGlobArgs,\n buildFallbackGrepArgs,\n GREP_PCRE_PROBE_ARGS,\n grepRegexFromProbe,\n listTree,\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 ShellLaunch,\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 { root, anchor } = await this.searchTarget(absRoot);\n const result = await run('rg', buildGlobArgs(pattern, root), { 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 { root: findRoot } = await this.searchTarget(absRoot);\n const result = await run('find', [findRoot, '-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, findRoot, { emptyMessage: 'No files matched.' }),\n truncated: capped.truncated,\n };\n }\n\n /**\n * The search path and a directory to anchor it in. `cwd` exists only so\n * anchored `--glob`/`--include` patterns resolve against the search root, and\n * 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 * The root is resolved through symlinks because the OS reports a child's cwd\n * as the resolved path (macOS tmpdir is `/var/...` -> `/private/var/...`),\n * and ripgrep matches an anchored glob against the search path as written: a\n * root that goes through a link never matches and yields a false empty\n * result. Result rows then carry the resolved prefix, which is why callers\n * strip `anchor` rather than the path they were handed.\n */\n private async searchTarget(absRoot: string): Promise<{ root: string; anchor: string }> {\n try {\n const root = await fs.realpath(absRoot);\n return { root, anchor: (await fs.stat(root)).isDirectory() ? root : path.dirname(root) };\n } catch {\n return { root: absRoot, anchor: 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 { root, anchor } = await this.searchTarget(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, root).args, { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() })\n : await run('grep', buildFallbackGrepArgs(pattern, anchoredInclude ? { ...opts, include: undefined } : opts, root, 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 try {\n return await listTree(absPath, depth, async (abs) =>\n (await fs.readdir(abs, { withFileTypes: true })).map((e) => ({ name: e.name, directory: e.isDirectory() })));\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, shell: ShellLaunch, signal: AbortSignal | undefined, cwd: string): 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 where no sandbox\n // runs. A resolved file is the sandbox launcher around the POSIX shell, or\n // the POSIX shell found on a Windows box: either way the command goes last,\n // in the dialect `BaseFileSystem` classified it under.\n const { file, args, env, wallTimeMs } = shell;\n const result = file === null\n ? await run(command, [], { cwd, timeout: BASH_TIMEOUT_MS, shell: true, env, signal })\n : await run(file, [...args, command], { cwd, timeout: wallTimeMs ?? BASH_TIMEOUT_MS, env, signal, sealed: wallTimeMs !== undefined });\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, ...(result.timedOut ? { timedOut: true } : {}) };\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 type { IRunner, IRunnerSession, RunnerSpawnOptions } from '@ordewell/core';\nimport type { SessionBroadcaster } from '@ordewell/core';\n\nexport class PoolAwareRunner implements IRunner {\n /**\n * Sessions this plan spawned. The inner runner is shared by every plan in\n * the pool, so \"stop everything\" and \"how many are running\" must be\n * answered from this set, never delegated — delegating would let one plan's\n * /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 private inner: IRunner,\n ) {}\n\n get activeCount(): number { return this.owned.size; }\n\n async spawn(opts: RunnerSpawnOptions): Promise<IRunnerSession> {\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): Promise<void> {\n this.owned.delete(sessionId);\n return this.inner.stop(sessionId);\n }\n\n stopAll(): void {\n for (const id of this.owned) void this.inner.stop(id);\n this.owned.clear();\n }\n}\n","import { spawn as nodeSpawn } from 'child_process';\nimport { randomUUID } from 'crypto';\nimport { resolve } from 'path';\nimport { WebSocket } from 'ws';\nimport {\n AccountLimitMonitor,\n claudeAccountLimitCollector,\n codexAccountLimitCollector,\n openCodeGoAccountLimitCollector,\n assignedRunnerOf,\n flattenTasks,\n type AccountLimitCollector,\n type AccountLimitsFrame,\n Session,\n createSession,\n type ConversationCompaction,\n type ConversationFork,\n type RunView,\n type SessionMessage,\n type SessionNotice,\n type SessionRuntimeSettings,\n type SessionFrame,\n type ApprovalRequestMessage,\n type StreamStamp,\n ModelResolver,\n RunnerRegistry,\n removedPluginNotice,\n RunnerInstallation,\n listSessions,\n loadSession,\n deleteSession,\n SettingsService,\n sessionRuntimeSettings,\n type GlobalRunSettings,\n type PlanState,\n type LegacyPlanState,\n migratePlanState,\n type RunnerId,\n type DiscoveredModel,\n type ModelsResponse,\n type RunnersResponse,\n type SettingsResponse,\n type SettingsUpdateResponse,\n SessionNotFoundError,\n runnerModesFrom,\n configuredProviders,\n assertWorkspaceExists,\n assertWorkspaceIsProject,\n WorkspaceNotAProjectError,\n ensureStateDirIgnored,\n runnerForProvider,\n PlannerModelMemory,\n selectPlanner,\n admitSettingsEnv,\n PROVIDER_CREDENTIAL_ENV,\n type PlannerBackendId,\n type PlannerModelCandidate,\n type PlannerSelectionChange,\n type PlannerSelectionCurrent,\n StructuredRunner,\n CodexSandboxAvailability,\n detectInstalledPlanner,\n installedPlannerAnswered,\n PlannerNotReadyError,\n PlannerTurnDiscardedError,\n PlannerTurnStoppedError,\n type LeaseHost,\n workspaceEnvOf,\n recordedRunnerAuth,\n createIsolationPreview,\n type IIsolationPreview,\n type IsolationPreview,\n} from '@ordewell/core';\nimport { WebConfig, type PlannerPick } from '../adapters/WebConfig';\nimport { scanWorkspaces as scanWorkspacesImpl } from '../utils/workspaceScanner';\nimport { PoolFileSystem } from '../adapters/PoolFileSystem';\nimport { PoolAwareRunner } from '../adapters/PoolAwareRunner';\nimport type { ApprovalAnswer, RunnerRegistry as CoreRunnerRegistry, IRunner } 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\n/**\n * The installation checks a host supplies the pool. `refresh` is optional so a\n * test may hand in only the two probes; the real `RunnerInstallation` always\n * has it, and a refresh then re-probes a CLI installed since the last look.\n */\ntype RunnerInstall = Pick<RunnerInstallation, 'filterInstalled' | 'plannerUsability'> & Partial<Pick<RunnerInstallation, 'refresh'>>;\n\nexport interface OrchestratorPoolDeps {\n /** Inject acquisition boundaries without reading real accounts in host lifecycle tests. */\n accountLimitCollectors?: (workspace: string) => readonly AccountLimitCollector[];\n /**\n * Where every plan's tasks run (ADR-0018), shared across sessions behind\n * each plan's `PoolAwareRunner`. Defaulted to a real one; tests inject a fake.\n */\n runner?: IRunner;\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 /** Overrides the pool's Codex sandbox probe; tests inject one so no real `codex` is started. */\n codexSandbox?: Pick<CodexSandboxAvailability, 'ensure' | 'refresh'>;\n /** Overrides the pool's installation checks; tests inject one so no real agent binary is asked. */\n runnerInstallation?: RunnerInstall;\n /**\n * The host whose leases the pool's sessions hold (ADR-0049); this process's\n * unless a test runs two pools as two hosts.\n */\n leaseHost?: LeaseHost;\n /**\n * The read-only repository look a surface shows before any run. Defaulted to\n * one built from the daemon's config; tests inject a fake so no real git runs.\n */\n isolationPreview?: IIsolationPreview;\n}\n\nexport class OrchestratorPool {\n // A daemon serves several workspaces; login selection must never follow\n // whichever session was opened most recently (ADR-0051).\n private readonly sessionWorkspaces = new Map<string, string>();\n private readonly accountLimits = new Map<string, AccountLimitMonitor>();\n private readonly accountLimitCollectors: (workspace: string) => readonly AccountLimitCollector[];\n private limitsRevision = 0;\n private sessions = new Map<string, Session>();\n private clients = new Map<string, Set<WebSocket>>();\n /**\n * This process's broadcast numbering (see `StreamStamp`), per session id\n * rather than per Session object: a session replaced under the same id\n * keeps counting up, so a client never mistakes its first broadcast for one\n * of the old session's it already showed.\n */\n private readonly stream = randomUUID();\n private sequence = new Map<string, number>();\n private registry: CoreRunnerRegistry = new RunnerRegistry();\n private modelResolver: ModelResolver;\n private runnerInstallation: RunnerInstall;\n /**\n * A host that supplied its own probe (a test, or a surface that owns one).\n * Everything else asks {@link installationFor}, which keys a real probe by\n * the workspace whose account it is judging (ADR-0016).\n */\n private suppliedRunnerInstallation: RunnerInstall | undefined;\n private workspaceInstallations = new Map<string, RunnerInstall>();\n private cachedProviderLists: Record<string, string[]> | undefined;\n private settingsService = new SettingsService();\n private plannerModelMemory = new PlannerModelMemory(this.settingsService);\n /**\n * The model a settings write picked in this daemon. The environment's model\n * is otherwise inherited, and an agent planning only because detection\n * found it does not plan with an inherited model it cannot be shown to run.\n */\n private pickedModel: PlannerPick | undefined;\n private runner: IRunner;\n /** One probe per daemon, asked again whenever the runner list is refreshed (ADR-0033). */\n private codexSandbox: Pick<CodexSandboxAvailability, 'ensure' | 'refresh'>;\n private readonly leaseHost: LeaseHost | undefined;\n private readonly isolationPreview: IIsolationPreview;\n\n constructor(deps: OrchestratorPoolDeps = {}) {\n const pluginNotice = removedPluginNotice();\n if (pluginNotice) console.warn(pluginNotice);\n this.runner = deps.runner ?? new StructuredRunner();\n // The login probe must ask the account the planner will use (ADR-0016).\n // This installation is the daemon's own cwd for detection; a runner list\n // request naming a workspace is judged by that workspace's own probe.\n this.suppliedRunnerInstallation = deps.runnerInstallation;\n this.runnerInstallation = deps.runnerInstallation\n ?? new RunnerInstallation(this.registry, undefined, undefined, {\n env: () => workspaceEnvOf(process.cwd()),\n workspace: () => process.cwd(),\n });\n this.modelResolver = deps.modelResolver ?? new ModelResolver(this.registry, new WebConfig());\n this.codexSandbox = deps.codexSandbox\n ?? new CodexSandboxAvailability(this.registry, { spawn: nodeSpawn, fetch: globalThis.fetch }, { cwd: process.cwd(), env: process.env });\n this.leaseHost = deps.leaseHost;\n // What worktreeIsolation and workspaceRepos mean here, which is the config\n // the sessions plan with: the daemon's own environment, not a guess from\n // the workspace a request happens to name.\n this.isolationPreview = deps.isolationPreview ?? createIsolationPreview({ config: new WebConfig() });\n this.accountLimitCollectors = deps.accountLimitCollectors ?? ((workspace) => {\n const workspaceRoot = () => workspace;\n const isInstalled = (runner: string) => async () => (await this.runnerInstallation.filterInstalled([runner])).includes(runner);\n const server = this.registry.getManifest('codex')?.modelDiscovery.appServer;\n return [\n claudeAccountLimitCollector({ workspaceRoot, isInstalled: isInstalled('claude-code') }),\n codexAccountLimitCollector({ workspaceRoot, isInstalled: isInstalled('codex'), command: server?.command, args: server?.args }),\n openCodeGoAccountLimitCollector({ workspaceRoot, isInstalled: isInstalled('opencode') }),\n ];\n });\n }\n\n /**\n * Not awaited: planning must start at once, and the daemon already warms the\n * probe at startup through the catalog. This only covers a daemon that was\n * asked to plan before that finished.\n */\n private warmCodexSandbox(): void {\n this.codexSandbox.ensure().catch((err) => console.error(`[web] codex sandbox probe failed: ${err instanceof Error ? err.message : err}`));\n }\n\n /**\n * Find the coding agent that plans when the user has chosen no planner and\n * set no vendor key (ADR-0009), for the daemon to start as it starts. Every\n * planner turn waits on it, so a goal typed the instant the TUI opens\n * does not plan with an openrouter key nobody set.\n */\n detectInstalledPlanner(): Promise<PlannerBackendId | null> {\n return detectInstalledPlanner(this.runnerInstallation);\n }\n\n /**\n * A read-only look at the repositories and branches a run would isolate in\n * `workspace`. Free of side effects on purpose: a first screen may ask before\n * any plan or run exists, and asking must not create one.\n */\n previewIsolation(workspace: string): Promise<IsolationPreview> {\n assertWorkspaceExists(workspace);\n return this.isolationPreview.preview(workspace);\n }\n\n /**\n * A new session's first planner turn. It waits for that probe at the\n * session's own planner gate, where a reply sent meanwhile queues behind\n * it, and a Stop or the session closing or being replaced ends the wait.\n */\n private async firstTurn<T>(sessionId: string, session: Session, turn: () => Promise<T>): Promise<T> {\n try {\n return await turn();\n } catch (err) {\n // Judged once the probe answered: a refused session is never left\n // addressable, as when it is judged before it is registered.\n if (err instanceof PlannerNotReadyError && this.sessions.get(sessionId) === session) this.destroy(sessionId);\n // Stopped before it opened, the session holds no conversation for a\n // reply to continue: for the client its goal was discarded.\n if (err instanceof PlannerTurnStoppedError && !session.planState) throw new PlannerTurnDiscardedError();\n throw err;\n }\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 this.connectAccountLimits(sessionId, 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 this.releaseUnusedAccountLimits();\n }\n\n private connectAccountLimits(sessionId: string, ws: WebSocket): void {\n const workspace = this.sessionWorkspaces.get(sessionId);\n if (!workspace) {\n this.sendAccountLimits(sessionId, ws, []);\n return;\n }\n let monitor = this.accountLimits.get(workspace);\n if (!monitor) {\n monitor = new AccountLimitMonitor({ collectors: this.accountLimitCollectors(workspace) });\n this.accountLimits.set(workspace, monitor);\n monitor.subscribe((limits) => {\n for (const [id, clients] of this.clients) {\n if (this.sessionWorkspaces.get(id) !== workspace) continue;\n for (const client of clients) this.sendAccountLimits(id, client, limits);\n }\n });\n }\n this.sendAccountLimits(sessionId, ws, monitor.snapshots());\n monitor.setForeground(true);\n monitor.surfaceConnected();\n }\n\n private sendAccountLimits(sessionId: string, ws: WebSocket, limits: AccountLimitsFrame['limits']): void {\n if (ws.readyState !== ws.OPEN) return;\n ws.send(JSON.stringify({ type: 'account_limits', sessionId, limits, stream: this.stream, revision: ++this.limitsRevision } satisfies AccountLimitsFrame));\n }\n\n private releaseUnusedAccountLimits(): void {\n for (const [workspace, monitor] of this.accountLimits) {\n if ([...this.clients.keys()].some((id) => this.sessionWorkspaces.get(id) === workspace)) continue;\n monitor.dispose();\n this.accountLimits.delete(workspace);\n }\n }\n\n private registerSession(sessionId: string, workspace: string, session: Session): void {\n this.sessions.set(sessionId, session);\n this.sessionWorkspaces.set(sessionId, workspace);\n for (const ws of this.clients.get(sessionId) ?? []) this.connectAccountLimits(sessionId, ws);\n }\n\n private broadcast(sessionId: string, msg: SessionMessage | SessionNotice): void {\n const workspace = this.sessionWorkspaces.get(sessionId);\n const monitor = workspace ? this.accountLimits.get(workspace) : undefined;\n if (msg.type === 'planner_usage') monitor?.invalidate();\n else if (msg.type === 'task_log' && msg.events.some((event) => event.type === 'turn_end')) {\n const task = flattenTasks(this.sessions.get(sessionId)?.planTasks ?? []).find((task) => task.id === msg.taskId);\n const runner = task && assignedRunnerOf(task);\n if (runner) monitor?.invalidate(runner);\n }\n const seq = (this.sequence.get(sessionId) ?? 0) + 1;\n this.sequence.set(sessionId, seq);\n const payload = JSON.stringify({ ...msg, stream: this.stream, seq } satisfies SessionFrame);\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 /** Null for a session this process is not holding: there is no run to describe. */\n runSnapshot(sessionId: string): RunView | null { return this.sessions.get(sessionId)?.runSnapshot() ?? null; }\n /** The planner turn answering in a session this process holds, if one is. */\n plannerTurnId(sessionId: string): string | undefined { return this.sessions.get(sessionId)?.plannerTurnId; }\n /** The planner compaction running in a session this process holds, as its start was announced; it has no turn to name. */\n plannerCompaction(sessionId: string): ReturnType<Session['plannerCompaction']> { return this.sessions.get(sessionId)?.plannerCompaction(); }\n /** The planner's approval requests still waiting, as they were announced. */\n announcedApprovals(sessionId: string): ApprovalRequestMessage[] { return this.sessions.get(sessionId)?.announcedApprovals() ?? []; }\n /** The last broadcast of the session so far: a snapshot taken now accounts for it and everything before. */\n streamPosition(sessionId: string): StreamStamp { return { stream: this.stream, seq: this.sequence.get(sessionId) ?? 0 }; }\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 = this.plannerConfig(modelOverride);\n const fsAdapter = new PoolFileSystem(workspace);\n const broadcast = (msg: SessionMessage) => this.broadcast(sessionId, msg);\n const runner = new PoolAwareRunner(sessionId, broadcast, this.runner);\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 ...(this.leaseHost ? { leaseHost: this.leaseHost } : {}),\n });\n }\n\n /**\n * The one way the pool builds a config that answers \"who plans\": sessions,\n * the settings response and the switch judgement all route through it, so\n * what the settings route reports is what the next turn plans with. The\n * lists are handed over as a reader, not a snapshot, so a credential change\n * reaches a session that is already open.\n */\n private plannerConfig(modelOverride?: string): WebConfig {\n return new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n modelOverride,\n providerModelLists: () => this.cachedProviderLists,\n pickedModel: () => this.pickedModel,\n agentCatalog: (provider) => this.plannerCatalogFor(provider).map((model) => model.id),\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 // Worked out from the file as it is when written, not from an earlier read.\n this.settingsService.updateEnabledRunners((saved) => {\n const current = saved ?? new WebConfig().enabledRunners;\n return enabled\n ? (current.includes(id) ? current : [...current, id])\n : current.filter((r) => r !== id);\n });\n }\n\n getSettings(sessionId?: string): SettingsResponse {\n const config = this.plannerConfig();\n const userSettings = this.settingsService.getAll();\n const live = sessionId ? this.sessions.get(sessionId) : undefined;\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 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 // An open session shows what it was opened with; a closed or unknown id\n // falls back to the file, which is what a new session starts from (ADR-0030).\n run: live?.runSettings() ?? this.settingsService.getRunSettings(),\n };\n }\n\n /**\n * Save the user's run settings, and apply them at once to `sessionId`'s run\n * when that session is open here (ADR-0030). Other sessions keep the values\n * they were opened with. Throws a {@link RunSettingsError}, saving nothing,\n * for a value out of range.\n */\n updateRunSettings(changes: Partial<GlobalRunSettings>, sessionId?: string): SettingsResponse {\n this.settingsService.updateRunSettings(changes);\n if (sessionId) this.sessions.get(sessionId)?.applyRunSettings(changes);\n return this.getSettings(sessionId);\n }\n\n /**\n * The catalog `selectPlanner` 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: PlannerBackendId): 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 /**\n * The provider planning right now. A vendor planner is resolved from its\n * model id, so this is read again after a write rather than carried over.\n */\n private plannerProviderInEffect(): PlannerBackendId {\n return this.plannerConfig().aiProvider;\n }\n\n updateSettings(changes: Record<string, unknown>, sessionId?: string): SettingsUpdateResponse {\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. The model and effort\n // too, with where they came from: a detected agent does not plan with a\n // vendor model left in the environment, and judging against it would\n // remember that model as the agent's own pick.\n const current: PlannerSelectionCurrent = this.plannerConfig().planner;\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\n // A pick arrives either as a top-level field (a vendor model, `ordewell\n // model set`) or through env (`ordewell planner-effort`, the TUI's\n // pickers); env wins, as it did when both were written in that order. The\n // provider is the name the client sent, never re-derived from the model: a\n // switch may have just cleared that model. An `inherited` write is no\n // pick at all: it is the environment a client was started under, which\n // the daemon would have inherited had the client spawned it, so it is\n // written as it stands and nothing in it is remembered.\n const plannerChange: PlannerSelectionChange = changes.inherited === true ? {} : {\n provider: envChanges?.AI_PROVIDER,\n model: envChanges?.ORCHESTRATOR_MODEL ?? stringField(changes.orchestratorModel),\n effort: envChanges?.ORDEWELL_PLANNER_EFFORT ?? stringField(changes.plannerThinkingEffort),\n };\n const touchesPlanner = Object.values(plannerChange).some((v) => v !== undefined);\n // Judged against the incoming provider's catalog as already discovered —\n // before the credential refresh below clears the resolver's cache — so a\n // settings write never waits on (async) discovery.\n const selection = touchesPlanner\n ? selectPlanner(current, plannerChange, this.plannerModelMemory, this.plannerCatalogFor(plannerChange.provider ?? current.provider))\n : undefined;\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, 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 [id, session] of this.sessions) {\n session.reschedule().catch((err) => {\n console.error(`[web] reschedule failed for session ${id}: ${err instanceof Error ? err.message : err}`);\n });\n }\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 this.dropUnkeyedProviderLists();\n }\n }\n\n if (selection) {\n // An effort on its own leaves the configured model as it was: a\n // detected agent's model in effect can be its remembered one, which a\n // key added later must not find written over the configured model.\n if (plannerChange.provider !== undefined || plannerChange.model !== undefined) process.env.ORCHESTRATOR_MODEL = selection.next.model;\n process.env.ORDEWELL_PLANNER_EFFORT = selection.next.effort;\n // Read once the env above is written: the pick is for whoever that\n // routes to, which a switch or the model's own catalog may have changed.\n if (plannerChange.model !== undefined) this.pickedModel = { model: selection.next.model, provider: this.plannerProviderInEffect() };\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 if (envChanges) for (const monitor of this.accountLimits.values()) monitor.refresh();\n\n if (selection?.remember) {\n const { provider, model, effort } = selection.remember;\n // Without a switch a vendor pick is keyed by the provider its model id\n // resolves to now, which the env written above already reflects.\n const switched = provider !== current.provider;\n this.plannerModelMemory.remember(switched ? provider : this.plannerProviderInEffect(), model, effort);\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: SettingsUpdateResponse = this.getSettings(sessionId);\n if (rejectedEnvKeys.length > 0) settings.rejectedEnvKeys = rejectedEnvKeys;\n if (selection?.recall) settings.switchRecall = selection.recall;\n return settings;\n }\n\n /**\n * A vendor whose credential is gone keeps no list to route a model to it,\n * or the next turn would be sent to a planner the settings response no\n * longer names. Pruned rather than cleared: the vendors that still hold a\n * key keep routing their models until the catalog is discovered again, so\n * adding a second key does not move the planner off the first.\n */\n private dropUnkeyedProviderLists(): void {\n if (!this.cachedProviderLists) return;\n const keyed = new Set<string>(configuredProviders(new WebConfig()));\n this.cachedProviderLists = Object.fromEntries(\n Object.entries(this.cachedProviderLists).filter(([provider]) => keyed.has(provider)),\n );\n }\n\n setOrchestratorModel(model: string): string {\n process.env.ORCHESTRATOR_MODEL = model;\n return model;\n }\n\n async getProviderModels(): Promise<ModelsResponse> {\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 this.codexSandbox.ensure(),\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 = configuredProviders(config);\n\n return {\n models: allModels,\n modelsByRunner,\n modesByRunner: runnerModesFrom(this.registry, runnerIds),\n orchestratorModel: this.plannerConfig().orchestratorModel,\n providers,\n orchestratorModels,\n providerErrors,\n };\n }\n\n getRunnerState(): { enabledRunners: RunnerId[]; orchestratorModel: string } {\n const config = this.plannerConfig();\n return { enabledRunners: config.enabledRunners, orchestratorModel: config.orchestratorModel };\n }\n\n /**\n * The probe that judges a login for `workspace`, cached so its install and\n * auth verdicts survive between runner-list refreshes. Without a workspace\n * the daemon's cwd is what the request would plan with anyway.\n */\n private installationFor(workspace: string | undefined): RunnerInstall {\n if (this.suppliedRunnerInstallation) return this.suppliedRunnerInstallation;\n if (!workspace) return this.runnerInstallation;\n const key = resolve(workspace);\n let installation = this.workspaceInstallations.get(key);\n if (!installation) {\n installation = new RunnerInstallation(this.registry, undefined, undefined, {\n env: () => workspaceEnvOf(key),\n workspace: () => key,\n });\n this.workspaceInstallations.set(key, installation);\n }\n return installation;\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. `workspace` names whose account the auth verdict\n * is about; without it the daemon's cwd stands in.\n */\n async getInstalledRunners(workspace?: string): Promise<RunnersResponse['runners']> {\n // The runner list is the one place a user who just fixed their host looks\n // again, so every cached answer is asked afresh: the Codex sandbox, the\n // install verdicts, and the agent detection behind the no-choice defaults.\n await this.codexSandbox.refresh();\n const installation = this.installationFor(workspace);\n installation.refresh?.();\n await this.detectInstalledPlanner();\n\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const enabled = new Set(config.enabledRunners);\n const runners = this.registry.list();\n const installedIds = new Set(\n await installation.filterInstalled(runners.map((p) => p.manifest.name)),\n );\n // The auth verdict rides along, never gating the list: a signed-out agent\n // is installed and offered, and a surface flags it. The probe was just\n // asked above and its answer is cached, so this costs no second spawn.\n // Its `usable` does gate: an installed CLI that cannot be spawned (a\n // Windows `.cmd` shim) must not be offered (ADR-0009).\n const rows = await Promise.all(\n runners\n .filter((p) => installedIds.has(p.manifest.name))\n .map(async (p): Promise<RunnersResponse['runners'][number] | null> => {\n const { usable, auth } = await installation.plannerUsability(p.manifest.name);\n if (!usable) return null;\n return {\n id: p.manifest.name,\n name: p.manifest.displayName,\n enabled: enabled.has(p.manifest.name),\n ...(auth ? { auth } : {}),\n };\n }),\n );\n return rows.filter((row): row is RunnersResponse['runners'][number] => row !== null);\n }\n\n async generatePlan(sessionId: string, goal: string, runners: RunnerId[] | undefined, workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<PlanState> {\n const recheck = this.recheckSignedOutPlanner(workspace, this.plannerConfig(modelOverride).aiProvider);\n if (recheck) await recheck;\n const session = this.openPlanningSession(sessionId, runners, workspace, modelOverride, options);\n return migratePlanState(await this.firstTurn(sessionId, session, () => session.generatePlan(goal, runners)));\n }\n\n /**\n * Judge the planner as the workspace's account is now, not as it was when the\n * list was last read: the signed-out refusal itself offers the runner's own\n * `auth login` as a way back, and that happens in another process. Only a\n * recorded signed-out verdict is asked again — unknown never blocks, and a\n * signed-in one is the runner's own failure to report. Null when there is\n * nothing to ask, so the turn registers at once as it always did.\n */\n private recheckSignedOutPlanner(workspace: string, provider: PlannerBackendId): Promise<void> | null {\n const runner = runnerForProvider(provider);\n if (!runner || recordedRunnerAuth(runner, workspace)?.state !== 'signed-out') return null;\n const installation = this.installationFor(workspace);\n installation.refresh?.();\n return installation.plannerUsability(runner).then(() => undefined);\n }\n\n /**\n * Build the session a new planning conversation runs in and register it in\n * place of any live one, for {@link firstTurn} to run its first turn on.\n */\n private openPlanningSession(sessionId: string, runners: RunnerId[] | undefined, workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Session {\n const session = this.createSessionFor(sessionId, workspace, modelOverride, options);\n // Judged on the new session's config (which carries the request's model)\n // and before the old session is destroyed, so a refusal leaves it alone.\n // Not while the installed-planner probe is out: its answer can be the\n // planner, and judging the openrouter fallback now would refuse the very\n // keyless first run the probe exists for, so that judgement is the first\n // turn's own gate. The runners are judged on the same terms: before the\n // probe answers, the enabled set is a guess a refusal must not rest on.\n if (installedPlannerAnswered()) {\n session.assertPlannerReady();\n session.assertRunnersEnabled(runners);\n }\n // After the new session is built, so a refusal above leaves the live one\n // alone; before the set, so its runners and planner turn stop broadcasting.\n this.destroy(sessionId);\n // Registered before the blocking call, not after: research inside\n // the first planner turn can raise an approval and await the answer, and\n // that answer arrives over POST /api/approvals/:sessionId — which 404s\n // until the session is in this map. Registering only on return made the\n // first approval of every session unanswerable until its 5-minute timeout.\n this.registerSession(sessionId, workspace, session);\n this.warmCodexSandbox();\n return session;\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[] | undefined, workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<LegacyPlanState> {\n const recheck = this.recheckSignedOutPlanner(workspace, this.plannerConfig(modelOverride).aiProvider);\n if (recheck) await recheck;\n const session = this.openPlanningSession(sessionId, runners, workspace, modelOverride, options);\n return this.firstTurn(sessionId, session, () => session.startPlanning(goal, runners));\n }\n\n /**\n * Continue the planner dialogue with the user's reply: queued behind the\n * first turn, even while it waits for the installed-planner probe, and\n * refused only while a turn of another kind holds the conversation. The\n * session's own planner gate waits for the probe and judges the planner, as\n * it does for every turn.\n */\n async continuePlanning(sessionId: string, message: string): Promise<LegacyPlanState> {\n const session = this.session(sessionId);\n // A reply is a planner turn like any other: the signed-out refusal offers\n // the runner's own login, which runs outside this process, so ask the\n // workspace's account again before the session's synchronous gate judges.\n const recheck = this.recheckSignedOutPlanner(session.workspaceRoot, session.plannerProvider);\n if (recheck) await recheck;\n return session.continueConversation(message);\n }\n\n /** Condense a session's conversation. The summary turn is a planner turn, so `cancelPlanning` stops it. */\n async compactConversation(sessionId: string): Promise<ConversationCompaction & { plan: LegacyPlanState }> {\n const session = this.session(sessionId);\n const recheck = this.recheckSignedOutPlanner(session.workspaceRoot, session.plannerProvider);\n if (recheck) await recheck;\n const compaction = await session.compactConversation();\n return { ...compaction, plan: session.planState! };\n }\n\n /**\n * Send now (ADR-0023): the Session stops the planner turn in flight and\n * answers this message in the turn that replaces it, ahead of anything\n * waiting. The recheck is the one a reply does before the gate: a login done\n * with the runner's own command is seen here too.\n */\n async forceSendPrompt(sessionId: string, message: string): Promise<LegacyPlanState> {\n const session = this.session(sessionId);\n const recheck = this.recheckSignedOutPlanner(session.workspaceRoot, session.plannerProvider);\n if (recheck) await recheck;\n return session.forceSendPrompt(message);\n }\n\n /** Retry a compaction paused on the planner's context: a planner turn, and gated as one. */\n async retryPlannerCompaction(sessionId: string): Promise<LegacyPlanState> {\n const session = this.session(sessionId);\n const recheck = this.recheckSignedOutPlanner(session.workspaceRoot, session.plannerProvider);\n if (recheck) await recheck;\n return session.retryPlannerCompaction();\n }\n\n /**\n * Abort the planner 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 // A first turn still waiting for the probe is the session's to stop too.\n return this.sessions.get(sessionId)?.abortPlannerTurn() ?? false;\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 SessionNotFoundError();\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. Refused while\n // another live host runs the session (ADR-0049); the session built for\n // it is let go, and the one live here, if any, keeps running.\n try {\n session.loadPlan(saved.plan, saved.meta.goal, workspace, { sessionId: saved.meta.id });\n } catch (err) {\n session.destroy();\n throw err;\n }\n // A live session with no plan yet is mid-planning; replacing it must stop that turn.\n this.destroy(sessionId);\n this.registerSession(sessionId, workspace, 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 SessionNotFoundError();\n return session;\n }\n\n /**\n * Stop a session and drop it. A replacement under the same id (re-planning,\n * adopting) keeps its subscribers: they are watching the id, and the new\n * session's broadcasts continue on the same socket. An explicit delete or\n * close is different — the surface must stop drawing a session that no\n * longer exists — so those pass `notifyClients`.\n */\n destroy(sessionId: string, options?: { notifyClients?: boolean }): void {\n this.sessions.get(sessionId)?.destroy();\n this.sessions.delete(sessionId);\n this.sessionWorkspaces.delete(sessionId);\n this.releaseUnusedAccountLimits();\n if (!options?.notifyClients) return;\n const clients = this.clients.get(sessionId);\n if (!clients) return;\n this.broadcast(sessionId, { type: 'notice', level: 'info', message: 'Session closed.' });\n for (const ws of clients) {\n if (ws.readyState === ws.OPEN) ws.close(1001, 'Session closed');\n }\n this.clients.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\nfunction stringField(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","import type { Context } from 'hono';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport {\n AlreadyExecutingError,\n ConversationBusyError,\n ConversationEditError,\n NoPlanError,\n PlanEditError,\n PlannerNotReadyError,\n PlannerTurnDiscardedError,\n PlannerTurnStoppedError,\n SessionHeldError,\n SessionNotFoundError,\n TaskControlError,\n WorkspaceNotAProjectError,\n WorkspaceNotFoundError,\n type DaemonErrorCode,\n type ErrorBody,\n} from '@ordewell/core';\n\ninterface Classified {\n status: ContentfulStatusCode;\n code: DaemonErrorCode;\n}\n\n/** A request body that is missing, not JSON, or not an object: the request's fault, never a fault of the daemon. */\nexport class InvalidBodyError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidBodyError';\n }\n}\n\n/**\n * The body of a route that needs one object. Every route that read\n * `c.req.json()` directly turned a client's typo into a 500 with the parser's\n * message and a logged stack, while its neighbours answered 400.\n */\nexport async function jsonObject<T extends object = Record<string, unknown>>(c: Context): Promise<T> {\n let parsed: unknown;\n try {\n parsed = await c.req.json();\n } catch {\n throw new InvalidBodyError('The request body must be valid JSON.');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new InvalidBodyError('The request body must be a JSON object.');\n }\n return parsed as T;\n}\n\n/**\n * The one table from a thrown class to a status and a stable code. A refusal is\n * the request being wrong (400) or arriving at a bad moment (409), a missing\n * session is 404, and only what falls through is a fault — collapsing these\n * into 404/500 gave the TUI and VS Code nothing to show but \"Internal error\",\n * which reads as the edit having silently done nothing.\n *\n * Order matters: `ConversationBusyError` extends `ConversationEditError`.\n */\nfunction classify(err: unknown): Classified | undefined {\n if (err instanceof InvalidBodyError) return { status: 400, code: 'refused' };\n if (err instanceof SessionNotFoundError) return { status: 404, code: 'session_not_found' };\n // 409: the session exists; another host has it open right now (ADR-0049).\n if (err instanceof SessionHeldError) return { status: 409, code: 'session_held' };\n if (err instanceof NoPlanError) return { status: 400, code: 'no_plan' };\n if (err instanceof AlreadyExecutingError) return { status: 409, code: 'already_executing' };\n if (err instanceof WorkspaceNotAProjectError) return { status: 400, code: 'workspace_not_a_project' };\n if (err instanceof WorkspaceNotFoundError) return { status: 400, code: 'workspace_not_found' };\n // 409: the request is fine; the machine is not set up to serve it yet.\n if (err instanceof PlannerNotReadyError) return { status: 409, code: 'planner_not_ready' };\n // 409, not 5xx: the turn ending is what the user asked for (or a plan they\n // dropped), and a 5xx would log a stack for every Stop.\n if (err instanceof PlannerTurnStoppedError) return { status: 409, code: 'planner_turn_stopped' };\n if (err instanceof PlannerTurnDiscardedError) return { status: 409, code: 'planner_turn_discarded' };\n if (err instanceof ConversationBusyError) return { status: 409, code: 'conversation_busy' };\n if (err instanceof ConversationEditError || err instanceof PlanEditError || err instanceof TaskControlError) {\n return { status: 400, code: 'refused' };\n }\n return undefined;\n}\n\n/** A refusal the route itself decided on, in the body shape every client reads. */\nexport function refuse(c: Context, status: ContentfulStatusCode, message: string, code?: DaemonErrorCode) {\n const body: ErrorBody = code ? { error: message, code } : { error: message };\n return c.json(body, status);\n}\n\n/**\n * A JSON error response from a thrown call. What `classify` does not know is a\n * fault and takes the route's `fallback` status; only a 5xx is logged, since a\n * refusal is the request being wrong and travels to the client as-is.\n */\nexport function failure(\n c: Context,\n err: unknown,\n label: string,\n { fallback = 500, message = 'Internal error' }: { fallback?: ContentfulStatusCode; message?: string } = {},\n) {\n const classified = classify(err);\n const status = classified?.status ?? fallback;\n // Log before returning: the message alone travels to the client, so an\n // unexpected throw (a research tool crashing the whole turn, say) left no\n // stack anywhere — server.log showed nothing and the CLI showed one line.\n if (status >= 500) console.error(`[web] ${label} failed:`, err);\n const body: ErrorBody = {\n error: (err instanceof Error && err.message) || message,\n ...(classified ? { code: classified.code } : {}),\n ...(err instanceof WorkspaceNotAProjectError ? { workspace: err.workspace } : {}),\n ...(err instanceof PlannerNotReadyError ? { plannerNotReady: err.reason } : {}),\n ...(err instanceof SessionHeldError ? { sessionHeld: err.held } : {}),\n };\n return c.json(body, status);\n}\n","import { Hono } from 'hono';\nimport { OrchestratorPool, getSessionList, removeSession } from '../pool/orchestratorPool';\nimport {\n listTaskLogAttempts,\n loadSessionPlanState,\n readTaskLog,\n surfacePlan,\n surfacePlanState,\n taskLogForSurface,\n type AdoptSessionResponse,\n type OkResponse,\n type SessionListResponse,\n type SessionResponse,\n type TaskLogAttemptsResponse,\n type TaskLogResponse,\n} from '@ordewell/core';\nimport { failure, refuse } from './errors';\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: SessionListResponse = 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 refuse(c, 404, 'Session not found', 'session_not_found');\n const run = pool.runSnapshot(id);\n const plannerCompaction = pool.plannerCompaction(id);\n return c.json({\n meta: saved.meta,\n plan: surfacePlanState(pool.getPlanState(id) ?? saved.plan),\n ...(run ? { run } : {}),\n ...(plannerCompaction ? { plannerCompaction } : {}),\n } satisfies SessionResponse);\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 const run = pool.runSnapshot(id);\n const plannerTurnId = pool.plannerTurnId(id);\n const plannerCompaction = pool.plannerCompaction(id);\n return c.json({\n ok: true,\n plan: surfacePlan(plan),\n goal: pool.getGoal(id),\n ...(run ? { run } : {}),\n ...(plannerTurnId ? { plannerTurnId } : {}),\n ...(plannerCompaction ? { plannerCompaction } : {}),\n } satisfies AdoptSessionResponse);\n } catch (err: unknown) {\n return failure(c, err, 'load session', { message: 'Failed to load session' });\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')), position: pool.streamPosition(c.req.param('id')) } satisfies TaskLogAttemptsResponse);\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 refuse(c, 400, 'attempt must be a positive integer');\n return c.json({ attempt, events: taskLogForSurface(readTaskLog({ baseDir: ws, sessionId: c.req.param('id') }, c.req.param('taskId'), attempt)), position: pool.streamPosition(c.req.param('id')) } satisfies TaskLogResponse);\n });\n\n // The live session goes first: it persists as it changes, so a session left\n // running would write its file back and reappear in the list.\n router.delete('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const id = c.req.param('id');\n const held = pool.hasSession(id);\n pool.destroy(id, { notifyClients: true });\n const removed = removeSession(id, ws);\n const ok = held || removed;\n return c.json({\n ok,\n ...(ok ? {} : { message: `No session \"${id}\" was found in ${ws}.` }),\n } satisfies OkResponse);\n });\n\n // Stops the orchestrator (killing every runner it spawned) and drops the\n // in-memory planner conversation. No-op if already closed/unregistered.\n router.post('/:id/close', (c) => {\n pool.destroy(c.req.param('id'), { notifyClients: true });\n return c.json({ ok: true } satisfies OkResponse);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport {\n flattenTasks,\n NoPlanError,\n parseExecutionCommand,\n resolveUserTaskRef,\n surfacePlan,\n surfacePlanState,\n TaskControlError,\n type CommandOutcome,\n type ConversationCompactResponse,\n type ConversationForkResponse,\n type ConversationRewindResponse,\n type ApproveReviewResponse,\n type ErrorBody,\n type ExecuteCommandResponse,\n type ExecuteResponse,\n type ExecutionCommand,\n type GeneratePlanResponse,\n type IsolationDiffResponse,\n type IsolationMergeResponse,\n type MergeGateResponse,\n type OkResponse,\n type PlanResponse,\n type PrdResponse,\n type ResolveConflictResponse,\n type RewindTargetsResponse,\n type StopResponse,\n type TaskMessageResponse,\n type Task,\n type CancelPlanningResponse,\n type CancelResumeResponse,\n} from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\nimport { failure, jsonObject, refuse } from './errors';\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/** The id of the task a reference names, as the seam resolves it — the user's unique id prefix included; the reference itself when the plan holds no such task, for the seam to refuse. */\nfunction idOfRef(session: ReturnType<OrchestratorPool['session']>, ref: string): string {\n return resolveUserTaskRef(session.planState?.tasks ?? [], ref)?.id ?? ref;\n}\n\n/** One execution button's command, run as the user (ADR-0029): a refusal becomes the 400 the surface already shows. */\nasync function runUserCommand(session: ReturnType<OrchestratorPool['session']>, command: ExecutionCommand): Promise<Extract<CommandOutcome, { ok: true }>> {\n const outcome = await session.execute(command, { kind: 'user' });\n if (!outcome.ok) throw new TaskControlError(outcome.message);\n return outcome;\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 jsonObject<{\n goal?: string; runners?: string[]; workspace?: string; model?: string; allowInit?: boolean;\n }>(c);\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. Left undefined for\n // the session to read after its planner gate, since before the installed\n // agents are detected the enabled default is not known yet.\n const runnerList: string[] | undefined = Array.isArray(runners) ? runners : (runners ? [runners] : (queryRunners ? queryRunners.split(',').map(s => s.trim()).filter(Boolean) : undefined));\n const plan = await pool.generatePlan(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n const { models, modelsByRunner } = await pool.getProviderModels();\n const notes = (pool.session(c.req.param('sessionId')).planState?.conversationHistory ?? [])\n .filter((e) => e.kind === 'system')\n .map((e) => e.content);\n return c.json({ plan: surfacePlanState(plan), models, modelsByRunner, ...(notes.length > 0 ? { notes } : {}) } satisfies GeneratePlanResponse);\n } catch (err) {\n return failure(c, err, 'generate', { message: 'Plan generation failed' });\n }\n });\n\n router.post('/:sessionId/execute', async (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n // The daemon contract keeps `no_plan` distinct from a plain refusal; the\n // seam refuses either way, so the code it cannot carry is kept here. A\n // run under way is no refusal: executing then approves what waits (#95).\n if (!session.planState || session.planTasks.length === 0) throw new NoPlanError('execute');\n const { message } = await runUserCommand(session, { command: 'run_plan' });\n return c.json({ status: 'running', message } satisfies ExecuteResponse);\n } catch (err) {\n return failure(c, err, 'execute');\n }\n });\n\n router.post('/:sessionId/stop', async (c) => {\n try {\n if (pool.hasSession(c.req.param('sessionId'))) {\n const session = pool.session(c.req.param('sessionId'));\n const outcome = await session.execute({ command: 'stop_run' }, { kind: 'user' });\n // A refused stop is no failure while nothing can start: \"stopped\" is still true (ADR-0029).\n if (!outcome.ok && (session.isExecuting || session.startsPending)) throw new TaskControlError(outcome.message);\n return c.json({ status: 'stopped', message: outcome.message } satisfies StopResponse);\n }\n return c.json({ status: 'stopped' } satisfies StopResponse);\n } catch (err) {\n return failure(c, err, 'stop');\n }\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 } satisfies CancelPlanningResponse);\n });\n\n // Every execution button that is no more than \"this command, as the user\"\n // (ADR-0029, ADR-0006): the body is an ExecutionCommand, the answer is the\n // seam's own line and payload, and a refusal is the one 400 every route gives.\n // The routes beside it stay because they answer more than the seam does: a\n // `no_plan` code, the 409 for a checkpoint nobody waits at, the Merge all card.\n router.post('/:sessionId/execute-command', async (c) => {\n try {\n const parsed = parseExecutionCommand(await jsonObject(c));\n if (!parsed.ok) return refuse(c, 400, parsed.message, 'refused');\n const outcome = await pool.session(c.req.param('sessionId')).execute(parsed.command, { kind: 'user' });\n if (!outcome.ok) {\n // Not through TaskControlError: a Merge all that git stopped keeps the result it stopped with.\n return c.json({ error: outcome.message, code: 'refused', ...(outcome.payload ? { payload: outcome.payload } : {}) } satisfies ErrorBody, 400);\n }\n return c.json({ ok: true, message: outcome.message, ...(outcome.payload ? { payload: outcome.payload } : {}) } satisfies ExecuteCommandResponse);\n } catch (err) {\n return failure(c, err, 'execute-command');\n }\n });\n\n // The task runner's own slash command (#66): carried to the runner, never\n // one of Ordewell's. A task that cannot take one is refused with the reason.\n router.post('/:sessionId/tasks/:taskId/commands', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const fields = typeof body === 'object' && body !== null ? body as { name?: unknown; args?: unknown } : {};\n if (typeof fields.name !== 'string' || !fields.name.trim()) return c.json({ error: 'name is required' }, 400);\n const args = typeof fields.args === 'string' ? fields.args : '';\n const id = pool.session(c.req.param('sessionId')).invokeTaskCommand(c.req.param('taskId'), fields.name.trim(), args);\n return c.json({ id } satisfies TaskMessageResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\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 // The seam refuses a checkpoint nobody waits at too; this route keeps that\n // case apart as its own 409 and code.\n for (const answer of ['approve', 'reject'] as const) {\n router.post(`/:sessionId/tasks/:taskId/checkpoint/${answer}`, async (c) => {\n try {\n const body: unknown = answer === 'reject' ? 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 = idOfRef(session, c.req.param('taskId'));\n // Resolved once: the pre-check and the seam judge the same task, the\n // user's unique id prefix included (ADR-0029).\n if (!session.awaitsCheckpoint(taskId)) return refuse(c, 409, NO_CHECKPOINT, 'checkpoint_not_waiting');\n const { message } = await runUserCommand(session, { command: 'answer_checkpoint', task: taskId, answer, ...(reason ? { reason } : {}) });\n return c.json({ ok: true, message } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\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 // Named as the seam names a task, so a surface asks about the reference the user typed.\n const mergeGate = session.mergeGate(idOfRef(session, 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 } satisfies MergeGateResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\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() } satisfies IsolationDiffResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.post('/:sessionId/isolation/merge', async (c) => {\n try {\n // A merge git stopped is still an outcome the Merge all card shows: the seam refuses it, with the result.\n const outcome = await pool.session(c.req.param('sessionId')).execute({ command: 'merge_all' }, { kind: 'user' });\n if (outcome.payload?.kind === 'merge') return c.json(outcome.payload.result satisfies IsolationMergeResponse);\n if (!outcome.ok) throw new TaskControlError(outcome.message);\n throw new Error('Merge all answered without its result.');\n } catch (err) {\n return failure(c, err, 'task edit');\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 } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\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: plan && surfacePlan(plan) } satisfies ResolveConflictResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.put('/:sessionId/tasks/:taskId', async (c) => {\n try {\n const changes = await jsonObject<Partial<Task>>(c);\n // JSON cannot carry undefined, so a null is a client clearing the model.\n if (changes.assignedModel === null) changes.assignedModel = undefined;\n // One edit, whatever it holds: the session takes the fields a direct\n // edit may set, moves the runner with what it scopes, checks the\n // dependency list against the whole plan, and lands it as one save. An\n // empty patch still asks whether the task exists at all.\n const result = await pool.session(c.req.param('sessionId')).updateTask(c.req.param('taskId'), changes);\n if (!result) return refuse(c, 404, 'Task not found', 'task_not_found');\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\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 refuse(c, 404, 'Task not found', 'task_not_found');\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.post('/:sessionId/tasks', async (c) => {\n try {\n const body = await jsonObject<Partial<Task>>(c);\n const result = await pool.session(c.req.param('sessionId')).addTask(body);\n if (!result) return refuse(c, 404, 'Session not found', 'session_not_found');\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.post('/:sessionId/review/approve', async (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n const plan = session.planState;\n if (!plan) throw new NoPlanError('review');\n const { message } = await runUserCommand(session, { command: 'approve_review' });\n return c.json({ plan: surfacePlan(plan), message } satisfies ApproveReviewResponse);\n } catch (err) {\n return failure(c, err, 'review approve');\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 jsonObject<{\n goal?: string; runners?: string[]; workspace?: string; model?: string; allowInit?: boolean;\n }>(c);\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n // As in generate: none requested is read by the session, after its gate.\n const runnerList: string[] | undefined = Array.isArray(runners) ? runners : (runners ? [runners] : undefined);\n const plan = await pool.startPlanning(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'converse start', { message: 'Planning failed' });\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 jsonObject<{ message?: string }>(c);\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: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'conversation message');\n }\n });\n\n // Send now (ADR-0023): stops the planner turn in flight — never the run's\n // tasks — and answers this message in the turn that replaces it, ahead of\n // anything waiting. With no turn in flight it is the plain send above.\n router.post('/:sessionId/converse/message/now', async (c) => {\n try {\n const { message } = await jsonObject<{ message?: string }>(c);\n if (!message) return c.json({ error: 'message is required' }, 400);\n const plan = await pool.forceSendPrompt(c.req.param('sessionId'), message);\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'conversation message');\n }\n });\n\n // What waits on the planner's usage limit then goes with the user's next\n // message instead of at the reset; `cancelled` is false when nothing waited.\n router.post('/:sessionId/converse/resend/cancel', (c) => {\n try {\n const cancelled = pool.session(c.req.param('sessionId')).cancelPlannerResend();\n return c.json({ cancelled } satisfies CancelResumeResponse);\n } catch (err) {\n return failure(c, err, 'cancel resend', { fallback: 404, message: 'Not found' });\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 const fork = pool.forkConversation(c.req.param('sessionId'));\n return c.json({ ...fork, plan: surfacePlan(fork.plan) } satisfies ConversationForkResponse);\n } catch (err) {\n return failure(c, err, 'conversation edit');\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() } satisfies RewindTargetsResponse);\n } catch (err) {\n return failure(c, err, 'conversation edit');\n }\n });\n\n router.post('/:sessionId/conversation/rewind', async (c) => {\n try {\n const { index } = await jsonObject<{ index?: number }>(c);\n if (typeof index !== 'number' || !Number.isInteger(index) || index < 0) return c.json({ error: 'index must be a non-negative integer' }, 400);\n const rewound = pool.rewindConversation(c.req.param('sessionId'), index);\n return c.json({ ...rewound, plan: surfacePlan(rewound.plan) } satisfies ConversationRewindResponse);\n } catch (err) {\n return failure(c, err, 'conversation edit');\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 const compacted = await pool.compactConversation(c.req.param('sessionId'));\n return c.json({ ...compacted, plan: surfacePlan(compacted.plan) } satisfies ConversationCompactResponse);\n } catch (err) {\n return failure(c, err, 'conversation edit');\n }\n });\n\n // Retry compaction of a planner paused on its context (ADR-0002): the\n // paused turn opens again on the inputs it kept, and this answers once it\n // has landed — or paused again, which the plan's pause says. A stop of the\n // planner ends it, as it ends any turn.\n router.post('/:sessionId/conversation/compact/retry', async (c) => {\n try {\n const plan = await pool.retryPlannerCompaction(c.req.param('sessionId'));\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'retry compaction');\n }\n });\n\n router.get('/:sessionId/prd', (c) => {\n const plan = pool.getPlan(c.req.param('sessionId'));\n if (!plan?.prdMarkdown) return refuse(c, 404, 'No PRD found');\n return c.json({ prdMarkdown: plan.prdMarkdown } satisfies PrdResponse);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { installedPlannerDetected, type OkResponse, type RunnersResponse } from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\nimport { failure, jsonObject, refuse } from './errors';\n\nexport function runnersRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n // getInstalledRunners re-probes the host first, so the state read after it\n // reflects the fresh answer rather than the stale default. A workspace's\n // own `.envrc` can choose the account, so the probe is asked about the one\n // that will plan rather than the daemon's cwd.\n const runners = await pool.getInstalledRunners(c.req.query('workspace'));\n const state = pool.getRunnerState();\n return c.json({\n runners,\n orchestratorModel: state.orchestratorModel,\n } satisfies RunnersResponse);\n });\n\n router.put('/:id', async (c) => {\n try {\n // A toggle saves the enabled set it changes; built on the stale default,\n // it would save claude-code over the installed agents the probe finds.\n await installedPlannerDetected();\n const id = c.req.param('id');\n const { enabled } = await jsonObject<{ enabled?: unknown }>(c);\n // A missing value is not `false`: before this, `{}` disabled the runner\n // while answering 200.\n if (typeof enabled !== 'boolean') return refuse(c, 400, 'enabled must be true or false');\n pool.setRunnerEnabled(id, enabled);\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'runner toggle', { fallback: 400 });\n }\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { ModelsResponse } from '@ordewell/core';\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: ModelsResponse = await pool.getProviderModels();\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { assertWorkspaceExists, type IsolationPreviewResponse, type WorkspacesResponse } from '@ordewell/core';\nimport { OrchestratorPool, scanWorkspaces } from '../pool/orchestratorPool';\nimport { failure } from './errors';\n\nexport function workspacesRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n // A read-only sibling of the list: it names the repositories behind one\n // workspace, while `/` keeps listing the workspaces sessions are saved under.\n router.get('/isolation-preview', async (c) => {\n try {\n const workspace = c.req.query('workspace') || process.cwd();\n assertWorkspaceExists(workspace);\n const preview = await pool.previewIsolation(workspace);\n return c.json({ preview } satisfies IsolationPreviewResponse);\n } catch (err) {\n return failure(c, err, 'read isolation preview', { message: 'Could not read the repositories' });\n }\n });\n\n router.get('/', (c) => {\n const workspaces = scanWorkspaces();\n return c.json({ workspaces } satisfies WorkspacesResponse);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { isGranted, toApprovalDecision, type ApprovalAnswer, type ApprovalAnswerResponse, type ApprovalsResponse } from '@ordewell/core';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\nimport { refuse } from './errors';\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 refuse(c, 404, `Unknown session: ${sessionId}`, 'session_not_found');\n\n return c.json({\n pending: pool.outstandingApprovals(sessionId),\n approvedScopes: pool.approvedScopes(sessionId),\n } satisfies ApprovalsResponse);\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 refuse(c, 404, `Unknown session: ${sessionId}`, 'session_not_found');\n\n const answer = answerOf(await c.req.json().catch(() => null));\n const decided = toApprovalDecision(answer);\n // A runner request goes through the command seam as the user's answer, so\n // their action is kept in the timeline (ADR-0029). The planner's own\n // prompt is no execution action and is answered directly.\n const request = pool.outstandingApprovals(sessionId).find((pending) => pending.id === approvalId)?.request;\n if (request?.taskId) {\n const outcome = await pool.session(sessionId).execute(\n { command: 'answer_approval', task: request.taskId, approval: approvalId, answer: decided.decision, ...(decided.decision === 'deny' && decided.note ? { note: decided.note } : {}) },\n { kind: 'user' },\n );\n if (!outcome.ok) return refuse(c, 400, outcome.message, 'refused');\n } else if (!pool.resolveApproval(sessionId, approvalId, answer)) {\n return refuse(c, 409, 'Approval is no longer outstanding: it timed out or was already answered.', 'approval_not_outstanding');\n }\n return c.json({ ok: true, granted: isGranted(decided), decision: decided.decision } satisfies ApprovalAnswerResponse);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { RunSettingsError, installedPlannerDetected, type GlobalRunSettings, type SettingsResponse, type SettingsUpdateResponse } from '@ordewell/core';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\nimport { failure, jsonObject, refuse } from './errors';\n\nexport function settingsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n // Both wait for the startup probe (ADR-0009): the TUI reads the planner from\n // here the moment it opens, and a /planner switch is judged against the\n // planner in effect, which the probe may be about to change.\n router.get('/', async (c) => {\n await installedPlannerDetected();\n // An open session answers with its own run settings; no id or an id it no\n // longer holds answers with the file's, which a new session starts from\n // (ADR-0030).\n const settings: SettingsResponse = pool.getSettings(c.req.query('sessionId') || undefined);\n return c.json(settings);\n });\n\n router.patch('/', async (c) => {\n try {\n await installedPlannerDetected();\n const body = await jsonObject(c);\n if (Object.keys(body).length === 0) {\n return refuse(c, 400, 'At least one setting field is required');\n }\n // Run settings (ADR-0030) are named fields under `run`, never environment\n // variables; `sessionId` is the session the change was made in.\n const { run, sessionId: namedSession, ...rest } = body;\n if (namedSession !== undefined && typeof namedSession !== 'string') return refuse(c, 400, 'sessionId must be a string');\n const sessionId = namedSession || undefined;\n if (run !== undefined) {\n if (!run || typeof run !== 'object' || Array.isArray(run)) return refuse(c, 400, 'run must be an object of run settings');\n try {\n pool.updateRunSettings(run as Partial<GlobalRunSettings>, sessionId);\n } catch (err) {\n if (err instanceof RunSettingsError) return refuse(c, 400, err.message);\n throw err;\n }\n }\n const result: SettingsUpdateResponse = Object.keys(rest).length > 0\n ? (sessionId ? pool.updateSettings(rest, sessionId) : pool.updateSettings(rest))\n : pool.getSettings(sessionId);\n return c.json(result);\n } catch (err) {\n return failure(c, err, 'settings update', { fallback: 400 });\n }\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { CommandDescriptor, CommandsResponse } from '@ordewell/core';\nimport { refuse } from './errors';\n\n// Every command this route ran was a mode toggle, and none is left; the\n// route stays so a client listing commands still gets an answer.\nconst COMMANDS: CommandDescriptor[] = [];\n\nexport function commandsRoute() {\n const router = new Hono();\n\n router.get('/', (c) => {\n return c.json({ commands: COMMANDS } satisfies CommandsResponse);\n });\n\n router.post('/:name', (c) => {\n const name = c.req.param('name');\n return refuse(c, 404, `Unknown command: ${name}`);\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, type RunSnapshotFrame, type SessionFrame } 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 // The stream reports changes only. Taken and subscribed in one turn, so no\n // broadcast can fall between the snapshot and the first message after it.\n const view = pool.runSnapshot(sessionId);\n if (view) {\n ws.send(JSON.stringify({\n type: 'run_snapshot', sessionId, view, approvals: pool.announcedApprovals(sessionId), ...pool.streamPosition(sessionId),\n } satisfies RunSnapshotFrame));\n }\n // A compaction has no turn id to adopt, so a client joining mid-way would\n // not know the planner is busy. Unstamped: the client's fold is idempotent\n // by the compaction's id, and a stamp would let it count this as the\n // broadcast it already holds.\n const compaction = pool.plannerCompaction(sessionId);\n if (compaction) ws.send(JSON.stringify(compaction satisfies SessionFrame));\n // Subscribing also greets with host-owned account limits, independently\n // of the run snapshot above, even when the host knows none yet.\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';\nimport type { ServerInfoResponse } from '@ordewell/core';\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 // `ordewell stop --server` verifies a PID file against the process that\n // actually owns the port before signalling anything, so a stale file cannot\n // terminate an unrelated process. Behind admission like every other route.\n app.get('/api/server', (c) => c.json({ pid: process.pid, port: admission.port } satisfies ServerInfoResponse));\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());\n app.route('/api/workspaces', workspacesRoute(pool));\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';\nimport { decideAdmission, type AdmissionContext } from './security/admission';\n\n/**\n * How much of a request body the daemon will hold in memory. Plans, task edits\n * and conversation messages are small; a body past this is not one of ours.\n * Without a cap, the admission check below could never run before a browser's\n * multi-gigabyte `text/plain` POST was already buffered.\n */\nexport const MAX_BODY_BYTES = 10 * 1024 * 1024;\n\nclass BodyTooLargeError extends Error {}\n\n/** A body over the cap, or a request the admission check refused, answered and closed. */\nfunction refuse(req: IncomingMessage, res: ServerResponse, status: number, message: string): void {\n const payload = JSON.stringify({ error: message });\n res.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(payload),\n // Nothing more is read from this request, so its connection cannot be reused.\n Connection: 'close',\n });\n res.end(payload, () => req.destroy());\n}\n\n/**\n * Read at most `max` bytes, leaving the stream paused once it is over. The\n * caller answers 413 and destroys the request; draining it instead would let a\n * browser keep the daemon busy for as long as it liked.\n */\nfunction readBody(req: IncomingMessage, max: number): Promise<string | undefined> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n const cleanup = () => {\n req.off('data', onData);\n req.off('end', onEnd);\n req.off('error', onError);\n };\n const onData = (chunk: Buffer) => {\n size += chunk.length;\n if (size > max) {\n cleanup();\n req.pause();\n reject(new BodyTooLargeError());\n return;\n }\n chunks.push(chunk);\n };\n const onEnd = () => {\n cleanup();\n resolve(chunks.length > 0 ? Buffer.concat(chunks).toString() : undefined);\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n req.on('data', onData);\n req.on('end', onEnd);\n req.on('error', onError);\n });\n}\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 *\n * Admission runs here as well as in the Hono middleware, and first: the\n * middleware only sees the request after the body has been read, which is too\n * late to keep a browser from making the daemon buffer it.\n */\nexport function createRequestListener(app: Hono, admission: AdmissionContext, maxBodyBytes = MAX_BODY_BYTES) {\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const decision = decideAdmission({\n origin: req.headers.origin ?? null,\n host: req.headers.host ?? null,\n authorization: req.headers.authorization ?? null,\n }, admission);\n if (!decision.admit) {\n refuse(req, res, decision.status, decision.reason);\n return;\n }\n\n const declared = Number(req.headers['content-length']);\n if (Number.isFinite(declared) && declared > maxBodyBytes) {\n refuse(req, res, 413, `Request body must be at most ${maxBodyBytes} bytes.`);\n return;\n }\n\n let body: string | undefined;\n try {\n body = await readBody(req, maxBodyBytes);\n } catch (err) {\n if (err instanceof BodyTooLargeError) {\n refuse(req, res, 413, `Request body must be at most ${maxBodyBytes} bytes.`);\n return;\n }\n throw err;\n }\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 { mkdirSync, unlinkSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { clearDaemonToken, mintDaemonToken, processLeaseHost, StructuredRunner } from '@ordewell/core';\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// Written by the daemon itself only once it is listening, and removed on\n// shutdown, so `ordewell stop --server` never reads an entry belonging to a\n// process that failed to bind or a daemon that is already gone.\nconst pidFileIdx = args.indexOf('--pid-file');\nconst pidFile = pidFileIdx !== -1 ? args[pidFileIdx + 1] : undefined;\nlet ownsPidFile = false;\n\n// What another host's refusal names this one as (ADR-0049). Only a TUI starts\n// a daemon it watches, as its private one.\nprocessLeaseHost().describe({ kind: 'daemon', port, ...(watchParentPid ? { ownerPid: watchParentPid } : {}) });\n\n// Tasks run on the structured transport (ADR-0018) as plain child processes,\n// so one runner serves every plan whatever the host has.\nconst pool = new OrchestratorPool({ runner: new StructuredRunner() });\n// Before listening, so the first request already finds the probe in flight\n// and waits on it rather than reading the openrouter fallback (ADR-0009).\nvoid pool.detectInstalledPlanner();\nconst server = createServer();\nlet ownsToken = false;\n\nserver.listen(port, '127.0.0.1', () => {\n // A losing startup must not replace the listening daemon's credential.\n // This callback installs admission before the event loop can serve a request.\n const { token, file: tokenFile } = mintDaemonToken(port);\n ownsToken = true;\n if (pidFile) {\n mkdirSync(dirname(pidFile), { recursive: true });\n writeFileSync(pidFile, String(process.pid), { mode: 0o600 });\n ownsPidFile = true;\n }\n const admission = { port, token, tokenFile };\n const app = createApp(pool, admission);\n app.get('/', (c) => c.json({ message: 'Ordewell API', docs: '/api/workspaces' }));\n server.on('request', createRequestListener(app, admission));\n attachWsHandler(server, pool, admission);\n pool.getProviderModels().catch((err) => {\n console.error(`[web] model discovery warmup failed: ${err?.message ?? err}`);\n });\n console.error(`[web] Ordewell API server: http://localhost:${port}`);\n});\n\nfunction shutdown(): void {\n if (ownsToken) clearDaemonToken(port);\n if (ownsPidFile && pidFile) {\n try { unlinkSync(pidFile); } catch { /* already gone */ }\n }\n pool.destroyAll();\n server.close();\n process.exit(0);\n}\n\n// A stray rejection in one session's background work must not take every\n// session's runners down with the daemon.\nprocess.on('unhandledRejection', (reason) => {\n console.error(`[web] unhandled rejection: ${reason instanceof Error ? reason.stack ?? reason.message : String(reason)}`);\n});\n\n// A daemon this CLI owns shares its foreground process group. Ctrl-C while a\n// login child holds the terminal is a SIGINT to that whole group, and the TUI\n// ignores it so the child alone is cancelled; shutting down here would take\n// every in-memory session with it. The owner stops us with SIGTERM, and the\n// parent watch below still catches an owner that dies.\nprocess.on('SIGINT', () => { if (!watchParentPid) 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/pool/orchestratorPool.ts","../../server/routes/errors.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","isApiProvider","normalizeGeminiModel","defaultEnabledRunners","DEFAULT_RUNNERS","fs","path","args","resolve","execFile","BaseFileSystem","researchToolsPath","withPath","GREP_PCRE_PROBE_ARGS","grepRegexFromProbe","result","buildGlobArgs","capped","applyHeadLimit","formatSearchOutput","SEARCH_EXCLUSIONS","path2","buildGrepArgs","buildFallbackGrepArgs","filterFallbackByAnchoredInclude","listTree","STOPPED_TOOL_RESULT","randomUUID","RunnerRegistry","SettingsService","PlannerModelMemory","removedPluginNotice","StructuredRunner","RunnerInstallation","workspaceEnvOf","ModelResolver","CodexSandboxAvailability","nodeSpawn","createIsolationPreview","server","claudeAccountLimitCollector","codexAccountLimitCollector","openCodeGoAccountLimitCollector","detectInstalledPlanner","assertWorkspaceExists","PlannerNotReadyError","PlannerTurnStoppedError","PlannerTurnDiscardedError","AccountLimitMonitor","flattenTasks","task","assignedRunnerOf","sessionRuntimeSettings","assertWorkspaceIsProject","WorkspaceNotAProjectError","ensureStateDirIgnored","createSession","runnerForProvider","selectPlanner","PROVIDER_CREDENTIAL_ENV","configuredProviders","runnerModesFrom","migratePlanState","recordedRunnerAuth","installedPlannerAnswered","loadSession","SessionNotFoundError","scanWorkspaces","listSessions","deleteSession","admitSettingsEnv","SessionHeldError","NoPlanError","AlreadyExecutingError","WorkspaceNotFoundError","ConversationBusyError","ConversationEditError","PlanEditError","TaskControlError","pool","Hono","loadSessionPlanState","run","surfacePlanState","surfacePlan","listTaskLogAttempts","taskLogForSurface","readTaskLog","resolveUserTaskRef","parseExecutionCommand","installedPlannerDetected","toApprovalDecision","isGranted","RunSettingsError","WebSocketServer","DAEMON_SUBPROTOCOL","tokensMatch","extractPresentedToken","port","refuse","processLeaseHost","createServer","mintDaemonToken","mkdirSync","dirname","writeFileSync","unlinkSync"],"mappings":"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","file":"main.js","sourcesContent":["import { type PlannerBackendId, BaseConfig, DEFAULT_RUNNERS, defaultEnabledRunners, isApiProvider, normalizeGeminiModel } from '@ordewell/core';\nimport type { ConfiguredPlanner, ProviderModelLists, ResolvedPlanner } from '@ordewell/core';\n\nexport interface PlannerPick {\n model: string;\n provider: PlannerBackendId;\n}\n\ninterface WebConfigOpts {\n enabledRunners?: string[];\n /**\n * The lists that route a model id to its vendor. A function is read on every\n * resolution, so a long-lived config (a session's) never routes on lists its\n * owner has since dropped for a removed key.\n */\n providerModelLists?: ProviderModelLists | (() => ProviderModelLists | undefined);\n modelOverride?: string;\n /** The model a settings write picked in this daemon and the planner it was for, read live; absent when none has. */\n pickedModel?: () => PlannerPick | undefined;\n /** The model ids a coding agent's discovery last listed, read live; empty while it is cold. */\n agentCatalog?: (provider: PlannerBackendId) => readonly string[];\n}\n\nexport class WebConfig extends BaseConfig {\n private _enabledRunnersOverride: string[] | undefined;\n private _providerModelLists: () => ProviderModelLists | undefined;\n private _modelOverride: string | undefined;\n private _pickedModel: () => PlannerPick | undefined;\n private _agentCatalog: (provider: PlannerBackendId) => readonly string[];\n\n constructor(opts?: WebConfigOpts) {\n super();\n this._enabledRunnersOverride = opts?.enabledRunners;\n const lists = opts?.providerModelLists;\n this._providerModelLists = typeof lists === 'function' ? lists : () => lists;\n this._modelOverride = opts?.modelOverride;\n this._pickedModel = opts?.pickedModel ?? (() => undefined);\n this._agentCatalog = opts?.agentCatalog ?? (() => []);\n }\n\n protected agentCatalog(provider: PlannerBackendId): readonly string[] {\n return this._agentCatalog(provider);\n }\n\n setProviderModelLists(lists: ProviderModelLists): void {\n this._providerModelLists = () => lists;\n }\n\n /**\n * Read live, not fixed at construction: a session's WebConfig lives for the\n * whole session while /planner and /key (or the headless `ordewell model`)\n * mutate process.env under it. `routedProvider` keeps that cheap.\n */\n get planner(): ResolvedPlanner {\n return this.resolvePlanner({ ...this.configuredPlanner(), override: this._modelOverride }, this._providerModelLists());\n }\n\n /**\n * What the daemon inherited at startup, or what a settings write has set\n * since; the model counts as picked only while it is the one a write picked.\n */\n private configuredPlanner(): ConfiguredPlanner {\n const model = process.env.ORCHESTRATOR_MODEL || '';\n const pick = this._pickedModel();\n return { model, effort: process.env.ORDEWELL_PLANNER_EFFORT || '', pickedFor: pick?.model === model ? pick.provider : undefined };\n }\n\n get orchestratorModel(): string {\n return this.planner.model;\n }\n\n get aiProvider(): PlannerBackendId {\n return this.planner.provider;\n }\n\n get plannerThinkingEffort(): string | undefined {\n return this.planner.effort || undefined;\n }\n\n get apiKey(): string {\n const provider = this.aiProvider;\n return isApiProvider(provider) ? this.getProviderApiKey(provider) : '';\n }\n\n get planningModel(): string {\n const model = this.plannerChoiceFor(this.aiProvider, this.configuredPlanner()).model;\n return this.aiProvider === 'google' ? normalizeGeminiModel(process.env.GEMINI_MODEL || model) : 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 // The per-runner toggles that predate ORDEWELL_ENABLED_RUNNERS: three fixed\n // variables, named by runner id on purpose; a newer runner is enabled\n // through the list above. Only a toggle that is set is a choice: with none,\n // claude-code's default-on toggle would hide a Codex- or OpenCode-only host.\n const toggles = ['ORDEWELL_CLAUDE_CODE_ENABLED', 'ORDEWELL_CODEX_ENABLED', 'ORDEWELL_OPENCODE_ENABLED'];\n if (toggles.every((name) => process.env[name] === undefined)) return defaultEnabledRunners();\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 : [...DEFAULT_RUNNERS];\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 /** The child was killed at the call's time limit, rather than exiting on its own. */\n timedOut: boolean;\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/** How long a sealed run's output may trail its exit. */\nconst SEALED_OUTPUT_GRACE_MS = 1_000;\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; sealed?: boolean },\n): Promise<ExecResult> {\n return new Promise((resolve) => {\n try {\n const child = 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 // A sealed run's wall-time limit is a kill, not a request it may trap\n // (ADR-0036 S1); the sandbox takes the processes it started down with it.\n ...(opts.sealed ? { killSignal: 'SIGKILL' as const } : {}),\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 // Only Node's own timeout sets `killed`; an abort and a stdout overflow do not, so this names the limit exactly.\n resolve({ stdout: stdout ?? '', stderr: stderr ?? '', code, timedOut: err?.killed === true });\n });\n // A process that left a sealed run's process group can hold its output\n // open after the run has ended: the result is what arrived by then.\n if (opts.sealed) child.once('exit', () => setTimeout(() => { child.stdout?.destroy(); child.stderr?.destroy(); }, SEALED_OUTPUT_GRACE_MS).unref());\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, timedOut: false });\n }\n });\n}","import {\n BaseFileSystem,\n buildGrepArgs,\n buildGlobArgs,\n buildFallbackGrepArgs,\n GREP_PCRE_PROBE_ARGS,\n grepRegexFromProbe,\n listTree,\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 ShellLaunch,\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 { root, anchor } = await this.searchTarget(absRoot);\n const result = await run('rg', buildGlobArgs(pattern, root), { 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 { root: findRoot } = await this.searchTarget(absRoot);\n const result = await run('find', [findRoot, '-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, findRoot, { emptyMessage: 'No files matched.' }),\n truncated: capped.truncated,\n };\n }\n\n /**\n * The search path and a directory to anchor it in. `cwd` exists only so\n * anchored `--glob`/`--include` patterns resolve against the search root, and\n * 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 * The root is resolved through symlinks because the OS reports a child's cwd\n * as the resolved path (macOS tmpdir is `/var/...` -> `/private/var/...`),\n * and ripgrep matches an anchored glob against the search path as written: a\n * root that goes through a link never matches and yields a false empty\n * result. Result rows then carry the resolved prefix, which is why callers\n * strip `anchor` rather than the path they were handed.\n */\n private async searchTarget(absRoot: string): Promise<{ root: string; anchor: string }> {\n try {\n const root = await fs.realpath(absRoot);\n return { root, anchor: (await fs.stat(root)).isDirectory() ? root : path.dirname(root) };\n } catch {\n return { root: absRoot, anchor: 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 { root, anchor } = await this.searchTarget(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, root).args, { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() })\n : await run('grep', buildFallbackGrepArgs(pattern, anchoredInclude ? { ...opts, include: undefined } : opts, root, 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 try {\n return await listTree(absPath, depth, async (abs) =>\n (await fs.readdir(abs, { withFileTypes: true })).map((e) => ({ name: e.name, directory: e.isDirectory() })));\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, shell: ShellLaunch, signal: AbortSignal | undefined, cwd: string): 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 where no sandbox\n // runs. A resolved file is the sandbox launcher around the POSIX shell, or\n // the POSIX shell found on a Windows box: either way the command goes last,\n // in the dialect `BaseFileSystem` classified it under.\n const { file, args, env, wallTimeMs } = shell;\n const result = file === null\n ? await run(command, [], { cwd, timeout: BASH_TIMEOUT_MS, shell: true, env, signal })\n : await run(file, [...args, command], { cwd, timeout: wallTimeMs ?? BASH_TIMEOUT_MS, env, signal, sealed: wallTimeMs !== undefined });\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, ...(result.timedOut ? { timedOut: true } : {}) };\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 type { IRunner, IRunnerSession, RunnerSpawnOptions } from '@ordewell/core';\nimport type { SessionBroadcaster } from '@ordewell/core';\n\nexport class PoolAwareRunner implements IRunner {\n /**\n * Sessions this plan spawned. The inner runner is shared by every plan in\n * the pool, so \"stop everything\" and \"how many are running\" must be\n * answered from this set, never delegated — delegating would let one plan's\n * /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 private inner: IRunner,\n ) {}\n\n get activeCount(): number { return this.owned.size; }\n\n async spawn(opts: RunnerSpawnOptions): Promise<IRunnerSession> {\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): Promise<void> {\n this.owned.delete(sessionId);\n return this.inner.stop(sessionId);\n }\n\n stopAll(): void {\n for (const id of this.owned) void this.inner.stop(id);\n this.owned.clear();\n }\n}\n","import { spawn as nodeSpawn } from 'child_process';\nimport { randomUUID } from 'crypto';\nimport { resolve } from 'path';\nimport { WebSocket } from 'ws';\nimport {\n AccountLimitMonitor,\n claudeAccountLimitCollector,\n codexAccountLimitCollector,\n openCodeGoAccountLimitCollector,\n assignedRunnerOf,\n flattenTasks,\n type AccountLimitCollector,\n type AccountLimitsFrame,\n Session,\n createSession,\n type ConversationCompaction,\n type ConversationFork,\n type RunView,\n type SessionMessage,\n type SessionNotice,\n type SessionRuntimeSettings,\n type SessionFrame,\n type ApprovalRequestMessage,\n type StreamStamp,\n ModelResolver,\n RunnerRegistry,\n removedPluginNotice,\n RunnerInstallation,\n listSessions,\n loadSession,\n deleteSession,\n SettingsService,\n sessionRuntimeSettings,\n type GlobalRunSettings,\n type PlanState,\n type LegacyPlanState,\n migratePlanState,\n type RunnerId,\n type DiscoveredModel,\n type ModelsResponse,\n type RunnersResponse,\n type SettingsResponse,\n type SettingsUpdateResponse,\n SessionNotFoundError,\n runnerModesFrom,\n configuredProviders,\n assertWorkspaceExists,\n assertWorkspaceIsProject,\n WorkspaceNotAProjectError,\n ensureStateDirIgnored,\n runnerForProvider,\n PlannerModelMemory,\n selectPlanner,\n admitSettingsEnv,\n PROVIDER_CREDENTIAL_ENV,\n type PlannerBackendId,\n type PlannerModelCandidate,\n type PlannerSelectionChange,\n type PlannerSelectionCurrent,\n StructuredRunner,\n CodexSandboxAvailability,\n detectInstalledPlanner,\n installedPlannerAnswered,\n PlannerNotReadyError,\n PlannerTurnDiscardedError,\n PlannerTurnStoppedError,\n type LeaseHost,\n workspaceEnvOf,\n recordedRunnerAuth,\n createIsolationPreview,\n type IIsolationPreview,\n type IsolationPreview,\n} from '@ordewell/core';\nimport { WebConfig, type PlannerPick } from '../adapters/WebConfig';\nimport { scanWorkspaces as scanWorkspacesImpl } from '../utils/workspaceScanner';\nimport { PoolFileSystem } from '../adapters/PoolFileSystem';\nimport { PoolAwareRunner } from '../adapters/PoolAwareRunner';\nimport type { ApprovalAnswer, RunnerRegistry as CoreRunnerRegistry, IRunner } 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\n/**\n * The installation checks a host supplies the pool. `refresh` is optional so a\n * test may hand in only the two probes; the real `RunnerInstallation` always\n * has it, and a refresh then re-probes a CLI installed since the last look.\n */\ntype RunnerInstall = Pick<RunnerInstallation, 'filterInstalled' | 'plannerUsability'> & Partial<Pick<RunnerInstallation, 'refresh'>>;\n\nexport interface OrchestratorPoolDeps {\n /** Inject acquisition boundaries without reading real accounts in host lifecycle tests. */\n accountLimitCollectors?: (workspace: string) => readonly AccountLimitCollector[];\n /**\n * Where every plan's tasks run (ADR-0018), shared across sessions behind\n * each plan's `PoolAwareRunner`. Defaulted to a real one; tests inject a fake.\n */\n runner?: IRunner;\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 /** Overrides the pool's Codex sandbox probe; tests inject one so no real `codex` is started. */\n codexSandbox?: Pick<CodexSandboxAvailability, 'ensure' | 'refresh'>;\n /** Overrides the pool's installation checks; tests inject one so no real agent binary is asked. */\n runnerInstallation?: RunnerInstall;\n /**\n * The host whose leases the pool's sessions hold (ADR-0049); this process's\n * unless a test runs two pools as two hosts.\n */\n leaseHost?: LeaseHost;\n /**\n * The read-only repository look a surface shows before any run. Defaulted to\n * one built from the daemon's config; tests inject a fake so no real git runs.\n */\n isolationPreview?: IIsolationPreview;\n}\n\nexport class OrchestratorPool {\n // A daemon serves several workspaces; login selection must never follow\n // whichever session was opened most recently (ADR-0051).\n private readonly sessionWorkspaces = new Map<string, string>();\n private readonly accountLimits = new Map<string, AccountLimitMonitor>();\n private readonly accountLimitCollectors: (workspace: string) => readonly AccountLimitCollector[];\n private limitsRevision = 0;\n private sessions = new Map<string, Session>();\n private clients = new Map<string, Set<WebSocket>>();\n /**\n * This process's broadcast numbering (see `StreamStamp`), per session id\n * rather than per Session object: a session replaced under the same id\n * keeps counting up, so a client never mistakes its first broadcast for one\n * of the old session's it already showed.\n */\n private readonly stream = randomUUID();\n private sequence = new Map<string, number>();\n private registry: CoreRunnerRegistry = new RunnerRegistry();\n private modelResolver: ModelResolver;\n /** A host that supplied its own resolver answers for every workspace, as a supplied probe does. */\n private suppliedModelResolver: boolean;\n private runnerInstallation: RunnerInstall;\n /**\n * A host that supplied its own probe (a test, or a surface that owns one).\n * Everything else asks {@link installationFor}, which keys a real probe by\n * the workspace whose account it is judging (ADR-0016).\n */\n private suppliedRunnerInstallation: RunnerInstall | undefined;\n private workspaceInstallations = new Map<string, RunnerInstall>();\n private cachedProviderLists: Record<string, string[]> | undefined;\n private settingsService = new SettingsService();\n private plannerModelMemory = new PlannerModelMemory(this.settingsService);\n /**\n * The model a settings write picked in this daemon, and the workspace it was\n * picked in. The environment's model is otherwise inherited, and an agent\n * planning only because detection found it does not plan with an inherited\n * model it cannot be shown to run. The pick is that workspace's: another\n * may name another account, whose catalog judges the model afresh.\n */\n private pickedModel: (PlannerPick & { workspace: string }) | undefined;\n /**\n * The last planner write a route made, so each lands after the ones made\n * before it: a switch still waiting for its catalog must not write over a\n * pick made while it waited (ADR-0040).\n */\n private plannerWrites: Promise<unknown> = Promise.resolve();\n private runner: IRunner;\n /** One probe per daemon, asked again whenever the runner list is refreshed (ADR-0033). */\n private codexSandbox: Pick<CodexSandboxAvailability, 'ensure' | 'refresh'>;\n private readonly leaseHost: LeaseHost | undefined;\n private readonly isolationPreview: IIsolationPreview;\n\n constructor(deps: OrchestratorPoolDeps = {}) {\n const pluginNotice = removedPluginNotice();\n if (pluginNotice) console.warn(pluginNotice);\n this.runner = deps.runner ?? new StructuredRunner();\n // The login probe must ask the account the planner will use (ADR-0016).\n // This installation is the daemon's own cwd for detection; a runner list\n // request naming a workspace is judged by that workspace's own probe.\n this.suppliedRunnerInstallation = deps.runnerInstallation;\n this.runnerInstallation = deps.runnerInstallation\n ?? new RunnerInstallation(this.registry, undefined, undefined, {\n env: () => workspaceEnvOf(process.cwd()),\n workspace: () => process.cwd(),\n });\n // Read from the account the runners use, as the login probe above is.\n this.suppliedModelResolver = deps.modelResolver !== undefined;\n this.modelResolver = deps.modelResolver ?? new ModelResolver(this.registry, new WebConfig(), {\n env: async () => ({ ...process.env, ...(await workspaceEnvOf(process.cwd())) }),\n });\n this.codexSandbox = deps.codexSandbox\n ?? new CodexSandboxAvailability(this.registry, { spawn: nodeSpawn, fetch: globalThis.fetch }, { cwd: process.cwd(), env: process.env });\n this.leaseHost = deps.leaseHost;\n // What worktreeIsolation and workspaceRepos mean here, which is the config\n // the sessions plan with: the daemon's own environment, not a guess from\n // the workspace a request happens to name.\n this.isolationPreview = deps.isolationPreview ?? createIsolationPreview({ config: new WebConfig() });\n this.accountLimitCollectors = deps.accountLimitCollectors ?? ((workspace) => {\n const workspaceRoot = () => workspace;\n const isInstalled = (runner: string) => async () => (await this.runnerInstallation.filterInstalled([runner])).includes(runner);\n const server = this.registry.getManifest('codex')?.modelDiscovery.appServer;\n return [\n claudeAccountLimitCollector({ workspaceRoot, isInstalled: isInstalled('claude-code') }),\n codexAccountLimitCollector({ workspaceRoot, isInstalled: isInstalled('codex'), command: server?.command, args: server?.args }),\n openCodeGoAccountLimitCollector({ workspaceRoot, isInstalled: isInstalled('opencode') }),\n ];\n });\n }\n\n /**\n * Not awaited: planning must start at once, and the daemon already warms the\n * probe at startup through the catalog. This only covers a daemon that was\n * asked to plan before that finished.\n */\n private warmCodexSandbox(): void {\n this.codexSandbox.ensure().catch((err) => console.error(`[web] codex sandbox probe failed: ${err instanceof Error ? err.message : err}`));\n }\n\n /**\n * Find the coding agent that plans when the user has chosen no planner and\n * set no vendor key (ADR-0009), for the daemon to start as it starts. Every\n * planner turn waits on it, so a goal typed the instant the TUI opens\n * does not plan with an openrouter key nobody set.\n */\n detectInstalledPlanner(): Promise<PlannerBackendId | null> {\n return detectInstalledPlanner(this.runnerInstallation);\n }\n\n /**\n * A read-only look at the repositories and branches a run would isolate in\n * `workspace`. Free of side effects on purpose: a first screen may ask before\n * any plan or run exists, and asking must not create one.\n */\n previewIsolation(workspace: string): Promise<IsolationPreview> {\n assertWorkspaceExists(workspace);\n return this.isolationPreview.preview(workspace);\n }\n\n /**\n * A new session's first planner turn. It waits for that probe at the\n * session's own planner gate, where a reply sent meanwhile queues behind\n * it, and a Stop or the session closing or being replaced ends the wait.\n */\n private async firstTurn<T>(sessionId: string, session: Session, turn: () => Promise<T>): Promise<T> {\n try {\n return await turn();\n } catch (err) {\n // Judged once the probe answered: a refused session is never left\n // addressable, as when it is judged before it is registered.\n if (err instanceof PlannerNotReadyError && this.sessions.get(sessionId) === session) this.destroy(sessionId);\n // Stopped before it opened, the session holds no conversation for a\n // reply to continue: for the client its goal was discarded.\n if (err instanceof PlannerTurnStoppedError && !session.planState) throw new PlannerTurnDiscardedError();\n throw err;\n }\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 this.connectAccountLimits(sessionId, 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 this.releaseUnusedAccountLimits();\n }\n\n private connectAccountLimits(sessionId: string, ws: WebSocket): void {\n const workspace = this.sessionWorkspaces.get(sessionId);\n if (!workspace) {\n this.sendAccountLimits(sessionId, ws, []);\n return;\n }\n let monitor = this.accountLimits.get(workspace);\n if (!monitor) {\n monitor = new AccountLimitMonitor({ collectors: this.accountLimitCollectors(workspace) });\n this.accountLimits.set(workspace, monitor);\n monitor.subscribe((limits) => {\n for (const [id, clients] of this.clients) {\n if (this.sessionWorkspaces.get(id) !== workspace) continue;\n for (const client of clients) this.sendAccountLimits(id, client, limits);\n }\n });\n }\n this.sendAccountLimits(sessionId, ws, monitor.snapshots());\n monitor.setForeground(true);\n monitor.surfaceConnected();\n }\n\n private sendAccountLimits(sessionId: string, ws: WebSocket, limits: AccountLimitsFrame['limits']): void {\n if (ws.readyState !== ws.OPEN) return;\n ws.send(JSON.stringify({ type: 'account_limits', sessionId, limits, stream: this.stream, revision: ++this.limitsRevision } satisfies AccountLimitsFrame));\n }\n\n private releaseUnusedAccountLimits(): void {\n for (const [workspace, monitor] of this.accountLimits) {\n if ([...this.clients.keys()].some((id) => this.sessionWorkspaces.get(id) === workspace)) continue;\n monitor.dispose();\n this.accountLimits.delete(workspace);\n }\n }\n\n private registerSession(sessionId: string, workspace: string, session: Session): void {\n this.sessions.set(sessionId, session);\n this.sessionWorkspaces.set(sessionId, workspace);\n for (const ws of this.clients.get(sessionId) ?? []) this.connectAccountLimits(sessionId, ws);\n }\n\n private broadcast(sessionId: string, msg: SessionMessage | SessionNotice): void {\n const workspace = this.sessionWorkspaces.get(sessionId);\n const monitor = workspace ? this.accountLimits.get(workspace) : undefined;\n if (msg.type === 'planner_usage') monitor?.invalidate();\n else if (msg.type === 'task_log' && msg.events.some((event) => event.type === 'turn_end')) {\n const task = flattenTasks(this.sessions.get(sessionId)?.planTasks ?? []).find((task) => task.id === msg.taskId);\n const runner = task && assignedRunnerOf(task);\n if (runner) monitor?.invalidate(runner);\n }\n const seq = (this.sequence.get(sessionId) ?? 0) + 1;\n this.sequence.set(sessionId, seq);\n const payload = JSON.stringify({ ...msg, stream: this.stream, seq } satisfies SessionFrame);\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 /** Null for a session this process is not holding: there is no run to describe. */\n runSnapshot(sessionId: string): RunView | null { return this.sessions.get(sessionId)?.runSnapshot() ?? null; }\n /** The planner turn answering in a session this process holds, if one is. */\n plannerTurnId(sessionId: string): string | undefined { return this.sessions.get(sessionId)?.plannerTurnId; }\n /** The planner compaction running in a session this process holds, as its start was announced; it has no turn to name. */\n plannerCompaction(sessionId: string): ReturnType<Session['plannerCompaction']> { return this.sessions.get(sessionId)?.plannerCompaction(); }\n /** The planner's approval requests still waiting, as they were announced. */\n announcedApprovals(sessionId: string): ApprovalRequestMessage[] { return this.sessions.get(sessionId)?.announcedApprovals() ?? []; }\n /** The last broadcast of the session so far: a snapshot taken now accounts for it and everything before. */\n streamPosition(sessionId: string): StreamStamp { return { stream: this.stream, seq: this.sequence.get(sessionId) ?? 0 }; }\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 = this.plannerConfig(modelOverride, workspace);\n const fsAdapter = new PoolFileSystem(workspace);\n const broadcast = (msg: SessionMessage) => this.broadcast(sessionId, msg);\n const runner = new PoolAwareRunner(sessionId, broadcast, this.runner);\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.resolverFor(workspace),\n settings: () => this.runtimeSettings(),\n sessionId,\n ...(this.leaseHost ? { leaseHost: this.leaseHost } : {}),\n });\n }\n\n /**\n * The one way the pool builds a config that answers \"who plans\": sessions,\n * the settings response and the switch judgement all route through it, so\n * what the settings route reports is what the next turn plans with. The\n * lists are handed over as a reader, not a snapshot, so a credential change\n * reaches a session that is already open.\n */\n private plannerConfig(\n modelOverride?: string,\n workspace?: string,\n catalog: (provider: PlannerBackendId) => PlannerModelCandidate[] = (provider) => this.plannerCatalogFor(provider, workspace),\n ): WebConfig {\n return new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n modelOverride,\n providerModelLists: () => this.cachedProviderLists,\n pickedModel: () => (this.pickedModel?.workspace === workspaceKey(workspace) ? this.pickedModel : undefined),\n agentCatalog: (provider) => catalog(provider).map((model) => model.id),\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 // Worked out from the file as it is when written, not from an earlier read.\n this.settingsService.updateEnabledRunners((saved) => {\n const current = saved ?? new WebConfig().enabledRunners;\n return enabled\n ? (current.includes(id) ? current : [...current, id])\n : current.filter((r) => r !== id);\n });\n }\n\n /**\n * What `sessionId`, or a client in `workspace`, plans with: the planner's\n * model is judged against that workspace's runner catalog (see\n * {@link settingsWorkspace}).\n */\n getSettings(sessionId?: string, workspace?: string): SettingsResponse {\n const config = this.plannerConfig(undefined, this.settingsWorkspace(sessionId, workspace));\n const userSettings = this.settingsService.getAll();\n const live = sessionId ? this.sessions.get(sessionId) : undefined;\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 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 // An open session shows what it was opened with; a closed or unknown id\n // falls back to the file, which is what a new session starts from (ADR-0030).\n run: live?.runSettings() ?? this.settingsService.getRunSettings(),\n };\n }\n\n /**\n * Save the user's run settings, and apply them at once to `sessionId`'s run\n * when that session is open here (ADR-0030). Other sessions keep the values\n * they were opened with. Throws a {@link RunSettingsError}, saving nothing,\n * for a value out of range.\n */\n updateRunSettings(changes: Partial<GlobalRunSettings>, sessionId?: string, workspace?: string): SettingsResponse {\n this.settingsService.updateRunSettings(changes);\n if (sessionId) this.sessions.get(sessionId)?.applyRunSettings(changes);\n return this.getSettings(sessionId, workspace);\n }\n\n /**\n * The workspace whose runner catalog a settings read or write is judged\n * against: an open session's own, else the one the client says it is in.\n * Without either the daemon's cwd stands in. One daemon serves several\n * workspaces, and each may name another Claude account in its environment.\n */\n private settingsWorkspace(sessionId: string | undefined, workspace: string | undefined): string | undefined {\n return (sessionId ? this.sessions.get(sessionId)?.workspaceRoot : undefined) ?? workspace;\n }\n\n /**\n * The catalog `selectPlanner` 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; the routes discover it\n * first where it decides the answer ({@link discoverPlannerCatalogs},\n * {@link writeSettings}), and a catalog still cold degrades to an empty one\n * rather than kicking off discovery mid-settings-write.\n */\n private plannerCatalogFor(provider: PlannerBackendId, workspace?: string): PlannerModelCandidate[] {\n return this.resolverFor(workspace).cachedPlannerCatalog(provider);\n }\n\n /**\n * Discover the runner catalog a settings read for `workspace` is judged\n * against, when the read consults one not yet held. Most reads consult\n * none — a vendor planner, a model picked in that workspace, an agent's\n * alias or remembered pick — and answer at once, however slow the runner\n * is to list its models (ADR-0040). Only a configured model whose owner\n * only the catalog can tell waits: a cold one would report the wrong model.\n * Never throws: a catalog that cannot be discovered stays empty.\n */\n async discoverPlannerCatalogs(sessionId: string | undefined, requestWorkspace: string | undefined): Promise<void> {\n const workspace = this.settingsWorkspace(sessionId, requestWorkspace);\n const consulted: PlannerBackendId[] = [];\n void this.plannerConfig(undefined, workspace, (provider) => {\n consulted.push(provider);\n return this.plannerCatalogFor(provider, workspace);\n }).planner;\n await this.discoverUnheld(workspace, consulted);\n }\n\n /**\n * {@link updateSettings} as a route makes it. A write that changes who plans\n * lands after the planner writes made before it and, where its judgement\n * reads a catalog not yet held, waits for that one; every other write — a\n * key, an allowlist, a limit — lands at once (ADR-0040).\n */\n async writeSettings(changes: Record<string, unknown>, sessionId?: string, requestWorkspace?: string): Promise<SettingsUpdateResponse> {\n const change = plannerChangeOf(changes, admittedEnv(changes)?.accepted);\n if (!changesPlanner(change)) return this.updateSettings(changes, sessionId, requestWorkspace);\n const turn = this.plannerWrites.then(async () => {\n // Judged once the writes before it have landed: one may have switched.\n const workspace = this.settingsWorkspace(sessionId, requestWorkspace);\n const judging = this.catalogJudging(change, workspace);\n await this.discoverUnheld(workspace, judging ? [judging] : []);\n return this.updateSettings(changes, sessionId, requestWorkspace);\n });\n this.plannerWrites = turn.catch(() => undefined);\n return turn;\n }\n\n /**\n * The provider whose catalog `selectPlanner` reads to judge `change`: a\n * switch with no model of its own restores the remembered pick only from\n * the incoming catalog, and an agent's effort alone survives only where its\n * model in effect offers it. An explicit model is the user's word whatever\n * the catalog lists, and a cold catalog refuses no effort, so it reads none.\n */\n private catalogJudging(change: PlannerSelectionChange, workspace: string | undefined): PlannerBackendId | undefined {\n const current = this.plannerProviderInEffect(workspace);\n const provider = change.provider ?? current;\n const model = change.model?.trim();\n if (provider !== current) return model ? undefined : provider;\n return model === undefined && change.effort !== undefined && runnerForProvider(provider) ? provider : undefined;\n }\n\n /**\n * Discover the catalogs of `providers` that `workspace`'s resolver does not\n * hold yet; a held one, or a degraded one discovery still remembers,\n * answers at once. Never throws.\n */\n private async discoverUnheld(workspace: string | undefined, providers: PlannerBackendId[]): Promise<void> {\n const resolver = this.resolverFor(workspace);\n await Promise.all([...new Set(providers)].map((provider) => resolver.plannerCatalog(provider)));\n }\n\n /**\n * The provider planning right now. A vendor planner is resolved from its\n * model id, so this is read again after a write rather than carried over.\n */\n private plannerProviderInEffect(workspace: string | undefined): PlannerBackendId {\n return this.plannerConfig(undefined, workspace).aiProvider;\n }\n\n updateSettings(changes: Record<string, unknown>, sessionId?: string, requestWorkspace?: string): SettingsUpdateResponse {\n const workspace = this.settingsWorkspace(sessionId, requestWorkspace);\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. The model and effort\n // too, with where they came from: a detected agent does not plan with a\n // vendor model left in the environment, and judging against it would\n // remember that model as the agent's own pick.\n const current: PlannerSelectionCurrent = this.plannerConfig(undefined, workspace).planner;\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 admission = admittedEnv(changes);\n const envChanges = admission ? admission.accepted : undefined;\n\n const plannerChange = plannerChangeOf(changes, envChanges);\n // Judged against the incoming provider's catalog as already discovered —\n // before the credential refresh below clears the resolver's cache — so\n // the write itself never waits on (async) discovery.\n const selection = changesPlanner(plannerChange)\n ? selectPlanner(current, plannerChange, this.plannerModelMemory, this.plannerCatalogFor(plannerChange.provider ?? current.provider, workspace))\n : undefined;\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, 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 [id, session] of this.sessions) {\n session.reschedule().catch((err) => {\n console.error(`[web] reschedule failed for session ${id}: ${err instanceof Error ? err.message : err}`);\n });\n }\n }\n // A new/changed provider key or base URL must re-probe the catalog, every\n // workspace's included; without this the picker keeps serving the\n // pre-key cache until restart.\n if (touched) {\n this.modelResolver.invalidate();\n this.dropUnkeyedProviderLists();\n }\n }\n\n if (selection) {\n // An effort on its own leaves the configured model as it was: a\n // detected agent's model in effect can be its remembered one, which a\n // key added later must not find written over the configured model.\n if (plannerChange.provider !== undefined || plannerChange.model !== undefined) process.env.ORCHESTRATOR_MODEL = selection.next.model;\n process.env.ORDEWELL_PLANNER_EFFORT = selection.next.effort;\n // Read once the env above is written: the pick is for whoever that\n // routes to, which a switch or the model's own catalog may have changed.\n if (plannerChange.model !== undefined) {\n this.pickedModel = { model: selection.next.model, provider: this.plannerProviderInEffect(workspace), workspace: workspaceKey(workspace) };\n }\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 if (envChanges) for (const monitor of this.accountLimits.values()) monitor.refresh();\n\n if (selection?.remember) {\n const { provider, model, effort } = selection.remember;\n // Without a switch a vendor pick is keyed by the provider its model id\n // resolves to now, which the env written above already reflects.\n const switched = provider !== current.provider;\n this.plannerModelMemory.remember(switched ? provider : this.plannerProviderInEffect(workspace), model, effort);\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: SettingsUpdateResponse = this.getSettings(sessionId, workspace);\n if (rejectedEnvKeys.length > 0) settings.rejectedEnvKeys = rejectedEnvKeys;\n if (selection?.recall) settings.switchRecall = selection.recall;\n return settings;\n }\n\n /**\n * A vendor whose credential is gone keeps no list to route a model to it,\n * or the next turn would be sent to a planner the settings response no\n * longer names. Pruned rather than cleared: the vendors that still hold a\n * key keep routing their models until the catalog is discovered again, so\n * adding a second key does not move the planner off the first.\n */\n private dropUnkeyedProviderLists(): void {\n if (!this.cachedProviderLists) return;\n const keyed = new Set<string>(configuredProviders(new WebConfig()));\n this.cachedProviderLists = Object.fromEntries(\n Object.entries(this.cachedProviderLists).filter(([provider]) => keyed.has(provider)),\n );\n }\n\n setOrchestratorModel(model: string): string {\n process.env.ORCHESTRATOR_MODEL = model;\n return model;\n }\n\n /**\n * The catalog as `workspace`'s runners see it: Claude Code's picker lineup\n * follows the `CLAUDE_CONFIG_DIR` that workspace's environment sets.\n * Without a workspace the daemon's cwd stands in.\n */\n async getProviderModels(workspace?: string): Promise<ModelsResponse> {\n const config = new WebConfig();\n const resolver = this.resolverFor(workspace);\n\n const runnerIds = this.registry.list().map((p) => p.manifest.name);\n const [runnerModels, providerLists] = await Promise.all([\n resolver.modelsForRunners(runnerIds),\n resolver.refresh(),\n this.codexSandbox.ensure(),\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 resolver.pickerOptions();\n const providerErrors = resolver.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 = configuredProviders(config);\n\n return {\n models: allModels,\n modelsByRunner,\n modesByRunner: runnerModesFrom(this.registry, runnerIds),\n orchestratorModel: this.plannerConfig(undefined, workspace).orchestratorModel,\n providers,\n orchestratorModels,\n providerErrors,\n };\n }\n\n getRunnerState(workspace?: string): { enabledRunners: RunnerId[]; orchestratorModel: string } {\n const config = this.plannerConfig(undefined, workspace);\n return { enabledRunners: config.enabledRunners, orchestratorModel: config.orchestratorModel };\n }\n\n /**\n * The resolver whose runner catalogs are discovered under `workspace`'s\n * environment, the one its tasks are launched with. Kept per workspace,\n * since one daemon serves several and a catalog is cached until refreshed;\n * the vendor catalogs are shared by all of them.\n */\n private resolverFor(workspace: string | undefined): ModelResolver {\n if (this.suppliedModelResolver || !workspace) return this.modelResolver;\n const key = workspaceKey(workspace);\n if (key === workspaceKey(undefined)) return this.modelResolver;\n return this.modelResolver.withRunnerEnv(key, async () => ({ ...process.env, ...(await workspaceEnvOf(key)) }));\n }\n\n /**\n * The probe that judges a login for `workspace`, cached so its install and\n * auth verdicts survive between runner-list refreshes. Without a workspace\n * the daemon's cwd is what the request would plan with anyway.\n */\n private installationFor(workspace: string | undefined): RunnerInstall {\n if (this.suppliedRunnerInstallation) return this.suppliedRunnerInstallation;\n if (!workspace) return this.runnerInstallation;\n const key = resolve(workspace);\n let installation = this.workspaceInstallations.get(key);\n if (!installation) {\n installation = new RunnerInstallation(this.registry, undefined, undefined, {\n env: () => workspaceEnvOf(key),\n workspace: () => key,\n });\n this.workspaceInstallations.set(key, installation);\n }\n return installation;\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. `workspace` names whose account the auth verdict\n * is about; without it the daemon's cwd stands in.\n */\n async getInstalledRunners(workspace?: string): Promise<RunnersResponse['runners']> {\n // The runner list is the one place a user who just fixed their host looks\n // again, so every cached answer is asked afresh: the Codex sandbox, the\n // install verdicts, and the agent detection behind the no-choice defaults.\n await this.codexSandbox.refresh();\n const installation = this.installationFor(workspace);\n installation.refresh?.();\n await this.detectInstalledPlanner();\n\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const enabled = new Set(config.enabledRunners);\n const runners = this.registry.list();\n const installedIds = new Set(\n await installation.filterInstalled(runners.map((p) => p.manifest.name)),\n );\n // The auth verdict rides along, never gating the list: a signed-out agent\n // is installed and offered, and a surface flags it. The probe was just\n // asked above and its answer is cached, so this costs no second spawn.\n // Its `usable` does gate: an installed CLI that cannot be spawned (a\n // Windows `.cmd` shim) must not be offered (ADR-0009).\n const rows = await Promise.all(\n runners\n .filter((p) => installedIds.has(p.manifest.name))\n .map(async (p): Promise<RunnersResponse['runners'][number] | null> => {\n const { usable, auth } = await installation.plannerUsability(p.manifest.name);\n if (!usable) return null;\n return {\n id: p.manifest.name,\n name: p.manifest.displayName,\n enabled: enabled.has(p.manifest.name),\n ...(auth ? { auth } : {}),\n };\n }),\n );\n return rows.filter((row): row is RunnersResponse['runners'][number] => row !== null);\n }\n\n async generatePlan(sessionId: string, goal: string, runners: RunnerId[] | undefined, workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<PlanState> {\n const recheck = this.recheckSignedOutPlanner(workspace, this.plannerConfig(modelOverride).aiProvider);\n if (recheck) await recheck;\n const session = this.openPlanningSession(sessionId, runners, workspace, modelOverride, options);\n return migratePlanState(await this.firstTurn(sessionId, session, () => session.generatePlan(goal, runners)));\n }\n\n /**\n * Judge the planner as the workspace's account is now, not as it was when the\n * list was last read: the signed-out refusal itself offers the runner's own\n * `auth login` as a way back, and that happens in another process. Only a\n * recorded signed-out verdict is asked again — unknown never blocks, and a\n * signed-in one is the runner's own failure to report. Null when there is\n * nothing to ask, so the turn registers at once as it always did.\n */\n private recheckSignedOutPlanner(workspace: string, provider: PlannerBackendId): Promise<void> | null {\n const runner = runnerForProvider(provider);\n if (!runner || recordedRunnerAuth(runner, workspace)?.state !== 'signed-out') return null;\n const installation = this.installationFor(workspace);\n installation.refresh?.();\n return installation.plannerUsability(runner).then(() => undefined);\n }\n\n /**\n * Build the session a new planning conversation runs in and register it in\n * place of any live one, for {@link firstTurn} to run its first turn on.\n */\n private openPlanningSession(sessionId: string, runners: RunnerId[] | undefined, workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Session {\n const session = this.createSessionFor(sessionId, workspace, modelOverride, options);\n // Judged on the new session's config (which carries the request's model)\n // and before the old session is destroyed, so a refusal leaves it alone.\n // Not while the installed-planner probe is out: its answer can be the\n // planner, and judging the openrouter fallback now would refuse the very\n // keyless first run the probe exists for, so that judgement is the first\n // turn's own gate. The runners are judged on the same terms: before the\n // probe answers, the enabled set is a guess a refusal must not rest on.\n if (installedPlannerAnswered()) {\n session.assertPlannerReady();\n session.assertRunnersEnabled(runners);\n }\n // After the new session is built, so a refusal above leaves the live one\n // alone; before the set, so its runners and planner turn stop broadcasting.\n this.destroy(sessionId);\n // Registered before the blocking call, not after: research inside\n // the first planner turn can raise an approval and await the answer, and\n // that answer arrives over POST /api/approvals/:sessionId — which 404s\n // until the session is in this map. Registering only on return made the\n // first approval of every session unanswerable until its 5-minute timeout.\n this.registerSession(sessionId, workspace, session);\n this.warmCodexSandbox();\n return session;\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[] | undefined, workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<LegacyPlanState> {\n const recheck = this.recheckSignedOutPlanner(workspace, this.plannerConfig(modelOverride).aiProvider);\n if (recheck) await recheck;\n const session = this.openPlanningSession(sessionId, runners, workspace, modelOverride, options);\n return this.firstTurn(sessionId, session, () => session.startPlanning(goal, runners));\n }\n\n /**\n * Continue the planner dialogue with the user's reply: queued behind the\n * first turn, even while it waits for the installed-planner probe, and\n * refused only while a turn of another kind holds the conversation. The\n * session's own planner gate waits for the probe and judges the planner, as\n * it does for every turn.\n */\n async continuePlanning(sessionId: string, message: string): Promise<LegacyPlanState> {\n const session = this.session(sessionId);\n // A reply is a planner turn like any other: the signed-out refusal offers\n // the runner's own login, which runs outside this process, so ask the\n // workspace's account again before the session's synchronous gate judges.\n const recheck = this.recheckSignedOutPlanner(session.workspaceRoot, session.plannerProvider);\n if (recheck) await recheck;\n return session.continueConversation(message);\n }\n\n /** Condense a session's conversation. The summary turn is a planner turn, so `cancelPlanning` stops it. */\n async compactConversation(sessionId: string): Promise<ConversationCompaction & { plan: LegacyPlanState }> {\n const session = this.session(sessionId);\n const recheck = this.recheckSignedOutPlanner(session.workspaceRoot, session.plannerProvider);\n if (recheck) await recheck;\n const compaction = await session.compactConversation();\n return { ...compaction, plan: session.planState! };\n }\n\n /**\n * Send now (ADR-0023): the Session stops the planner turn in flight and\n * answers this message in the turn that replaces it, ahead of anything\n * waiting. The recheck is the one a reply does before the gate: a login done\n * with the runner's own command is seen here too.\n */\n async forceSendPrompt(sessionId: string, message: string): Promise<LegacyPlanState> {\n const session = this.session(sessionId);\n const recheck = this.recheckSignedOutPlanner(session.workspaceRoot, session.plannerProvider);\n if (recheck) await recheck;\n return session.forceSendPrompt(message);\n }\n\n /** Retry a compaction paused on the planner's context: a planner turn, and gated as one. */\n async retryPlannerCompaction(sessionId: string): Promise<LegacyPlanState> {\n const session = this.session(sessionId);\n const recheck = this.recheckSignedOutPlanner(session.workspaceRoot, session.plannerProvider);\n if (recheck) await recheck;\n return session.retryPlannerCompaction();\n }\n\n /**\n * Abort the planner 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 // A first turn still waiting for the probe is the session's to stop too.\n return this.sessions.get(sessionId)?.abortPlannerTurn() ?? false;\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 SessionNotFoundError();\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. Refused while\n // another live host runs the session (ADR-0049); the session built for\n // it is let go, and the one live here, if any, keeps running.\n try {\n session.loadPlan(saved.plan, saved.meta.goal, workspace, { sessionId: saved.meta.id });\n } catch (err) {\n session.destroy();\n throw err;\n }\n // A live session with no plan yet is mid-planning; replacing it must stop that turn.\n this.destroy(sessionId);\n this.registerSession(sessionId, workspace, 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 SessionNotFoundError();\n return session;\n }\n\n /**\n * Stop a session and drop it. A replacement under the same id (re-planning,\n * adopting) keeps its subscribers: they are watching the id, and the new\n * session's broadcasts continue on the same socket. An explicit delete or\n * close is different — the surface must stop drawing a session that no\n * longer exists — so those pass `notifyClients`.\n */\n destroy(sessionId: string, options?: { notifyClients?: boolean }): void {\n this.sessions.get(sessionId)?.destroy();\n this.sessions.delete(sessionId);\n this.sessionWorkspaces.delete(sessionId);\n this.releaseUnusedAccountLimits();\n if (!options?.notifyClients) return;\n const clients = this.clients.get(sessionId);\n if (!clients) return;\n this.broadcast(sessionId, { type: 'notice', level: 'info', message: 'Session closed.' });\n for (const ws of clients) {\n if (ws.readyState === ws.OPEN) ws.close(1001, 'Session closed');\n }\n this.clients.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\n/** A write's `env`, split into what may reach `process.env` and what may not. */\nfunction admittedEnv(changes: Record<string, unknown>): ReturnType<typeof admitSettingsEnv> | undefined {\n const raw = changes.env;\n return raw && typeof raw === 'object' && !Array.isArray(raw) ? admitSettingsEnv(raw as Record<string, unknown>) : undefined;\n}\n\n/**\n * What a settings write asks of who plans. A pick arrives either as a\n * top-level field (a vendor model, `ordewell model set`) or through env\n * (`ordewell planner-effort`, the TUI's pickers); env wins, as it did when\n * both were written in that order. The provider is the name the client sent,\n * never re-derived from the model: a switch may have just cleared that model.\n * An `inherited` write is no pick at all: it is the environment a client was\n * started under, which the daemon would have inherited had the client spawned\n * it, so it is written as it stands and nothing in it is remembered.\n */\nfunction plannerChangeOf(changes: Record<string, unknown>, envChanges: Record<string, string> | undefined): PlannerSelectionChange {\n return changes.inherited === true ? {} : {\n provider: envChanges?.AI_PROVIDER,\n model: envChanges?.ORCHESTRATOR_MODEL ?? stringField(changes.orchestratorModel),\n effort: envChanges?.ORDEWELL_PLANNER_EFFORT ?? stringField(changes.plannerThinkingEffort),\n };\n}\n\nfunction changesPlanner(change: PlannerSelectionChange): boolean {\n return Object.values(change).some((v) => v !== undefined);\n}\n\nfunction stringField(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n/** One spelling per workspace; a request that names none is the daemon's cwd's. */\nfunction workspaceKey(workspace: string | undefined): string {\n return resolve(workspace ?? process.cwd());\n}\n","import type { Context } from 'hono';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport {\n AlreadyExecutingError,\n ConversationBusyError,\n ConversationEditError,\n NoPlanError,\n PlanEditError,\n PlannerNotReadyError,\n PlannerTurnDiscardedError,\n PlannerTurnStoppedError,\n SessionHeldError,\n SessionNotFoundError,\n TaskControlError,\n WorkspaceNotAProjectError,\n WorkspaceNotFoundError,\n type DaemonErrorCode,\n type ErrorBody,\n} from '@ordewell/core';\n\ninterface Classified {\n status: ContentfulStatusCode;\n code: DaemonErrorCode;\n}\n\n/** A request body that is missing, not JSON, or not an object: the request's fault, never a fault of the daemon. */\nexport class InvalidBodyError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidBodyError';\n }\n}\n\n/**\n * The body of a route that needs one object. Every route that read\n * `c.req.json()` directly turned a client's typo into a 500 with the parser's\n * message and a logged stack, while its neighbours answered 400.\n */\nexport async function jsonObject<T extends object = Record<string, unknown>>(c: Context): Promise<T> {\n let parsed: unknown;\n try {\n parsed = await c.req.json();\n } catch {\n throw new InvalidBodyError('The request body must be valid JSON.');\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new InvalidBodyError('The request body must be a JSON object.');\n }\n return parsed as T;\n}\n\n/**\n * The one table from a thrown class to a status and a stable code. A refusal is\n * the request being wrong (400) or arriving at a bad moment (409), a missing\n * session is 404, and only what falls through is a fault — collapsing these\n * into 404/500 gave the TUI and VS Code nothing to show but \"Internal error\",\n * which reads as the edit having silently done nothing.\n *\n * Order matters: `ConversationBusyError` extends `ConversationEditError`.\n */\nfunction classify(err: unknown): Classified | undefined {\n if (err instanceof InvalidBodyError) return { status: 400, code: 'refused' };\n if (err instanceof SessionNotFoundError) return { status: 404, code: 'session_not_found' };\n // 409: the session exists; another host has it open right now (ADR-0049).\n if (err instanceof SessionHeldError) return { status: 409, code: 'session_held' };\n if (err instanceof NoPlanError) return { status: 400, code: 'no_plan' };\n if (err instanceof AlreadyExecutingError) return { status: 409, code: 'already_executing' };\n if (err instanceof WorkspaceNotAProjectError) return { status: 400, code: 'workspace_not_a_project' };\n if (err instanceof WorkspaceNotFoundError) return { status: 400, code: 'workspace_not_found' };\n // 409: the request is fine; the machine is not set up to serve it yet.\n if (err instanceof PlannerNotReadyError) return { status: 409, code: 'planner_not_ready' };\n // 409, not 5xx: the turn ending is what the user asked for (or a plan they\n // dropped), and a 5xx would log a stack for every Stop.\n if (err instanceof PlannerTurnStoppedError) return { status: 409, code: 'planner_turn_stopped' };\n if (err instanceof PlannerTurnDiscardedError) return { status: 409, code: 'planner_turn_discarded' };\n if (err instanceof ConversationBusyError) return { status: 409, code: 'conversation_busy' };\n if (err instanceof ConversationEditError || err instanceof PlanEditError || err instanceof TaskControlError) {\n return { status: 400, code: 'refused' };\n }\n return undefined;\n}\n\n/** A refusal the route itself decided on, in the body shape every client reads. */\nexport function refuse(c: Context, status: ContentfulStatusCode, message: string, code?: DaemonErrorCode) {\n const body: ErrorBody = code ? { error: message, code } : { error: message };\n return c.json(body, status);\n}\n\n/**\n * A JSON error response from a thrown call. What `classify` does not know is a\n * fault and takes the route's `fallback` status; only a 5xx is logged, since a\n * refusal is the request being wrong and travels to the client as-is.\n */\nexport function failure(\n c: Context,\n err: unknown,\n label: string,\n { fallback = 500, message = 'Internal error' }: { fallback?: ContentfulStatusCode; message?: string } = {},\n) {\n const classified = classify(err);\n const status = classified?.status ?? fallback;\n // Log before returning: the message alone travels to the client, so an\n // unexpected throw (a research tool crashing the whole turn, say) left no\n // stack anywhere — server.log showed nothing and the CLI showed one line.\n if (status >= 500) console.error(`[web] ${label} failed:`, err);\n const body: ErrorBody = {\n error: (err instanceof Error && err.message) || message,\n ...(classified ? { code: classified.code } : {}),\n ...(err instanceof WorkspaceNotAProjectError ? { workspace: err.workspace } : {}),\n ...(err instanceof PlannerNotReadyError ? { plannerNotReady: err.reason } : {}),\n ...(err instanceof SessionHeldError ? { sessionHeld: err.held } : {}),\n };\n return c.json(body, status);\n}\n","import { Hono } from 'hono';\nimport { OrchestratorPool, getSessionList, removeSession } from '../pool/orchestratorPool';\nimport {\n listTaskLogAttempts,\n loadSessionPlanState,\n readTaskLog,\n surfacePlan,\n surfacePlanState,\n taskLogForSurface,\n type AdoptSessionResponse,\n type OkResponse,\n type SessionListResponse,\n type SessionResponse,\n type TaskLogAttemptsResponse,\n type TaskLogResponse,\n} from '@ordewell/core';\nimport { failure, refuse } from './errors';\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: SessionListResponse = 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 refuse(c, 404, 'Session not found', 'session_not_found');\n const run = pool.runSnapshot(id);\n const plannerCompaction = pool.plannerCompaction(id);\n return c.json({\n meta: saved.meta,\n plan: surfacePlanState(pool.getPlanState(id) ?? saved.plan),\n ...(run ? { run } : {}),\n ...(plannerCompaction ? { plannerCompaction } : {}),\n } satisfies SessionResponse);\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 const run = pool.runSnapshot(id);\n const plannerTurnId = pool.plannerTurnId(id);\n const plannerCompaction = pool.plannerCompaction(id);\n return c.json({\n ok: true,\n plan: surfacePlan(plan),\n goal: pool.getGoal(id),\n ...(run ? { run } : {}),\n ...(plannerTurnId ? { plannerTurnId } : {}),\n ...(plannerCompaction ? { plannerCompaction } : {}),\n } satisfies AdoptSessionResponse);\n } catch (err: unknown) {\n return failure(c, err, 'load session', { message: 'Failed to load session' });\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')), position: pool.streamPosition(c.req.param('id')) } satisfies TaskLogAttemptsResponse);\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 refuse(c, 400, 'attempt must be a positive integer');\n return c.json({ attempt, events: taskLogForSurface(readTaskLog({ baseDir: ws, sessionId: c.req.param('id') }, c.req.param('taskId'), attempt)), position: pool.streamPosition(c.req.param('id')) } satisfies TaskLogResponse);\n });\n\n // The live session goes first: it persists as it changes, so a session left\n // running would write its file back and reappear in the list.\n router.delete('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const id = c.req.param('id');\n const held = pool.hasSession(id);\n pool.destroy(id, { notifyClients: true });\n const removed = removeSession(id, ws);\n const ok = held || removed;\n return c.json({\n ok,\n ...(ok ? {} : { message: `No session \"${id}\" was found in ${ws}.` }),\n } satisfies OkResponse);\n });\n\n // Stops the orchestrator (killing every runner it spawned) and drops the\n // in-memory planner conversation. No-op if already closed/unregistered.\n router.post('/:id/close', (c) => {\n pool.destroy(c.req.param('id'), { notifyClients: true });\n return c.json({ ok: true } satisfies OkResponse);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport {\n flattenTasks,\n NoPlanError,\n parseExecutionCommand,\n resolveUserTaskRef,\n surfacePlan,\n surfacePlanState,\n TaskControlError,\n type CommandOutcome,\n type ConversationCompactResponse,\n type ConversationForkResponse,\n type ConversationRewindResponse,\n type ApproveReviewResponse,\n type ErrorBody,\n type ExecuteCommandResponse,\n type ExecuteResponse,\n type ExecutionCommand,\n type GeneratePlanResponse,\n type IsolationDiffResponse,\n type IsolationMergeResponse,\n type MergeGateResponse,\n type OkResponse,\n type PlanResponse,\n type PrdResponse,\n type ResolveConflictResponse,\n type RewindTargetsResponse,\n type StopResponse,\n type TaskMessageResponse,\n type Task,\n type CancelPlanningResponse,\n type CancelResumeResponse,\n} from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\nimport { failure, jsonObject, refuse } from './errors';\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/** The id of the task a reference names, as the seam resolves it — the user's unique id prefix included; the reference itself when the plan holds no such task, for the seam to refuse. */\nfunction idOfRef(session: ReturnType<OrchestratorPool['session']>, ref: string): string {\n return resolveUserTaskRef(session.planState?.tasks ?? [], ref)?.id ?? ref;\n}\n\n/** One execution button's command, run as the user (ADR-0029): a refusal becomes the 400 the surface already shows. */\nasync function runUserCommand(session: ReturnType<OrchestratorPool['session']>, command: ExecutionCommand): Promise<Extract<CommandOutcome, { ok: true }>> {\n const outcome = await session.execute(command, { kind: 'user' });\n if (!outcome.ok) throw new TaskControlError(outcome.message);\n return outcome;\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 jsonObject<{\n goal?: string; runners?: string[]; workspace?: string; model?: string; allowInit?: boolean;\n }>(c);\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. Left undefined for\n // the session to read after its planner gate, since before the installed\n // agents are detected the enabled default is not known yet.\n const runnerList: string[] | undefined = Array.isArray(runners) ? runners : (runners ? [runners] : (queryRunners ? queryRunners.split(',').map(s => s.trim()).filter(Boolean) : undefined));\n const plan = await pool.generatePlan(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n const { models, modelsByRunner } = await pool.getProviderModels(ws);\n const notes = (pool.session(c.req.param('sessionId')).planState?.conversationHistory ?? [])\n .filter((e) => e.kind === 'system')\n .map((e) => e.content);\n return c.json({ plan: surfacePlanState(plan), models, modelsByRunner, ...(notes.length > 0 ? { notes } : {}) } satisfies GeneratePlanResponse);\n } catch (err) {\n return failure(c, err, 'generate', { message: 'Plan generation failed' });\n }\n });\n\n router.post('/:sessionId/execute', async (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n // The daemon contract keeps `no_plan` distinct from a plain refusal; the\n // seam refuses either way, so the code it cannot carry is kept here. A\n // run under way is no refusal: executing then approves what waits (#95).\n if (!session.planState || session.planTasks.length === 0) throw new NoPlanError('execute');\n const { message } = await runUserCommand(session, { command: 'run_plan' });\n return c.json({ status: 'running', message } satisfies ExecuteResponse);\n } catch (err) {\n return failure(c, err, 'execute');\n }\n });\n\n router.post('/:sessionId/stop', async (c) => {\n try {\n if (pool.hasSession(c.req.param('sessionId'))) {\n const session = pool.session(c.req.param('sessionId'));\n const outcome = await session.execute({ command: 'stop_run' }, { kind: 'user' });\n // A refused stop is no failure while nothing can start: \"stopped\" is still true (ADR-0029).\n if (!outcome.ok && (session.isExecuting || session.startsPending)) throw new TaskControlError(outcome.message);\n return c.json({ status: 'stopped', message: outcome.message } satisfies StopResponse);\n }\n return c.json({ status: 'stopped' } satisfies StopResponse);\n } catch (err) {\n return failure(c, err, 'stop');\n }\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 } satisfies CancelPlanningResponse);\n });\n\n // Every execution button that is no more than \"this command, as the user\"\n // (ADR-0029, ADR-0006): the body is an ExecutionCommand, the answer is the\n // seam's own line and payload, and a refusal is the one 400 every route gives.\n // The routes beside it stay because they answer more than the seam does: a\n // `no_plan` code, the 409 for a checkpoint nobody waits at, the Merge all card.\n router.post('/:sessionId/execute-command', async (c) => {\n try {\n const parsed = parseExecutionCommand(await jsonObject(c));\n if (!parsed.ok) return refuse(c, 400, parsed.message, 'refused');\n const outcome = await pool.session(c.req.param('sessionId')).execute(parsed.command, { kind: 'user' });\n if (!outcome.ok) {\n // Not through TaskControlError: a Merge all that git stopped keeps the result it stopped with.\n return c.json({ error: outcome.message, code: 'refused', ...(outcome.payload ? { payload: outcome.payload } : {}) } satisfies ErrorBody, 400);\n }\n return c.json({ ok: true, message: outcome.message, ...(outcome.payload ? { payload: outcome.payload } : {}) } satisfies ExecuteCommandResponse);\n } catch (err) {\n return failure(c, err, 'execute-command');\n }\n });\n\n // The task runner's own slash command (#66): carried to the runner, never\n // one of Ordewell's. A task that cannot take one is refused with the reason.\n router.post('/:sessionId/tasks/:taskId/commands', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const fields = typeof body === 'object' && body !== null ? body as { name?: unknown; args?: unknown } : {};\n if (typeof fields.name !== 'string' || !fields.name.trim()) return c.json({ error: 'name is required' }, 400);\n const args = typeof fields.args === 'string' ? fields.args : '';\n const id = pool.session(c.req.param('sessionId')).invokeTaskCommand(c.req.param('taskId'), fields.name.trim(), args);\n return c.json({ id } satisfies TaskMessageResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\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 // The seam refuses a checkpoint nobody waits at too; this route keeps that\n // case apart as its own 409 and code.\n for (const answer of ['approve', 'reject'] as const) {\n router.post(`/:sessionId/tasks/:taskId/checkpoint/${answer}`, async (c) => {\n try {\n const body: unknown = answer === 'reject' ? 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 = idOfRef(session, c.req.param('taskId'));\n // Resolved once: the pre-check and the seam judge the same task, the\n // user's unique id prefix included (ADR-0029).\n if (!session.awaitsCheckpoint(taskId)) return refuse(c, 409, NO_CHECKPOINT, 'checkpoint_not_waiting');\n const { message } = await runUserCommand(session, { command: 'answer_checkpoint', task: taskId, answer, ...(reason ? { reason } : {}) });\n return c.json({ ok: true, message } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\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 // Named as the seam names a task, so a surface asks about the reference the user typed.\n const mergeGate = session.mergeGate(idOfRef(session, 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 } satisfies MergeGateResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\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() } satisfies IsolationDiffResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.post('/:sessionId/isolation/merge', async (c) => {\n try {\n // A merge git stopped is still an outcome the Merge all card shows: the seam refuses it, with the result.\n const outcome = await pool.session(c.req.param('sessionId')).execute({ command: 'merge_all' }, { kind: 'user' });\n if (outcome.payload?.kind === 'merge') return c.json(outcome.payload.result satisfies IsolationMergeResponse);\n if (!outcome.ok) throw new TaskControlError(outcome.message);\n throw new Error('Merge all answered without its result.');\n } catch (err) {\n return failure(c, err, 'task edit');\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 } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\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: plan && surfacePlan(plan) } satisfies ResolveConflictResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.put('/:sessionId/tasks/:taskId', async (c) => {\n try {\n const changes = await jsonObject<Partial<Task>>(c);\n // JSON cannot carry undefined, so a null is a client clearing the model.\n if (changes.assignedModel === null) changes.assignedModel = undefined;\n // One edit, whatever it holds: the session takes the fields a direct\n // edit may set, moves the runner with what it scopes, checks the\n // dependency list against the whole plan, and lands it as one save. An\n // empty patch still asks whether the task exists at all.\n const result = await pool.session(c.req.param('sessionId')).updateTask(c.req.param('taskId'), changes);\n if (!result) return refuse(c, 404, 'Task not found', 'task_not_found');\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\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 refuse(c, 404, 'Task not found', 'task_not_found');\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.post('/:sessionId/tasks', async (c) => {\n try {\n const body = await jsonObject<Partial<Task>>(c);\n const result = await pool.session(c.req.param('sessionId')).addTask(body);\n if (!result) return refuse(c, 404, 'Session not found', 'session_not_found');\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.post('/:sessionId/review/approve', async (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n const plan = session.planState;\n if (!plan) throw new NoPlanError('review');\n const { message } = await runUserCommand(session, { command: 'approve_review' });\n return c.json({ plan: surfacePlan(plan), message } satisfies ApproveReviewResponse);\n } catch (err) {\n return failure(c, err, 'review approve');\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 jsonObject<{\n goal?: string; runners?: string[]; workspace?: string; model?: string; allowInit?: boolean;\n }>(c);\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n // As in generate: none requested is read by the session, after its gate.\n const runnerList: string[] | undefined = Array.isArray(runners) ? runners : (runners ? [runners] : undefined);\n const plan = await pool.startPlanning(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'converse start', { message: 'Planning failed' });\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 jsonObject<{ message?: string }>(c);\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: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'conversation message');\n }\n });\n\n // Send now (ADR-0023): stops the planner turn in flight — never the run's\n // tasks — and answers this message in the turn that replaces it, ahead of\n // anything waiting. With no turn in flight it is the plain send above.\n router.post('/:sessionId/converse/message/now', async (c) => {\n try {\n const { message } = await jsonObject<{ message?: string }>(c);\n if (!message) return c.json({ error: 'message is required' }, 400);\n const plan = await pool.forceSendPrompt(c.req.param('sessionId'), message);\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'conversation message');\n }\n });\n\n // What waits on the planner's usage limit then goes with the user's next\n // message instead of at the reset; `cancelled` is false when nothing waited.\n router.post('/:sessionId/converse/resend/cancel', (c) => {\n try {\n const cancelled = pool.session(c.req.param('sessionId')).cancelPlannerResend();\n return c.json({ cancelled } satisfies CancelResumeResponse);\n } catch (err) {\n return failure(c, err, 'cancel resend', { fallback: 404, message: 'Not found' });\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 const fork = pool.forkConversation(c.req.param('sessionId'));\n return c.json({ ...fork, plan: surfacePlan(fork.plan) } satisfies ConversationForkResponse);\n } catch (err) {\n return failure(c, err, 'conversation edit');\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() } satisfies RewindTargetsResponse);\n } catch (err) {\n return failure(c, err, 'conversation edit');\n }\n });\n\n router.post('/:sessionId/conversation/rewind', async (c) => {\n try {\n const { index } = await jsonObject<{ index?: number }>(c);\n if (typeof index !== 'number' || !Number.isInteger(index) || index < 0) return c.json({ error: 'index must be a non-negative integer' }, 400);\n const rewound = pool.rewindConversation(c.req.param('sessionId'), index);\n return c.json({ ...rewound, plan: surfacePlan(rewound.plan) } satisfies ConversationRewindResponse);\n } catch (err) {\n return failure(c, err, 'conversation edit');\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 const compacted = await pool.compactConversation(c.req.param('sessionId'));\n return c.json({ ...compacted, plan: surfacePlan(compacted.plan) } satisfies ConversationCompactResponse);\n } catch (err) {\n return failure(c, err, 'conversation edit');\n }\n });\n\n // Retry compaction of a planner paused on its context (ADR-0002): the\n // paused turn opens again on the inputs it kept, and this answers once it\n // has landed — or paused again, which the plan's pause says. A stop of the\n // planner ends it, as it ends any turn.\n router.post('/:sessionId/conversation/compact/retry', async (c) => {\n try {\n const plan = await pool.retryPlannerCompaction(c.req.param('sessionId'));\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'retry compaction');\n }\n });\n\n router.get('/:sessionId/prd', (c) => {\n const plan = pool.getPlan(c.req.param('sessionId'));\n if (!plan?.prdMarkdown) return refuse(c, 404, 'No PRD found');\n return c.json({ prdMarkdown: plan.prdMarkdown } satisfies PrdResponse);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { installedPlannerDetected, type OkResponse, type RunnersResponse } from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\nimport { failure, jsonObject, refuse } from './errors';\n\nexport function runnersRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n // getInstalledRunners re-probes the host first, so the state read after it\n // reflects the fresh answer rather than the stale default. A workspace's\n // own `.envrc` can choose the account, so the probe and the planner's\n // model are judged for the one that will plan rather than the daemon's cwd.\n const workspace = c.req.query('workspace');\n const runners = await pool.getInstalledRunners(workspace);\n await pool.discoverPlannerCatalogs(undefined, workspace);\n const state = pool.getRunnerState(workspace);\n return c.json({\n runners,\n orchestratorModel: state.orchestratorModel,\n } satisfies RunnersResponse);\n });\n\n router.put('/:id', async (c) => {\n try {\n // A toggle saves the enabled set it changes; built on the stale default,\n // it would save claude-code over the installed agents the probe finds.\n await installedPlannerDetected();\n const id = c.req.param('id');\n const { enabled } = await jsonObject<{ enabled?: unknown }>(c);\n // A missing value is not `false`: before this, `{}` disabled the runner\n // while answering 200.\n if (typeof enabled !== 'boolean') return refuse(c, 400, 'enabled must be true or false');\n pool.setRunnerEnabled(id, enabled);\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'runner toggle', { fallback: 400 });\n }\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { ModelsResponse } from '@ordewell/core';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function modelsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n // The catalog of the workspace's own runner environment, as its login verdict is.\n const result: ModelsResponse = await pool.getProviderModels(c.req.query('workspace'));\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { assertWorkspaceExists, type IsolationPreviewResponse, type WorkspacesResponse } from '@ordewell/core';\nimport { OrchestratorPool, scanWorkspaces } from '../pool/orchestratorPool';\nimport { failure } from './errors';\n\nexport function workspacesRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n // A read-only sibling of the list: it names the repositories behind one\n // workspace, while `/` keeps listing the workspaces sessions are saved under.\n router.get('/isolation-preview', async (c) => {\n try {\n const workspace = c.req.query('workspace') || process.cwd();\n assertWorkspaceExists(workspace);\n const preview = await pool.previewIsolation(workspace);\n return c.json({ preview } satisfies IsolationPreviewResponse);\n } catch (err) {\n return failure(c, err, 'read isolation preview', { message: 'Could not read the repositories' });\n }\n });\n\n router.get('/', (c) => {\n const workspaces = scanWorkspaces();\n return c.json({ workspaces } satisfies WorkspacesResponse);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { isGranted, toApprovalDecision, type ApprovalAnswer, type ApprovalAnswerResponse, type ApprovalsResponse } from '@ordewell/core';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\nimport { refuse } from './errors';\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 refuse(c, 404, `Unknown session: ${sessionId}`, 'session_not_found');\n\n return c.json({\n pending: pool.outstandingApprovals(sessionId),\n approvedScopes: pool.approvedScopes(sessionId),\n } satisfies ApprovalsResponse);\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 refuse(c, 404, `Unknown session: ${sessionId}`, 'session_not_found');\n\n const answer = answerOf(await c.req.json().catch(() => null));\n const decided = toApprovalDecision(answer);\n // A runner request goes through the command seam as the user's answer, so\n // their action is kept in the timeline (ADR-0029). The planner's own\n // prompt is no execution action and is answered directly.\n const request = pool.outstandingApprovals(sessionId).find((pending) => pending.id === approvalId)?.request;\n if (request?.taskId) {\n const outcome = await pool.session(sessionId).execute(\n { command: 'answer_approval', task: request.taskId, approval: approvalId, answer: decided.decision, ...(decided.decision === 'deny' && decided.note ? { note: decided.note } : {}) },\n { kind: 'user' },\n );\n if (!outcome.ok) return refuse(c, 400, outcome.message, 'refused');\n } else if (!pool.resolveApproval(sessionId, approvalId, answer)) {\n return refuse(c, 409, 'Approval is no longer outstanding: it timed out or was already answered.', 'approval_not_outstanding');\n }\n return c.json({ ok: true, granted: isGranted(decided), decision: decided.decision } satisfies ApprovalAnswerResponse);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { RunSettingsError, installedPlannerDetected, type GlobalRunSettings, type SettingsResponse, type SettingsUpdateResponse } from '@ordewell/core';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\nimport { failure, jsonObject, refuse } from './errors';\n\nexport function settingsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n // Both wait for the startup probe (ADR-0009): the TUI reads the planner from\n // here the moment it opens, and a /planner switch is judged against the\n // planner in effect, which the probe may be about to change.\n router.get('/', async (c) => {\n await installedPlannerDetected();\n // An open session answers with its own run settings; no id or an id it no\n // longer holds answers with the file's, which a new session starts from\n // (ADR-0030). The planner's model is judged against the runner catalog of\n // the session's workspace, else of the one the client is in, waited for\n // only where it decides that model (ADR-0040).\n const sessionId = c.req.query('sessionId') || undefined;\n const workspace = c.req.query('workspace') || undefined;\n await pool.discoverPlannerCatalogs(sessionId, workspace);\n const settings: SettingsResponse = pool.getSettings(sessionId, workspace);\n return c.json(settings);\n });\n\n router.patch('/', async (c) => {\n try {\n await installedPlannerDetected();\n const body = await jsonObject(c);\n // Every client names its workspace, which is not itself a change.\n if (Object.keys(body).every((key) => key === 'workspace')) {\n return refuse(c, 400, 'At least one setting field is required');\n }\n // Run settings (ADR-0030) are named fields under `run`, never environment\n // variables; `sessionId` is the session the change was made in, and\n // `workspace` the one the client is in, whose catalog a pick is judged by.\n const { run, sessionId: namedSession, workspace: namedWorkspace, ...rest } = body;\n if (namedSession !== undefined && typeof namedSession !== 'string') return refuse(c, 400, 'sessionId must be a string');\n if (namedWorkspace !== undefined && typeof namedWorkspace !== 'string') return refuse(c, 400, 'workspace must be a string');\n const sessionId = namedSession || undefined;\n const workspace = namedWorkspace || undefined;\n if (run !== undefined) {\n if (!run || typeof run !== 'object' || Array.isArray(run)) return refuse(c, 400, 'run must be an object of run settings');\n try {\n pool.updateRunSettings(run as Partial<GlobalRunSettings>, sessionId, workspace);\n } catch (err) {\n if (err instanceof RunSettingsError) return refuse(c, 400, err.message);\n throw err;\n }\n }\n // Only a planner switch waits for a catalog, the one it is judged\n // against, which no client has asked for yet when it switches (ADR-0040).\n const result: SettingsUpdateResponse = Object.keys(rest).length > 0\n ? await pool.writeSettings(rest, sessionId, workspace)\n : pool.getSettings(sessionId, workspace);\n return c.json(result);\n } catch (err) {\n return failure(c, err, 'settings update', { fallback: 400 });\n }\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { CommandDescriptor, CommandsResponse } from '@ordewell/core';\nimport { refuse } from './errors';\n\n// Every command this route ran was a mode toggle, and none is left; the\n// route stays so a client listing commands still gets an answer.\nconst COMMANDS: CommandDescriptor[] = [];\n\nexport function commandsRoute() {\n const router = new Hono();\n\n router.get('/', (c) => {\n return c.json({ commands: COMMANDS } satisfies CommandsResponse);\n });\n\n router.post('/:name', (c) => {\n const name = c.req.param('name');\n return refuse(c, 404, `Unknown command: ${name}`);\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, type RunSnapshotFrame, type SessionFrame } 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 // The stream reports changes only. Taken and subscribed in one turn, so no\n // broadcast can fall between the snapshot and the first message after it.\n const view = pool.runSnapshot(sessionId);\n if (view) {\n ws.send(JSON.stringify({\n type: 'run_snapshot', sessionId, view, approvals: pool.announcedApprovals(sessionId), ...pool.streamPosition(sessionId),\n } satisfies RunSnapshotFrame));\n }\n // A compaction has no turn id to adopt, so a client joining mid-way would\n // not know the planner is busy. Unstamped: the client's fold is idempotent\n // by the compaction's id, and a stamp would let it count this as the\n // broadcast it already holds.\n const compaction = pool.plannerCompaction(sessionId);\n if (compaction) ws.send(JSON.stringify(compaction satisfies SessionFrame));\n // Subscribing also greets with host-owned account limits, independently\n // of the run snapshot above, even when the host knows none yet.\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';\nimport type { ServerInfoResponse } from '@ordewell/core';\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 // `ordewell stop --server` verifies a PID file against the process that\n // actually owns the port before signalling anything, so a stale file cannot\n // terminate an unrelated process. Behind admission like every other route.\n app.get('/api/server', (c) => c.json({ pid: process.pid, port: admission.port } satisfies ServerInfoResponse));\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());\n app.route('/api/workspaces', workspacesRoute(pool));\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';\nimport { decideAdmission, type AdmissionContext } from './security/admission';\n\n/**\n * How much of a request body the daemon will hold in memory. Plans, task edits\n * and conversation messages are small; a body past this is not one of ours.\n * Without a cap, the admission check below could never run before a browser's\n * multi-gigabyte `text/plain` POST was already buffered.\n */\nexport const MAX_BODY_BYTES = 10 * 1024 * 1024;\n\nclass BodyTooLargeError extends Error {}\n\n/** A body over the cap, or a request the admission check refused, answered and closed. */\nfunction refuse(req: IncomingMessage, res: ServerResponse, status: number, message: string): void {\n const payload = JSON.stringify({ error: message });\n res.writeHead(status, {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(payload),\n // Nothing more is read from this request, so its connection cannot be reused.\n Connection: 'close',\n });\n res.end(payload, () => req.destroy());\n}\n\n/**\n * Read at most `max` bytes, leaving the stream paused once it is over. The\n * caller answers 413 and destroys the request; draining it instead would let a\n * browser keep the daemon busy for as long as it liked.\n */\nfunction readBody(req: IncomingMessage, max: number): Promise<string | undefined> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n const cleanup = () => {\n req.off('data', onData);\n req.off('end', onEnd);\n req.off('error', onError);\n };\n const onData = (chunk: Buffer) => {\n size += chunk.length;\n if (size > max) {\n cleanup();\n req.pause();\n reject(new BodyTooLargeError());\n return;\n }\n chunks.push(chunk);\n };\n const onEnd = () => {\n cleanup();\n resolve(chunks.length > 0 ? Buffer.concat(chunks).toString() : undefined);\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n req.on('data', onData);\n req.on('end', onEnd);\n req.on('error', onError);\n });\n}\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 *\n * Admission runs here as well as in the Hono middleware, and first: the\n * middleware only sees the request after the body has been read, which is too\n * late to keep a browser from making the daemon buffer it.\n */\nexport function createRequestListener(app: Hono, admission: AdmissionContext, maxBodyBytes = MAX_BODY_BYTES) {\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const decision = decideAdmission({\n origin: req.headers.origin ?? null,\n host: req.headers.host ?? null,\n authorization: req.headers.authorization ?? null,\n }, admission);\n if (!decision.admit) {\n refuse(req, res, decision.status, decision.reason);\n return;\n }\n\n const declared = Number(req.headers['content-length']);\n if (Number.isFinite(declared) && declared > maxBodyBytes) {\n refuse(req, res, 413, `Request body must be at most ${maxBodyBytes} bytes.`);\n return;\n }\n\n let body: string | undefined;\n try {\n body = await readBody(req, maxBodyBytes);\n } catch (err) {\n if (err instanceof BodyTooLargeError) {\n refuse(req, res, 413, `Request body must be at most ${maxBodyBytes} bytes.`);\n return;\n }\n throw err;\n }\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 { mkdirSync, unlinkSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\nimport { clearDaemonToken, mintDaemonToken, processLeaseHost, StructuredRunner } from '@ordewell/core';\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// Written by the daemon itself only once it is listening, and removed on\n// shutdown, so `ordewell stop --server` never reads an entry belonging to a\n// process that failed to bind or a daemon that is already gone.\nconst pidFileIdx = args.indexOf('--pid-file');\nconst pidFile = pidFileIdx !== -1 ? args[pidFileIdx + 1] : undefined;\nlet ownsPidFile = false;\n\n// What another host's refusal names this one as (ADR-0049). Only a TUI starts\n// a daemon it watches, as its private one.\nprocessLeaseHost().describe({ kind: 'daemon', port, ...(watchParentPid ? { ownerPid: watchParentPid } : {}) });\n\n// Tasks run on the structured transport (ADR-0018) as plain child processes,\n// so one runner serves every plan whatever the host has.\nconst pool = new OrchestratorPool({ runner: new StructuredRunner() });\n// Before listening, so the first request already finds the probe in flight\n// and waits on it rather than reading the openrouter fallback (ADR-0009).\nvoid pool.detectInstalledPlanner();\nconst server = createServer();\nlet ownsToken = false;\n\nserver.listen(port, '127.0.0.1', () => {\n // A losing startup must not replace the listening daemon's credential.\n // This callback installs admission before the event loop can serve a request.\n const { token, file: tokenFile } = mintDaemonToken(port);\n ownsToken = true;\n if (pidFile) {\n mkdirSync(dirname(pidFile), { recursive: true });\n writeFileSync(pidFile, String(process.pid), { mode: 0o600 });\n ownsPidFile = true;\n }\n const admission = { port, token, tokenFile };\n const app = createApp(pool, admission);\n app.get('/', (c) => c.json({ message: 'Ordewell API', docs: '/api/workspaces' }));\n server.on('request', createRequestListener(app, admission));\n attachWsHandler(server, pool, admission);\n pool.getProviderModels().catch((err) => {\n console.error(`[web] model discovery warmup failed: ${err?.message ?? err}`);\n });\n console.error(`[web] Ordewell API server: http://localhost:${port}`);\n});\n\nfunction shutdown(): void {\n if (ownsToken) clearDaemonToken(port);\n if (ownsPidFile && pidFile) {\n try { unlinkSync(pidFile); } catch { /* already gone */ }\n }\n pool.destroyAll();\n server.close();\n process.exit(0);\n}\n\n// A stray rejection in one session's background work must not take every\n// session's runners down with the daemon.\nprocess.on('unhandledRejection', (reason) => {\n console.error(`[web] unhandled rejection: ${reason instanceof Error ? reason.stack ?? reason.message : String(reason)}`);\n});\n\n// A daemon this CLI owns shares its foreground process group. Ctrl-C while a\n// login child holds the terminal is a SIGINT to that whole group, and the TUI\n// ignores it so the child alone is cancelled; shutting down here would take\n// every in-memory session with it. The owner stops us with SIGTERM, and the\n// parent watch below still catches an owner that dies.\nprocess.on('SIGINT', () => { if (!watchParentPid) 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"]}
|