@ordewell/web 0.10.10 → 0.10.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/main.js +2 -2
- package/dist/server/main.js.map +1 -1
- package/package.json +2 -2
package/dist/server/main.js
CHANGED
|
@@ -54,8 +54,8 @@ var WebConfig = class extends core.BaseConfig {
|
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
56
|
* Read live, not fixed at construction: a session's WebConfig lives for the
|
|
57
|
-
* whole session while /
|
|
58
|
-
* it. `routedProvider` keeps that cheap.
|
|
57
|
+
* whole session while /planner and /key (or the headless `ordewell model`)
|
|
58
|
+
* mutate process.env under it. `routedProvider` keeps that cheap.
|
|
59
59
|
*/
|
|
60
60
|
get planner() {
|
|
61
61
|
return this.resolvePlanner({ ...this.configuredPlanner(), override: this._modelOverride }, this._providerModelLists());
|
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","ModelResolver","CodexSandboxAvailability","nodeSpawn","detectInstalledPlanner","PlannerNotReadyError","PlannerTurnStoppedError","PlannerTurnDiscardedError","sessionRuntimeSettings","assertWorkspaceExists","assertWorkspaceIsProject","WorkspaceNotAProjectError","ensureStateDirIgnored","createSession","runnerForProvider","admitSettingsEnv","selectPlanner","PROVIDER_CREDENTIAL_ENV","configuredProviders","runnerModesFrom","migratePlanState","installedPlannerAnswered","loadSession","SessionNotFoundError","scanWorkspaces","listSessions","deleteSession","NoPlanError","AlreadyExecutingError","WorkspaceNotFoundError","ConversationBusyError","ConversationEditError","PlanEditError","TaskControlError","pool","Hono","loadSessionPlanState","run","surfacePlanState","surfacePlan","listTaskLogAttempts","taskLogForSurface","readTaskLog","resolveUserTaskRef","flattenTasks","installedPlannerDetected","toApprovalDecision","isGranted","RunSettingsError","WebSocketServer","DAEMON_SUBPROTOCOL","tokensMatch","extractPresentedToken","port","server","createServer","mintDaemonToken"],"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 /model, /planner and /key mutate process.env under\n * 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}\n\n/**\n * Cap on a single child's buffered output. Above this, Node kills the child\n * and invokes the callback with `err.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER'`\n * — a string, so the coercion below maps it to `1` (see `run`).\n */\nexport const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;\n\n/**\n * The single primitive every search/inspection adapter in this package is\n * built on: spawn a child, never reject. Kept in its own module so the\n * contract that the planner depends on — synchronous spawn failures degrade\n * to a failed tool call, never a rejected promise that aborts the whole\n * planner turn — can be pinned by a focused test rather than exercised only\n * incidentally through the public adapter API.\n *\n * Node hands only ENOENT/EAGAIN/EMFILE/ENFILE from spawn(2) to the\n * callback; every other errno — ENOTDIR for a `cwd` that is a file, EACCES\n * for one it cannot enter — is thrown synchronously. Thrown in here that\n * rejects the promise, and no caller of `run` catches, so a single bad\n * search argument aborted the entire planner turn as \"Plan generation\n * failed: spawn ENOTDIR\". A failed spawn is a failed tool call, never a\n * failed plan.\n */\nexport function run(\n file: string,\n args: string[],\n opts: { cwd?: string; timeout: number; shell?: boolean; env?: NodeJS.ProcessEnv; signal?: AbortSignal },\n): Promise<ExecResult> {\n return new Promise((resolve) => {\n try {\n execFile(file, args, {\n cwd: opts.cwd,\n timeout: opts.timeout,\n maxBuffer: MAX_OUTPUT_BYTES,\n encoding: 'utf8',\n shell: opts.shell,\n env: opts.env,\n // Node kills the child when this aborts, and calls back with an\n // ABORT_ERR — which lands on the `code: 1` branch below, i.e. a\n // failed tool call, exactly like any other command that did not\n // finish. Stopping the planner must not leave a research `bash`\n // running out its own timeout on the server.\n signal: opts.signal,\n }, (err, stdout, stderr) => {\n const code = err && typeof (err as { code?: unknown }).code === 'number' ? (err as { code: number }).code : err ? 1 : 0;\n resolve({ stdout: stdout ?? '', stderr: stderr ?? '', code });\n });\n } catch (err) {\n // `code: null` rather than 1 on purpose: the search adapters read 0 and 1\n // as \"ran, possibly no matches\", so a 1 here would report a confident\n // \"No matches found.\" for a search that never executed.\n resolve({ stdout: '', stderr: (err as Error).message, code: null });\n }\n });\n}","import {\n BaseFileSystem,\n buildGrepArgs,\n buildGlobArgs,\n buildFallbackGrepArgs,\n GREP_PCRE_PROBE_ARGS,\n grepRegexFromProbe,\n 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 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, signal?: AbortSignal): Promise<ToolOutcome> {\n // `shell: true` is required now that approved commands may legitimately\n // contain pipes; the tier classifier in core (not string filtering here)\n // is what decides whether this command was allowed to reach the shell.\n //\n // `file: null` is that host default, unchanged on POSIX. A resolved file is\n // the POSIX shell found on a Windows box, invoked explicitly so the command\n // runs in the dialect `BaseFileSystem` classified it under.\n const { file, args } = this.researchShell;\n const result = file === null\n ? await run(command, [], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, shell: true, signal })\n : await run(file, [...args, command], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, signal });\n const out = (result.stdout || '').trim();\n const err = (result.stderr || '').trim();\n\n // A stopped turn reports as a stop, not as a mysterious non-zero exit: the\n // child was killed on purpose and there is nothing here to diagnose.\n if (signal?.aborted) return { success: false, output: STOPPED_TOOL_RESULT, truncated: false };\n\n if (result.code !== 0) {\n const detail = err || out || `exited with code ${result.code}`;\n // A failing command is still research: the model asked to diagnose, and\n // the failure output is usually the answer. Report it, do not swallow it.\n return { success: false, output: `Command exited ${result.code}:\\n${detail.slice(0, 20_000)}`, truncated: detail.length > 20_000 };\n }\n\n const combined = err ? `${out}\\n[stderr]\\n${err}` : out;\n return { success: true, output: combined || '(no output)', truncated: combined.length > 20_000 };\n }\n}\n","import 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 { WebSocket } from 'ws';\nimport {\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} 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 /**\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\nexport class OrchestratorPool {\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 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\n constructor(deps: OrchestratorPoolDeps = {}) {\n const pluginNotice = removedPluginNotice();\n if (pluginNotice) console.warn(pluginNotice);\n this.runner = deps.runner ?? new StructuredRunner();\n this.runnerInstallation = deps.runnerInstallation ?? new RunnerInstallation(this.registry);\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 }\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 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 }\n\n unsubscribe(sessionId: string, ws: WebSocket): void {\n this.clients.get(sessionId)?.delete(ws);\n if (this.clients.get(sessionId)?.size === 0) this.clients.delete(sessionId);\n }\n\n private broadcast(sessionId: string, msg: SessionMessage | SessionNotice): void {\n const 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'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 });\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(): SettingsResponse {\n const config = this.plannerConfig();\n const userSettings = this.settingsService.getAll();\n return {\n orchestratorModel: config.orchestratorModel,\n // Who plans (ADR-0009) — a vendor id, or one of the three harness\n // planners. Surfaces need it to render the planner picker and to know\n // whether the planner model comes from a runner catalog or a vendor one.\n aiProvider: config.aiProvider,\n // A harness planner's thinking effort (ADR-0009). Surfaces need it back\n // to render the current level; without it the picker shows \"default\"\n // for a planner that is running at \"high\".\n plannerThinkingEffort: config.plannerThinkingEffort ?? '',\n maxParallel: config.maxParallelSessions,\n 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 run: 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' runs keep\n * theirs. Throws a {@link RunSettingsError}, saving nothing, for a value\n * 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();\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>): 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 (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();\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 * Runners whose CLI is actually installed on the host, with display name and\n * enabled state. Only these should be offered for selection — an uninstalled\n * runner can't be spawned.\n */\n async getInstalledRunners(): Promise<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 this.runnerInstallation.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 this.runnerInstallation.filterInstalled(runners.map((p) => p.manifest.name)),\n );\n return runners\n .filter((p) => installedIds.has(p.manifest.name))\n .map((p) => ({\n id: p.manifest.name,\n name: p.manifest.displayName,\n enabled: enabled.has(p.manifest.name),\n }));\n }\n\n async generatePlan(sessionId: string, goal: string, runners: RunnerId[] | undefined, workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<PlanState> {\n const session = this.openPlanningSession(sessionId, workspace, modelOverride, options);\n return migratePlanState(await this.firstTurn(sessionId, session, () => session.generatePlan(goal, runners)));\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, 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.\n if (installedPlannerAnswered()) session.assertPlannerReady();\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.sessions.set(sessionId, 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 session = this.openPlanningSession(sessionId, 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 return this.session(sessionId).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 compaction = await session.compactConversation();\n return { ...compaction, plan: session.planState! };\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.\n session.loadPlan(saved.plan, saved.meta.goal, workspace, { sessionId: saved.meta.id });\n // A live session with no plan yet is mid-planning; replacing it must stop that turn.\n this.destroy(sessionId);\n this.sessions.set(sessionId, session);\n\n return session.planState ?? saved.plan;\n }\n\n /**\n * Fork a session's conversation into a new session and adopt it, so the\n * fork is addressable at once — through the same path a saved session is\n * adopted by, reading back the file the fork was written to. The original\n * keeps running, or planning, untouched.\n */\n forkConversation(sessionId: string): AdoptedFork {\n return this.adoptFork(this.session(sessionId).forkConversation());\n }\n\n /** A rewind is a fork from an earlier point, so it is adopted the same way. */\n rewindConversation(sessionId: string, index: number): AdoptedFork & { rewoundMessage: string } {\n const fork = this.session(sessionId).rewindConversation(index);\n return { ...this.adoptFork(fork), rewoundMessage: fork.rewoundMessage };\n }\n\n private adoptFork(fork: ConversationFork): AdoptedFork {\n return { sessionId: fork.sessionId, goal: fork.goal, plan: this.adoptSavedSession(fork.sessionId, fork.workspace) };\n }\n\n /**\n * Direct access to a session's interface — routes call the Session; the\n * pool only registers sessions and fans broadcasts out to WS clients.\n */\n session(sessionId: string): Session {\n const session = this.sessions.get(sessionId);\n if (!session) throw new SessionNotFoundError();\n return session;\n }\n\n destroy(sessionId: string): void {\n this.sessions.get(sessionId)?.destroy();\n this.sessions.delete(sessionId);\n }\n\n destroyAll(): void { for (const id of this.sessions.keys()) this.destroy(id); }\n}\n\nexport const scanWorkspaces = scanWorkspacesImpl;\n\nexport function getSessionList(workspace: string) { return listSessions(workspace); }\nexport function getSession(sessionId: string, workspace: string) { return loadSession(sessionId, workspace); }\nexport function removeSession(sessionId: string, workspace: string) { return deleteSession(sessionId, workspace); }\n\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 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/**\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 SessionNotFoundError) return { status: 404, code: 'session_not_found' };\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 };\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 return c.json({ meta: saved.meta, plan: surfacePlanState(pool.getPlanState(id) ?? saved.plan), ...(run ? { run } : {}) } 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 return c.json({ ok: true, plan: surfacePlan(plan), goal: pool.getGoal(id), ...(run ? { run } : {}) } 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 pool.destroy(id);\n const ok = removeSession(id, ws);\n return c.json({ ok } 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'));\n return c.json({ ok: true } satisfies OkResponse);\n });\n\n return router;\n}\n","import { Hono, type Context, type Env } from 'hono';\nimport {\n flattenTasks,\n NoPlanError,\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 ExecuteResponse,\n type TaskStartResponse,\n type ExecutionCommand,\n type ForceSendResponse,\n type GeneratePlanResponse,\n type IsolationDiffResponse,\n type IsolationMergeResponse,\n type MergeGateResponse,\n type OkResponse,\n type PlanResponse,\n type PrdResponse,\n type RemoveMessageResponse,\n type ResolveConflictResponse,\n type RewindTargetsResponse,\n type StopResponse,\n type TaskMessageResponse,\n type CancelPlanningResponse,\n type CancelResumeResponse,\n} from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\nimport { failure, 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 c.req.json();\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n const queryRunners = c.req.query('runners');\n // No runners in the request means \"whatever is enabled\", not claude-code:\n // a hard-coded default here contradicts the /runners toggle state and\n // fails planning for anyone who disabled claude-code. 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 // A task paused on a usage limit then waits for a manual retry.\n router.post('/:sessionId/tasks/:taskId/resume/cancel', async (c) => {\n try {\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'cancel_resume', task: c.req.param('taskId') });\n return c.json({ cancelled: true, message } satisfies CancelResumeResponse);\n } catch (err) {\n return failure(c, err, 'cancel resume');\n }\n });\n\n // Task controls — these spawn or kill runner processes, or settle a task's\n // state, so they are deliberately separate from the generic `PUT tasks/:taskId`\n // status patch. Each is an execution button, so it goes through the command\n // seam as the user (ADR-0029) and answers in the seam's words. Force start\n // has its own route below, since it also answers the line saying it is queued.\n for (const [segment, command] of [\n ['run', (id: string): ExecutionCommand => ({ command: 'run_task', task: id })],\n ['retry', (id: string): ExecutionCommand => ({ command: 'retry_task', task: id, from: 'fresh' })],\n ['cancel', (id: string): ExecutionCommand => ({ command: 'stop_task', task: id })],\n ['complete', (id: string): ExecutionCommand => ({ command: 'mark_complete', task: id })],\n ['uncomplete', (id: string): ExecutionCommand => ({ command: 'mark_not_done', task: id })],\n // The user says the limit has reset early: the task, and every other one waiting on its runner's reset, resumes in its saved session now.\n ['resume/now', (id: string): ExecutionCommand => ({ command: 'retry_task', task: id, from: 'session' })],\n ['interrupt', (id: string): ExecutionCommand => ({ command: 'interrupt_task', task: id })],\n ] as const) {\n router.post(`/:sessionId/tasks/:taskId/${segment}`, async (c) => {\n try {\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), command(c.req.param('taskId')));\n return c.json({ ok: true, message } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, segment);\n }\n });\n }\n\n // Skip ends the task without landing its work (never a mark complete); the user's reason is optional.\n router.post('/:sessionId/tasks/:taskId/skip', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const reason = typeof body === 'object' && body !== null && 'reason' in body && typeof body.reason === 'string' ? body.reason : undefined;\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'skip_task', task: c.req.param('taskId'), ...(reason ? { reason } : {}) });\n return c.json({ ok: true, message } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'skip');\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/force-start', async (c) => {\n try {\n const { message, payload } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'force_start', task: c.req.param('taskId') });\n return c.json({ ok: true, ...(payload?.kind === 'queued' ? { queued: payload.line } : {}), message } satisfies TaskStartResponse);\n } catch (err) {\n return failure(c, err, 'force-start');\n }\n });\n\n // Talking to a task (ADR-0018, M1). A task not running is refused with\n // the reason. Force send\n // (ADR-0023, F1) is the same request: it interrupts the running turn and\n // delivers this message next, ahead of anything queued.\n const messageHandler = (send: (session: ReturnType<typeof pool.session>, taskId: string, text: string) => Promise<string>) => async (c: Context<Env, '/:sessionId/tasks/:taskId/messages'>) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const text = typeof body === 'object' && body !== null && 'text' in body ? body.text : undefined;\n if (typeof text !== 'string' || !text.trim()) return c.json({ error: 'text is required' }, 400);\n const id = await send(pool.session(c.req.param('sessionId')), c.req.param('taskId'), text);\n return c.json({ id } satisfies TaskMessageResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n };\n\n // A message reaches the task through the command seam as the user (ADR-0029),\n // so it lands in the timeline.\n const sendMessage = (force: boolean) => messageHandler(async (session, taskId, text) => {\n const { payload } = await runUserCommand(session, { command: 'message_task', task: taskId, text, ...(force ? { force } : {}) });\n return payload?.kind === 'message' ? payload.id : '';\n });\n router.post('/:sessionId/tasks/:taskId/messages', sendMessage(false));\n router.post('/:sessionId/tasks/:taskId/messages/now', sendMessage(true));\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 // Force send a message queued behind the running turn; one already\n // delivered is refused with the reason.\n router.post('/:sessionId/tasks/:taskId/messages/:messageId/now', async (c) => {\n try {\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'force_send_queued', task: c.req.param('taskId'), id: c.req.param('messageId') });\n return c.json({ sent: true, message } satisfies ForceSendResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n // Continue a finished structured task in its saved session (ADR-0018, K1),\n // through the command seam as the user (ADR-0029). A task that cannot be\n // continued is refused with the reason.\n router.post('/:sessionId/tasks/:taskId/continue', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const text = typeof body === 'object' && body !== null && 'text' in body ? body.text : undefined;\n if (typeof text !== 'string' || !text.trim()) return c.json({ error: 'text is required' }, 400);\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'retry_task', task: c.req.param('taskId'), from: 'session', message: text });\n return c.json({ ok: true, message } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId/messages/:messageId', async (c) => {\n try {\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'remove_queued', task: c.req.param('taskId'), id: c.req.param('messageId') });\n return c.json({ removed: true, message } satisfies RemoveMessageResponse);\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; the daemon contract\n // keeps that distinct as the 409 a surface says instead of claiming success.\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 c.req.json();\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 c.req.json();\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 router.post('/:sessionId/tasks/merge', async (c) => {\n try {\n const { taskIds } = await c.req.json();\n if (!taskIds || !Array.isArray(taskIds) || taskIds.length < 2) {\n return c.json({ error: 'taskIds array with at least two ids is required' }, 400);\n }\n const plan = await pool.session(c.req.param('sessionId')).requestMerge(taskIds);\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'merge', { fallback: 400 });\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/split', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).requestSplit(c.req.param('taskId'));\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'split', { fallback: 400 });\n }\n });\n\n // Conversational planning (ADR-0002): start the planner dialogue. The\n // response's plan carries conversationHistory; when tasks are non-empty the\n // planner committed the plan.\n router.post('/:sessionId/converse/start', async (c) => {\n try {\n const { goal, runners, workspace, model, allowInit } = await c.req.json();\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n // 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 c.req.json();\n if (!message) return c.json({ error: 'message is required' }, 400);\n const plan = await pool.continuePlanning(c.req.param('sessionId'), message);\n return c.json({ plan: 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 c.req.json();\n if (!message) return c.json({ error: 'message is required' }, 400);\n const plan = await pool.session(c.req.param('sessionId')).forceSendPrompt(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 c.req.json();\n if (!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 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';\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.\n const runners = await pool.getInstalledRunners();\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 // 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 body = await c.req.json();\n pool.setRunnerEnabled(id, body.enabled);\n return c.json({ ok: true } satisfies OkResponse);\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 type { WorkspacesResponse } from '@ordewell/core';\nimport { scanWorkspaces } from '../pool/orchestratorPool';\n\nexport function workspacesRoute() {\n const router = new Hono();\n\n router.get('/', (c) => {\n const workspaces = scanWorkspaces();\n return c.json({ workspaces } 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 { 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 const settings: SettingsResponse = pool.getSettings();\n return c.json(settings);\n });\n\n router.patch('/', async (c) => {\n await installedPlannerDetected();\n const body: unknown = await c.req.json();\n if (!body || typeof body !== 'object' || Array.isArray(body) || 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, ...rest } = body as Record<string, unknown>;\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 if (sessionId !== undefined && typeof sessionId !== 'string') return refuse(c, 400, 'sessionId must be a string');\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 ? pool.updateSettings(rest) : pool.getSettings();\n return c.json(result);\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 } 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 pool.subscribe(sessionId, ws);\n });\n\n return (request: IncomingMessage, socket: Duplex, head: Buffer) => {\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit('connection', ws, request);\n });\n };\n}\n","/**\n * The single admission decision for the daemon.\n *\n * Both the HTTP middleware and the WebSocket upgrade handler call this. The\n * sharing is the point: the two paths drifting apart is how the upgrade ended\n * up validating nothing while the HTTP routes had a CORS allowlist.\n */\n\nimport { extractPresentedToken, tokensMatch } from '@ordewell/core';\n\n/** `localhost` is included because clients dial it by name; the daemon binds loopback only. */\nconst LOOPBACK_HOSTNAMES = new Set(['localhost', '127.0.0.1', '::1']);\n\nexport interface AdmissionHeaders {\n /** `null`/`undefined` mean absent. An empty string still counts as present. */\n origin?: string | null;\n host?: string | null;\n /** `Authorization: Bearer <token>` — how the token travels on HTTP routes. */\n authorization?: string | null;\n /** `Sec-WebSocket-Protocol` — how it travels on the upgrade, so it stays out of logs. */\n secWebSocketProtocol?: string | null;\n}\n\n/** What this daemon is: which port it bound, and which token it minted. */\nexport interface AdmissionContext {\n port: number;\n token: string;\n /** Named in a token rejection, so a stale token is diagnosable rather than a bare failure. */\n tokenFile: string;\n}\n\nexport type AdmissionDecision =\n | { admit: true }\n | { admit: false; status: number; reason: string };\n\nconst ADMIT: AdmissionDecision = { admit: true };\n\nexport function decideAdmission(\n headers: AdmissionHeaders,\n context: AdmissionContext,\n): AdmissionDecision {\n if (headers.origin !== undefined && headers.origin !== null) {\n return {\n admit: false,\n status: 403,\n reason: 'Refused: requests carrying an Origin header are not accepted. The Ordewell daemon has no browser client.',\n };\n }\n\n if (!isOwnLoopbackAuthority(headers.host, context.port)) {\n return {\n admit: false,\n status: 403,\n reason: `Refused: the Host header must name loopback (localhost, 127.0.0.1 or [::1]) at port ${context.port}.`,\n };\n }\n\n if (!tokensMatch(extractPresentedToken(headers), context.token)) {\n return {\n admit: false,\n status: 401,\n reason:\n 'Unauthenticated: this request did not present the daemon\\'s bearer token. '\n + `Ordewell clients read it from ${context.tokenFile}; if that file is stale, `\n + 'restart the daemon (`ordewell web --daemon`) to mint a fresh one.',\n };\n }\n\n return ADMIT;\n}\n\n/**\n * Rejecting anything but our own loopback authority is what closes DNS\n * rebinding: a page rebinding a hostname it controls to 127.0.0.1 still sends\n * that hostname in `Host`, and same-origin requests to it carry no `Origin`.\n */\nfunction isOwnLoopbackAuthority(host: string | null | undefined, port: number): boolean {\n if (!host) return false;\n const authority = splitAuthority(host);\n if (!authority) return false;\n if (!LOOPBACK_HOSTNAMES.has(authority.hostname.toLowerCase())) return false;\n return authority.port === port;\n}\n\n/** Absent port means the scheme default; the daemon only ever speaks http. */\nconst DEFAULT_HTTP_PORT = 80;\n\nfunction splitAuthority(host: string): { hostname: string; port: number } | undefined {\n const value = host.trim();\n if (value === '') return undefined;\n\n if (value.startsWith('[')) {\n const close = value.indexOf(']');\n if (close === -1) return undefined;\n const hostname = value.slice(1, close);\n const rest = value.slice(close + 1);\n if (rest === '') return { hostname, port: DEFAULT_HTTP_PORT };\n if (!rest.startsWith(':')) return undefined;\n return withPort(hostname, rest.slice(1));\n }\n\n const colon = value.indexOf(':');\n if (colon === -1) return { hostname: value, port: DEFAULT_HTTP_PORT };\n // An unbracketed second colon is a bare IPv6 literal, which is malformed in a\n // Host header — refuse rather than guess where the port starts.\n if (value.indexOf(':', colon + 1) !== -1) return undefined;\n return withPort(value.slice(0, colon), value.slice(colon + 1));\n}\n\nfunction withPort(hostname: string, port: string): { hostname: string; port: number } | undefined {\n if (!/^\\d+$/.test(port)) return undefined;\n return { hostname, port: Number(port) };\n}\n","import { Hono } from 'hono';\nimport type { Server } from 'http';\nimport type { Duplex } from 'stream';\nimport { sessionsRoute } from './routes/sessions';\nimport { plansRoute } from './routes/plans';\nimport { runnersRoute } from './routes/runners';\nimport { modelsRoute } from './routes/models';\nimport { workspacesRoute } from './routes/workspaces';\nimport { approvalsRoute } from './routes/approvals';\nimport { settingsRoute } from './routes/settings';\nimport { commandsRoute } from './routes/commands';\nimport { createWsHandler } from './ws/stream';\nimport {\n decideAdmission,\n type AdmissionContext,\n type AdmissionDecision,\n} from './security/admission';\nimport { OrchestratorPool } from './pool/orchestratorPool';\n\nexport function createApp(pool: OrchestratorPool, admission: AdmissionContext) {\n const app = new Hono();\n\n // There is no CORS allowlist: the daemon ships no browser front end, so a\n // browser has no legitimate reason to reach it at all. The bearer token\n // supersedes it, and covers every local caller rather than only browsers.\n app.use('*', async (c, next) => {\n const decision = decideAdmission({\n origin: c.req.header('origin') ?? null,\n // The request URL's authority is built from the Host header upstream, so\n // it is the same value; the fallback only matters when the header is\n // absent entirely, which fails the check anyway.\n host: c.req.header('host') ?? new URL(c.req.url).host,\n authorization: c.req.header('authorization') ?? null,\n }, admission);\n if (!decision.admit) return c.json({ error: decision.reason }, decision.status as 401 | 403);\n await next();\n });\n\n app.route('/api/sessions', sessionsRoute(pool));\n app.route('/api/plans', plansRoute(pool));\n app.route('/api/runners', runnersRoute(pool));\n app.route('/api/models', modelsRoute(pool));\n app.route('/api/settings', settingsRoute(pool));\n app.route('/api/commands', commandsRoute());\n app.route('/api/workspaces', workspacesRoute());\n app.route('/api/approvals', approvalsRoute(pool));\n\n return app;\n}\n\nexport function attachWsHandler(server: Server, pool: OrchestratorPool, admission: AdmissionContext) {\n const handler = createWsHandler(pool);\n server.on('upgrade', (request, socket, head) => {\n const decision = decideAdmission({\n origin: request.headers.origin ?? null,\n host: request.headers.host ?? null,\n authorization: request.headers.authorization ?? null,\n secWebSocketProtocol: request.headers['sec-websocket-protocol'] ?? null,\n }, admission);\n if (!decision.admit) {\n refuseUpgrade(socket, decision);\n return;\n }\n\n const url = new URL(request.url ?? '', `http://${request.headers.host}`);\n if (url.pathname.startsWith('/ws/session/')) {\n handler(request, socket, head);\n } else {\n socket.destroy();\n }\n });\n}\n\nconst REASON_PHRASE: Record<number, string> = { 401: 'Unauthorized', 403: 'Forbidden' };\n\nfunction refuseUpgrade(socket: Duplex, decision: Extract<AdmissionDecision, { admit: false }>): void {\n const body = JSON.stringify({ error: decision.reason });\n socket.end(\n `HTTP/1.1 ${decision.status} ${REASON_PHRASE[decision.status] ?? 'Forbidden'}\\r\\n` +\n 'Connection: close\\r\\n' +\n 'Content-Type: application/json\\r\\n' +\n `Content-Length: ${Buffer.byteLength(body)}\\r\\n` +\n `\\r\\n${body}`,\n );\n socket.destroy();\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport type { Hono } from 'hono';\n\n/**\n * Bridges node's http server onto the Hono app. Kept out of `main.ts` so the\n * real request path — including the Host header the admission check reads — is\n * testable against a listening server.\n */\nexport function createRequestListener(app: Hono) {\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const bufs: Buffer[] = [];\n for await (const chunk of req) bufs.push(chunk as Buffer);\n const body = bufs.length > 0 ? Buffer.concat(bufs).toString() : undefined;\n\n const url = `http://${req.headers.host || 'localhost'}${req.url}`;\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers)) {\n if (v) {\n if (Array.isArray(v)) v.forEach(vv => headers.append(k, vv));\n else headers.set(k, v as string);\n }\n }\n if (body && !headers.has('content-type')) headers.set('content-type', 'application/json');\n\n const webReq = new Request(url, {\n method: req.method || 'GET',\n headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? body : undefined,\n });\n\n try {\n const webRes = await app.fetch(webReq);\n res.writeHead(webRes.status, Object.fromEntries(webRes.headers.entries()));\n if (webRes.body) {\n const reader = webRes.body.getReader();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n }\n res.end();\n } catch (err) {\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: err instanceof Error ? (err as Error).message : 'Internal server error' }));\n }\n }\n };\n}\n","#!/usr/bin/env node\nimport { createApp, attachWsHandler } from './app';\nimport { createRequestListener } from './nodeAdapter';\nimport { OrchestratorPool } from './pool/orchestratorPool';\nimport { createServer } from 'http';\nimport { clearDaemonToken, mintDaemonToken, StructuredRunner } from '@ordewell/core';\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// 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 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));\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 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\nprocess.on('SIGINT', () => { shutdown(); });\nprocess.on('SIGTERM', () => { shutdown(); });\nprocess.on('SIGHUP', () => { shutdown(); });\n\nif (watchParentPid) {\n const parentCheck = setInterval(() => {\n try {\n process.kill(watchParentPid, 0);\n } catch {\n clearInterval(parentCheck);\n shutdown();\n }\n }, 5000);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../server/adapters/WebConfig.ts","../../server/utils/workspaceScanner.ts","../../server/adapters/run.ts","../../server/adapters/PoolFileSystem.ts","../../server/adapters/PoolAwareRunner.ts","../../server/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","ModelResolver","CodexSandboxAvailability","nodeSpawn","detectInstalledPlanner","PlannerNotReadyError","PlannerTurnStoppedError","PlannerTurnDiscardedError","sessionRuntimeSettings","assertWorkspaceExists","assertWorkspaceIsProject","WorkspaceNotAProjectError","ensureStateDirIgnored","createSession","runnerForProvider","admitSettingsEnv","selectPlanner","PROVIDER_CREDENTIAL_ENV","configuredProviders","runnerModesFrom","migratePlanState","installedPlannerAnswered","loadSession","SessionNotFoundError","scanWorkspaces","listSessions","deleteSession","NoPlanError","AlreadyExecutingError","WorkspaceNotFoundError","ConversationBusyError","ConversationEditError","PlanEditError","TaskControlError","pool","Hono","loadSessionPlanState","run","surfacePlanState","surfacePlan","listTaskLogAttempts","taskLogForSurface","readTaskLog","resolveUserTaskRef","flattenTasks","installedPlannerDetected","toApprovalDecision","isGranted","RunSettingsError","WebSocketServer","DAEMON_SUBPROTOCOL","tokensMatch","extractPresentedToken","port","server","createServer","mintDaemonToken"],"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}\n\n/**\n * Cap on a single child's buffered output. Above this, Node kills the child\n * and invokes the callback with `err.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER'`\n * — a string, so the coercion below maps it to `1` (see `run`).\n */\nexport const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;\n\n/**\n * The single primitive every search/inspection adapter in this package is\n * built on: spawn a child, never reject. Kept in its own module so the\n * contract that the planner depends on — synchronous spawn failures degrade\n * to a failed tool call, never a rejected promise that aborts the whole\n * planner turn — can be pinned by a focused test rather than exercised only\n * incidentally through the public adapter API.\n *\n * Node hands only ENOENT/EAGAIN/EMFILE/ENFILE from spawn(2) to the\n * callback; every other errno — ENOTDIR for a `cwd` that is a file, EACCES\n * for one it cannot enter — is thrown synchronously. Thrown in here that\n * rejects the promise, and no caller of `run` catches, so a single bad\n * search argument aborted the entire planner turn as \"Plan generation\n * failed: spawn ENOTDIR\". A failed spawn is a failed tool call, never a\n * failed plan.\n */\nexport function run(\n file: string,\n args: string[],\n opts: { cwd?: string; timeout: number; shell?: boolean; env?: NodeJS.ProcessEnv; signal?: AbortSignal },\n): Promise<ExecResult> {\n return new Promise((resolve) => {\n try {\n execFile(file, args, {\n cwd: opts.cwd,\n timeout: opts.timeout,\n maxBuffer: MAX_OUTPUT_BYTES,\n encoding: 'utf8',\n shell: opts.shell,\n env: opts.env,\n // Node kills the child when this aborts, and calls back with an\n // ABORT_ERR — which lands on the `code: 1` branch below, i.e. a\n // failed tool call, exactly like any other command that did not\n // finish. Stopping the planner must not leave a research `bash`\n // running out its own timeout on the server.\n signal: opts.signal,\n }, (err, stdout, stderr) => {\n const code = err && typeof (err as { code?: unknown }).code === 'number' ? (err as { code: number }).code : err ? 1 : 0;\n resolve({ stdout: stdout ?? '', stderr: stderr ?? '', code });\n });\n } catch (err) {\n // `code: null` rather than 1 on purpose: the search adapters read 0 and 1\n // as \"ran, possibly no matches\", so a 1 here would report a confident\n // \"No matches found.\" for a search that never executed.\n resolve({ stdout: '', stderr: (err as Error).message, code: null });\n }\n });\n}","import {\n BaseFileSystem,\n buildGrepArgs,\n buildGlobArgs,\n buildFallbackGrepArgs,\n GREP_PCRE_PROBE_ARGS,\n grepRegexFromProbe,\n 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 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, signal?: AbortSignal): Promise<ToolOutcome> {\n // `shell: true` is required now that approved commands may legitimately\n // contain pipes; the tier classifier in core (not string filtering here)\n // is what decides whether this command was allowed to reach the shell.\n //\n // `file: null` is that host default, unchanged on POSIX. A resolved file is\n // the POSIX shell found on a Windows box, invoked explicitly so the command\n // runs in the dialect `BaseFileSystem` classified it under.\n const { file, args } = this.researchShell;\n const result = file === null\n ? await run(command, [], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, shell: true, signal })\n : await run(file, [...args, command], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, signal });\n const out = (result.stdout || '').trim();\n const err = (result.stderr || '').trim();\n\n // A stopped turn reports as a stop, not as a mysterious non-zero exit: the\n // child was killed on purpose and there is nothing here to diagnose.\n if (signal?.aborted) return { success: false, output: STOPPED_TOOL_RESULT, truncated: false };\n\n if (result.code !== 0) {\n const detail = err || out || `exited with code ${result.code}`;\n // A failing command is still research: the model asked to diagnose, and\n // the failure output is usually the answer. Report it, do not swallow it.\n return { success: false, output: `Command exited ${result.code}:\\n${detail.slice(0, 20_000)}`, truncated: detail.length > 20_000 };\n }\n\n const combined = err ? `${out}\\n[stderr]\\n${err}` : out;\n return { success: true, output: combined || '(no output)', truncated: combined.length > 20_000 };\n }\n}\n","import 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 { WebSocket } from 'ws';\nimport {\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} 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 /**\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\nexport class OrchestratorPool {\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 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\n constructor(deps: OrchestratorPoolDeps = {}) {\n const pluginNotice = removedPluginNotice();\n if (pluginNotice) console.warn(pluginNotice);\n this.runner = deps.runner ?? new StructuredRunner();\n this.runnerInstallation = deps.runnerInstallation ?? new RunnerInstallation(this.registry);\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 }\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 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 }\n\n unsubscribe(sessionId: string, ws: WebSocket): void {\n this.clients.get(sessionId)?.delete(ws);\n if (this.clients.get(sessionId)?.size === 0) this.clients.delete(sessionId);\n }\n\n private broadcast(sessionId: string, msg: SessionMessage | SessionNotice): void {\n const 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'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 });\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(): SettingsResponse {\n const config = this.plannerConfig();\n const userSettings = this.settingsService.getAll();\n return {\n orchestratorModel: config.orchestratorModel,\n // Who plans (ADR-0009) — a vendor id, or one of the three harness\n // planners. Surfaces need it to render the planner picker and to know\n // whether the planner model comes from a runner catalog or a vendor one.\n aiProvider: config.aiProvider,\n // A harness planner's thinking effort (ADR-0009). Surfaces need it back\n // to render the current level; without it the picker shows \"default\"\n // for a planner that is running at \"high\".\n plannerThinkingEffort: config.plannerThinkingEffort ?? '',\n maxParallel: config.maxParallelSessions,\n 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 run: 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' runs keep\n * theirs. Throws a {@link RunSettingsError}, saving nothing, for a value\n * 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();\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>): 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 (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();\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 * Runners whose CLI is actually installed on the host, with display name and\n * enabled state. Only these should be offered for selection — an uninstalled\n * runner can't be spawned.\n */\n async getInstalledRunners(): Promise<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 this.runnerInstallation.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 this.runnerInstallation.filterInstalled(runners.map((p) => p.manifest.name)),\n );\n return runners\n .filter((p) => installedIds.has(p.manifest.name))\n .map((p) => ({\n id: p.manifest.name,\n name: p.manifest.displayName,\n enabled: enabled.has(p.manifest.name),\n }));\n }\n\n async generatePlan(sessionId: string, goal: string, runners: RunnerId[] | undefined, workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<PlanState> {\n const session = this.openPlanningSession(sessionId, workspace, modelOverride, options);\n return migratePlanState(await this.firstTurn(sessionId, session, () => session.generatePlan(goal, runners)));\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, 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.\n if (installedPlannerAnswered()) session.assertPlannerReady();\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.sessions.set(sessionId, 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 session = this.openPlanningSession(sessionId, 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 return this.session(sessionId).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 compaction = await session.compactConversation();\n return { ...compaction, plan: session.planState! };\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.\n session.loadPlan(saved.plan, saved.meta.goal, workspace, { sessionId: saved.meta.id });\n // A live session with no plan yet is mid-planning; replacing it must stop that turn.\n this.destroy(sessionId);\n this.sessions.set(sessionId, session);\n\n return session.planState ?? saved.plan;\n }\n\n /**\n * Fork a session's conversation into a new session and adopt it, so the\n * fork is addressable at once — through the same path a saved session is\n * adopted by, reading back the file the fork was written to. The original\n * keeps running, or planning, untouched.\n */\n forkConversation(sessionId: string): AdoptedFork {\n return this.adoptFork(this.session(sessionId).forkConversation());\n }\n\n /** A rewind is a fork from an earlier point, so it is adopted the same way. */\n rewindConversation(sessionId: string, index: number): AdoptedFork & { rewoundMessage: string } {\n const fork = this.session(sessionId).rewindConversation(index);\n return { ...this.adoptFork(fork), rewoundMessage: fork.rewoundMessage };\n }\n\n private adoptFork(fork: ConversationFork): AdoptedFork {\n return { sessionId: fork.sessionId, goal: fork.goal, plan: this.adoptSavedSession(fork.sessionId, fork.workspace) };\n }\n\n /**\n * Direct access to a session's interface — routes call the Session; the\n * pool only registers sessions and fans broadcasts out to WS clients.\n */\n session(sessionId: string): Session {\n const session = this.sessions.get(sessionId);\n if (!session) throw new SessionNotFoundError();\n return session;\n }\n\n destroy(sessionId: string): void {\n this.sessions.get(sessionId)?.destroy();\n this.sessions.delete(sessionId);\n }\n\n destroyAll(): void { for (const id of this.sessions.keys()) this.destroy(id); }\n}\n\nexport const scanWorkspaces = scanWorkspacesImpl;\n\nexport function getSessionList(workspace: string) { return listSessions(workspace); }\nexport function getSession(sessionId: string, workspace: string) { return loadSession(sessionId, workspace); }\nexport function removeSession(sessionId: string, workspace: string) { return deleteSession(sessionId, workspace); }\n\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 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/**\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 SessionNotFoundError) return { status: 404, code: 'session_not_found' };\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 };\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 return c.json({ meta: saved.meta, plan: surfacePlanState(pool.getPlanState(id) ?? saved.plan), ...(run ? { run } : {}) } 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 return c.json({ ok: true, plan: surfacePlan(plan), goal: pool.getGoal(id), ...(run ? { run } : {}) } 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 pool.destroy(id);\n const ok = removeSession(id, ws);\n return c.json({ ok } 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'));\n return c.json({ ok: true } satisfies OkResponse);\n });\n\n return router;\n}\n","import { Hono, type Context, type Env } from 'hono';\nimport {\n flattenTasks,\n NoPlanError,\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 ExecuteResponse,\n type TaskStartResponse,\n type ExecutionCommand,\n type ForceSendResponse,\n type GeneratePlanResponse,\n type IsolationDiffResponse,\n type IsolationMergeResponse,\n type MergeGateResponse,\n type OkResponse,\n type PlanResponse,\n type PrdResponse,\n type RemoveMessageResponse,\n type ResolveConflictResponse,\n type RewindTargetsResponse,\n type StopResponse,\n type TaskMessageResponse,\n type CancelPlanningResponse,\n type CancelResumeResponse,\n} from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\nimport { failure, 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 c.req.json();\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n const queryRunners = c.req.query('runners');\n // No runners in the request means \"whatever is enabled\", not claude-code:\n // a hard-coded default here contradicts the /runners toggle state and\n // fails planning for anyone who disabled claude-code. 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 // A task paused on a usage limit then waits for a manual retry.\n router.post('/:sessionId/tasks/:taskId/resume/cancel', async (c) => {\n try {\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'cancel_resume', task: c.req.param('taskId') });\n return c.json({ cancelled: true, message } satisfies CancelResumeResponse);\n } catch (err) {\n return failure(c, err, 'cancel resume');\n }\n });\n\n // Task controls — these spawn or kill runner processes, or settle a task's\n // state, so they are deliberately separate from the generic `PUT tasks/:taskId`\n // status patch. Each is an execution button, so it goes through the command\n // seam as the user (ADR-0029) and answers in the seam's words. Force start\n // has its own route below, since it also answers the line saying it is queued.\n for (const [segment, command] of [\n ['run', (id: string): ExecutionCommand => ({ command: 'run_task', task: id })],\n ['retry', (id: string): ExecutionCommand => ({ command: 'retry_task', task: id, from: 'fresh' })],\n ['cancel', (id: string): ExecutionCommand => ({ command: 'stop_task', task: id })],\n ['complete', (id: string): ExecutionCommand => ({ command: 'mark_complete', task: id })],\n ['uncomplete', (id: string): ExecutionCommand => ({ command: 'mark_not_done', task: id })],\n // The user says the limit has reset early: the task, and every other one waiting on its runner's reset, resumes in its saved session now.\n ['resume/now', (id: string): ExecutionCommand => ({ command: 'retry_task', task: id, from: 'session' })],\n ['interrupt', (id: string): ExecutionCommand => ({ command: 'interrupt_task', task: id })],\n ] as const) {\n router.post(`/:sessionId/tasks/:taskId/${segment}`, async (c) => {\n try {\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), command(c.req.param('taskId')));\n return c.json({ ok: true, message } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, segment);\n }\n });\n }\n\n // Skip ends the task without landing its work (never a mark complete); the user's reason is optional.\n router.post('/:sessionId/tasks/:taskId/skip', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const reason = typeof body === 'object' && body !== null && 'reason' in body && typeof body.reason === 'string' ? body.reason : undefined;\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'skip_task', task: c.req.param('taskId'), ...(reason ? { reason } : {}) });\n return c.json({ ok: true, message } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'skip');\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/force-start', async (c) => {\n try {\n const { message, payload } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'force_start', task: c.req.param('taskId') });\n return c.json({ ok: true, ...(payload?.kind === 'queued' ? { queued: payload.line } : {}), message } satisfies TaskStartResponse);\n } catch (err) {\n return failure(c, err, 'force-start');\n }\n });\n\n // Talking to a task (ADR-0018, M1). A task not running is refused with\n // the reason. Force send\n // (ADR-0023, F1) is the same request: it interrupts the running turn and\n // delivers this message next, ahead of anything queued.\n const messageHandler = (send: (session: ReturnType<typeof pool.session>, taskId: string, text: string) => Promise<string>) => async (c: Context<Env, '/:sessionId/tasks/:taskId/messages'>) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const text = typeof body === 'object' && body !== null && 'text' in body ? body.text : undefined;\n if (typeof text !== 'string' || !text.trim()) return c.json({ error: 'text is required' }, 400);\n const id = await send(pool.session(c.req.param('sessionId')), c.req.param('taskId'), text);\n return c.json({ id } satisfies TaskMessageResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n };\n\n // A message reaches the task through the command seam as the user (ADR-0029),\n // so it lands in the timeline.\n const sendMessage = (force: boolean) => messageHandler(async (session, taskId, text) => {\n const { payload } = await runUserCommand(session, { command: 'message_task', task: taskId, text, ...(force ? { force } : {}) });\n return payload?.kind === 'message' ? payload.id : '';\n });\n router.post('/:sessionId/tasks/:taskId/messages', sendMessage(false));\n router.post('/:sessionId/tasks/:taskId/messages/now', sendMessage(true));\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 // Force send a message queued behind the running turn; one already\n // delivered is refused with the reason.\n router.post('/:sessionId/tasks/:taskId/messages/:messageId/now', async (c) => {\n try {\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'force_send_queued', task: c.req.param('taskId'), id: c.req.param('messageId') });\n return c.json({ sent: true, message } satisfies ForceSendResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n // Continue a finished structured task in its saved session (ADR-0018, K1),\n // through the command seam as the user (ADR-0029). A task that cannot be\n // continued is refused with the reason.\n router.post('/:sessionId/tasks/:taskId/continue', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const text = typeof body === 'object' && body !== null && 'text' in body ? body.text : undefined;\n if (typeof text !== 'string' || !text.trim()) return c.json({ error: 'text is required' }, 400);\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'retry_task', task: c.req.param('taskId'), from: 'session', message: text });\n return c.json({ ok: true, message } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId/messages/:messageId', async (c) => {\n try {\n const { message } = await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'remove_queued', task: c.req.param('taskId'), id: c.req.param('messageId') });\n return c.json({ removed: true, message } satisfies RemoveMessageResponse);\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; the daemon contract\n // keeps that distinct as the 409 a surface says instead of claiming success.\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 c.req.json();\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 c.req.json();\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 router.post('/:sessionId/tasks/merge', async (c) => {\n try {\n const { taskIds } = await c.req.json();\n if (!taskIds || !Array.isArray(taskIds) || taskIds.length < 2) {\n return c.json({ error: 'taskIds array with at least two ids is required' }, 400);\n }\n const plan = await pool.session(c.req.param('sessionId')).requestMerge(taskIds);\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'merge', { fallback: 400 });\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/split', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).requestSplit(c.req.param('taskId'));\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\n } catch (err) {\n return failure(c, err, 'split', { fallback: 400 });\n }\n });\n\n // Conversational planning (ADR-0002): start the planner dialogue. The\n // response's plan carries conversationHistory; when tasks are non-empty the\n // planner committed the plan.\n router.post('/:sessionId/converse/start', async (c) => {\n try {\n const { goal, runners, workspace, model, allowInit } = await c.req.json();\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n // 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 c.req.json();\n if (!message) return c.json({ error: 'message is required' }, 400);\n const plan = await pool.continuePlanning(c.req.param('sessionId'), message);\n return c.json({ plan: 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 c.req.json();\n if (!message) return c.json({ error: 'message is required' }, 400);\n const plan = await pool.session(c.req.param('sessionId')).forceSendPrompt(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 c.req.json();\n if (!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 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';\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.\n const runners = await pool.getInstalledRunners();\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 // 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 body = await c.req.json();\n pool.setRunnerEnabled(id, body.enabled);\n return c.json({ ok: true } satisfies OkResponse);\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 type { WorkspacesResponse } from '@ordewell/core';\nimport { scanWorkspaces } from '../pool/orchestratorPool';\n\nexport function workspacesRoute() {\n const router = new Hono();\n\n router.get('/', (c) => {\n const workspaces = scanWorkspaces();\n return c.json({ workspaces } 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 { 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 const settings: SettingsResponse = pool.getSettings();\n return c.json(settings);\n });\n\n router.patch('/', async (c) => {\n await installedPlannerDetected();\n const body: unknown = await c.req.json();\n if (!body || typeof body !== 'object' || Array.isArray(body) || 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, ...rest } = body as Record<string, unknown>;\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 if (sessionId !== undefined && typeof sessionId !== 'string') return refuse(c, 400, 'sessionId must be a string');\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 ? pool.updateSettings(rest) : pool.getSettings();\n return c.json(result);\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 } 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 pool.subscribe(sessionId, ws);\n });\n\n return (request: IncomingMessage, socket: Duplex, head: Buffer) => {\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit('connection', ws, request);\n });\n };\n}\n","/**\n * The single admission decision for the daemon.\n *\n * Both the HTTP middleware and the WebSocket upgrade handler call this. The\n * sharing is the point: the two paths drifting apart is how the upgrade ended\n * up validating nothing while the HTTP routes had a CORS allowlist.\n */\n\nimport { extractPresentedToken, tokensMatch } from '@ordewell/core';\n\n/** `localhost` is included because clients dial it by name; the daemon binds loopback only. */\nconst LOOPBACK_HOSTNAMES = new Set(['localhost', '127.0.0.1', '::1']);\n\nexport interface AdmissionHeaders {\n /** `null`/`undefined` mean absent. An empty string still counts as present. */\n origin?: string | null;\n host?: string | null;\n /** `Authorization: Bearer <token>` — how the token travels on HTTP routes. */\n authorization?: string | null;\n /** `Sec-WebSocket-Protocol` — how it travels on the upgrade, so it stays out of logs. */\n secWebSocketProtocol?: string | null;\n}\n\n/** What this daemon is: which port it bound, and which token it minted. */\nexport interface AdmissionContext {\n port: number;\n token: string;\n /** Named in a token rejection, so a stale token is diagnosable rather than a bare failure. */\n tokenFile: string;\n}\n\nexport type AdmissionDecision =\n | { admit: true }\n | { admit: false; status: number; reason: string };\n\nconst ADMIT: AdmissionDecision = { admit: true };\n\nexport function decideAdmission(\n headers: AdmissionHeaders,\n context: AdmissionContext,\n): AdmissionDecision {\n if (headers.origin !== undefined && headers.origin !== null) {\n return {\n admit: false,\n status: 403,\n reason: 'Refused: requests carrying an Origin header are not accepted. The Ordewell daemon has no browser client.',\n };\n }\n\n if (!isOwnLoopbackAuthority(headers.host, context.port)) {\n return {\n admit: false,\n status: 403,\n reason: `Refused: the Host header must name loopback (localhost, 127.0.0.1 or [::1]) at port ${context.port}.`,\n };\n }\n\n if (!tokensMatch(extractPresentedToken(headers), context.token)) {\n return {\n admit: false,\n status: 401,\n reason:\n 'Unauthenticated: this request did not present the daemon\\'s bearer token. '\n + `Ordewell clients read it from ${context.tokenFile}; if that file is stale, `\n + 'restart the daemon (`ordewell web --daemon`) to mint a fresh one.',\n };\n }\n\n return ADMIT;\n}\n\n/**\n * Rejecting anything but our own loopback authority is what closes DNS\n * rebinding: a page rebinding a hostname it controls to 127.0.0.1 still sends\n * that hostname in `Host`, and same-origin requests to it carry no `Origin`.\n */\nfunction isOwnLoopbackAuthority(host: string | null | undefined, port: number): boolean {\n if (!host) return false;\n const authority = splitAuthority(host);\n if (!authority) return false;\n if (!LOOPBACK_HOSTNAMES.has(authority.hostname.toLowerCase())) return false;\n return authority.port === port;\n}\n\n/** Absent port means the scheme default; the daemon only ever speaks http. */\nconst DEFAULT_HTTP_PORT = 80;\n\nfunction splitAuthority(host: string): { hostname: string; port: number } | undefined {\n const value = host.trim();\n if (value === '') return undefined;\n\n if (value.startsWith('[')) {\n const close = value.indexOf(']');\n if (close === -1) return undefined;\n const hostname = value.slice(1, close);\n const rest = value.slice(close + 1);\n if (rest === '') return { hostname, port: DEFAULT_HTTP_PORT };\n if (!rest.startsWith(':')) return undefined;\n return withPort(hostname, rest.slice(1));\n }\n\n const colon = value.indexOf(':');\n if (colon === -1) return { hostname: value, port: DEFAULT_HTTP_PORT };\n // An unbracketed second colon is a bare IPv6 literal, which is malformed in a\n // Host header — refuse rather than guess where the port starts.\n if (value.indexOf(':', colon + 1) !== -1) return undefined;\n return withPort(value.slice(0, colon), value.slice(colon + 1));\n}\n\nfunction withPort(hostname: string, port: string): { hostname: string; port: number } | undefined {\n if (!/^\\d+$/.test(port)) return undefined;\n return { hostname, port: Number(port) };\n}\n","import { Hono } from 'hono';\nimport type { Server } from 'http';\nimport type { Duplex } from 'stream';\nimport { sessionsRoute } from './routes/sessions';\nimport { plansRoute } from './routes/plans';\nimport { runnersRoute } from './routes/runners';\nimport { modelsRoute } from './routes/models';\nimport { workspacesRoute } from './routes/workspaces';\nimport { approvalsRoute } from './routes/approvals';\nimport { settingsRoute } from './routes/settings';\nimport { commandsRoute } from './routes/commands';\nimport { createWsHandler } from './ws/stream';\nimport {\n decideAdmission,\n type AdmissionContext,\n type AdmissionDecision,\n} from './security/admission';\nimport { OrchestratorPool } from './pool/orchestratorPool';\n\nexport function createApp(pool: OrchestratorPool, admission: AdmissionContext) {\n const app = new Hono();\n\n // There is no CORS allowlist: the daemon ships no browser front end, so a\n // browser has no legitimate reason to reach it at all. The bearer token\n // supersedes it, and covers every local caller rather than only browsers.\n app.use('*', async (c, next) => {\n const decision = decideAdmission({\n origin: c.req.header('origin') ?? null,\n // The request URL's authority is built from the Host header upstream, so\n // it is the same value; the fallback only matters when the header is\n // absent entirely, which fails the check anyway.\n host: c.req.header('host') ?? new URL(c.req.url).host,\n authorization: c.req.header('authorization') ?? null,\n }, admission);\n if (!decision.admit) return c.json({ error: decision.reason }, decision.status as 401 | 403);\n await next();\n });\n\n app.route('/api/sessions', sessionsRoute(pool));\n app.route('/api/plans', plansRoute(pool));\n app.route('/api/runners', runnersRoute(pool));\n app.route('/api/models', modelsRoute(pool));\n app.route('/api/settings', settingsRoute(pool));\n app.route('/api/commands', commandsRoute());\n app.route('/api/workspaces', workspacesRoute());\n app.route('/api/approvals', approvalsRoute(pool));\n\n return app;\n}\n\nexport function attachWsHandler(server: Server, pool: OrchestratorPool, admission: AdmissionContext) {\n const handler = createWsHandler(pool);\n server.on('upgrade', (request, socket, head) => {\n const decision = decideAdmission({\n origin: request.headers.origin ?? null,\n host: request.headers.host ?? null,\n authorization: request.headers.authorization ?? null,\n secWebSocketProtocol: request.headers['sec-websocket-protocol'] ?? null,\n }, admission);\n if (!decision.admit) {\n refuseUpgrade(socket, decision);\n return;\n }\n\n const url = new URL(request.url ?? '', `http://${request.headers.host}`);\n if (url.pathname.startsWith('/ws/session/')) {\n handler(request, socket, head);\n } else {\n socket.destroy();\n }\n });\n}\n\nconst REASON_PHRASE: Record<number, string> = { 401: 'Unauthorized', 403: 'Forbidden' };\n\nfunction refuseUpgrade(socket: Duplex, decision: Extract<AdmissionDecision, { admit: false }>): void {\n const body = JSON.stringify({ error: decision.reason });\n socket.end(\n `HTTP/1.1 ${decision.status} ${REASON_PHRASE[decision.status] ?? 'Forbidden'}\\r\\n` +\n 'Connection: close\\r\\n' +\n 'Content-Type: application/json\\r\\n' +\n `Content-Length: ${Buffer.byteLength(body)}\\r\\n` +\n `\\r\\n${body}`,\n );\n socket.destroy();\n}\n","import type { IncomingMessage, ServerResponse } from 'http';\nimport type { Hono } from 'hono';\n\n/**\n * Bridges node's http server onto the Hono app. Kept out of `main.ts` so the\n * real request path — including the Host header the admission check reads — is\n * testable against a listening server.\n */\nexport function createRequestListener(app: Hono) {\n return async (req: IncomingMessage, res: ServerResponse): Promise<void> => {\n const bufs: Buffer[] = [];\n for await (const chunk of req) bufs.push(chunk as Buffer);\n const body = bufs.length > 0 ? Buffer.concat(bufs).toString() : undefined;\n\n const url = `http://${req.headers.host || 'localhost'}${req.url}`;\n const headers = new Headers();\n for (const [k, v] of Object.entries(req.headers)) {\n if (v) {\n if (Array.isArray(v)) v.forEach(vv => headers.append(k, vv));\n else headers.set(k, v as string);\n }\n }\n if (body && !headers.has('content-type')) headers.set('content-type', 'application/json');\n\n const webReq = new Request(url, {\n method: req.method || 'GET',\n headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? body : undefined,\n });\n\n try {\n const webRes = await app.fetch(webReq);\n res.writeHead(webRes.status, Object.fromEntries(webRes.headers.entries()));\n if (webRes.body) {\n const reader = webRes.body.getReader();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n }\n res.end();\n } catch (err) {\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: err instanceof Error ? (err as Error).message : 'Internal server error' }));\n }\n }\n };\n}\n","#!/usr/bin/env node\nimport { createApp, attachWsHandler } from './app';\nimport { createRequestListener } from './nodeAdapter';\nimport { OrchestratorPool } from './pool/orchestratorPool';\nimport { createServer } from 'http';\nimport { clearDaemonToken, mintDaemonToken, StructuredRunner } from '@ordewell/core';\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// 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 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));\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 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\nprocess.on('SIGINT', () => { shutdown(); });\nprocess.on('SIGTERM', () => { shutdown(); });\nprocess.on('SIGHUP', () => { shutdown(); });\n\nif (watchParentPid) {\n const parentCheck = setInterval(() => {\n try {\n process.kill(watchParentPid, 0);\n } catch {\n clearInterval(parentCheck);\n shutdown();\n }\n }, 5000);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ordewell/web",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.11",
|
|
4
4
|
"description": "Ordewell local API server — the daemon the Ordewell CLI and TUI talk to.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Alessandro Costanzo Ciano",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"typecheck": "tsc --noEmit"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@ordewell/core": "^0.10.
|
|
42
|
+
"@ordewell/core": "^0.10.11",
|
|
43
43
|
"hono": "^4.6.0",
|
|
44
44
|
"@hono/node-server": "^1.13.0",
|
|
45
45
|
"ws": "^8.18.0"
|