@ordewell/web 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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","isCliProvider","resolveProvider","normalizeGeminiModel","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","STOPPED_TOOL_RESULT","RunnerRegistry","RunnerInstallation","SettingsService","PlannerModelMemory","removedPluginNotice","StructuredRunner","ModelResolver","sessionRuntimeSettings","assertWorkspaceExists","assertWorkspaceIsProject","WorkspaceNotAProjectError","ensureStateDirIgnored","createSession","runnerForProvider","admission","admitSettingsEnv","PROVIDER_CREDENTIAL_ENV","configuredProviders","runnerModesFrom","migratePlanState","loadSession","SessionNotFoundError","scanWorkspaces","listSessions","deleteSession","NoPlanError","AlreadyExecutingError","WorkspaceNotFoundError","PlannerTurnStoppedError","PlannerTurnDiscardedError","ConversationBusyError","ConversationEditError","PlanEditError","TaskControlError","pool","Hono","loadSessionPlanState","surfacePlanState","surfacePlan","listTaskLogAttempts","taskLogForSurface","readTaskLog","run","flattenTasks","toApprovalDecision","isGranted","WebSocketServer","DAEMON_SUBPROTOCOL","tokensMatch","extractPresentedToken","port","app","server","mintDaemonToken","createServer","clearDaemonToken"],"mappings":"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","file":"main.js","sourcesContent":["import { AiProvider, BaseConfig, DEFAULT_RUNNERS, isCliProvider, normalizeGeminiModel, resolveProvider } from '@ordewell/core';\nimport type { ProviderModelLists } from '@ordewell/core';\n\ninterface WebConfigOpts {\n enabledRunners?: string[];\n providerModelLists?: ProviderModelLists;\n modelOverride?: string;\n}\n\nexport class WebConfig extends BaseConfig {\n private _provider: AiProvider | null = null;\n private _providerCacheKey: string | null = null;\n private _providerCacheLists: ProviderModelLists | undefined = undefined;\n private _enabledRunnersOverride: string[] | undefined;\n private _providerModelLists: ProviderModelLists | undefined;\n private _modelOverride: string | undefined;\n\n constructor(opts?: WebConfigOpts) {\n super();\n this._enabledRunnersOverride = opts?.enabledRunners;\n this._providerModelLists = opts?.providerModelLists;\n this._modelOverride = opts?.modelOverride;\n }\n\n setProviderModelLists(lists: ProviderModelLists): void {\n this._providerModelLists = lists;\n this._provider = null;\n }\n\n get orchestratorModel(): string {\n return this._modelOverride || process.env.ORCHESTRATOR_MODEL || '';\n }\n\n get aiProvider(): AiProvider {\n // Memoized by cache key rather than forever: a session's WebConfig lives\n // for the whole session, but /model and /planner switches mutate process.env\n // mid-session, so a permanent cache would strand the transport on the old\n // provider (mirrors the live-read behavior of `orchestratorModel` above).\n const explicitEnv = process.env.AI_PROVIDER;\n const model = this._modelOverride || process.env.ORCHESTRATOR_MODEL;\n const cacheKey = `${explicitEnv ?? ''}|${model ?? ''}`;\n if (\n this._provider &&\n this._providerCacheKey === cacheKey &&\n this._providerCacheLists === this._providerModelLists\n ) {\n return this._provider;\n }\n\n // An explicitly chosen harness planner (ADR-0009) wins over model-based\n // resolution: its model ids are the agent's own (`sonnet`, `gpt-5.6-sol`)\n // and can collide with a vendor catalog, which would silently route the\n // planner back to an API the user may not even have a key for.\n const explicit = explicitEnv as AiProvider | undefined;\n if (explicit && isCliProvider(explicit)) {\n this._provider = explicit;\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n\n if (model && this._providerModelLists) {\n const resolved = resolveProvider(model, this._providerModelLists);\n if (resolved) {\n this._provider = resolved;\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n }\n\n this._provider = BaseConfig.detectProvider('openrouter');\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n\n get apiKey(): string {\n return this.getProviderApiKey(this.aiProvider);\n }\n\n get planningModel(): string {\n if (this.aiProvider === 'google')\n return normalizeGeminiModel(process.env.GEMINI_MODEL || process.env.ORCHESTRATOR_MODEL || super.geminiModel);\n return process.env.ORCHESTRATOR_MODEL || '';\n }\n\n get enabledRunners(): string[] {\n if (this._enabledRunnersOverride) return this._enabledRunnersOverride;\n\n const envRunners = process.env.ORDEWELL_ENABLED_RUNNERS;\n if (envRunners) {\n const parsed = envRunners.split(',').map((s) => s.trim()).filter(Boolean);\n if (parsed.length > 0) return parsed;\n }\n\n const out: string[] = [];\n if (process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== 'false' && process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== '0') {\n out.push('claude-code');\n }\n if (process.env.ORDEWELL_CODEX_ENABLED === 'true' || process.env.ORDEWELL_CODEX_ENABLED === '1') {\n out.push('codex');\n }\n if (process.env.ORDEWELL_OPENCODE_ENABLED === 'true' || process.env.ORDEWELL_OPENCODE_ENABLED === '1') {\n out.push('opencode');\n }\n return out.length > 0 ? out : [...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 type GrepRegex,\n filterFallbackByAnchoredInclude,\n applyHeadLimit,\n formatSearchOutput,\n researchToolsPath,\n withPath,\n SEARCH_EXCLUSIONS,\n STOPPED_TOOL_RESULT,\n type GrepOptions,\n type ReadFileOpts,\n type ToolOutcome,\n} from '@ordewell/core';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { run } from './run';\n\n/**\n * Everything here is async. It used to be `execSync`/`readFileSync`, which on\n * the web server blocked the entire Node event loop: one session running\n * `tree -L 4` over a monorepo stalled every other session's WebSocket\n * streaming, HTTP API, and plan-token delivery. It also makes the parallel\n * tool-round pre-pass in BaseAiService pointless, since concurrent calls into\n * a synchronous adapter still serialize.\n */\n\nconst SEARCH_TIMEOUT_MS = 20_000;\n/** Generous, because an approved `bash` call may legitimately be a test suite. */\nconst BASH_TIMEOUT_MS = 120_000;\n\nexport class PoolFileSystem extends BaseFileSystem {\n constructor(private workspaceRoot: string) { super(); }\n getWorkspaceRoot(): string { return this.workspaceRoot; }\n\n /**\n * PATH for the search subprocesses. `execFile` starts them with no shell, so\n * on a Windows box whose POSIX tools live in the Git tree (`grep.exe` beside\n * the research shell) they are only resolvable with that directory prepended.\n * Identity on POSIX, where `utilsDir` is null. Kept in step with\n * VsCodeFileSystem.searchEnv.\n */\n private searchEnv(): NodeJS.ProcessEnv | undefined {\n const resolved = researchToolsPath(this.researchShell, process.env.PATH);\n // `withPath`, not a `PATH:` spread: on Windows the spread of `process.env`\n // carries `Path`, so adding `PATH` hands the child two and lets the OS pick.\n return resolved === (process.env.PATH ?? '') ? undefined : withPath(process.env, resolved);\n }\n\n private grepRegex: Promise<GrepRegex> | null = null;\n private fallbackGrepRegex(): Promise<GrepRegex> {\n this.grepRegex ??= run('grep', GREP_PCRE_PROBE_ARGS, { timeout: 5_000, env: this.searchEnv() })\n .then((r) => grepRegexFromProbe(r.code))\n .catch(() => 'ere' as const);\n return this.grepRegex;\n }\n\n private rgAvailable: Promise<boolean> | null = null;\n private hasRg(): Promise<boolean> {\n this.rgAvailable ??= run('rg', ['--version'], { timeout: 5_000, env: this.searchEnv() }).then((r) => r.code === 0).catch(() => false);\n return this.rgAvailable;\n }\n\n protected async readFileImpl(absPath: string, opts?: ReadFileOpts): Promise<ToolOutcome> {\n try {\n const stat = await fs.stat(absPath);\n if (!stat.isFile()) return { success: false, output: `Not a file: ${absPath}`, truncated: false };\n\n // Hard file-size cap — return an actionable error so the model switches to grep\n const maxBytes = opts?.maxBytes ?? 1024;\n if (stat.size > maxBytes * 1024) {\n const sizeMB = (stat.size / (1024 * 1024)).toFixed(1);\n return {\n success: true,\n output: `File too large (${sizeMB} MB). Maximum is ${maxBytes} KB. Use grep to search for specific patterns instead.`,\n truncated: false,\n };\n }\n\n const content = await fs.readFile(absPath, 'utf8');\n const allLines = content.split('\\n');\n // Discard the empty element from a trailing newline\n if (allLines.length > 0 && allLines[allLines.length - 1] === '') allLines.pop();\n const totalLines = allLines.length;\n\n const startLine = opts?.offset ?? 0;\n const maxLines = opts?.limit ?? 2000;\n\n if (startLine >= totalLines) return { success: true, output: '', truncated: false };\n\n const selectedLines = allLines.slice(startLine, startLine + maxLines);\n const truncated = (startLine + maxLines) < totalLines;\n\n // Right-align line numbers so columns stay aligned across calls\n const lineWidth = String(totalLines).length;\n let output = selectedLines.map((line, i) => {\n const lineNum = String(startLine + i + 1).padStart(lineWidth);\n return `${lineNum}|${line}`;\n }).join('\\n');\n\n // Actionable hint so the model knows how to continue\n if (truncated) {\n const nextOffset = startLine + maxLines;\n output += `\\n\\n(File has more lines — use offset=${nextOffset} to read beyond line ${nextOffset})\\n`;\n }\n\n return { success: true, output, truncated };\n } catch (err) {\n return { success: false, output: `Error reading ${absPath}: ${(err as Error).message}`, truncated: false };\n }\n }\n\n protected async globImpl(pattern: string, absRoot: string, headLimit: number): Promise<ToolOutcome> {\n if (await this.hasRg()) {\n // ripgrep resolves a `--glob` pattern that contains a `/` against its own\n // cwd, not the `--` search path — without this, a daemon started outside\n // the workspace silently drops every anchored pattern (\"src/**/*\") to a\n // false \"No files matched.\".\n const anchor = await this.searchAnchor(absRoot);\n const result = await run('rg', buildGlobArgs(pattern, absRoot), { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() });\n // rg exits 1 for \"no files matched\", which is a valid empty answer.\n if (result.code !== 0 && result.code !== 1 && !result.stdout) {\n return { success: false, output: `Glob failed: ${result.stderr.trim() || 'ripgrep error'}`, truncated: false };\n }\n const capped = applyHeadLimit(result.stdout, headLimit);\n return {\n success: true,\n output: formatSearchOutput(capped, anchor, { emptyMessage: 'No files matched.', hint: 'Narrow the pattern.' }),\n truncated: capped.truncated,\n };\n }\n\n // `find -path` treats `*` as crossing `/`, so `**` is not recursive there.\n // Translating to `-name` on the basename keeps the common cases honest\n // rather than silently returning a different result set than ripgrep would.\n const basename = pattern.split('/').pop() || pattern;\n const excludeArgs = SEARCH_EXCLUSIONS.flatMap((dir) => ['-not', '-path', `*/${dir}/*`]);\n const result = await run('find', [absRoot, '-type', 'f', '-name', basename, ...excludeArgs], { timeout: SEARCH_TIMEOUT_MS, env: this.searchEnv() });\n if (result.code !== 0 && !result.stdout) {\n return { success: false, output: `Glob failed: ${result.stderr.trim() || 'find error'}`, truncated: false };\n }\n const capped = applyHeadLimit(result.stdout, headLimit);\n return {\n success: true,\n output: formatSearchOutput(capped, absRoot, { emptyMessage: 'No files matched.' }),\n truncated: capped.truncated,\n };\n }\n\n /**\n * A directory to anchor a search in. `cwd` exists only so anchored\n * `--glob`/`--include` patterns resolve against the search root (see\n * globImpl), and spawn(2) rejects a `cwd` that is a file with ENOTDIR.\n *\n * `grep`'s `path` is documented as a directory, but the tool description\n * tells the model to survey with output_mode=\"files\" and then re-run \"on a\n * narrower path\" — and what that survey hands back are files. rg and grep\n * both search a single file happily, so anchor at the parent rather than\n * failing a legitimately file-scoped search.\n */\n private async searchAnchor(absRoot: string): Promise<string> {\n try {\n return (await fs.stat(absRoot)).isDirectory() ? absRoot : path.dirname(absRoot);\n } catch {\n return absRoot;\n }\n }\n\n protected async grepImpl(pattern: string, absRoot: string, opts: GrepOptions): Promise<ToolOutcome> {\n const headLimit = opts.headLimit ?? 100;\n const useRg = await this.hasRg();\n // Same anchored-glob-vs-cwd hazard as globImpl: an `include` filter with a\n // `/` in it would otherwise resolve against the daemon's cwd, not absRoot.\n const anchor = await this.searchAnchor(absRoot);\n // GNU grep's `--include` only matches a basename, so an anchored pattern\n // like `subdir/*.txt` never matches there — strip it from the grep call\n // and filter matches by relative path afterward instead.\n const anchoredInclude = !useRg && opts.include?.includes('/') ? opts.include : undefined;\n const result = useRg\n ? await run('rg', buildGrepArgs(pattern, opts, absRoot).args, { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() })\n : await run('grep', buildFallbackGrepArgs(pattern, anchoredInclude ? { ...opts, include: undefined } : opts, absRoot, await this.fallbackGrepRegex()), { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() });\n\n // Exit 1 is \"no matches\" for both tools — a successful search with an empty\n // result, not a failure. Anything else with no stdout is a real error.\n if (result.code !== 0 && result.code !== 1 && !result.stdout) {\n return { success: false, output: `Search failed: ${result.stderr.trim() || 'search error'}`, truncated: false };\n }\n\n const filteredStdout = anchoredInclude\n ? filterFallbackByAnchoredInclude(result.stdout, anchoredInclude, anchor, opts.outputMode)\n : result.stdout;\n const capped = applyHeadLimit(filteredStdout, headLimit);\n const hint = opts.outputMode === 'content'\n ? 'Re-run with output_mode=\"files\" to see the full breadth, or narrow with include/path.'\n : 'Narrow with include/path.';\n return {\n success: true,\n output: formatSearchOutput(capped, anchor, { emptyMessage: 'No matches found.', hint }),\n truncated: capped.truncated,\n };\n }\n\n protected async listDirImpl(absPath: string, depth: number): Promise<ToolOutcome> {\n if (depth > 1) {\n const result = await run('tree', ['-L', String(depth), '-I', 'node_modules|.git|dist|build', absPath], { timeout: 10_000, env: this.searchEnv() });\n if (result.code === 0 && result.stdout.trim()) {\n const lines = result.stdout.trim().split('\\n');\n return { success: true, output: lines.slice(0, 300).join('\\n'), truncated: lines.length > 300 };\n }\n // `tree` is not installed everywhere; fall through to a flat listing.\n }\n try {\n const entries = await fs.readdir(absPath, { withFileTypes: true });\n const lines = entries.slice(0, 200).map((e) => `${e.isDirectory() ? 'D' : 'F'} ${e.name}`);\n return { success: true, output: lines.join('\\n') || '(empty directory)', truncated: entries.length > 200 };\n } catch (err) {\n return { success: false, output: `Error listing ${absPath}: ${(err as Error).message}`, truncated: false };\n }\n }\n\n protected async execBashImpl(command: string, signal?: AbortSignal): Promise<ToolOutcome> {\n // `shell: true` is required now that approved commands may legitimately\n // contain pipes; the tier classifier in core (not string filtering here)\n // is what decides whether this command was allowed to reach the shell.\n //\n // `file: null` is that host default, unchanged on POSIX. A resolved file is\n // the POSIX shell found on a Windows box, invoked explicitly so the command\n // runs in the dialect `BaseFileSystem` classified it under.\n const { file, args } = this.researchShell;\n const result = file === null\n ? await run(command, [], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, shell: true, signal })\n : await run(file, [...args, command], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, signal });\n const out = (result.stdout || '').trim();\n const err = (result.stderr || '').trim();\n\n // A stopped turn reports as a stop, not as a mysterious non-zero exit: the\n // child was killed on purpose and there is nothing here to diagnose.\n if (signal?.aborted) return { success: false, output: STOPPED_TOOL_RESULT, truncated: false };\n\n if (result.code !== 0) {\n const detail = err || out || `exited with code ${result.code}`;\n // A failing command is still research: the model asked to diagnose, and\n // the failure output is usually the answer. Report it, do not swallow it.\n return { success: false, output: `Command exited ${result.code}:\\n${detail.slice(0, 20_000)}`, truncated: detail.length > 20_000 };\n }\n\n const combined = err ? `${out}\\n[stderr]\\n${err}` : out;\n return { success: true, output: combined || '(no output)', truncated: combined.length > 20_000 };\n }\n}\n","import 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): void {\n this.inner.stop(sessionId);\n this.owned.delete(sessionId);\n }\n\n stopAll(): void {\n for (const id of this.owned) this.inner.stop(id);\n this.owned.clear();\n }\n}\n","import { WebSocket } from 'ws';\nimport {\n Session,\n createSession,\n type ConversationCompaction,\n type ConversationFork,\n type SessionMessage,\n type SessionNotice,\n type SessionRuntimeSettings,\n ModelResolver,\n RunnerRegistry,\n removedPluginNotice,\n RunnerInstallation,\n listSessions,\n loadSession,\n deleteSession,\n SettingsService,\n sessionRuntimeSettings,\n type PlanState,\n type LegacyPlanState,\n migratePlanState,\n type RunnerId,\n type DiscoveredModel,\n type 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 admitSettingsEnv,\n PROVIDER_CREDENTIAL_ENV,\n type AiProvider,\n type PlannerModelCandidate,\n StructuredRunner,\n} from '@ordewell/core';\nimport { WebConfig } from '../adapters/WebConfig';\nimport { scanWorkspaces as scanWorkspacesImpl } from '../utils/workspaceScanner';\nimport { PoolFileSystem } from '../adapters/PoolFileSystem';\nimport { PoolAwareRunner } from '../adapters/PoolAwareRunner';\nimport 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\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}\n\nexport class OrchestratorPool {\n private sessions = new Map<string, Session>();\n private clients = new Map<string, Set<WebSocket>>();\n private registry: CoreRunnerRegistry = new RunnerRegistry();\n private modelResolver: ModelResolver;\n private runnerInstallation = new RunnerInstallation(this.registry);\n private cachedProviderLists: Record<string, string[]> | undefined;\n private settingsService = new SettingsService();\n private plannerModelMemory = new PlannerModelMemory(this.settingsService);\n private runner: IRunner;\n\n constructor(deps: OrchestratorPoolDeps = {}) {\n const pluginNotice = removedPluginNotice();\n if (pluginNotice) console.warn(pluginNotice);\n this.runner = deps.runner ?? new StructuredRunner();\n this.modelResolver = deps.modelResolver ?? new ModelResolver(this.registry, new WebConfig());\n }\n\n subscribe(sessionId: string, ws: WebSocket): void {\n if (!this.clients.has(sessionId)) this.clients.set(sessionId, new Set());\n this.clients.get(sessionId)!.add(ws);\n }\n\n unsubscribe(sessionId: string, ws: WebSocket): void {\n this.clients.get(sessionId)?.delete(ws);\n if (this.clients.get(sessionId)?.size === 0) this.clients.delete(sessionId);\n }\n\n private broadcast(sessionId: string, msg: SessionMessage | SessionNotice): void {\n const payload = JSON.stringify(msg);\n for (const ws of this.clients.get(sessionId) ?? []) {\n if (ws.readyState === ws.OPEN) ws.send(payload);\n }\n }\n\n hasSession(sessionId: string): boolean { return this.sessions.has(sessionId); }\n\n /** Answer an approval prompt, the planner's or a task runner's. False means the id was unknown or already settled. */\n resolveApproval(sessionId: string, approvalId: string, answer: ApprovalAnswer): boolean {\n return this.sessions.get(sessionId)?.resolveApproval(approvalId, answer) ?? false;\n }\n\n outstandingApprovals(sessionId: string) {\n return this.sessions.get(sessionId)?.outstandingApprovals() ?? [];\n }\n\n approvedScopes(sessionId: string): string[] {\n return this.sessions.get(sessionId)?.approvedScopes() ?? [];\n }\n isExecuting(sessionId: string): boolean { return this.sessions.get(sessionId)?.isExecuting ?? false; }\n getPlan(sessionId: string): LegacyPlanState | null { return this.sessions.get(sessionId)?.planState ?? null; }\n /**\n * The plan of a session this process is holding, straight from its store —\n * null for an id the pool never adopted. Reading it through the saved file\n * instead answers as if nothing were running.\n */\n getPlanState(sessionId: string): PlanState | null {\n return this.sessions.get(sessionId)?.currentPlanState ?? null;\n }\n getGoal(sessionId: string): string { return this.sessions.get(sessionId)?.currentGoal ?? ''; }\n\n private runtimeSettings(): SessionRuntimeSettings {\n return sessionRuntimeSettings(this.settingsService.getAll());\n }\n\n private createSessionFor(sessionId: string, workspace: string, modelOverride?: string, options: { allowInit?: boolean } = {}): Session {\n // Rejected here rather than left to the planner: a non-existent workspace\n // otherwise reaches the harness adapter's `spawn` as an ENOENT that reads\n // as a missing agent binary, not a missing directory.\n assertWorkspaceExists(workspace);\n // Rejected here too: without a project marker, the filesystem root or an\n // arbitrary system directory becomes the confinement boundary for every\n // read, search and permitted command the planner runs. `allowInit` only\n // ever arrives here on the retry of a call the user already saw and\n // explicitly confirmed (the TUI's \"initialize this as a new workspace?\"\n // prompt) — never as a default, so an unmarked directory is still never\n // admitted silently.\n try {\n assertWorkspaceIsProject(workspace);\n } catch (err) {\n if (!(err instanceof WorkspaceNotAProjectError) || !options.allowInit) throw err;\n ensureStateDirIgnored(workspace);\n assertWorkspaceIsProject(workspace);\n }\n const config = new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n modelOverride,\n providerModelLists: this.cachedProviderLists,\n });\n const fsAdapter = new PoolFileSystem(workspace);\n const broadcast = (msg: SessionMessage) => this.broadcast(sessionId, msg);\n 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 user's runner choice, or undefined when they have never made one —\n * which is what lets `WebConfig` fall back to the environment's defaults.\n * Read per call rather than cached: the settings file is shared with the\n * VS Code extension host, and `getAll()` already invalidates on mtime.\n */\n private enabledRunnerOverride(): string[] | undefined {\n return this.settingsService.getEnabledRunners();\n }\n\n /**\n * Persisted, not held in memory: the daemon dies with the TUI, and a\n * process-local override meant every reopen silently reinstated the\n * environment's defaults over what the user had chosen.\n */\n setRunnerEnabled(id: string, enabled: boolean): void {\n const current = this.enabledRunnerOverride() ?? new WebConfig().enabledRunners;\n const next = enabled\n ? (current.includes(id) ? current : [...current, id])\n : current.filter((r) => r !== id);\n this.settingsService.setEnabledRunners(next);\n }\n\n getSettings(): SettingsResponse {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const userSettings = this.settingsService.getAll();\n return {\n orchestratorModel: config.orchestratorModel,\n // Who plans (ADR-0009) — a vendor id, or one of the three harness\n // planners. Surfaces need it to render the planner picker and to know\n // whether the planner model comes from a runner catalog or a vendor one.\n aiProvider: config.aiProvider,\n // A harness planner's thinking effort (ADR-0009). Surfaces need it back\n // to render the current level; without it the picker shows \"default\"\n // for a planner that is running at \"high\".\n plannerThinkingEffort: config.plannerThinkingEffort ?? '',\n maxParallel: config.maxParallelSessions,\n 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 };\n }\n\n /**\n * The catalog `PlannerModelMemory.recall` should judge `provider`'s\n * remembered model against — a harness planner's own runner catalog, or the\n * cross-provider picker list for a vendor (ADR-0009), same split as\n * `plannerModelItems` in the TUI reducer. Read from whatever the resolver\n * has already cached so this stays synchronous; a cold cache degrades to an\n * empty catalog rather than kicking off discovery mid-settings-write.\n */\n private plannerCatalogFor(provider: AiProvider): PlannerModelCandidate[] {\n const runner = runnerForProvider(provider);\n if (runner) {\n return this.modelResolver.getCachedRunnerModels(runner).map((m) => ({ id: m.modelId, variants: m.variants }));\n }\n return this.modelResolver.getCachedPickerOptions().map((o) => ({ id: o.id }));\n }\n\n updateSettings(changes: Record<string, unknown>): 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.\n const providerBefore = new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n providerModelLists: this.cachedProviderLists,\n }).aiProvider;\n\n // Only allowlisted keys reach `process.env`, and everything else comes back\n // to the caller by name — the daemon's environment is inherited by every\n // runner it spawns, so this write is the whole of `admitSettingsEnv`'s\n // reason to exist. All downstream reads below use `envChanges`, which is\n // the admitted subset, never the raw body.\n const rawEnv = changes.env && typeof changes.env === 'object' && !Array.isArray(changes.env)\n ? (changes.env as Record<string, unknown>)\n : undefined;\n const admission = rawEnv ? admitSettingsEnv(rawEnv) : undefined;\n const envChanges = admission ? admission.accepted : undefined;\n const incomingAiProvider = typeof envChanges?.AI_PROVIDER === 'string' ? envChanges.AI_PROVIDER : undefined;\n // The name the client sent wins over re-deriving it from `config.aiProvider`\n // later: for a vendor pick that resolution reads the model id, and a switch\n // may have just cleared it — model-based resolution would misfire on the\n // very call meant to establish the new provider.\n const switchedToProvider: AiProvider | undefined =\n incomingAiProvider && incomingAiProvider !== providerBefore ? (incomingAiProvider as AiProvider) : undefined;\n const requestedModel = envChanges?.ORCHESTRATOR_MODEL ?? changes.orchestratorModel;\n const explicitModel = typeof requestedModel === 'string' && requestedModel.trim().length > 0;\n // Read the incoming provider's catalog now, before the env-touched refresh\n // below clears the resolver's cache — recall must judge the memory against\n // what was already discovered, not force a fresh (async) discovery here.\n const switchRecall = switchedToProvider && !explicitModel\n ? this.plannerModelMemory.recall(switchedToProvider, this.plannerCatalogFor(switchedToProvider))\n : undefined;\n\n if (switchedToProvider && explicitModel &&\n typeof changes.plannerThinkingEffort !== 'string' && envChanges?.ORDEWELL_PLANNER_EFFORT === undefined) {\n process.env.ORDEWELL_PLANNER_EFFORT = '';\n }\n\n if (typeof changes.orchestratorModel === 'string') {\n process.env.ORCHESTRATOR_MODEL = changes.orchestratorModel;\n }\n if (typeof changes.plannerThinkingEffort === 'string') {\n process.env.ORDEWELL_PLANNER_EFFORT = changes.plannerThinkingEffort;\n }\n if (envChanges) {\n let touched = false;\n for (const [key, value] of Object.entries(envChanges)) {\n process.env[key] = value;\n // Only a credential or endpoint change touches what a catalog\n // contains. A planner, model or effort pick does not, and invalidating\n // on one would wipe the very cache `plannerCatalogFor` reads\n // synchronously below, right before the next call's switch needs it.\n if (PROVIDER_CREDENTIAL_ENV.has(key)) touched = true;\n }\n // The scheduler reads the limit on every tick, but a raised one would\n // only be seen at the next verdict; the runs waiting for a slot start now.\n if (envChanges.ORDEWELL_MAX_PARALLEL !== undefined) {\n for (const [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 }\n }\n\n // Legacy clients send a blank model on switch; recall fills that clear,\n // but must never replace an explicit model chosen in the same request.\n if (switchRecall) {\n process.env.ORCHESTRATOR_MODEL = switchRecall.model;\n process.env.ORDEWELL_PLANNER_EFFORT = switchRecall.effort;\n }\n\n if (changes.modelAllowlist && typeof changes.modelAllowlist === 'object') {\n const allowlist = changes.modelAllowlist as Record<string, unknown>;\n for (const [runner, ids] of Object.entries(allowlist)) {\n if (Array.isArray(ids)) {\n this.settingsService.setModelAllowlist(runner, ids.map(String));\n } else if (ids === null) {\n this.settingsService.setModelAllowlist(runner, undefined);\n }\n }\n }\n\n // An explicit model/effort pick is remembered against whichever provider\n // is in effect: the one this same call just switched to, or — resolved\n // fresh, now that ORCHESTRATOR_MODEL reflects this call's changes —\n // today's, so a vendor pick keys correctly off its model id. The pick\n // arrives either as a top-level field (a vendor model, `ordewell model\n // set`) or through env (`ordewell planner-effort`, the TUI's effort\n // picker send ORDEWELL_PLANNER_EFFORT this way) — both are a real pick,\n // including a switch with an explicit model, but never its legacy clear.\n const envCarriesModelOrEffort = (envChanges?.AI_PROVIDER === undefined || explicitModel) &&\n (typeof envChanges?.ORCHESTRATOR_MODEL === 'string' || typeof envChanges?.ORDEWELL_PLANNER_EFFORT === 'string');\n if (typeof changes.orchestratorModel === 'string' || typeof changes.plannerThinkingEffort === 'string' || envCarriesModelOrEffort) {\n const rememberProvider = switchedToProvider ?? new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n providerModelLists: this.cachedProviderLists,\n }).aiProvider;\n this.plannerModelMemory.remember(\n rememberProvider,\n process.env.ORCHESTRATOR_MODEL || '',\n process.env.ORDEWELL_PLANNER_EFFORT || '',\n );\n }\n\n // Refused keys are named back rather than dropped: a client that sent one\n // wrote it to `.env` on the strength of this response, and would otherwise\n // reinstate the refusal as the next daemon's startup environment.\n const rejectedEnvKeys = admission?.rejected ?? [];\n const settings: SettingsUpdateResponse = this.getSettings();\n if (rejectedEnvKeys.length > 0) settings.rejectedEnvKeys = rejectedEnvKeys;\n if (switchRecall) settings.switchRecall = switchRecall;\n return settings;\n }\n\n setOrchestratorModel(model: string): string {\n process.env.ORCHESTRATOR_MODEL = model;\n return model;\n }\n\n async getProviderModels(): Promise<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 ]);\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: process.env.ORCHESTRATOR_MODEL || '',\n providers,\n orchestratorModels,\n providerErrors,\n };\n }\n\n getRunnerState(): { enabledRunners: RunnerId[]; orchestratorModel: string } {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n return { enabledRunners: config.enabledRunners, orchestratorModel: config.orchestratorModel };\n }\n\n /**\n * Runners whose CLI is actually installed on the host, with display name and\n * enabled state. Only these should be offered for selection — an uninstalled\n * runner can't be spawned.\n */\n async getInstalledRunners(): Promise<RunnersResponse['runners']> {\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[], workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<PlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride, options);\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 // generatePlan can raise an approval and await the answer, and that\n // answer arrives over POST /api/approvals/:sessionId — which 404s until\n // the session is in this map. Registering only on return made the first\n // approval of every session unanswerable until its 5-minute timeout.\n this.sessions.set(sessionId, session);\n return migratePlanState(await session.generatePlan(goal, runners));\n }\n\n /**\n * Conversational planning (ADR-0002): start the planner dialogue for a\n * session. Returns the current plan state — a committed plan when the\n * planner had enough context, otherwise the dialogue so far (last\n * assistant message lives in conversationHistory).\n */\n async startPlanning(sessionId: string, goal: string, runners: RunnerId[], workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<LegacyPlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride, options);\n this.destroy(sessionId);\n // See generatePlan: must be registered before the blocking call so a\n // mid-research approval is answerable rather than 404ing until timeout.\n this.sessions.set(sessionId, session);\n return session.startPlanning(goal, runners);\n }\n\n /** Continue the planner dialogue with the user's reply; refused while a planner turn is in flight. */\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 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","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 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, 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 };\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 return c.json({ meta: saved.meta, plan: surfacePlanState(pool.getPlanState(id) ?? saved.plan) } 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 return c.json({ ok: true, plan: surfacePlan(plan), goal: pool.getGoal(id) } 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')) } 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)) } satisfies TaskLogResponse);\n });\n\n router.delete('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const ok = removeSession(c.req.param('id'), ws);\n return c.json({ ok } 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 surfacePlan,\n surfacePlanState,\n type ConversationCompactResponse,\n type ConversationForkResponse,\n type ConversationRewindResponse,\n type ExecuteResponse,\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} 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\nexport function plansRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.post('/:sessionId/generate', async (c) => {\n try {\n const { goal, runners, workspace, model, allowInit } = await c.req.json();\n if (!goal) return c.json({ error: 'goal is required' }, 400);\n const ws = workspace || c.req.query('workspace') || process.cwd();\n const queryRunners = c.req.query('runners');\n // No runners in the request means \"whatever is enabled\", not claude-code:\n // a hard-coded default here contradicts the /runners toggle state and\n // fails planning for anyone who disabled claude-code.\n const runnerList: string[] = Array.isArray(runners) ? runners : (runners ? [runners] : (queryRunners ? queryRunners.split(',').map(s => s.trim()).filter(Boolean) : pool.getRunnerState().enabledRunners));\n const plan = await pool.generatePlan(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n const { models, modelsByRunner } = await pool.getProviderModels();\n 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 await pool.session(c.req.param('sessionId')).executePlan();\n return c.json({ status: 'running' } satisfies ExecuteResponse);\n } catch (err) {\n return failure(c, err, 'execute');\n }\n });\n\n router.post('/:sessionId/stop', (c) => {\n if (pool.hasSession(c.req.param('sessionId'))) pool.session(c.req.param('sessionId')).stopExecution();\n return c.json({ status: 'stopped' } satisfies StopResponse);\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 router.post('/:sessionId/tasks/:taskId/complete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskComplete(c.req.param('taskId'));\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'mark complete', { fallback: 404, message: 'Not found' });\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/uncomplete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskIncomplete(c.req.param('taskId'));\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'mark incomplete', { fallback: 404, message: 'Not found' });\n }\n });\n\n // Orchestrator controls — these spawn or kill runner processes, so they are\n // deliberately separate from the generic `PUT tasks/:taskId` status patch.\n for (const [segment, run] of [\n ['run', (s: ReturnType<typeof pool.session>, id: string) => s.runTask(id)],\n ['force-start', (s: ReturnType<typeof pool.session>, id: string) => s.forceStartTask(id)],\n ['retry', (s: ReturnType<typeof pool.session>, id: string) => s.retryTask(id)],\n ['cancel', (s: ReturnType<typeof pool.session>, id: string) => s.cancelTask(id)],\n ] as const) {\n router.post(`/:sessionId/tasks/:taskId/${segment}`, async (c) => {\n try {\n await run(pool.session(c.req.param('sessionId')), c.req.param('taskId'));\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, segment);\n }\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) => 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 = 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 router.post('/:sessionId/tasks/:taskId/messages', messageHandler((session, taskId, text) => session.sendTaskMessage(taskId, text)));\n router.post('/:sessionId/tasks/:taskId/messages/now', messageHandler((session, taskId, text) => session.forceSendTaskMessage(taskId, text)));\n\n // Force send a message still queued; `sent` is false once the runner has it.\n router.post('/:sessionId/tasks/:taskId/messages/:messageId/now', (c) => {\n try {\n const sent = pool.session(c.req.param('sessionId')).forceSendQueuedTaskMessage(c.req.param('taskId'), c.req.param('messageId'));\n return c.json({ sent } 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 // A task that cannot be continued is refused with the reason.\n router.post('/:sessionId/tasks/:taskId/continue', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const text = typeof body === 'object' && body !== null && 'text' in body ? body.text : undefined;\n if (typeof text !== 'string' || !text.trim()) return c.json({ error: 'text is required' }, 400);\n await pool.session(c.req.param('sessionId')).continueTask(c.req.param('taskId'), text);\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId/messages/:messageId', (c) => {\n try {\n const removed = pool.session(c.req.param('sessionId')).removeQueuedTaskMessage(c.req.param('taskId'), c.req.param('messageId'));\n return c.json({ removed } satisfies RemoveMessageResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/interrupt', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).interruptTask(c.req.param('taskId'));\n return c.json({ ok: true } satisfies OkResponse);\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 router.post('/:sessionId/tasks/:taskId/checkpoint/approve', (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n if (!session.awaitsCheckpoint(taskId)) return refuse(c, 409, NO_CHECKPOINT, 'checkpoint_not_waiting');\n session.approveCheckpoint(taskId);\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/:taskId/checkpoint/reject', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const reason = typeof body === 'object' && body !== null && 'reason' in body && typeof body.reason === 'string' ? body.reason.trim() : '';\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n if (!session.awaitsCheckpoint(taskId)) return refuse(c, 409, NO_CHECKPOINT, 'checkpoint_not_waiting');\n session.rejectCheckpoint(taskId, reason || undefined);\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n // What a task waits on at its merge gate (ADR-0020), for a surface that asks\n // before a force start passes it. Empty when nothing gates the task.\n router.get('/:sessionId/tasks/:taskId/merge-gate', (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n const tasks = flattenTasks(session.planState?.tasks ?? []);\n const mergeGate = session.mergeGate(c.req.param('taskId')).map((id) => {\n const dep = tasks.find((t) => t.id === id);\n return { id, order: dep?.order ?? 0, title: dep?.title ?? id };\n });\n return c.json({ mergeGate } 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 return c.json(await pool.session(c.req.param('sessionId')).mergeRun() satisfies IsolationMergeResponse);\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 { assignedRunner, dependencies, ...rest } = await c.req.json();\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n\n // Two fields are not field writes. A runner change carries the task's\n // model, effort and mode with it, and a dependency list has to be\n // validated against the whole graph — each has one owner on the session.\n // The runner goes first: its retarget derives a model, and an explicit\n // model in the same patch must win over that derived one.\n const hasRunner = typeof assignedRunner === 'string';\n const hasDeps = Array.isArray(dependencies);\n\n let result = null;\n if (hasRunner) result = await session.setTaskRunner(taskId, assignedRunner);\n if (hasDeps) {\n try {\n result = await session.setTaskDependencies(taskId, dependencies.map(String));\n } catch (err) {\n // A rejected dependency edit is the client's mistake, not a fault.\n return failure(c, err, 'task dependencies', { fallback: 400 });\n }\n }\n // An empty patch still reaches updateTask — that is how a caller asks\n // whether the task exists at all.\n if (Object.keys(rest).length > 0 || (!hasRunner && !hasDeps)) result = await session.updateTask(taskId, rest);\n\n if (!result) return 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 plan = await pool.session(c.req.param('sessionId')).approveReview();\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\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 const runnerList: string[] = Array.isArray(runners) ? runners : (runners ? [runners] : pool.getRunnerState().enabledRunners);\n const plan = await pool.startPlanning(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n return c.json({ plan: 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 // 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 type { OkResponse, 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 const state = pool.getRunnerState();\n const runners = await pool.getInstalledRunners();\n return c.json({\n runners,\n orchestratorModel: state.orchestratorModel,\n } satisfies RunnersResponse);\n });\n\n router.put('/:id', async (c) => {\n const id = c.req.param('id');\n const body = await c.req.json();\n pool.setRunnerEnabled(id, body.enabled);\n return c.json({ ok: true } 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\n 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 const { decision } = toApprovalDecision(answer);\n return c.json({ ok: true, granted: isGranted({ decision }), decision } satisfies ApprovalAnswerResponse);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { SettingsResponse, 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 router.get('/', (c) => {\n const settings: SettingsResponse = pool.getSettings();\n return c.json(settings);\n });\n\n router.patch('/', async (c) => {\n const body = await c.req.json();\n if (!body || typeof body !== 'object' || Object.keys(body).length === 0) {\n return refuse(c, 400, 'At least one setting field is required');\n }\n const result: SettingsUpdateResponse = pool.updateSettings(body);\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 } from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function createWsHandler(pool: OrchestratorPool) {\n const wss = new WebSocketServer({\n noServer: true,\n // Select the plain subprotocol explicitly. Left to itself `ws` echoes back\n // whichever was offered first, which would put the token in the 101\n // response; selecting nothing makes the client fail the handshake.\n handleProtocols: (protocols) => (protocols.has(DAEMON_SUBPROTOCOL) ? DAEMON_SUBPROTOCOL : false),\n });\n\n wss.on('connection', (ws: WebSocket, request: IncomingMessage) => {\n const url = new URL(request.url ?? '', `http://${request.headers.host}`);\n const sessionId = url.pathname.split('/').pop() || '';\n\n ws.on('close', () => {\n pool.unsubscribe(sessionId, ws);\n });\n\n ws.on('error', () => {\n pool.unsubscribe(sessionId, ws);\n });\n\n ws.send(JSON.stringify({ type: 'connected', sessionId }));\n pool.subscribe(sessionId, ws);\n });\n\n return (request: IncomingMessage, socket: Duplex, head: Buffer) => {\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit('connection', ws, request);\n });\n };\n}\n","/**\n * The single admission decision for the daemon.\n *\n * Both the HTTP middleware and the WebSocket upgrade handler call this. The\n * sharing is the point: the two paths drifting apart is how the upgrade ended\n * up validating nothing while the HTTP routes had a CORS allowlist.\n */\n\nimport { extractPresentedToken, tokensMatch } from '@ordewell/core';\n\n/** `localhost` is included because clients dial it by name; the daemon binds loopback only. */\nconst LOOPBACK_HOSTNAMES = new Set(['localhost', '127.0.0.1', '::1']);\n\nexport interface AdmissionHeaders {\n /** `null`/`undefined` mean absent. An empty string still counts as present. */\n origin?: string | null;\n host?: string | null;\n /** `Authorization: Bearer <token>` — how the token travels on HTTP routes. */\n authorization?: string | null;\n /** `Sec-WebSocket-Protocol` — how it travels on the upgrade, so it stays out of logs. */\n secWebSocketProtocol?: string | null;\n}\n\n/** What this daemon is: which port it bound, and which token it minted. */\nexport interface AdmissionContext {\n port: number;\n token: string;\n /** Named in a token rejection, so a stale token is diagnosable rather than a bare failure. */\n tokenFile: string;\n}\n\nexport type AdmissionDecision =\n | { admit: true }\n | { admit: false; status: number; reason: string };\n\nconst ADMIT: AdmissionDecision = { admit: true };\n\nexport function decideAdmission(\n headers: AdmissionHeaders,\n context: AdmissionContext,\n): AdmissionDecision {\n if (headers.origin !== undefined && headers.origin !== null) {\n return {\n admit: false,\n status: 403,\n reason: 'Refused: requests carrying an Origin header are not accepted. The Ordewell daemon has no browser client.',\n };\n }\n\n if (!isOwnLoopbackAuthority(headers.host, context.port)) {\n return {\n admit: false,\n status: 403,\n reason: `Refused: the Host header must name loopback (localhost, 127.0.0.1 or [::1]) at port ${context.port}.`,\n };\n }\n\n if (!tokensMatch(extractPresentedToken(headers), context.token)) {\n return {\n admit: false,\n status: 401,\n reason:\n 'Unauthenticated: this request did not present the daemon\\'s bearer token. '\n + `Ordewell clients read it from ${context.tokenFile}; if that file is stale, `\n + 'restart the daemon (`ordewell web --daemon`) to mint a fresh one.',\n };\n }\n\n return ADMIT;\n}\n\n/**\n * Rejecting anything but our own loopback authority is what closes DNS\n * rebinding: a page rebinding a hostname it controls to 127.0.0.1 still sends\n * that hostname in `Host`, and same-origin requests to it carry no `Origin`.\n */\nfunction isOwnLoopbackAuthority(host: string | null | undefined, port: number): boolean {\n if (!host) return false;\n const authority = splitAuthority(host);\n if (!authority) return false;\n if (!LOOPBACK_HOSTNAMES.has(authority.hostname.toLowerCase())) return false;\n return authority.port === port;\n}\n\n/** Absent port means the scheme default; the daemon only ever speaks http. */\nconst DEFAULT_HTTP_PORT = 80;\n\nfunction splitAuthority(host: string): { hostname: string; port: number } | undefined {\n const value = host.trim();\n if (value === '') return undefined;\n\n if (value.startsWith('[')) {\n const close = value.indexOf(']');\n if (close === -1) return undefined;\n const hostname = value.slice(1, close);\n const rest = value.slice(close + 1);\n if (rest === '') return { hostname, port: DEFAULT_HTTP_PORT };\n if (!rest.startsWith(':')) return undefined;\n return withPort(hostname, rest.slice(1));\n }\n\n const colon = value.indexOf(':');\n if (colon === -1) return { hostname: value, port: DEFAULT_HTTP_PORT };\n // An unbracketed second colon is a bare IPv6 literal, which is malformed in a\n // Host header — refuse rather than guess where the port starts.\n if (value.indexOf(':', colon + 1) !== -1) return undefined;\n return withPort(value.slice(0, colon), value.slice(colon + 1));\n}\n\nfunction withPort(hostname: string, port: string): { hostname: string; port: number } | undefined {\n if (!/^\\d+$/.test(port)) return undefined;\n return { hostname, port: Number(port) };\n}\n","import { Hono } from 'hono';\nimport type { Server } from 'http';\nimport type { Duplex } from 'stream';\nimport { sessionsRoute } from './routes/sessions';\nimport { plansRoute } from './routes/plans';\nimport { runnersRoute } from './routes/runners';\nimport { modelsRoute } from './routes/models';\nimport { workspacesRoute } from './routes/workspaces';\nimport { approvalsRoute } from './routes/approvals';\nimport { settingsRoute } from './routes/settings';\nimport { commandsRoute } from './routes/commands';\nimport { createWsHandler } from './ws/stream';\nimport {\n decideAdmission,\n type AdmissionContext,\n type AdmissionDecision,\n} from './security/admission';\nimport { OrchestratorPool } from './pool/orchestratorPool';\n\nexport function createApp(pool: OrchestratorPool, admission: AdmissionContext) {\n const app = new Hono();\n\n // There is no CORS allowlist: the daemon ships no browser front end, so a\n // browser has no legitimate reason to reach it at all. The bearer token\n // supersedes it, and covers every local caller rather than only browsers.\n app.use('*', async (c, next) => {\n const decision = decideAdmission({\n origin: c.req.header('origin') ?? null,\n // The request URL's authority is built from the Host header upstream, so\n // it is the same value; the fallback only matters when the header is\n // absent entirely, which fails the check anyway.\n host: c.req.header('host') ?? new URL(c.req.url).host,\n authorization: c.req.header('authorization') ?? null,\n }, admission);\n if (!decision.admit) return c.json({ error: decision.reason }, decision.status as 401 | 403);\n await next();\n });\n\n app.route('/api/sessions', sessionsRoute(pool));\n app.route('/api/plans', plansRoute(pool));\n app.route('/api/runners', runnersRoute(pool));\n app.route('/api/models', modelsRoute(pool));\n app.route('/api/settings', settingsRoute(pool));\n app.route('/api/commands', commandsRoute());\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// Minted before the socket is listening, so no request can arrive before there\n// is a token to check it against.\nconst { token, file: tokenFile } = mintDaemonToken(port);\nconst admission = { port, token, tokenFile };\n\n// Tasks 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() });\nconst app = createApp(pool, admission);\n\n// Warm the model caches at startup (same as the VS Code extension's activation\n// refresh): runner model discovery + provider routing lists, so the first\n// request/plan doesn't pay the discovery latency and stale caches are rebuilt.\npool.getProviderModels().catch((err) => {\n console.error(`[web] model discovery warmup failed: ${err?.message ?? err}`);\n});\n\napp.get('/', (c) => c.json({ message: 'Ordewell API', docs: '/api/workspaces' }));\n\nconst server = createServer(createRequestListener(app));\n\nattachWsHandler(server, pool, admission);\n\nserver.listen(port, '127.0.0.1', () => {\n console.error(`[web] Ordewell API server: http://localhost:${port}`);\n});\n\nfunction shutdown(): void {\n 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","isCliProvider","resolveProvider","normalizeGeminiModel","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","RunnerRegistry","RunnerInstallation","SettingsService","PlannerModelMemory","removedPluginNotice","StructuredRunner","ModelResolver","CodexSandboxAvailability","nodeSpawn","sessionRuntimeSettings","assertWorkspaceExists","assertWorkspaceIsProject","WorkspaceNotAProjectError","ensureStateDirIgnored","createSession","runnerForProvider","admitSettingsEnv","selectPlanner","PROVIDER_CREDENTIAL_ENV","configuredProviders","runnerModesFrom","migratePlanState","loadSession","SessionNotFoundError","scanWorkspaces","listSessions","deleteSession","NoPlanError","AlreadyExecutingError","WorkspaceNotFoundError","PlannerTurnStoppedError","PlannerTurnDiscardedError","ConversationBusyError","ConversationEditError","PlanEditError","TaskControlError","pool","Hono","loadSessionPlanState","surfacePlanState","surfacePlan","listTaskLogAttempts","taskLogForSurface","readTaskLog","flattenTasks","run","toApprovalDecision","isGranted","RunSettingsError","WebSocketServer","DAEMON_SUBPROTOCOL","tokensMatch","extractPresentedToken","port","server","createServer","mintDaemonToken"],"mappings":"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","file":"main.js","sourcesContent":["import { AiProvider, BaseConfig, DEFAULT_RUNNERS, isCliProvider, normalizeGeminiModel, resolveProvider } from '@ordewell/core';\nimport type { ProviderModelLists } from '@ordewell/core';\n\ninterface WebConfigOpts {\n enabledRunners?: string[];\n providerModelLists?: ProviderModelLists;\n modelOverride?: string;\n}\n\nexport class WebConfig extends BaseConfig {\n private _provider: AiProvider | null = null;\n private _providerCacheKey: string | null = null;\n private _providerCacheLists: ProviderModelLists | undefined = undefined;\n private _enabledRunnersOverride: string[] | undefined;\n private _providerModelLists: ProviderModelLists | undefined;\n private _modelOverride: string | undefined;\n\n constructor(opts?: WebConfigOpts) {\n super();\n this._enabledRunnersOverride = opts?.enabledRunners;\n this._providerModelLists = opts?.providerModelLists;\n this._modelOverride = opts?.modelOverride;\n }\n\n setProviderModelLists(lists: ProviderModelLists): void {\n this._providerModelLists = lists;\n this._provider = null;\n }\n\n get orchestratorModel(): string {\n return this._modelOverride || process.env.ORCHESTRATOR_MODEL || '';\n }\n\n get aiProvider(): AiProvider {\n // Memoized by cache key rather than forever: a session's WebConfig lives\n // for the whole session, but /model and /planner switches mutate process.env\n // mid-session, so a permanent cache would strand the transport on the old\n // provider (mirrors the live-read behavior of `orchestratorModel` above).\n const explicitEnv = process.env.AI_PROVIDER;\n const model = this._modelOverride || process.env.ORCHESTRATOR_MODEL;\n const cacheKey = `${explicitEnv ?? ''}|${model ?? ''}`;\n if (\n this._provider &&\n this._providerCacheKey === cacheKey &&\n this._providerCacheLists === this._providerModelLists\n ) {\n return this._provider;\n }\n\n // An explicitly chosen harness planner (ADR-0009) wins over model-based\n // resolution: its model ids are the agent's own (`sonnet`, `gpt-5.6-sol`)\n // and can collide with a vendor catalog, which would silently route the\n // planner back to an API the user may not even have a key for.\n const explicit = explicitEnv as AiProvider | undefined;\n if (explicit && isCliProvider(explicit)) {\n this._provider = explicit;\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n\n if (model && this._providerModelLists) {\n const resolved = resolveProvider(model, this._providerModelLists);\n if (resolved) {\n this._provider = resolved;\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n }\n\n this._provider = BaseConfig.detectProvider('openrouter');\n this._providerCacheKey = cacheKey;\n this._providerCacheLists = this._providerModelLists;\n return this._provider;\n }\n\n get apiKey(): string {\n return this.getProviderApiKey(this.aiProvider);\n }\n\n get planningModel(): string {\n if (this.aiProvider === 'google')\n return normalizeGeminiModel(process.env.GEMINI_MODEL || process.env.ORCHESTRATOR_MODEL || super.geminiModel);\n return process.env.ORCHESTRATOR_MODEL || '';\n }\n\n get enabledRunners(): string[] {\n if (this._enabledRunnersOverride) return this._enabledRunnersOverride;\n\n const envRunners = process.env.ORDEWELL_ENABLED_RUNNERS;\n if (envRunners) {\n const parsed = envRunners.split(',').map((s) => s.trim()).filter(Boolean);\n if (parsed.length > 0) return parsed;\n }\n\n const out: string[] = [];\n if (process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== 'false' && process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== '0') {\n out.push('claude-code');\n }\n if (process.env.ORDEWELL_CODEX_ENABLED === 'true' || process.env.ORDEWELL_CODEX_ENABLED === '1') {\n out.push('codex');\n }\n if (process.env.ORDEWELL_OPENCODE_ENABLED === 'true' || process.env.ORDEWELL_OPENCODE_ENABLED === '1') {\n out.push('opencode');\n }\n return out.length > 0 ? out : [...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 anchor = await this.searchAnchor(absRoot);\n const result = await run('rg', buildGlobArgs(pattern, absRoot), { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() });\n // rg exits 1 for \"no files matched\", which is a valid empty answer.\n if (result.code !== 0 && result.code !== 1 && !result.stdout) {\n return { success: false, output: `Glob failed: ${result.stderr.trim() || 'ripgrep error'}`, truncated: false };\n }\n const capped = applyHeadLimit(result.stdout, headLimit);\n return {\n success: true,\n output: formatSearchOutput(capped, anchor, { emptyMessage: 'No files matched.', hint: 'Narrow the pattern.' }),\n truncated: capped.truncated,\n };\n }\n\n // `find -path` treats `*` as crossing `/`, so `**` is not recursive there.\n // Translating to `-name` on the basename keeps the common cases honest\n // rather than silently returning a different result set than ripgrep would.\n const basename = pattern.split('/').pop() || pattern;\n const excludeArgs = SEARCH_EXCLUSIONS.flatMap((dir) => ['-not', '-path', `*/${dir}/*`]);\n const result = await run('find', [absRoot, '-type', 'f', '-name', basename, ...excludeArgs], { timeout: SEARCH_TIMEOUT_MS, env: this.searchEnv() });\n if (result.code !== 0 && !result.stdout) {\n return { success: false, output: `Glob failed: ${result.stderr.trim() || 'find error'}`, truncated: false };\n }\n const capped = applyHeadLimit(result.stdout, headLimit);\n return {\n success: true,\n output: formatSearchOutput(capped, absRoot, { emptyMessage: 'No files matched.' }),\n truncated: capped.truncated,\n };\n }\n\n /**\n * A directory to anchor a search in. `cwd` exists only so anchored\n * `--glob`/`--include` patterns resolve against the search root (see\n * globImpl), and spawn(2) rejects a `cwd` that is a file with ENOTDIR.\n *\n * `grep`'s `path` is documented as a directory, but the tool description\n * tells the model to survey with output_mode=\"files\" and then re-run \"on a\n * narrower path\" — and what that survey hands back are files. rg and grep\n * both search a single file happily, so anchor at the parent rather than\n * failing a legitimately file-scoped search.\n */\n private async searchAnchor(absRoot: string): Promise<string> {\n try {\n return (await fs.stat(absRoot)).isDirectory() ? absRoot : path.dirname(absRoot);\n } catch {\n return absRoot;\n }\n }\n\n protected async grepImpl(pattern: string, absRoot: string, opts: GrepOptions): Promise<ToolOutcome> {\n const headLimit = opts.headLimit ?? 100;\n const useRg = await this.hasRg();\n // Same anchored-glob-vs-cwd hazard as globImpl: an `include` filter with a\n // `/` in it would otherwise resolve against the daemon's cwd, not absRoot.\n const anchor = await this.searchAnchor(absRoot);\n // GNU grep's `--include` only matches a basename, so an anchored pattern\n // like `subdir/*.txt` never matches there — strip it from the grep call\n // and filter matches by relative path afterward instead.\n const anchoredInclude = !useRg && opts.include?.includes('/') ? opts.include : undefined;\n const result = useRg\n ? await run('rg', buildGrepArgs(pattern, opts, absRoot).args, { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() })\n : await run('grep', buildFallbackGrepArgs(pattern, anchoredInclude ? { ...opts, include: undefined } : opts, absRoot, await this.fallbackGrepRegex()), { timeout: SEARCH_TIMEOUT_MS, cwd: anchor, env: this.searchEnv() });\n\n // Exit 1 is \"no matches\" for both tools — a successful search with an empty\n // result, not a failure. Anything else with no stdout is a real error.\n if (result.code !== 0 && result.code !== 1 && !result.stdout) {\n return { success: false, output: `Search failed: ${result.stderr.trim() || 'search error'}`, truncated: false };\n }\n\n const filteredStdout = anchoredInclude\n ? filterFallbackByAnchoredInclude(result.stdout, anchoredInclude, anchor, opts.outputMode)\n : result.stdout;\n const capped = applyHeadLimit(filteredStdout, headLimit);\n const hint = opts.outputMode === 'content'\n ? 'Re-run with output_mode=\"files\" to see the full breadth, or narrow with include/path.'\n : 'Narrow with include/path.';\n return {\n success: true,\n output: formatSearchOutput(capped, anchor, { emptyMessage: 'No matches found.', hint }),\n truncated: capped.truncated,\n };\n }\n\n protected async listDirImpl(absPath: string, depth: number): Promise<ToolOutcome> {\n 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): void {\n this.inner.stop(sessionId);\n this.owned.delete(sessionId);\n }\n\n stopAll(): void {\n for (const id of this.owned) this.inner.stop(id);\n this.owned.clear();\n }\n}\n","import { spawn as nodeSpawn } from 'child_process';\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 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 AiProvider,\n type PlannerModelCandidate,\n type PlannerSelectionChange,\n type PlannerSelectionState,\n StructuredRunner,\n CodexSandboxAvailability,\n} from '@ordewell/core';\nimport { WebConfig } from '../adapters/WebConfig';\nimport { scanWorkspaces as scanWorkspacesImpl } from '../utils/workspaceScanner';\nimport { PoolFileSystem } from '../adapters/PoolFileSystem';\nimport { PoolAwareRunner } from '../adapters/PoolAwareRunner';\nimport 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\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}\n\nexport class OrchestratorPool {\n private sessions = new Map<string, Session>();\n private clients = new Map<string, Set<WebSocket>>();\n private registry: CoreRunnerRegistry = new RunnerRegistry();\n private modelResolver: ModelResolver;\n private runnerInstallation = new RunnerInstallation(this.registry);\n private cachedProviderLists: Record<string, string[]> | undefined;\n private settingsService = new SettingsService();\n private plannerModelMemory = new PlannerModelMemory(this.settingsService);\n private 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.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 subscribe(sessionId: string, ws: WebSocket): void {\n if (!this.clients.has(sessionId)) this.clients.set(sessionId, new Set());\n this.clients.get(sessionId)!.add(ws);\n }\n\n unsubscribe(sessionId: string, ws: WebSocket): void {\n this.clients.get(sessionId)?.delete(ws);\n if (this.clients.get(sessionId)?.size === 0) this.clients.delete(sessionId);\n }\n\n private broadcast(sessionId: string, msg: SessionMessage | SessionNotice): void {\n const payload = JSON.stringify(msg);\n for (const ws of this.clients.get(sessionId) ?? []) {\n if (ws.readyState === ws.OPEN) ws.send(payload);\n }\n }\n\n hasSession(sessionId: string): boolean { return this.sessions.has(sessionId); }\n\n /** Answer an approval prompt, the planner's or a task runner's. False means the id was unknown or already settled. */\n resolveApproval(sessionId: string, approvalId: string, answer: ApprovalAnswer): boolean {\n return this.sessions.get(sessionId)?.resolveApproval(approvalId, answer) ?? false;\n }\n\n outstandingApprovals(sessionId: string) {\n return this.sessions.get(sessionId)?.outstandingApprovals() ?? [];\n }\n\n approvedScopes(sessionId: string): string[] {\n return this.sessions.get(sessionId)?.approvedScopes() ?? [];\n }\n isExecuting(sessionId: string): boolean { return this.sessions.get(sessionId)?.isExecuting ?? false; }\n getPlan(sessionId: string): LegacyPlanState | null { return this.sessions.get(sessionId)?.planState ?? null; }\n /**\n * The plan of a session this process is holding, straight from its store —\n * null for an id the pool never adopted. Reading it through the saved file\n * instead answers as if nothing were running.\n */\n getPlanState(sessionId: string): PlanState | null {\n return this.sessions.get(sessionId)?.currentPlanState ?? null;\n }\n getGoal(sessionId: string): string { return this.sessions.get(sessionId)?.currentGoal ?? ''; }\n /** 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\n private runtimeSettings(): SessionRuntimeSettings {\n return sessionRuntimeSettings(this.settingsService.getAll());\n }\n\n private createSessionFor(sessionId: string, workspace: string, modelOverride?: string, options: { allowInit?: boolean } = {}): Session {\n // Rejected here rather than left to the planner: a non-existent workspace\n // otherwise reaches the harness adapter's `spawn` as an ENOENT that reads\n // as a missing agent binary, not a missing directory.\n assertWorkspaceExists(workspace);\n // Rejected here too: without a project marker, the filesystem root or an\n // arbitrary system directory becomes the confinement boundary for every\n // read, search and permitted command the planner runs. `allowInit` only\n // ever arrives here on the retry of a call the user already saw and\n // explicitly confirmed (the TUI's \"initialize this as a new workspace?\"\n // prompt) — never as a default, so an unmarked directory is still never\n // admitted silently.\n try {\n assertWorkspaceIsProject(workspace);\n } catch (err) {\n if (!(err instanceof WorkspaceNotAProjectError) || !options.allowInit) throw err;\n ensureStateDirIgnored(workspace);\n assertWorkspaceIsProject(workspace);\n }\n const config = new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n modelOverride,\n providerModelLists: this.cachedProviderLists,\n });\n const fsAdapter = new PoolFileSystem(workspace);\n const broadcast = (msg: SessionMessage) => this.broadcast(sessionId, msg);\n 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 user's runner choice, or undefined when they have never made one —\n * which is what lets `WebConfig` fall back to the environment's defaults.\n * Read per call rather than cached: the settings file is shared with the\n * VS Code extension host, and `getAll()` already invalidates on mtime.\n */\n private enabledRunnerOverride(): string[] | undefined {\n return this.settingsService.getEnabledRunners();\n }\n\n /**\n * Persisted, not held in memory: the daemon dies with the TUI, and a\n * process-local override meant every reopen silently reinstated the\n * environment's defaults over what the user had chosen.\n */\n setRunnerEnabled(id: string, enabled: boolean): void {\n const current = this.enabledRunnerOverride() ?? new WebConfig().enabledRunners;\n const next = enabled\n ? (current.includes(id) ? current : [...current, id])\n : current.filter((r) => r !== id);\n this.settingsService.setEnabledRunners(next);\n }\n\n getSettings(): SettingsResponse {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const userSettings = this.settingsService.getAll();\n return {\n orchestratorModel: config.orchestratorModel,\n // Who plans (ADR-0009) — a vendor id, or one of the three harness\n // planners. Surfaces need it to render the planner picker and to know\n // whether the planner model comes from a runner catalog or a vendor one.\n aiProvider: config.aiProvider,\n // A harness planner's thinking effort (ADR-0009). Surfaces need it back\n // to render the current level; without it the picker shows \"default\"\n // for a planner that is running at \"high\".\n plannerThinkingEffort: config.plannerThinkingEffort ?? '',\n maxParallel: config.maxParallelSessions,\n 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: AiProvider): PlannerModelCandidate[] {\n const runner = runnerForProvider(provider);\n if (runner) {\n return this.modelResolver.getCachedRunnerModels(runner).map((m) => ({ id: m.modelId, variants: m.variants }));\n }\n return this.modelResolver.getCachedPickerOptions().map((o) => ({ id: o.id }));\n }\n\n /**\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(): AiProvider {\n return new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n providerModelLists: this.cachedProviderLists,\n }).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.\n const current: PlannerSelectionState = {\n provider: this.plannerProviderInEffect(),\n model: process.env.ORCHESTRATOR_MODEL ?? '',\n effort: process.env.ORDEWELL_PLANNER_EFFORT ?? '',\n };\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.\n const plannerChange: PlannerSelectionChange = {\n provider: envChanges?.AI_PROVIDER as AiProvider | undefined,\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 }\n }\n\n if (selection) {\n process.env.ORCHESTRATOR_MODEL = selection.next.model;\n process.env.ORDEWELL_PLANNER_EFFORT = selection.next.effort;\n }\n\n if (changes.modelAllowlist && typeof changes.modelAllowlist === 'object') {\n const allowlist = changes.modelAllowlist as Record<string, unknown>;\n for (const [runner, ids] of Object.entries(allowlist)) {\n if (Array.isArray(ids)) {\n this.settingsService.setModelAllowlist(runner, ids.map(String));\n } else if (ids === null) {\n this.settingsService.setModelAllowlist(runner, undefined);\n }\n }\n }\n\n 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 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: process.env.ORCHESTRATOR_MODEL || '',\n providers,\n orchestratorModels,\n providerErrors,\n };\n }\n\n getRunnerState(): { enabledRunners: RunnerId[]; orchestratorModel: string } {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n return { enabledRunners: config.enabledRunners, orchestratorModel: config.orchestratorModel };\n }\n\n /**\n * Runners whose CLI is actually installed on the host, with display name and\n * enabled state. Only these should be offered for selection — an uninstalled\n * runner can't be spawned.\n */\n async getInstalledRunners(): Promise<RunnersResponse['runners']> {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const enabled = new Set(config.enabledRunners);\n // The runner list is the one place a user who just fixed their host looks\n // again, so it is where the cached answer is asked afresh.\n await this.codexSandbox.refresh();\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[], workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<PlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride, options);\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 // generatePlan can raise an approval and await the answer, and that\n // answer arrives over POST /api/approvals/:sessionId — which 404s until\n // the session is in this map. Registering only on return made the first\n // approval of every session unanswerable until its 5-minute timeout.\n this.sessions.set(sessionId, session);\n this.warmCodexSandbox();\n return migratePlanState(await session.generatePlan(goal, runners));\n }\n\n /**\n * Conversational planning (ADR-0002): start the planner dialogue for a\n * session. Returns the current plan state — a committed plan when the\n * planner had enough context, otherwise the dialogue so far (last\n * assistant message lives in conversationHistory).\n */\n async startPlanning(sessionId: string, goal: string, runners: RunnerId[], workspace: string, modelOverride?: string, options?: { allowInit?: boolean }): Promise<LegacyPlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride, options);\n this.destroy(sessionId);\n // See generatePlan: must be registered before the blocking call so a\n // mid-research approval is answerable rather than 404ing until timeout.\n this.sessions.set(sessionId, session);\n this.warmCodexSandbox();\n return session.startPlanning(goal, runners);\n }\n\n /** Continue the planner dialogue with the user's reply; refused while a planner turn is in flight. */\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 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 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, 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 };\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 return c.json({ meta: saved.meta, plan: surfacePlanState(pool.getPlanState(id) ?? saved.plan) } 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 return c.json({ ok: true, plan: surfacePlan(plan), goal: pool.getGoal(id) } 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')) } 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)) } 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 AlreadyExecutingError,\n flattenTasks,\n NoPlanError,\n surfacePlan,\n surfacePlanState,\n TaskControlError,\n type CommandOutcome,\n type ConversationCompactResponse,\n type ConversationForkResponse,\n type ConversationRewindResponse,\n type ExecuteResponse,\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/** 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.\n const runnerList: string[] = Array.isArray(runners) ? runners : (runners ? [runners] : (queryRunners ? queryRunners.split(',').map(s => s.trim()).filter(Boolean) : pool.getRunnerState().enabledRunners));\n const plan = await pool.generatePlan(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n const { models, modelsByRunner } = await pool.getProviderModels();\n 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` and `already_executing` distinct\n // from a plain refusal; the seam refuses either way, so the codes it\n // cannot carry are kept here.\n if (!session.planState || session.planTasks.length === 0) throw new NoPlanError('execute');\n if (session.isExecuting) throw new AlreadyExecutingError();\n await runUserCommand(session, { command: 'run_plan' });\n return c.json({ status: 'running' } 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 // A stop with nothing running is a no-op, not a refusal: the surface already said stopped.\n await pool.session(c.req.param('sessionId')).execute({ command: 'stop_run' }, { kind: 'user' });\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 router.post('/:sessionId/tasks/:taskId/complete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskComplete(c.req.param('taskId'));\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'mark complete', { fallback: 404, message: 'Not found' });\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/uncomplete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskIncomplete(c.req.param('taskId'));\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'mark incomplete', { fallback: 404, message: 'Not found' });\n }\n });\n\n // A task paused on a usage limit then waits for a manual retry; `cancelled`\n // is false when no resume was scheduled for it.\n router.post('/:sessionId/tasks/:taskId/resume/cancel', (c) => {\n try {\n const cancelled = pool.session(c.req.param('sessionId')).cancelScheduledResume(c.req.param('taskId'));\n return c.json({ cancelled } satisfies CancelResumeResponse);\n } catch (err) {\n return failure(c, err, 'cancel resume', { fallback: 404, message: 'Not found' });\n }\n });\n\n // The user says the limit has reset early: the task, and every other one\n // waiting on its runner's reset, resumes in its saved session now.\n router.post('/:sessionId/tasks/:taskId/resume/now', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).resumeNow(c.req.param('taskId'));\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'resume now', { fallback: 404, message: 'Not found' });\n }\n });\n\n // Orchestrator controls — these spawn or kill runner processes, so they are\n // deliberately separate from the generic `PUT tasks/:taskId` status patch.\n // Each is an execution button, so it goes through the command seam as the\n // user (ADR-0029). Force start passes a merge gate, which the seam has no\n // command for, so it stays on the Session method.\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 ] as const) {\n router.post(`/:sessionId/tasks/:taskId/${segment}`, async (c) => {\n try {\n await runUserCommand(pool.session(c.req.param('sessionId')), command(c.req.param('taskId')));\n return c.json({ ok: true } 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 await runUserCommand(pool.session(c.req.param('sessionId')), { command: 'skip_task', task: c.req.param('taskId'), ...(reason ? { reason } : {}) });\n return c.json({ ok: true } 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 await pool.session(c.req.param('sessionId')).forceStartTask(c.req.param('taskId'));\n return c.json({ ok: true } satisfies OkResponse);\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) => 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 plain message reaches the task through the command seam as the user (ADR-0029),\n // so it lands in the timeline; force send has no command and stays on the Session.\n router.post('/:sessionId/tasks/:taskId/messages', messageHandler(async (session, taskId, text) =>\n (await runUserCommand(session, { command: 'message_task', task: taskId, text })).id ?? ''));\n router.post('/:sessionId/tasks/:taskId/messages/now', messageHandler((session, taskId, text) => session.forceSendTaskMessage(taskId, text)));\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 not yet delivered, queued or already handed over;\n // `sent` is false once it was delivered.\n router.post('/:sessionId/tasks/:taskId/messages/:messageId/now', (c) => {\n try {\n const sent = pool.session(c.req.param('sessionId')).forceSendQueuedTaskMessage(c.req.param('taskId'), c.req.param('messageId'));\n return c.json({ sent } 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 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 } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId/messages/:messageId', (c) => {\n try {\n const removed = pool.session(c.req.param('sessionId')).removeQueuedTaskMessage(c.req.param('taskId'), c.req.param('messageId'));\n return c.json({ removed } satisfies RemoveMessageResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/interrupt', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).interruptTask(c.req.param('taskId'));\n return c.json({ ok: true } satisfies OkResponse);\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 router.post('/:sessionId/tasks/:taskId/checkpoint/approve', (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n if (!session.awaitsCheckpoint(taskId)) return refuse(c, 409, NO_CHECKPOINT, 'checkpoint_not_waiting');\n session.approveCheckpoint(taskId);\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/:taskId/checkpoint/reject', async (c) => {\n try {\n const body: unknown = await c.req.json().catch(() => ({}));\n const reason = typeof body === 'object' && body !== null && 'reason' in body && typeof body.reason === 'string' ? body.reason.trim() : '';\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n if (!session.awaitsCheckpoint(taskId)) return refuse(c, 409, NO_CHECKPOINT, 'checkpoint_not_waiting');\n session.rejectCheckpoint(taskId, reason || undefined);\n return c.json({ ok: true } satisfies OkResponse);\n } catch (err) {\n return failure(c, err, 'task edit');\n }\n });\n\n // What a task waits on at its merge gate (ADR-0020), for a surface that asks\n // before a force start passes it. Empty when nothing gates the task.\n router.get('/:sessionId/tasks/:taskId/merge-gate', (c) => {\n try {\n const session = pool.session(c.req.param('sessionId'));\n const tasks = flattenTasks(session.planState?.tasks ?? []);\n const mergeGate = session.mergeGate(c.req.param('taskId')).map((id) => {\n const dep = tasks.find((t) => t.id === id);\n return { id, order: dep?.order ?? 0, title: dep?.title ?? id };\n });\n return c.json({ mergeGate } 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 return c.json(await pool.session(c.req.param('sessionId')).mergeRun() satisfies IsolationMergeResponse);\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 { assignedRunner, dependencies, ...rest } = await c.req.json();\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n\n // Two fields are not field writes. A runner change carries the task's\n // model, effort and mode with it, and a dependency list has to be\n // validated against the whole graph — each has one owner on the session.\n // The runner goes first: its retarget derives a model, and an explicit\n // model in the same patch must win over that derived one.\n const hasRunner = typeof assignedRunner === 'string';\n const hasDeps = Array.isArray(dependencies);\n\n let result = null;\n if (hasRunner) result = await session.setTaskRunner(taskId, assignedRunner);\n if (hasDeps) {\n try {\n result = await session.setTaskDependencies(taskId, dependencies.map(String));\n } catch (err) {\n // A rejected dependency edit is the client's mistake, not a fault.\n return failure(c, err, 'task dependencies', { fallback: 400 });\n }\n }\n // An empty patch still reaches updateTask — that is how a caller asks\n // whether the task exists at all.\n if (Object.keys(rest).length > 0 || (!hasRunner && !hasDeps)) result = await session.updateTask(taskId, rest);\n\n if (!result) return 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 plan = await pool.session(c.req.param('sessionId')).approveReview();\n return c.json({ plan: surfacePlan(plan) } satisfies PlanResponse);\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 const runnerList: string[] = Array.isArray(runners) ? runners : (runners ? [runners] : pool.getRunnerState().enabledRunners);\n const plan = await pool.startPlanning(c.req.param('sessionId'), goal, runnerList, ws, model, { allowInit });\n return c.json({ plan: 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 // 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 type { OkResponse, 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 const state = pool.getRunnerState();\n const runners = await pool.getInstalledRunners();\n return c.json({\n runners,\n orchestratorModel: state.orchestratorModel,\n } satisfies RunnersResponse);\n });\n\n router.put('/:id', async (c) => {\n const id = c.req.param('id');\n const body = await c.req.json();\n pool.setRunnerEnabled(id, body.enabled);\n return c.json({ ok: true } 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 the user denies goes through the command seam, so their\n // action is kept in the timeline (ADR-0029). An allow must reach the\n // approval path: the seam never allows, and the user's own Allow is legitimate.\n const request = pool.outstandingApprovals(sessionId).find((pending) => pending.id === approvalId)?.request;\n if (decided.decision === 'deny' && request?.taskId) {\n const outcome = await pool.session(sessionId).execute(\n { command: 'answer_approval', task: request.taskId, approval: approvalId, answer: '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, 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 router.get('/', (c) => {\n const settings: SettingsResponse = pool.getSettings();\n return c.json(settings);\n });\n\n router.patch('/', async (c) => {\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) ws.send(JSON.stringify({ type: 'run_snapshot', sessionId, view } satisfies RunSnapshotFrame));\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() });\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"]}