@ordewell/web 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/main.js +21 -13
- package/dist/server/main.js.map +1 -1
- package/package.json +2 -2
package/dist/server/main.js
CHANGED
|
@@ -363,7 +363,6 @@ var OrchestratorPool = class {
|
|
|
363
363
|
})();
|
|
364
364
|
modelResolver = new core.ModelResolver(this.registry, new WebConfig());
|
|
365
365
|
runnerInstallation = new core.RunnerInstallation(this.registry);
|
|
366
|
-
enabledRunnerOverride;
|
|
367
366
|
cachedProviderLists;
|
|
368
367
|
settingsService = new core.SettingsService();
|
|
369
368
|
sharedRunner;
|
|
@@ -424,7 +423,7 @@ var OrchestratorPool = class {
|
|
|
424
423
|
}
|
|
425
424
|
createSessionFor(sessionId, workspace, modelOverride) {
|
|
426
425
|
const config = new WebConfig({
|
|
427
|
-
enabledRunners: this.enabledRunnerOverride,
|
|
426
|
+
enabledRunners: this.enabledRunnerOverride(),
|
|
428
427
|
modelOverride,
|
|
429
428
|
providerModelLists: this.cachedProviderLists
|
|
430
429
|
});
|
|
@@ -449,18 +448,27 @@ var OrchestratorPool = class {
|
|
|
449
448
|
sessionId
|
|
450
449
|
});
|
|
451
450
|
}
|
|
451
|
+
/**
|
|
452
|
+
* The user's runner choice, or undefined when they have never made one —
|
|
453
|
+
* which is what lets `WebConfig` fall back to the environment's defaults.
|
|
454
|
+
* Read per call rather than cached: the settings file is shared with the
|
|
455
|
+
* VS Code extension host, and `getAll()` already invalidates on mtime.
|
|
456
|
+
*/
|
|
457
|
+
enabledRunnerOverride() {
|
|
458
|
+
return this.settingsService.getEnabledRunners();
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Persisted, not held in memory: the daemon dies with the TUI, and a
|
|
462
|
+
* process-local override meant every reopen silently reinstated the
|
|
463
|
+
* environment's defaults over what the user had chosen.
|
|
464
|
+
*/
|
|
452
465
|
setRunnerEnabled(id, enabled) {
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
if (enabled && !this.enabledRunnerOverride.includes(id)) {
|
|
457
|
-
this.enabledRunnerOverride.push(id);
|
|
458
|
-
} else if (!enabled) {
|
|
459
|
-
this.enabledRunnerOverride = this.enabledRunnerOverride.filter((r) => r !== id);
|
|
460
|
-
}
|
|
466
|
+
const current = this.enabledRunnerOverride() ?? new WebConfig().enabledRunners;
|
|
467
|
+
const next = enabled ? current.includes(id) ? current : [...current, id] : current.filter((r) => r !== id);
|
|
468
|
+
this.settingsService.setEnabledRunners(next);
|
|
461
469
|
}
|
|
462
470
|
getSettings() {
|
|
463
|
-
const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride });
|
|
471
|
+
const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });
|
|
464
472
|
const userSettings = this.settingsService.getAll();
|
|
465
473
|
return {
|
|
466
474
|
orchestratorModel: config.orchestratorModel,
|
|
@@ -581,7 +589,7 @@ var OrchestratorPool = class {
|
|
|
581
589
|
};
|
|
582
590
|
}
|
|
583
591
|
getRunnerState() {
|
|
584
|
-
const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride });
|
|
592
|
+
const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });
|
|
585
593
|
return { enabledRunners: config.enabledRunners, orchestratorModel: config.orchestratorModel };
|
|
586
594
|
}
|
|
587
595
|
/**
|
|
@@ -590,7 +598,7 @@ var OrchestratorPool = class {
|
|
|
590
598
|
* runner can't be spawned.
|
|
591
599
|
*/
|
|
592
600
|
async getInstalledRunners() {
|
|
593
|
-
const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride });
|
|
601
|
+
const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });
|
|
594
602
|
const enabled = new Set(config.enabledRunners);
|
|
595
603
|
const plugins = this.registry.list();
|
|
596
604
|
const installedIds = new Set(
|
package/dist/server/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/adapters/WebConfig.ts","../../server/utils/workspaceScanner.ts","../../server/adapters/run.ts","../../server/adapters/PoolFileSystem.ts","../../server/adapters/PoolAwareRunner.ts","../../server/pool/orchestratorPool.ts","../../server/routes/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/app.ts","../../server/main.ts"],"names":["BaseConfig","isCliProvider","resolveProvider","normalizeGeminiModel","fs","path","args","resolve","execFile","BaseFileSystem","researchToolsPath","withPath","result","buildGlobArgs","capped","applyHeadLimit","formatSearchOutput","SEARCH_EXCLUSIONS","path2","buildGrepArgs","buildFallbackGrepArgs","filterFallbackByAnchoredInclude","HeadlessRunner","RunnerRegistry","ModelResolver","RunnerInstallation","SettingsService","sessionRuntimeSettings","Session","PROVIDER_PRIORITY","runnerModesFrom","migratePlanState","loadSession","scanWorkspaces","listSessions","deleteSession","pool","Hono","loadSessionPlanState","run","WebSocketServer","app","cors","server","hasTmux","TmuxRunner","createServer"],"mappings":"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","file":"main.js","sourcesContent":["import { AiProvider, BaseConfig, isCliProvider, normalizeGeminiModel, resolveProvider } from '@ordewell/core';\nimport type { ProviderModelLists } from '@ordewell/core';\n\ninterface WebConfigOpts {\n enabledRunners?: string[];\n providerModelLists?: ProviderModelLists;\n modelOverride?: string;\n}\n\nexport class WebConfig extends BaseConfig {\n private _provider: AiProvider | null = null;\n private _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 if (this._provider) return this._provider;\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 = process.env.AI_PROVIDER as AiProvider | undefined;\n if (explicit && isCliProvider(explicit)) {\n this._provider = explicit;\n return this._provider;\n }\n\n const model = this._modelOverride || process.env.ORCHESTRATOR_MODEL;\n if (model && this._providerModelLists) {\n const resolved = resolveProvider(model, this._providerModelLists);\n if (resolved) {\n this._provider = resolved;\n return this._provider;\n }\n }\n\n this._provider = BaseConfig.detectProvider('openrouter');\n return this._provider;\n }\n\n get apiKey(): string {\n return this.getProviderApiKey(this.aiProvider);\n }\n\n get planningModel(): string {\n if (this.aiProvider === 'google')\n return normalizeGeminiModel(process.env.GEMINI_MODEL || process.env.ORCHESTRATOR_MODEL || super.geminiModel);\n return process.env.ORCHESTRATOR_MODEL || '';\n }\n\n get enabledRunners(): string[] {\n if (this._enabledRunnersOverride) return this._enabledRunnersOverride;\n\n const envRunners = process.env.ORDEWELL_ENABLED_RUNNERS;\n if (envRunners) {\n const parsed = envRunners.split(',').map((s) => s.trim()).filter(Boolean);\n if (parsed.length > 0) return parsed;\n }\n\n const out: string[] = [];\n if (process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== 'false' && process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== '0') {\n out.push('claude-code');\n }\n if (process.env.ORDEWELL_CODEX_ENABLED === 'true' || process.env.ORDEWELL_CODEX_ENABLED === '1') {\n out.push('codex');\n }\n if (process.env.ORDEWELL_OPENCODE_ENABLED === 'true' || process.env.ORDEWELL_OPENCODE_ENABLED === '1') {\n out.push('opencode');\n }\n return out.length > 0 ? out : ['claude-code'];\n }\n\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface WorkspaceScannerDeps {\n fsModule: typeof fs;\n pathModule: typeof path;\n cwd: string;\n home: string;\n projectDir: string;\n}\n\nexport function scanWorkspacesImpl(deps: WorkspaceScannerDeps): string[] {\n const { fsModule, pathModule, cwd, home, projectDir } = deps;\n const paths = new Set<string>();\n const searchRoots = [\n cwd,\n home,\n pathModule.join(home, 'projects'),\n pathModule.join(home, 'dev'),\n pathModule.join(home, 'code'),\n pathModule.join(home, 'src'),\n pathModule.join(home, 'Desktop'),\n pathModule.join(home, 'Documents'),\n ];\n for (const root of searchRoots) {\n try {\n if (fsModule.existsSync(pathModule.join(root, '.ordewell'))) paths.add(root);\n const entries = fsModule.readdirSync(root, { withFileTypes: true }).filter(e => e.isDirectory());\n for (const e of entries.slice(0, 50)) {\n const sub = pathModule.join(root, e.name);\n if (fsModule.existsSync(pathModule.join(sub, '.ordewell'))) paths.add(sub);\n }\n } catch { /* empty */ }\n }\n return [...paths].filter(p => p !== pathModule.resolve(projectDir)).sort();\n}\n\nexport function scanWorkspaces(): string[] {\n return scanWorkspacesImpl({\n fsModule: fs,\n pathModule: path,\n cwd: process.cwd(),\n home: process.env.HOME || '/root',\n projectDir: path.resolve(__dirname, '..', '..', '..', '..'),\n });\n}\n","import { execFile } from 'child_process';\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n code: number | null;\n}\n\n/**\n * Cap on a single child's buffered output. Above this, Node kills the child\n * and invokes the callback with `err.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER'`\n * — a string, so the coercion below maps it to `1` (see `run`).\n */\nexport const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;\n\n/**\n * The single primitive every search/inspection adapter in this package is\n * built on: spawn a child, never reject. Kept in its own module so the\n * contract that the planner depends on — synchronous spawn failures degrade\n * to a failed tool call, never a rejected promise that aborts the whole\n * planner turn — can be pinned by a focused test rather than exercised only\n * incidentally through the public adapter API.\n *\n * Node hands only ENOENT/EAGAIN/EMFILE/ENFILE from spawn(2) to the\n * callback; every other errno — ENOTDIR for a `cwd` that is a file, EACCES\n * for one it cannot enter — is thrown synchronously. Thrown in here that\n * rejects the promise, and no caller of `run` catches, so a single bad\n * search argument aborted the entire planner turn as \"Plan generation\n * failed: spawn ENOTDIR\". A failed spawn is a failed tool call, never a\n * failed plan.\n */\nexport function run(\n file: string,\n args: string[],\n opts: { cwd?: string; timeout: number; shell?: boolean; env?: NodeJS.ProcessEnv },\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 }, (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 filterFallbackByAnchoredInclude,\n applyHeadLimit,\n formatSearchOutput,\n researchToolsPath,\n withPath,\n SEARCH_EXCLUSIONS,\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 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), { 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): 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 })\n : await run(file, [...args, command], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS });\n const out = (result.stdout || '').trim();\n const err = (result.stderr || '').trim();\n\n if (result.code !== 0) {\n const detail = err || out || `exited with code ${result.code}`;\n // A failing command is still research: the model asked to diagnose, and\n // the failure output is usually the answer. Report it, do not swallow it.\n return { success: false, output: `Command exited ${result.code}:\\n${detail.slice(0, 20_000)}`, truncated: detail.length > 20_000 };\n }\n\n const combined = err ? `${out}\\n[stderr]\\n${err}` : out;\n return { success: true, output: combined || '(no output)', truncated: combined.length > 20_000 };\n }\n}\n","import { HeadlessRunner, type ITerminalRunner, type ITerminalSession, type RunnerId } from '@ordewell/core';\nimport type { SessionBroadcaster } from '@ordewell/core';\n\nexport class PoolAwareRunner implements ITerminalRunner {\n private inner: ITerminalRunner;\n /**\n * Sessions this plan spawned. The inner runner may be shared by every plan\n * in the pool (one tmux session per daemon), so \"stop everything\" and\n * \"how many are running\" must be answered from this set, never delegated —\n * delegating would let one plan's /stop kill another plan's tasks.\n */\n private owned = new Set<string>();\n\n constructor(\n private sessionId: string,\n private broadcast: SessionBroadcaster,\n inner?: ITerminalRunner,\n ) {\n this.inner = inner ?? new HeadlessRunner();\n }\n\n get activeCount(): number { return this.owned.size; }\n\n async spawn(opts: { taskId: string; runner: RunnerId; prompt: string; modelId?: string; thinkingEffort?: string; modelVariants?: string[]; mode?: 'build' | 'plan'; headless?: boolean; cwd: string; order?: number; title?: string }): Promise<ITerminalSession> {\n const session = await this.inner.spawn({ ...opts, planSessionId: this.sessionId });\n this.owned.add(session.id);\n session.onExit(() => this.owned.delete(session.id));\n this.broadcast({ type: 'task_started', taskId: opts.taskId, order: opts.order ?? 0, title: opts.title ?? '', runner: opts.runner, modelId: opts.modelId });\n session.onOutput((text) => {\n this.broadcast({ type: 'task_output', taskId: opts.taskId, text });\n });\n return session;\n }\n\n stop(sessionId: string): void {\n this.inner.stop(sessionId);\n this.owned.delete(sessionId);\n }\n\n stopAll(): void {\n for (const id of this.owned) this.inner.stop(id);\n this.owned.clear();\n }\n}\n","import { WebSocket } from 'ws';\nimport {\n Session,\n type SessionMessage,\n type SessionRuntimeSettings,\n ModelResolver,\n RunnerRegistry,\n RunnerInstallation,\n listSessions,\n loadSession,\n deleteSession,\n SettingsService,\n sessionRuntimeSettings,\n type PlanState,\n type LegacyPlanState,\n migratePlanState,\n type RunnerId,\n type DiscoveredModel,\n type OrchestratorOption,\n type RunnerModeInfo,\n runnerModesFrom,\n PROVIDER_PRIORITY,\n} 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 { RunnerRegistry as CoreRunnerRegistry, ITerminalRunner } from '@ordewell/core';\n\nexport interface OrchestratorPoolDeps {\n /**\n * Shared across every session instead of each `PoolAwareRunner` defaulting\n * to its own `HeadlessRunner` — needed so a tmux-backed runner's one\n * session/many-windows lifecycle outlives any single planning session.\n * Left undefined, behavior is unchanged from before this existed.\n */\n runner?: ITerminalRunner;\n}\n\nexport class OrchestratorPool {\n private sessions = new Map<string, Session>();\n private clients = new Map<string, Set<WebSocket>>();\n private registry: CoreRunnerRegistry = (() => { const r = new RunnerRegistry(); r.loadUserPlugins(); return r; })();\n private modelResolver = new ModelResolver(this.registry, new WebConfig());\n private runnerInstallation = new RunnerInstallation(this.registry);\n private enabledRunnerOverride: RunnerId[] | undefined;\n private cachedProviderLists: Record<string, string[]> | undefined;\n private settingsService = new SettingsService();\n private sharedRunner?: ITerminalRunner;\n\n constructor(deps: OrchestratorPoolDeps = {}) {\n this.sharedRunner = deps.runner;\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 // Replay the planner dialogue so a (re)connecting client gets the backlog\n // instead of an empty chat. Read-only — no LLM call is made.\n const plan = this.sessions.get(sessionId)?.planState;\n const history = plan?.conversationHistory ?? [];\n if (history.length > 0 && ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify({ type: 'chat_backlog', history }));\n }\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): 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 a planner approval prompt. False means the id was unknown or already settled. */\n resolveApproval(sessionId: string, approvalId: string, granted: boolean): boolean {\n return this.sessions.get(sessionId)?.resolveApproval(approvalId, granted) ?? 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): Session {\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.sharedRunner);\n return new Session({\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 modelResolver: this.modelResolver,\n settings: () => this.runtimeSettings(),\n sessionId,\n });\n }\n\n setRunnerEnabled(id: string, enabled: boolean): void {\n if (this.enabledRunnerOverride === undefined) {\n this.enabledRunnerOverride = new WebConfig().enabledRunners;\n }\n if (enabled && !this.enabledRunnerOverride.includes(id)) {\n this.enabledRunnerOverride.push(id);\n } else if (!enabled) {\n this.enabledRunnerOverride = this.enabledRunnerOverride.filter(r => r !== id);\n }\n }\n\n getSettings() {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride });\n const userSettings = this.settingsService.getAll();\n return {\n orchestratorModel: config.orchestratorModel,\n // Who plans (ADR-0009) — a vendor id, or one of the three harness\n // planners. Surfaces need it to render the planner picker and to know\n // whether the planner model comes from a runner catalog or a vendor one.\n aiProvider: config.aiProvider,\n // A harness planner's thinking effort (ADR-0009). Surfaces need it back\n // to render the current level; without it the picker shows \"default\"\n // for a planner that is running at \"high\".\n plannerThinkingEffort: config.plannerThinkingEffort ?? '',\n grillMe: userSettings.grillMe,\n tdd: userSettings.tdd,\n prd: userSettings.prd,\n review: userSettings.review,\n verification: userSettings.verification,\n researchSubagents: userSettings.researchSubagents,\n modelAllowlist: userSettings.modelAllowlist,\n };\n }\n\n updateSettings(changes: Record<string, unknown>) {\n if (typeof changes.orchestratorModel === 'string') {\n process.env.ORCHESTRATOR_MODEL = changes.orchestratorModel;\n }\n if (typeof changes.plannerThinkingEffort === 'string') {\n process.env.ORDEWELL_PLANNER_EFFORT = changes.plannerThinkingEffort;\n }\n if (changes.grillMe && typeof (changes.grillMe as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setGrillMe((changes.grillMe as Record<string, unknown>).enabled as boolean);\n }\n if (changes.tdd && typeof (changes.tdd as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setTdd((changes.tdd as Record<string, unknown>).enabled as boolean);\n }\n if (changes.prd && typeof (changes.prd as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setPrd((changes.prd as Record<string, unknown>).enabled as boolean);\n }\n if (changes.review && typeof (changes.review as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setReview((changes.review as Record<string, unknown>).enabled as boolean);\n }\n if (changes.verification && typeof (changes.verification as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setVerification((changes.verification as Record<string, unknown>).enabled as boolean);\n }\n if (changes.researchSubagents && typeof (changes.researchSubagents as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setResearchSubagents((changes.researchSubagents as Record<string, unknown>).enabled as boolean);\n }\n if (changes.env && typeof changes.env === 'object' && !Array.isArray(changes.env)) {\n const env = changes.env as Record<string, string>;\n let touched = false;\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === 'string' && /^[A-Z_]+$/.test(key)) {\n process.env[key] = value;\n touched = true;\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 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 return this.getSettings();\n }\n\n setOrchestratorModel(model: string): string {\n process.env.ORCHESTRATOR_MODEL = model;\n return model;\n }\n\n async getProviderModels(): Promise<{\n models: DiscoveredModel[];\n modelsByRunner: Record<string, DiscoveredModel[]>;\n /** Each runner's manifest modes, so a surface can offer a per-task mode picker. */\n modesByRunner: Record<string, RunnerModeInfo[]>;\n orchestratorModel: string;\n providers: string[];\n /** Full cross-provider catalog for the orchestrator (planner) model picker. */\n orchestratorModels: OrchestratorOption[];\n /** Per-provider catalog-fetch failures, keyed by provider id. */\n providerErrors: Record<string, string>;\n }> {\n const config = new WebConfig();\n\n const runnerIds = this.registry.list().map((p) => p.manifest.name);\n const [runnerModels, providerLists] = await Promise.all([\n this.modelResolver.modelsForRunners(runnerIds),\n this.modelResolver.refresh(),\n ]);\n\n // `refresh()` populates the picker cache, so this is the same fetch — no\n // second network round-trip. Errors are whatever that fetch recorded.\n const orchestratorModels = await this.modelResolver.pickerOptions();\n const providerErrors = this.modelResolver.getDiscoveryErrors();\n\n this.cachedProviderLists = providerLists;\n\n const allModels: DiscoveredModel[] = [];\n const seen = new Set<string>();\n const modelsByRunner: Record<string, DiscoveredModel[]> = {};\n\n for (const id of runnerIds) {\n modelsByRunner[id] = runnerModels[id] ?? [];\n for (const m of modelsByRunner[id]) {\n if (!seen.has(m.modelId)) {\n seen.add(m.modelId);\n allModels.push(m);\n }\n }\n }\n\n const providers: string[] = [];\n for (const provider of PROVIDER_PRIORITY) {\n if (provider === 'openai_compatible') {\n if (config.openaiCompatibleBaseUrl) providers.push(provider);\n } else if (provider === 'openrouter') {\n if (config.openrouterKey) providers.push(provider);\n } else if (provider === 'google') {\n if (config.geminiKey) providers.push(provider);\n } else if (config.getProviderApiKey(provider)) {\n providers.push(provider);\n }\n }\n\n return {\n models: allModels,\n modelsByRunner,\n modesByRunner: runnerModesFrom(this.registry, runnerIds),\n orchestratorModel: process.env.ORCHESTRATOR_MODEL || '',\n providers,\n orchestratorModels,\n providerErrors,\n };\n }\n\n getRunnerState(): { enabledRunners: RunnerId[]; orchestratorModel: string } {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride });\n return { enabledRunners: config.enabledRunners, orchestratorModel: config.orchestratorModel };\n }\n\n /**\n * Runners whose CLI is actually installed on the host, with display name and\n * enabled state. Only these should be offered for selection — an uninstalled\n * runner can't be spawned.\n */\n async getInstalledRunners(): Promise<{ id: string; name: string; enabled: boolean }[]> {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride });\n const enabled = new Set(config.enabledRunners);\n const plugins = this.registry.list();\n const installedIds = new Set(\n await this.runnerInstallation.filterInstalled(plugins.map((p) => p.manifest.name)),\n );\n return plugins\n .filter((p) => installedIds.has(p.manifest.name))\n .map((p) => ({\n id: p.manifest.name,\n name: p.manifest.displayName,\n enabled: enabled.has(p.manifest.name),\n }));\n }\n\n async generatePlan(sessionId: string, goal: string, runners: RunnerId[], workspace: string, modelOverride?: string): Promise<PlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride);\n // Registered before the blocking call, not after: research inside\n // generatePlan can raise an approval and await the answer, and that\n // answer arrives over POST /api/approvals/:sessionId — which 404s until\n // the session is in this map. Registering only on return made the first\n // approval of every session unanswerable until its 5-minute timeout.\n this.sessions.set(sessionId, session);\n const plan = await session.generatePlan(goal, runners);\n return migratePlanState(plan);\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): Promise<LegacyPlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride);\n // See generatePlan: must be registered before the blocking call so a\n // mid-research approval is answerable rather than 404ing until timeout.\n this.sessions.set(sessionId, session);\n const plan = await session.startPlanning(goal, runners);\n return plan;\n }\n\n /** Continue the planner dialogue with the user's reply. */\n async continuePlanning(sessionId: string, message: string): Promise<LegacyPlanState> {\n return this.session(sessionId).continueConversation(message);\n }\n\n /**\n * Register a session persisted on disk so its plan becomes executable and\n * editable. Only sessions planned in this process are otherwise addressable,\n * which left a restored plan readable but inert — every task endpoint\n * answered \"Session not found\".\n *\n * No LLM call happens here: the plan is adopted as saved, and the planner is\n * only contacted when the user next sends a message.\n */\n adoptSavedSession(sessionId: string, workspace: string): LegacyPlanState {\n // Re-adopting would clear the execution log and drop a running plan back to\n // its saved state, so a live session wins over the file.\n const live = this.sessions.get(sessionId);\n if (live?.planState) return live.planState;\n\n const saved = loadSession(sessionId, workspace);\n if (!saved) throw new Error('Session not found');\n\n const session = this.createSessionFor(sessionId, workspace);\n // The saved id is adopted too, so later persists rewrite the same file\n // instead of forking the session under a fresh identity.\n session.loadPlan(saved.plan, saved.meta.goal, workspace, { sessionId: saved.meta.id });\n this.sessions.set(sessionId, session);\n\n return session.planState ?? saved.plan;\n }\n\n /**\n * Direct access to a session's interface — routes call the Session; the\n * pool only registers sessions and fans broadcasts out to WS clients.\n */\n session(sessionId: string): Session {\n const session = this.sessions.get(sessionId);\n if (!session) throw new Error('Session not found');\n return session;\n }\n\n 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 { Hono } from 'hono';\nimport { OrchestratorPool, getSessionList, removeSession } from '../pool/orchestratorPool';\nimport { loadSessionPlanState } from '@ordewell/core';\n\nexport function sessionsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const sessions = getSessionList(ws);\n return c.json(sessions);\n });\n\n /**\n * The saved file answers for a session nobody is holding. While the pool has\n * one, its store is the only honest source of task status: the file is\n * normalized as if nothing were running (`in_progress` → `pending`), so\n * serving it mid-run told every surface that the tasks it is watching had\n * never started.\n */\n router.get('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const id = c.req.param('id');\n const saved = loadSessionPlanState(id, ws);\n if (!saved) return c.json({ error: 'Session not found' }, 404);\n return c.json({ meta: saved.meta, plan: pool.getPlanState(id) ?? saved.plan });\n });\n\n /**\n * Adopt a saved session into the running server. `GET /:id` only reads the\n * file; until a session is registered with the pool there is no orchestrator\n * behind it, so execution and task control answer \"Session not found\".\n */\n router.post('/:id/load', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n try {\n const id = c.req.param('id');\n const plan = pool.adoptSavedSession(id, ws);\n return c.json({ ok: true, plan, goal: pool.getGoal(id) });\n } catch (err: any) {\n const status = err?.message === 'Session not found' ? 404 : 500;\n return c.json({ error: err?.message ?? 'Failed to load session' }, status as any);\n }\n });\n\n router.delete('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const ok = removeSession(c.req.param('id'), ws);\n return c.json({ ok });\n });\n\n // Stops the orchestrator (killing every tmux window it spawned) and drops\n // the in-memory planner conversation. No-op if already closed/unregistered.\n router.post('/:id/close', (c) => {\n pool.destroy(c.req.param('id'));\n return c.json({ ok: true });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\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 } = 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);\n const { models, modelsByRunner } = await pool.getProviderModels();\n return c.json({ plan, models, modelsByRunner });\n } catch (err) {\n // Log before returning: the message alone travels to the client, so an\n // unexpected throw in here (a research tool crashing the whole turn, say)\n // left no stack anywhere — server.log showed nothing and the CLI showed\n // one line. Diagnosing that cost far more than this console.error.\n console.error('[plans] generate failed:', err);\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Plan generation failed' }, 500);\n }\n });\n\n router.post('/:sessionId/execute', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).executePlan();\n return c.json({ status: 'running' });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : e.message === 'No plan to execute' ? 400 : e.message === 'Session already executing' ? 409 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/stop', (c) => {\n if (pool.hasSession(c.req.param('sessionId'))) pool.session(c.req.param('sessionId')).stopExecution();\n return c.json({ status: 'stopped' });\n });\n\n router.post('/:sessionId/tasks/:taskId/complete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskComplete(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Not found' }, 404);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/uncomplete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskIncomplete(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Not found' }, 404);\n }\n });\n\n // Orchestrator controls — these spawn or kill runner processes, so they are\n // deliberately separate from the generic `PUT tasks/:taskId` status patch.\n for (const [segment, run] of [\n ['run', (s: ReturnType<typeof pool.session>, id: string) => s.runTask(id)],\n ['force-start', (s: ReturnType<typeof pool.session>, id: string) => s.forceStartTask(id)],\n ['retry', (s: ReturnType<typeof pool.session>, id: string) => s.retryTask(id)],\n ['cancel', (s: ReturnType<typeof pool.session>, id: string) => s.cancelTask(id)],\n ] as const) {\n router.post(`/:sessionId/tasks/:taskId/${segment}`, async (c) => {\n try {\n await run(pool.session(c.req.param('sessionId')), c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n const status = (err as Error).message === 'Session not found' ? 404 : 500;\n return c.json({ error: (err as Error).message }, status as never);\n }\n });\n }\n\n 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 = session.setTaskDependencies(taskId, dependencies.map(String));\n } catch (err) {\n // A rejected dependency edit is the client's mistake, not a fault.\n return c.json({ error: (err as Error).message }, 400);\n }\n }\n // An empty patch still reaches updateTask — that is how a caller asks\n // whether the task exists at all.\n if (Object.keys(rest).length > 0 || (!hasRunner && !hasDeps)) result = session.updateTask(taskId, rest);\n\n if (!result) return c.json({ error: 'Task not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Internal error' }, 500);\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId', (c) => {\n const result = pool.session(c.req.param('sessionId')).removeTask(c.req.param('taskId'));\n if (!result) return c.json({ error: 'Task not found' }, 404);\n return c.json({ ok: true });\n });\n\n router.post('/:sessionId/tasks', async (c) => {\n try {\n const body = await c.req.json();\n const result = await pool.session(c.req.param('sessionId')).addTask(body);\n if (!result) return c.json({ error: 'Session not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Internal error' }, 500);\n }\n });\n\n router.post('/:sessionId/review/approve', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).approveReview();\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404\n : e.message === 'No plan to review' ? 400\n : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/tasks/merge', async (c) => {\n try {\n const { taskIds } = await c.req.json();\n if (!taskIds || !Array.isArray(taskIds) || taskIds.length < 2) {\n return c.json({ error: 'taskIds array with at least two ids is required' }, 400);\n }\n const plan = await pool.session(c.req.param('sessionId')).requestMerge(taskIds);\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 400;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/split', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).requestSplit(c.req.param('taskId'));\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 400;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n // Conversational planning (ADR-0002): start the planner dialogue. The\n // response's plan carries conversationHistory; when tasks are non-empty the\n // planner committed the plan.\n router.post('/:sessionId/converse/start', async (c) => {\n try {\n const { goal, runners, workspace, model } = 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);\n return c.json({ plan });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Planning failed' }, 500);\n }\n });\n\n // One branch for every user reply — grill-me answers, PRD accept/adjust,\n // outline confirm. The planner decides what happens next.\n router.post('/:sessionId/converse/message', async (c) => {\n try {\n const { message } = await c.req.json();\n if (!message) return c.json({ error: 'message is required' }, 400);\n const plan = await pool.continuePlanning(c.req.param('sessionId'), message);\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n // Drain queued structural edits between task batches. The orchestrator pauses\n // fan-out while a message is queued (so an edit can't race a spawn) and emits\n // `queue_ready` once no task is active; a surface calls this to apply the edit\n // via the planner and resume scheduling. Without a route the TUI/CLI could\n // never clear the queue, permanently suppressing dependents after one edit.\n router.post('/:sessionId/process-queued', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).processQueuedMessages();\n return c.json({ ok: true });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.get('/:sessionId/prd', (c) => {\n const plan = pool.getPlan(c.req.param('sessionId'));\n if (!plan?.prdMarkdown) return c.json({ error: 'No PRD found' }, 404);\n return c.json({ prdMarkdown: plan.prdMarkdown });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function runnersRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n const state = pool.getRunnerState();\n const runners = await pool.getInstalledRunners();\n return c.json({\n runners,\n orchestratorModel: state.orchestratorModel,\n });\n });\n\n router.put('/:id', async (c) => {\n const id = c.req.param('id');\n const body = await c.req.json();\n pool.setRunnerEnabled(id, body.enabled);\n return c.json({ ok: true });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function modelsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n const result = await pool.getProviderModels();\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { scanWorkspaces } from '../pool/orchestratorPool';\n\nexport function workspacesRoute() {\n const router = new Hono();\n\n router.get('/', (c) => {\n const workspaces = scanWorkspaces();\n return c.json({ workspaces });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\n/**\n * The answer channel for planner approval prompts.\n *\n * Requests go out over the session WebSocket (they are ordinary\n * SessionMessages), but answers come back here rather than over the socket:\n * the CLI and TUI already speak HTTP to this server, a prompt can outlive the\n * socket that announced it, and a plain POST is answerable from any surface —\n * including `curl` in a pinch.\n */\nexport function approvalsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/:sessionId', (c) => {\n const sessionId = c.req.param('sessionId');\n if (!pool.hasSession(sessionId)) return c.json({ error: `Unknown session: ${sessionId}` }, 404);\n\n return c.json({\n pending: pool.outstandingApprovals(sessionId),\n approvedScopes: pool.approvedScopes(sessionId),\n });\n });\n\n router.post('/:sessionId/:approvalId', async (c) => {\n const sessionId = c.req.param('sessionId');\n const approvalId = c.req.param('approvalId');\n if (!pool.hasSession(sessionId)) return c.json({ error: `Unknown session: ${sessionId}` }, 404);\n\n // Absent or malformed body is a denial, never consent.\n const body = await c.req.json().catch(() => ({}));\n const granted = body?.granted === true;\n\n if (!pool.resolveApproval(sessionId, approvalId, granted)) {\n return c.json({ error: 'Approval is no longer outstanding — it timed out or was already answered.' }, 409);\n }\n return c.json({ ok: true, granted });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function settingsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n return c.json(pool.getSettings());\n });\n\n router.patch('/', async (c) => {\n const body = await c.req.json();\n if (!body || typeof body !== 'object' || Object.keys(body).length === 0) {\n return c.json({ error: 'At least one setting field is required' }, 400);\n }\n const result = pool.updateSettings(body);\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\ninterface CommandDescriptor {\n name: string;\n description: string;\n}\n\nconst COMMANDS: CommandDescriptor[] = [\n { name: 'grill-me', description: 'Toggle Grill-Me challenge mode (on|off|status)' },\n { name: 'tdd', description: 'Toggle Test-Driven Development mode (on|off|status)' },\n { name: 'prd', description: 'Toggle PRD mode — planner writes a markdown PRD before the plan (on|off|status)' },\n { name: 'review', description: 'Toggle review mode — adds a final opinion-review task (human sign-off) to the plan (on|off|status)' },\n { name: 'verify', description: 'Toggle verification mode — adds a final evidence-based verification task that runs the full suite (on|off|status)' },\n { name: 'research-subagents', description: 'Toggle parallel research subagents — the planner may fan out read-only research agents during planning (on|off|status)' },\n];\n\nexport function commandsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n return c.json({ commands: COMMANDS });\n });\n\n router.post('/:name', async (c) => {\n // 'verify' was once a legacy alias for review mode; it now names the\n // evidence-based verification mode, so no remap happens here.\n const name = c.req.param('name');\n const body = await c.req.json().catch(() => ({}));\n const args: Record<string, string> = body?.args || {};\n\n const command = COMMANDS.find((cmd) => cmd.name === name);\n if (!command) {\n return c.json({ error: `Unknown command: ${name}` }, 404);\n }\n\n if (name === 'grill-me') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ grillMe: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ grillMe: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'tdd') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ tdd: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ tdd: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'prd') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ prd: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ prd: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'review') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ review: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ review: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'verify') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ verification: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ verification: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'research-subagents') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ researchSubagents: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ researchSubagents: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n return c.json({ error: `Unknown command: ${name}` }, 404);\n });\n\n return router;\n}\n","import { WebSocketServer, WebSocket } from 'ws';\nimport type { IncomingMessage } from 'http';\nimport type { Duplex } from 'stream';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function createWsHandler(pool: OrchestratorPool) {\n const wss = new WebSocketServer({ noServer: true });\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 // Subscribe after 'connected' so the chat-backlog replay arrives in order.\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","import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport type { Server } from 'http';\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 { OrchestratorPool } from './pool/orchestratorPool';\n\nexport function createApp(pool: OrchestratorPool) {\n const app = new Hono();\n\n app.use('*', cors({\n origin: ['http://localhost:5173', 'http://127.0.0.1:5173', 'http://localhost:3742', 'http://127.0.0.1:3742'],\n allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type'],\n }));\n\n app.route('/api/sessions', sessionsRoute(pool));\n app.route('/api/plans', plansRoute(pool));\n app.route('/api/runners', runnersRoute(pool));\n app.route('/api/models', modelsRoute(pool));\n app.route('/api/settings', settingsRoute(pool));\n app.route('/api/commands', commandsRoute(pool));\n app.route('/api/workspaces', workspacesRoute());\n app.route('/api/approvals', approvalsRoute(pool));\n\n return app;\n}\n\nexport function attachWsHandler(server: Server, pool: OrchestratorPool) {\n const handler = createWsHandler(pool);\n server.on('upgrade', (request, socket, head) => {\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","#!/usr/bin/env node\nimport { createApp, attachWsHandler } from './app';\nimport { OrchestratorPool } from './pool/orchestratorPool';\nimport { createServer } from 'http';\nimport { hasTmux, TmuxRunner } 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// Tasks run in a real tmux window (so `ordewell tui` can open a genuine\n// interactive terminal on them) whenever tmux is on the host; otherwise this\n// falls straight back to today's headless-per-session default (see\n// OrchestratorPool's `runner` dep).\nconst tmuxRunner = hasTmux() ? new TmuxRunner({ port }) : undefined;\nif (tmuxRunner) {\n // Failure is not fatal here: ensureSession is memoized and each spawn\n // re-awaits it, so the next task retries the setup rather than giving up.\n tmuxRunner.ensureSession().catch((err) => {\n console.error(`[web] tmux session setup failed (will retry on next task spawn): ${err?.message ?? err}`);\n });\n}\n\nconst pool = new OrchestratorPool({ runner: tmuxRunner });\nconst app = createApp(pool);\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(async (req, res) => {\n const bufs: Buffer[] = [];\n for await (const chunk of req) bufs.push(chunk);\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\nattachWsHandler(server, pool);\n\nserver.listen(port, '127.0.0.1', () => {\n console.error(`[web] Ordewell API server: http://localhost:${port}`);\n});\n\nasync function shutdown(): Promise<void> {\n pool.destroyAll();\n // The one cleanup guarantee against leaked tmux processes: killing the\n // shared session takes every window (and whatever's running in it) with it.\n if (tmuxRunner) await tmuxRunner.killSession().catch(() => {});\n server.close();\n process.exit(0);\n}\n\nprocess.on('SIGINT', () => { shutdown(); });\nprocess.on('SIGTERM', () => { shutdown(); });\nprocess.on('SIGHUP', () => { shutdown(); });\n"]}
|
|
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/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/app.ts","../../server/main.ts"],"names":["BaseConfig","isCliProvider","resolveProvider","normalizeGeminiModel","fs","path","args","resolve","execFile","BaseFileSystem","researchToolsPath","withPath","result","buildGlobArgs","capped","applyHeadLimit","formatSearchOutput","SEARCH_EXCLUSIONS","path2","buildGrepArgs","buildFallbackGrepArgs","filterFallbackByAnchoredInclude","HeadlessRunner","RunnerRegistry","ModelResolver","RunnerInstallation","SettingsService","sessionRuntimeSettings","Session","PROVIDER_PRIORITY","runnerModesFrom","migratePlanState","loadSession","scanWorkspaces","listSessions","deleteSession","pool","Hono","loadSessionPlanState","run","WebSocketServer","app","cors","server","hasTmux","TmuxRunner","createServer"],"mappings":"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","file":"main.js","sourcesContent":["import { AiProvider, BaseConfig, isCliProvider, normalizeGeminiModel, resolveProvider } from '@ordewell/core';\nimport type { ProviderModelLists } from '@ordewell/core';\n\ninterface WebConfigOpts {\n enabledRunners?: string[];\n providerModelLists?: ProviderModelLists;\n modelOverride?: string;\n}\n\nexport class WebConfig extends BaseConfig {\n private _provider: AiProvider | null = null;\n private _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 if (this._provider) return this._provider;\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 = process.env.AI_PROVIDER as AiProvider | undefined;\n if (explicit && isCliProvider(explicit)) {\n this._provider = explicit;\n return this._provider;\n }\n\n const model = this._modelOverride || process.env.ORCHESTRATOR_MODEL;\n if (model && this._providerModelLists) {\n const resolved = resolveProvider(model, this._providerModelLists);\n if (resolved) {\n this._provider = resolved;\n return this._provider;\n }\n }\n\n this._provider = BaseConfig.detectProvider('openrouter');\n return this._provider;\n }\n\n get apiKey(): string {\n return this.getProviderApiKey(this.aiProvider);\n }\n\n get planningModel(): string {\n if (this.aiProvider === 'google')\n return normalizeGeminiModel(process.env.GEMINI_MODEL || process.env.ORCHESTRATOR_MODEL || super.geminiModel);\n return process.env.ORCHESTRATOR_MODEL || '';\n }\n\n get enabledRunners(): string[] {\n if (this._enabledRunnersOverride) return this._enabledRunnersOverride;\n\n const envRunners = process.env.ORDEWELL_ENABLED_RUNNERS;\n if (envRunners) {\n const parsed = envRunners.split(',').map((s) => s.trim()).filter(Boolean);\n if (parsed.length > 0) return parsed;\n }\n\n const out: string[] = [];\n if (process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== 'false' && process.env.ORDEWELL_CLAUDE_CODE_ENABLED !== '0') {\n out.push('claude-code');\n }\n if (process.env.ORDEWELL_CODEX_ENABLED === 'true' || process.env.ORDEWELL_CODEX_ENABLED === '1') {\n out.push('codex');\n }\n if (process.env.ORDEWELL_OPENCODE_ENABLED === 'true' || process.env.ORDEWELL_OPENCODE_ENABLED === '1') {\n out.push('opencode');\n }\n return out.length > 0 ? out : ['claude-code'];\n }\n\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface WorkspaceScannerDeps {\n fsModule: typeof fs;\n pathModule: typeof path;\n cwd: string;\n home: string;\n projectDir: string;\n}\n\nexport function scanWorkspacesImpl(deps: WorkspaceScannerDeps): string[] {\n const { fsModule, pathModule, cwd, home, projectDir } = deps;\n const paths = new Set<string>();\n const searchRoots = [\n cwd,\n home,\n pathModule.join(home, 'projects'),\n pathModule.join(home, 'dev'),\n pathModule.join(home, 'code'),\n pathModule.join(home, 'src'),\n pathModule.join(home, 'Desktop'),\n pathModule.join(home, 'Documents'),\n ];\n for (const root of searchRoots) {\n try {\n if (fsModule.existsSync(pathModule.join(root, '.ordewell'))) paths.add(root);\n const entries = fsModule.readdirSync(root, { withFileTypes: true }).filter(e => e.isDirectory());\n for (const e of entries.slice(0, 50)) {\n const sub = pathModule.join(root, e.name);\n if (fsModule.existsSync(pathModule.join(sub, '.ordewell'))) paths.add(sub);\n }\n } catch { /* empty */ }\n }\n return [...paths].filter(p => p !== pathModule.resolve(projectDir)).sort();\n}\n\nexport function scanWorkspaces(): string[] {\n return scanWorkspacesImpl({\n fsModule: fs,\n pathModule: path,\n cwd: process.cwd(),\n home: process.env.HOME || '/root',\n projectDir: path.resolve(__dirname, '..', '..', '..', '..'),\n });\n}\n","import { execFile } from 'child_process';\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n code: number | null;\n}\n\n/**\n * Cap on a single child's buffered output. Above this, Node kills the child\n * and invokes the callback with `err.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER'`\n * — a string, so the coercion below maps it to `1` (see `run`).\n */\nexport const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;\n\n/**\n * The single primitive every search/inspection adapter in this package is\n * built on: spawn a child, never reject. Kept in its own module so the\n * contract that the planner depends on — synchronous spawn failures degrade\n * to a failed tool call, never a rejected promise that aborts the whole\n * planner turn — can be pinned by a focused test rather than exercised only\n * incidentally through the public adapter API.\n *\n * Node hands only ENOENT/EAGAIN/EMFILE/ENFILE from spawn(2) to the\n * callback; every other errno — ENOTDIR for a `cwd` that is a file, EACCES\n * for one it cannot enter — is thrown synchronously. Thrown in here that\n * rejects the promise, and no caller of `run` catches, so a single bad\n * search argument aborted the entire planner turn as \"Plan generation\n * failed: spawn ENOTDIR\". A failed spawn is a failed tool call, never a\n * failed plan.\n */\nexport function run(\n file: string,\n args: string[],\n opts: { cwd?: string; timeout: number; shell?: boolean; env?: NodeJS.ProcessEnv },\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 }, (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 filterFallbackByAnchoredInclude,\n applyHeadLimit,\n formatSearchOutput,\n researchToolsPath,\n withPath,\n SEARCH_EXCLUSIONS,\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 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), { 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): 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 })\n : await run(file, [...args, command], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS });\n const out = (result.stdout || '').trim();\n const err = (result.stderr || '').trim();\n\n if (result.code !== 0) {\n const detail = err || out || `exited with code ${result.code}`;\n // A failing command is still research: the model asked to diagnose, and\n // the failure output is usually the answer. Report it, do not swallow it.\n return { success: false, output: `Command exited ${result.code}:\\n${detail.slice(0, 20_000)}`, truncated: detail.length > 20_000 };\n }\n\n const combined = err ? `${out}\\n[stderr]\\n${err}` : out;\n return { success: true, output: combined || '(no output)', truncated: combined.length > 20_000 };\n }\n}\n","import { HeadlessRunner, type ITerminalRunner, type ITerminalSession, type RunnerId } from '@ordewell/core';\nimport type { SessionBroadcaster } from '@ordewell/core';\n\nexport class PoolAwareRunner implements ITerminalRunner {\n private inner: ITerminalRunner;\n /**\n * Sessions this plan spawned. The inner runner may be shared by every plan\n * in the pool (one tmux session per daemon), so \"stop everything\" and\n * \"how many are running\" must be answered from this set, never delegated —\n * delegating would let one plan's /stop kill another plan's tasks.\n */\n private owned = new Set<string>();\n\n constructor(\n private sessionId: string,\n private broadcast: SessionBroadcaster,\n inner?: ITerminalRunner,\n ) {\n this.inner = inner ?? new HeadlessRunner();\n }\n\n get activeCount(): number { return this.owned.size; }\n\n async spawn(opts: { taskId: string; runner: RunnerId; prompt: string; modelId?: string; thinkingEffort?: string; modelVariants?: string[]; mode?: 'build' | 'plan'; headless?: boolean; cwd: string; order?: number; title?: string }): Promise<ITerminalSession> {\n const session = await this.inner.spawn({ ...opts, planSessionId: this.sessionId });\n this.owned.add(session.id);\n session.onExit(() => this.owned.delete(session.id));\n this.broadcast({ type: 'task_started', taskId: opts.taskId, order: opts.order ?? 0, title: opts.title ?? '', runner: opts.runner, modelId: opts.modelId });\n session.onOutput((text) => {\n this.broadcast({ type: 'task_output', taskId: opts.taskId, text });\n });\n return session;\n }\n\n stop(sessionId: string): void {\n this.inner.stop(sessionId);\n this.owned.delete(sessionId);\n }\n\n stopAll(): void {\n for (const id of this.owned) this.inner.stop(id);\n this.owned.clear();\n }\n}\n","import { WebSocket } from 'ws';\nimport {\n Session,\n type SessionMessage,\n type SessionRuntimeSettings,\n ModelResolver,\n RunnerRegistry,\n RunnerInstallation,\n listSessions,\n loadSession,\n deleteSession,\n SettingsService,\n sessionRuntimeSettings,\n type PlanState,\n type LegacyPlanState,\n migratePlanState,\n type RunnerId,\n type DiscoveredModel,\n type OrchestratorOption,\n type RunnerModeInfo,\n runnerModesFrom,\n PROVIDER_PRIORITY,\n} 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 { RunnerRegistry as CoreRunnerRegistry, ITerminalRunner } from '@ordewell/core';\n\nexport interface OrchestratorPoolDeps {\n /**\n * Shared across every session instead of each `PoolAwareRunner` defaulting\n * to its own `HeadlessRunner` — needed so a tmux-backed runner's one\n * session/many-windows lifecycle outlives any single planning session.\n * Left undefined, behavior is unchanged from before this existed.\n */\n runner?: ITerminalRunner;\n}\n\nexport class OrchestratorPool {\n private sessions = new Map<string, Session>();\n private clients = new Map<string, Set<WebSocket>>();\n private registry: CoreRunnerRegistry = (() => { const r = new RunnerRegistry(); r.loadUserPlugins(); return r; })();\n private modelResolver = new ModelResolver(this.registry, new WebConfig());\n private runnerInstallation = new RunnerInstallation(this.registry);\n private cachedProviderLists: Record<string, string[]> | undefined;\n private settingsService = new SettingsService();\n private sharedRunner?: ITerminalRunner;\n\n constructor(deps: OrchestratorPoolDeps = {}) {\n this.sharedRunner = deps.runner;\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 // Replay the planner dialogue so a (re)connecting client gets the backlog\n // instead of an empty chat. Read-only — no LLM call is made.\n const plan = this.sessions.get(sessionId)?.planState;\n const history = plan?.conversationHistory ?? [];\n if (history.length > 0 && ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify({ type: 'chat_backlog', history }));\n }\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): 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 a planner approval prompt. False means the id was unknown or already settled. */\n resolveApproval(sessionId: string, approvalId: string, granted: boolean): boolean {\n return this.sessions.get(sessionId)?.resolveApproval(approvalId, granted) ?? 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): Session {\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.sharedRunner);\n return new Session({\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 modelResolver: this.modelResolver,\n settings: () => this.runtimeSettings(),\n sessionId,\n });\n }\n\n /**\n * The user's runner choice, or undefined when they have never made one —\n * which is what lets `WebConfig` fall back to the environment's defaults.\n * Read per call rather than cached: the settings file is shared with the\n * VS Code extension host, and `getAll()` already invalidates on mtime.\n */\n private enabledRunnerOverride(): string[] | undefined {\n return this.settingsService.getEnabledRunners();\n }\n\n /**\n * Persisted, not held in memory: the daemon dies with the TUI, and a\n * process-local override meant every reopen silently reinstated the\n * environment's defaults over what the user had chosen.\n */\n setRunnerEnabled(id: string, enabled: boolean): void {\n const current = this.enabledRunnerOverride() ?? new WebConfig().enabledRunners;\n const next = enabled\n ? (current.includes(id) ? current : [...current, id])\n : current.filter((r) => r !== id);\n this.settingsService.setEnabledRunners(next);\n }\n\n getSettings() {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const userSettings = this.settingsService.getAll();\n return {\n orchestratorModel: config.orchestratorModel,\n // Who plans (ADR-0009) — a vendor id, or one of the three harness\n // planners. Surfaces need it to render the planner picker and to know\n // whether the planner model comes from a runner catalog or a vendor one.\n aiProvider: config.aiProvider,\n // A harness planner's thinking effort (ADR-0009). Surfaces need it back\n // to render the current level; without it the picker shows \"default\"\n // for a planner that is running at \"high\".\n plannerThinkingEffort: config.plannerThinkingEffort ?? '',\n grillMe: userSettings.grillMe,\n tdd: userSettings.tdd,\n prd: userSettings.prd,\n review: userSettings.review,\n verification: userSettings.verification,\n researchSubagents: userSettings.researchSubagents,\n modelAllowlist: userSettings.modelAllowlist,\n };\n }\n\n updateSettings(changes: Record<string, unknown>) {\n if (typeof changes.orchestratorModel === 'string') {\n process.env.ORCHESTRATOR_MODEL = changes.orchestratorModel;\n }\n if (typeof changes.plannerThinkingEffort === 'string') {\n process.env.ORDEWELL_PLANNER_EFFORT = changes.plannerThinkingEffort;\n }\n if (changes.grillMe && typeof (changes.grillMe as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setGrillMe((changes.grillMe as Record<string, unknown>).enabled as boolean);\n }\n if (changes.tdd && typeof (changes.tdd as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setTdd((changes.tdd as Record<string, unknown>).enabled as boolean);\n }\n if (changes.prd && typeof (changes.prd as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setPrd((changes.prd as Record<string, unknown>).enabled as boolean);\n }\n if (changes.review && typeof (changes.review as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setReview((changes.review as Record<string, unknown>).enabled as boolean);\n }\n if (changes.verification && typeof (changes.verification as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setVerification((changes.verification as Record<string, unknown>).enabled as boolean);\n }\n if (changes.researchSubagents && typeof (changes.researchSubagents as Record<string, unknown>).enabled === 'boolean') {\n this.settingsService.setResearchSubagents((changes.researchSubagents as Record<string, unknown>).enabled as boolean);\n }\n if (changes.env && typeof changes.env === 'object' && !Array.isArray(changes.env)) {\n const env = changes.env as Record<string, string>;\n let touched = false;\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === 'string' && /^[A-Z_]+$/.test(key)) {\n process.env[key] = value;\n touched = true;\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 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 return this.getSettings();\n }\n\n setOrchestratorModel(model: string): string {\n process.env.ORCHESTRATOR_MODEL = model;\n return model;\n }\n\n async getProviderModels(): Promise<{\n models: DiscoveredModel[];\n modelsByRunner: Record<string, DiscoveredModel[]>;\n /** Each runner's manifest modes, so a surface can offer a per-task mode picker. */\n modesByRunner: Record<string, RunnerModeInfo[]>;\n orchestratorModel: string;\n providers: string[];\n /** Full cross-provider catalog for the orchestrator (planner) model picker. */\n orchestratorModels: OrchestratorOption[];\n /** Per-provider catalog-fetch failures, keyed by provider id. */\n providerErrors: Record<string, string>;\n }> {\n const config = new WebConfig();\n\n const runnerIds = this.registry.list().map((p) => p.manifest.name);\n const [runnerModels, providerLists] = await Promise.all([\n this.modelResolver.modelsForRunners(runnerIds),\n this.modelResolver.refresh(),\n ]);\n\n // `refresh()` populates the picker cache, so this is the same fetch — no\n // second network round-trip. Errors are whatever that fetch recorded.\n const orchestratorModels = await this.modelResolver.pickerOptions();\n const providerErrors = this.modelResolver.getDiscoveryErrors();\n\n this.cachedProviderLists = providerLists;\n\n const allModels: DiscoveredModel[] = [];\n const seen = new Set<string>();\n const modelsByRunner: Record<string, DiscoveredModel[]> = {};\n\n for (const id of runnerIds) {\n modelsByRunner[id] = runnerModels[id] ?? [];\n for (const m of modelsByRunner[id]) {\n if (!seen.has(m.modelId)) {\n seen.add(m.modelId);\n allModels.push(m);\n }\n }\n }\n\n const providers: string[] = [];\n for (const provider of PROVIDER_PRIORITY) {\n if (provider === 'openai_compatible') {\n if (config.openaiCompatibleBaseUrl) providers.push(provider);\n } else if (provider === 'openrouter') {\n if (config.openrouterKey) providers.push(provider);\n } else if (provider === 'google') {\n if (config.geminiKey) providers.push(provider);\n } else if (config.getProviderApiKey(provider)) {\n providers.push(provider);\n }\n }\n\n return {\n models: allModels,\n modelsByRunner,\n modesByRunner: runnerModesFrom(this.registry, runnerIds),\n orchestratorModel: process.env.ORCHESTRATOR_MODEL || '',\n providers,\n orchestratorModels,\n providerErrors,\n };\n }\n\n getRunnerState(): { enabledRunners: RunnerId[]; orchestratorModel: string } {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n return { enabledRunners: config.enabledRunners, orchestratorModel: config.orchestratorModel };\n }\n\n /**\n * Runners whose CLI is actually installed on the host, with display name and\n * enabled state. Only these should be offered for selection — an uninstalled\n * runner can't be spawned.\n */\n async getInstalledRunners(): Promise<{ id: string; name: string; enabled: boolean }[]> {\n const config = new WebConfig({ enabledRunners: this.enabledRunnerOverride() });\n const enabled = new Set(config.enabledRunners);\n const plugins = this.registry.list();\n const installedIds = new Set(\n await this.runnerInstallation.filterInstalled(plugins.map((p) => p.manifest.name)),\n );\n return plugins\n .filter((p) => installedIds.has(p.manifest.name))\n .map((p) => ({\n id: p.manifest.name,\n name: p.manifest.displayName,\n enabled: enabled.has(p.manifest.name),\n }));\n }\n\n async generatePlan(sessionId: string, goal: string, runners: RunnerId[], workspace: string, modelOverride?: string): Promise<PlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride);\n // Registered before the blocking call, not after: research inside\n // generatePlan can raise an approval and await the answer, and that\n // answer arrives over POST /api/approvals/:sessionId — which 404s until\n // the session is in this map. Registering only on return made the first\n // approval of every session unanswerable until its 5-minute timeout.\n this.sessions.set(sessionId, session);\n const plan = await session.generatePlan(goal, runners);\n return migratePlanState(plan);\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): Promise<LegacyPlanState> {\n const session = this.createSessionFor(sessionId, workspace, modelOverride);\n // See generatePlan: must be registered before the blocking call so a\n // mid-research approval is answerable rather than 404ing until timeout.\n this.sessions.set(sessionId, session);\n const plan = await session.startPlanning(goal, runners);\n return plan;\n }\n\n /** Continue the planner dialogue with the user's reply. */\n async continuePlanning(sessionId: string, message: string): Promise<LegacyPlanState> {\n return this.session(sessionId).continueConversation(message);\n }\n\n /**\n * Register a session persisted on disk so its plan becomes executable and\n * editable. Only sessions planned in this process are otherwise addressable,\n * which left a restored plan readable but inert — every task endpoint\n * answered \"Session not found\".\n *\n * No LLM call happens here: the plan is adopted as saved, and the planner is\n * only contacted when the user next sends a message.\n */\n adoptSavedSession(sessionId: string, workspace: string): LegacyPlanState {\n // Re-adopting would clear the execution log and drop a running plan back to\n // its saved state, so a live session wins over the file.\n const live = this.sessions.get(sessionId);\n if (live?.planState) return live.planState;\n\n const saved = loadSession(sessionId, workspace);\n if (!saved) throw new Error('Session not found');\n\n const session = this.createSessionFor(sessionId, workspace);\n // The saved id is adopted too, so later persists rewrite the same file\n // instead of forking the session under a fresh identity.\n session.loadPlan(saved.plan, saved.meta.goal, workspace, { sessionId: saved.meta.id });\n this.sessions.set(sessionId, session);\n\n return session.planState ?? saved.plan;\n }\n\n /**\n * Direct access to a session's interface — routes call the Session; the\n * pool only registers sessions and fans broadcasts out to WS clients.\n */\n session(sessionId: string): Session {\n const session = this.sessions.get(sessionId);\n if (!session) throw new Error('Session not found');\n return session;\n }\n\n 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 { Hono } from 'hono';\nimport { OrchestratorPool, getSessionList, removeSession } from '../pool/orchestratorPool';\nimport { loadSessionPlanState } from '@ordewell/core';\n\nexport function sessionsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const sessions = getSessionList(ws);\n return c.json(sessions);\n });\n\n /**\n * The saved file answers for a session nobody is holding. While the pool has\n * one, its store is the only honest source of task status: the file is\n * normalized as if nothing were running (`in_progress` → `pending`), so\n * serving it mid-run told every surface that the tasks it is watching had\n * never started.\n */\n router.get('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const id = c.req.param('id');\n const saved = loadSessionPlanState(id, ws);\n if (!saved) return c.json({ error: 'Session not found' }, 404);\n return c.json({ meta: saved.meta, plan: pool.getPlanState(id) ?? saved.plan });\n });\n\n /**\n * Adopt a saved session into the running server. `GET /:id` only reads the\n * file; until a session is registered with the pool there is no orchestrator\n * behind it, so execution and task control answer \"Session not found\".\n */\n router.post('/:id/load', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n try {\n const id = c.req.param('id');\n const plan = pool.adoptSavedSession(id, ws);\n return c.json({ ok: true, plan, goal: pool.getGoal(id) });\n } catch (err: any) {\n const status = err?.message === 'Session not found' ? 404 : 500;\n return c.json({ error: err?.message ?? 'Failed to load session' }, status as any);\n }\n });\n\n router.delete('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const ok = removeSession(c.req.param('id'), ws);\n return c.json({ ok });\n });\n\n // Stops the orchestrator (killing every tmux window it spawned) and drops\n // the in-memory planner conversation. No-op if already closed/unregistered.\n router.post('/:id/close', (c) => {\n pool.destroy(c.req.param('id'));\n return c.json({ ok: true });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\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 } = 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);\n const { models, modelsByRunner } = await pool.getProviderModels();\n return c.json({ plan, models, modelsByRunner });\n } catch (err) {\n // Log before returning: the message alone travels to the client, so an\n // unexpected throw in here (a research tool crashing the whole turn, say)\n // left no stack anywhere — server.log showed nothing and the CLI showed\n // one line. Diagnosing that cost far more than this console.error.\n console.error('[plans] generate failed:', err);\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Plan generation failed' }, 500);\n }\n });\n\n router.post('/:sessionId/execute', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).executePlan();\n return c.json({ status: 'running' });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : e.message === 'No plan to execute' ? 400 : e.message === 'Session already executing' ? 409 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/stop', (c) => {\n if (pool.hasSession(c.req.param('sessionId'))) pool.session(c.req.param('sessionId')).stopExecution();\n return c.json({ status: 'stopped' });\n });\n\n router.post('/:sessionId/tasks/:taskId/complete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskComplete(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Not found' }, 404);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/uncomplete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskIncomplete(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Not found' }, 404);\n }\n });\n\n // Orchestrator controls — these spawn or kill runner processes, so they are\n // deliberately separate from the generic `PUT tasks/:taskId` status patch.\n for (const [segment, run] of [\n ['run', (s: ReturnType<typeof pool.session>, id: string) => s.runTask(id)],\n ['force-start', (s: ReturnType<typeof pool.session>, id: string) => s.forceStartTask(id)],\n ['retry', (s: ReturnType<typeof pool.session>, id: string) => s.retryTask(id)],\n ['cancel', (s: ReturnType<typeof pool.session>, id: string) => s.cancelTask(id)],\n ] as const) {\n router.post(`/:sessionId/tasks/:taskId/${segment}`, async (c) => {\n try {\n await run(pool.session(c.req.param('sessionId')), c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n const status = (err as Error).message === 'Session not found' ? 404 : 500;\n return c.json({ error: (err as Error).message }, status as never);\n }\n });\n }\n\n 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 = session.setTaskDependencies(taskId, dependencies.map(String));\n } catch (err) {\n // A rejected dependency edit is the client's mistake, not a fault.\n return c.json({ error: (err as Error).message }, 400);\n }\n }\n // An empty patch still reaches updateTask — that is how a caller asks\n // whether the task exists at all.\n if (Object.keys(rest).length > 0 || (!hasRunner && !hasDeps)) result = session.updateTask(taskId, rest);\n\n if (!result) return c.json({ error: 'Task not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Internal error' }, 500);\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId', (c) => {\n const result = pool.session(c.req.param('sessionId')).removeTask(c.req.param('taskId'));\n if (!result) return c.json({ error: 'Task not found' }, 404);\n return c.json({ ok: true });\n });\n\n router.post('/:sessionId/tasks', async (c) => {\n try {\n const body = await c.req.json();\n const result = await pool.session(c.req.param('sessionId')).addTask(body);\n if (!result) return c.json({ error: 'Session not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Internal error' }, 500);\n }\n });\n\n router.post('/:sessionId/review/approve', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).approveReview();\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404\n : e.message === 'No plan to review' ? 400\n : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/tasks/merge', async (c) => {\n try {\n const { taskIds } = await c.req.json();\n if (!taskIds || !Array.isArray(taskIds) || taskIds.length < 2) {\n return c.json({ error: 'taskIds array with at least two ids is required' }, 400);\n }\n const plan = await pool.session(c.req.param('sessionId')).requestMerge(taskIds);\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 400;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/split', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).requestSplit(c.req.param('taskId'));\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 400;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n // Conversational planning (ADR-0002): start the planner dialogue. The\n // response's plan carries conversationHistory; when tasks are non-empty the\n // planner committed the plan.\n router.post('/:sessionId/converse/start', async (c) => {\n try {\n const { goal, runners, workspace, model } = 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);\n return c.json({ plan });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Planning failed' }, 500);\n }\n });\n\n // One branch for every user reply — grill-me answers, PRD accept/adjust,\n // outline confirm. The planner decides what happens next.\n router.post('/:sessionId/converse/message', async (c) => {\n try {\n const { message } = await c.req.json();\n if (!message) return c.json({ error: 'message is required' }, 400);\n const plan = await pool.continuePlanning(c.req.param('sessionId'), message);\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n // Drain queued structural edits between task batches. The orchestrator pauses\n // fan-out while a message is queued (so an edit can't race a spawn) and emits\n // `queue_ready` once no task is active; a surface calls this to apply the edit\n // via the planner and resume scheduling. Without a route the TUI/CLI could\n // never clear the queue, permanently suppressing dependents after one edit.\n router.post('/:sessionId/process-queued', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).processQueuedMessages();\n return c.json({ ok: true });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.get('/:sessionId/prd', (c) => {\n const plan = pool.getPlan(c.req.param('sessionId'));\n if (!plan?.prdMarkdown) return c.json({ error: 'No PRD found' }, 404);\n return c.json({ prdMarkdown: plan.prdMarkdown });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function runnersRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n const state = pool.getRunnerState();\n const runners = await pool.getInstalledRunners();\n return c.json({\n runners,\n orchestratorModel: state.orchestratorModel,\n });\n });\n\n router.put('/:id', async (c) => {\n const id = c.req.param('id');\n const body = await c.req.json();\n pool.setRunnerEnabled(id, body.enabled);\n return c.json({ ok: true });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function modelsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', async (c) => {\n const result = await pool.getProviderModels();\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport { scanWorkspaces } from '../pool/orchestratorPool';\n\nexport function workspacesRoute() {\n const router = new Hono();\n\n router.get('/', (c) => {\n const workspaces = scanWorkspaces();\n return c.json({ workspaces });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\n/**\n * The answer channel for planner approval prompts.\n *\n * Requests go out over the session WebSocket (they are ordinary\n * SessionMessages), but answers come back here rather than over the socket:\n * the CLI and TUI already speak HTTP to this server, a prompt can outlive the\n * socket that announced it, and a plain POST is answerable from any surface —\n * including `curl` in a pinch.\n */\nexport function approvalsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/:sessionId', (c) => {\n const sessionId = c.req.param('sessionId');\n if (!pool.hasSession(sessionId)) return c.json({ error: `Unknown session: ${sessionId}` }, 404);\n\n return c.json({\n pending: pool.outstandingApprovals(sessionId),\n approvedScopes: pool.approvedScopes(sessionId),\n });\n });\n\n router.post('/:sessionId/:approvalId', async (c) => {\n const sessionId = c.req.param('sessionId');\n const approvalId = c.req.param('approvalId');\n if (!pool.hasSession(sessionId)) return c.json({ error: `Unknown session: ${sessionId}` }, 404);\n\n // Absent or malformed body is a denial, never consent.\n const body = await c.req.json().catch(() => ({}));\n const granted = body?.granted === true;\n\n if (!pool.resolveApproval(sessionId, approvalId, granted)) {\n return c.json({ error: 'Approval is no longer outstanding — it timed out or was already answered.' }, 409);\n }\n return c.json({ ok: true, granted });\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function settingsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n return c.json(pool.getSettings());\n });\n\n router.patch('/', async (c) => {\n const body = await c.req.json();\n if (!body || typeof body !== 'object' || Object.keys(body).length === 0) {\n return c.json({ error: 'At least one setting field is required' }, 400);\n }\n const result = pool.updateSettings(body);\n return c.json(result);\n });\n\n return router;\n}\n","import { Hono } from 'hono';\nimport type { OrchestratorPool } from '../pool/orchestratorPool';\n\ninterface CommandDescriptor {\n name: string;\n description: string;\n}\n\nconst COMMANDS: CommandDescriptor[] = [\n { name: 'grill-me', description: 'Toggle Grill-Me challenge mode (on|off|status)' },\n { name: 'tdd', description: 'Toggle Test-Driven Development mode (on|off|status)' },\n { name: 'prd', description: 'Toggle PRD mode — planner writes a markdown PRD before the plan (on|off|status)' },\n { name: 'review', description: 'Toggle review mode — adds a final opinion-review task (human sign-off) to the plan (on|off|status)' },\n { name: 'verify', description: 'Toggle verification mode — adds a final evidence-based verification task that runs the full suite (on|off|status)' },\n { name: 'research-subagents', description: 'Toggle parallel research subagents — the planner may fan out read-only research agents during planning (on|off|status)' },\n];\n\nexport function commandsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n return c.json({ commands: COMMANDS });\n });\n\n router.post('/:name', async (c) => {\n // 'verify' was once a legacy alias for review mode; it now names the\n // evidence-based verification mode, so no remap happens here.\n const name = c.req.param('name');\n const body = await c.req.json().catch(() => ({}));\n const args: Record<string, string> = body?.args || {};\n\n const command = COMMANDS.find((cmd) => cmd.name === name);\n if (!command) {\n return c.json({ error: `Unknown command: ${name}` }, 404);\n }\n\n if (name === 'grill-me') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ grillMe: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ grillMe: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'tdd') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ tdd: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ tdd: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'prd') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ prd: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ prd: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'review') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ review: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ review: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'verify') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ verification: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ verification: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n if (name === 'research-subagents') {\n const action = args.action || 'status';\n if (action === 'on') {\n pool.updateSettings({ researchSubagents: { enabled: true } });\n } else if (action === 'off') {\n pool.updateSettings({ researchSubagents: { enabled: false } });\n }\n return c.json({ ok: true, settings: pool.getSettings() });\n }\n\n return c.json({ error: `Unknown command: ${name}` }, 404);\n });\n\n return router;\n}\n","import { WebSocketServer, WebSocket } from 'ws';\nimport type { IncomingMessage } from 'http';\nimport type { Duplex } from 'stream';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\nexport function createWsHandler(pool: OrchestratorPool) {\n const wss = new WebSocketServer({ noServer: true });\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 // Subscribe after 'connected' so the chat-backlog replay arrives in order.\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","import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport type { Server } from 'http';\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 { OrchestratorPool } from './pool/orchestratorPool';\n\nexport function createApp(pool: OrchestratorPool) {\n const app = new Hono();\n\n app.use('*', cors({\n origin: ['http://localhost:5173', 'http://127.0.0.1:5173', 'http://localhost:3742', 'http://127.0.0.1:3742'],\n allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type'],\n }));\n\n app.route('/api/sessions', sessionsRoute(pool));\n app.route('/api/plans', plansRoute(pool));\n app.route('/api/runners', runnersRoute(pool));\n app.route('/api/models', modelsRoute(pool));\n app.route('/api/settings', settingsRoute(pool));\n app.route('/api/commands', commandsRoute(pool));\n app.route('/api/workspaces', workspacesRoute());\n app.route('/api/approvals', approvalsRoute(pool));\n\n return app;\n}\n\nexport function attachWsHandler(server: Server, pool: OrchestratorPool) {\n const handler = createWsHandler(pool);\n server.on('upgrade', (request, socket, head) => {\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","#!/usr/bin/env node\nimport { createApp, attachWsHandler } from './app';\nimport { OrchestratorPool } from './pool/orchestratorPool';\nimport { createServer } from 'http';\nimport { hasTmux, TmuxRunner } 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// Tasks run in a real tmux window (so `ordewell tui` can open a genuine\n// interactive terminal on them) whenever tmux is on the host; otherwise this\n// falls straight back to today's headless-per-session default (see\n// OrchestratorPool's `runner` dep).\nconst tmuxRunner = hasTmux() ? new TmuxRunner({ port }) : undefined;\nif (tmuxRunner) {\n // Failure is not fatal here: ensureSession is memoized and each spawn\n // re-awaits it, so the next task retries the setup rather than giving up.\n tmuxRunner.ensureSession().catch((err) => {\n console.error(`[web] tmux session setup failed (will retry on next task spawn): ${err?.message ?? err}`);\n });\n}\n\nconst pool = new OrchestratorPool({ runner: tmuxRunner });\nconst app = createApp(pool);\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(async (req, res) => {\n const bufs: Buffer[] = [];\n for await (const chunk of req) bufs.push(chunk);\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\nattachWsHandler(server, pool);\n\nserver.listen(port, '127.0.0.1', () => {\n console.error(`[web] Ordewell API server: http://localhost:${port}`);\n});\n\nasync function shutdown(): Promise<void> {\n pool.destroyAll();\n // The one cleanup guarantee against leaked tmux processes: killing the\n // shared session takes every window (and whatever's running in it) with it.\n if (tmuxRunner) await tmuxRunner.killSession().catch(() => {});\n server.close();\n process.exit(0);\n}\n\nprocess.on('SIGINT', () => { shutdown(); });\nprocess.on('SIGTERM', () => { shutdown(); });\nprocess.on('SIGHUP', () => { shutdown(); });\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ordewell/web",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "Ordewell local API server — the daemon the Ordewell CLI and TUI talk to.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Alessandro Costanzo Ciano",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"typecheck": "tsc --noEmit"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@ordewell/core": "^0.4.
|
|
39
|
+
"@ordewell/core": "^0.4.2",
|
|
40
40
|
"hono": "^4.6.0",
|
|
41
41
|
"@hono/node-server": "^1.13.0",
|
|
42
42
|
"ws": "^8.18.0"
|