@ordewell/web 0.4.5 → 0.4.6
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 +131 -22
- package/dist/server/main.js.map +1 -1
- package/package.json +1 -1
package/dist/server/main.js
CHANGED
|
@@ -140,7 +140,13 @@ function run(file, args2, opts) {
|
|
|
140
140
|
maxBuffer: MAX_OUTPUT_BYTES,
|
|
141
141
|
encoding: "utf8",
|
|
142
142
|
shell: opts.shell,
|
|
143
|
-
env: opts.env
|
|
143
|
+
env: opts.env,
|
|
144
|
+
// Node kills the child when this aborts, and calls back with an
|
|
145
|
+
// ABORT_ERR — which lands on the `code: 1` branch below, i.e. a
|
|
146
|
+
// failed tool call, exactly like any other command that did not
|
|
147
|
+
// finish. Stopping the planner must not leave a research `bash`
|
|
148
|
+
// running out its own timeout on the server.
|
|
149
|
+
signal: opts.signal
|
|
144
150
|
}, (err, stdout, stderr) => {
|
|
145
151
|
const code = err && typeof err.code === "number" ? err.code : err ? 1 : 0;
|
|
146
152
|
resolve2({ stdout: stdout ?? "", stderr: stderr ?? "", code });
|
|
@@ -297,11 +303,12 @@ var PoolFileSystem = class extends core.BaseFileSystem {
|
|
|
297
303
|
return { success: false, output: `Error listing ${absPath}: ${err.message}`, truncated: false };
|
|
298
304
|
}
|
|
299
305
|
}
|
|
300
|
-
async execBashImpl(command) {
|
|
306
|
+
async execBashImpl(command, signal) {
|
|
301
307
|
const { file, args: args2 } = this.researchShell;
|
|
302
|
-
const result = file === null ? await run(command, [], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, shell: true }) : await run(file, [...args2, command], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS });
|
|
308
|
+
const result = file === null ? await run(command, [], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, shell: true, signal }) : await run(file, [...args2, command], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, signal });
|
|
303
309
|
const out = (result.stdout || "").trim();
|
|
304
310
|
const err = (result.stderr || "").trim();
|
|
311
|
+
if (signal?.aborted) return { success: false, output: core.STOPPED_TOOL_RESULT, truncated: false };
|
|
305
312
|
if (result.code !== 0) {
|
|
306
313
|
const detail = err || out || `exited with code ${result.code}`;
|
|
307
314
|
return { success: false, output: `Command exited ${result.code}:
|
|
@@ -356,18 +363,22 @@ var PoolAwareRunner = class {
|
|
|
356
363
|
var OrchestratorPool = class {
|
|
357
364
|
sessions = /* @__PURE__ */ new Map();
|
|
358
365
|
clients = /* @__PURE__ */ new Map();
|
|
366
|
+
/** The in-flight planning turn's abort controller, one per session — see `cancelPlanning`. */
|
|
367
|
+
planningAborts = /* @__PURE__ */ new Map();
|
|
359
368
|
registry = (() => {
|
|
360
369
|
const r = new core.RunnerRegistry();
|
|
361
370
|
r.loadUserPlugins();
|
|
362
371
|
return r;
|
|
363
372
|
})();
|
|
364
|
-
modelResolver
|
|
373
|
+
modelResolver;
|
|
365
374
|
runnerInstallation = new core.RunnerInstallation(this.registry);
|
|
366
375
|
cachedProviderLists;
|
|
367
376
|
settingsService = new core.SettingsService();
|
|
377
|
+
plannerModelMemory = new core.PlannerModelMemory(this.settingsService);
|
|
368
378
|
sharedRunner;
|
|
369
379
|
constructor(deps = {}) {
|
|
370
380
|
this.sharedRunner = deps.runner;
|
|
381
|
+
this.modelResolver = deps.modelResolver ?? new core.ModelResolver(this.registry, new WebConfig());
|
|
371
382
|
}
|
|
372
383
|
subscribe(sessionId, ws) {
|
|
373
384
|
if (!this.clients.has(sessionId)) this.clients.set(sessionId, /* @__PURE__ */ new Set());
|
|
@@ -422,6 +433,7 @@ var OrchestratorPool = class {
|
|
|
422
433
|
return core.sessionRuntimeSettings(this.settingsService.getAll());
|
|
423
434
|
}
|
|
424
435
|
createSessionFor(sessionId, workspace, modelOverride) {
|
|
436
|
+
core.assertWorkspaceExists(workspace);
|
|
425
437
|
const config = new WebConfig({
|
|
426
438
|
enabledRunners: this.enabledRunnerOverride(),
|
|
427
439
|
modelOverride,
|
|
@@ -486,10 +498,36 @@ var OrchestratorPool = class {
|
|
|
486
498
|
review: userSettings.review,
|
|
487
499
|
verification: userSettings.verification,
|
|
488
500
|
researchSubagents: userSettings.researchSubagents,
|
|
489
|
-
modelAllowlist: userSettings.modelAllowlist
|
|
501
|
+
modelAllowlist: userSettings.modelAllowlist,
|
|
502
|
+
// The model remembered per planner backend (this task), so a surface can
|
|
503
|
+
// render what's remembered without a second round-trip.
|
|
504
|
+
plannerModels: userSettings.plannerModels
|
|
490
505
|
};
|
|
491
506
|
}
|
|
507
|
+
/**
|
|
508
|
+
* The catalog `PlannerModelMemory.recall` should judge `provider`'s
|
|
509
|
+
* remembered model against — a harness planner's own runner catalog, or the
|
|
510
|
+
* cross-provider picker list for a vendor (ADR-0009), same split as
|
|
511
|
+
* `plannerModelItems` in the TUI reducer. Read from whatever the resolver
|
|
512
|
+
* has already cached so this stays synchronous; a cold cache degrades to an
|
|
513
|
+
* empty catalog rather than kicking off discovery mid-settings-write.
|
|
514
|
+
*/
|
|
515
|
+
plannerCatalogFor(provider) {
|
|
516
|
+
const runner = core.runnerForProvider(provider);
|
|
517
|
+
if (runner) {
|
|
518
|
+
return this.modelResolver.getCachedRunnerModels(runner).map((m) => ({ id: m.modelId, variants: m.variants }));
|
|
519
|
+
}
|
|
520
|
+
return this.modelResolver.getCachedPickerOptions().map((o) => ({ id: o.id }));
|
|
521
|
+
}
|
|
492
522
|
updateSettings(changes) {
|
|
523
|
+
const providerBefore = new WebConfig({
|
|
524
|
+
enabledRunners: this.enabledRunnerOverride(),
|
|
525
|
+
providerModelLists: this.cachedProviderLists
|
|
526
|
+
}).aiProvider;
|
|
527
|
+
const envChanges = changes.env && typeof changes.env === "object" && !Array.isArray(changes.env) ? changes.env : void 0;
|
|
528
|
+
const incomingAiProvider = typeof envChanges?.AI_PROVIDER === "string" ? envChanges.AI_PROVIDER : void 0;
|
|
529
|
+
const switchedToProvider = incomingAiProvider && incomingAiProvider !== providerBefore ? incomingAiProvider : void 0;
|
|
530
|
+
const switchRecall = switchedToProvider ? this.plannerModelMemory.recall(switchedToProvider, this.plannerCatalogFor(switchedToProvider)) : void 0;
|
|
493
531
|
if (typeof changes.orchestratorModel === "string") {
|
|
494
532
|
process.env.ORCHESTRATOR_MODEL = changes.orchestratorModel;
|
|
495
533
|
}
|
|
@@ -514,13 +552,14 @@ var OrchestratorPool = class {
|
|
|
514
552
|
if (changes.researchSubagents && typeof changes.researchSubagents.enabled === "boolean") {
|
|
515
553
|
this.settingsService.setResearchSubagents(changes.researchSubagents.enabled);
|
|
516
554
|
}
|
|
517
|
-
if (
|
|
518
|
-
const env = changes.env;
|
|
555
|
+
if (envChanges) {
|
|
519
556
|
let touched = false;
|
|
520
|
-
for (const [key, value] of Object.entries(
|
|
557
|
+
for (const [key, value] of Object.entries(envChanges)) {
|
|
521
558
|
if (typeof value === "string" && /^[A-Z_]+$/.test(key)) {
|
|
522
559
|
process.env[key] = value;
|
|
523
|
-
|
|
560
|
+
if (key !== "AI_PROVIDER" && key !== "ORCHESTRATOR_MODEL" && key !== "ORDEWELL_PLANNER_EFFORT") {
|
|
561
|
+
touched = true;
|
|
562
|
+
}
|
|
524
563
|
}
|
|
525
564
|
}
|
|
526
565
|
if (touched) {
|
|
@@ -528,6 +567,10 @@ var OrchestratorPool = class {
|
|
|
528
567
|
this.modelResolver.refreshRunnerModels();
|
|
529
568
|
}
|
|
530
569
|
}
|
|
570
|
+
if (switchRecall) {
|
|
571
|
+
process.env.ORCHESTRATOR_MODEL = switchRecall.model;
|
|
572
|
+
process.env.ORDEWELL_PLANNER_EFFORT = switchRecall.effort;
|
|
573
|
+
}
|
|
531
574
|
if (changes.modelAllowlist && typeof changes.modelAllowlist === "object") {
|
|
532
575
|
const allowlist = changes.modelAllowlist;
|
|
533
576
|
for (const [runner, ids] of Object.entries(allowlist)) {
|
|
@@ -538,6 +581,18 @@ var OrchestratorPool = class {
|
|
|
538
581
|
}
|
|
539
582
|
}
|
|
540
583
|
}
|
|
584
|
+
const envCarriesModelOrEffort = envChanges?.AI_PROVIDER === void 0 && (typeof envChanges?.ORCHESTRATOR_MODEL === "string" || typeof envChanges?.ORDEWELL_PLANNER_EFFORT === "string");
|
|
585
|
+
if (typeof changes.orchestratorModel === "string" || typeof changes.plannerThinkingEffort === "string" || envCarriesModelOrEffort) {
|
|
586
|
+
const rememberProvider = switchedToProvider ?? new WebConfig({
|
|
587
|
+
enabledRunners: this.enabledRunnerOverride(),
|
|
588
|
+
providerModelLists: this.cachedProviderLists
|
|
589
|
+
}).aiProvider;
|
|
590
|
+
this.plannerModelMemory.remember(
|
|
591
|
+
rememberProvider,
|
|
592
|
+
process.env.ORCHESTRATOR_MODEL || "",
|
|
593
|
+
process.env.ORDEWELL_PLANNER_EFFORT || ""
|
|
594
|
+
);
|
|
595
|
+
}
|
|
541
596
|
return this.getSettings();
|
|
542
597
|
}
|
|
543
598
|
setOrchestratorModel(model) {
|
|
@@ -613,8 +668,14 @@ var OrchestratorPool = class {
|
|
|
613
668
|
async generatePlan(sessionId, goal, runners, workspace, modelOverride) {
|
|
614
669
|
const session = this.createSessionFor(sessionId, workspace, modelOverride);
|
|
615
670
|
this.sessions.set(sessionId, session);
|
|
616
|
-
const
|
|
617
|
-
|
|
671
|
+
const controller = new AbortController();
|
|
672
|
+
this.planningAborts.set(sessionId, controller);
|
|
673
|
+
try {
|
|
674
|
+
const plan = await session.generatePlan(goal, runners, { signal: controller.signal });
|
|
675
|
+
return core.migratePlanState(plan);
|
|
676
|
+
} finally {
|
|
677
|
+
this.clearPlanningAbort(sessionId, controller);
|
|
678
|
+
}
|
|
618
679
|
}
|
|
619
680
|
/**
|
|
620
681
|
* Conversational planning (ADR-0002): start the planner dialogue for a
|
|
@@ -625,12 +686,42 @@ var OrchestratorPool = class {
|
|
|
625
686
|
async startPlanning(sessionId, goal, runners, workspace, modelOverride) {
|
|
626
687
|
const session = this.createSessionFor(sessionId, workspace, modelOverride);
|
|
627
688
|
this.sessions.set(sessionId, session);
|
|
628
|
-
const
|
|
629
|
-
|
|
689
|
+
const controller = new AbortController();
|
|
690
|
+
this.planningAborts.set(sessionId, controller);
|
|
691
|
+
try {
|
|
692
|
+
return await session.startPlanning(goal, runners, { signal: controller.signal });
|
|
693
|
+
} finally {
|
|
694
|
+
this.clearPlanningAbort(sessionId, controller);
|
|
695
|
+
}
|
|
630
696
|
}
|
|
631
697
|
/** Continue the planner dialogue with the user's reply. */
|
|
632
698
|
async continuePlanning(sessionId, message) {
|
|
633
|
-
|
|
699
|
+
const controller = new AbortController();
|
|
700
|
+
this.planningAborts.set(sessionId, controller);
|
|
701
|
+
try {
|
|
702
|
+
return await this.session(sessionId).continueConversation(message, { signal: controller.signal });
|
|
703
|
+
} finally {
|
|
704
|
+
this.clearPlanningAbort(sessionId, controller);
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
/**
|
|
708
|
+
* Abort the planning turn in flight for a session, if any. Answers whether
|
|
709
|
+
* there was one to cancel — the route reports that rather than 404ing a
|
|
710
|
+
* session that simply is not planning right now.
|
|
711
|
+
*/
|
|
712
|
+
cancelPlanning(sessionId) {
|
|
713
|
+
const controller = this.planningAborts.get(sessionId);
|
|
714
|
+
if (!controller) return false;
|
|
715
|
+
controller.abort();
|
|
716
|
+
return true;
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* Only clears the map entry if it still holds the controller this turn
|
|
720
|
+
* created — a later turn may already have installed its own by the time
|
|
721
|
+
* this one's `finally` runs (a fresh request racing a slow abort).
|
|
722
|
+
*/
|
|
723
|
+
clearPlanningAbort(sessionId, controller) {
|
|
724
|
+
if (this.planningAborts.get(sessionId) === controller) this.planningAborts.delete(sessionId);
|
|
634
725
|
}
|
|
635
726
|
/**
|
|
636
727
|
* Register a session persisted on disk so its plan becomes executable and
|
|
@@ -696,6 +787,7 @@ function sessionsRoute(pool2) {
|
|
|
696
787
|
const plan = pool2.adoptSavedSession(id, ws);
|
|
697
788
|
return c.json({ ok: true, plan, goal: pool2.getGoal(id) });
|
|
698
789
|
} catch (err) {
|
|
790
|
+
if (err instanceof core.WorkspaceNotFoundError) return c.json({ error: err.message }, 400);
|
|
699
791
|
const status = err?.message === "Session not found" ? 404 : 500;
|
|
700
792
|
return c.json({ error: err?.message ?? "Failed to load session" }, status);
|
|
701
793
|
}
|
|
@@ -711,6 +803,13 @@ function sessionsRoute(pool2) {
|
|
|
711
803
|
});
|
|
712
804
|
return router;
|
|
713
805
|
}
|
|
806
|
+
function editFailure(c, err) {
|
|
807
|
+
const e = err;
|
|
808
|
+
if (e.message === "Session not found") return c.json({ error: e.message }, 404);
|
|
809
|
+
if (e instanceof core.PlanEditError) return c.json({ error: e.message }, 400);
|
|
810
|
+
console.error("[plans] task edit failed:", err);
|
|
811
|
+
return c.json({ error: e.message || "Internal error" }, 500);
|
|
812
|
+
}
|
|
714
813
|
function plansRoute(pool2) {
|
|
715
814
|
const router = new hono.Hono();
|
|
716
815
|
router.post("/:sessionId/generate", async (c) => {
|
|
@@ -724,6 +823,7 @@ function plansRoute(pool2) {
|
|
|
724
823
|
const { models, modelsByRunner } = await pool2.getProviderModels();
|
|
725
824
|
return c.json({ plan, models, modelsByRunner });
|
|
726
825
|
} catch (err) {
|
|
826
|
+
if (err instanceof core.WorkspaceNotFoundError) return c.json({ error: err.message }, 400);
|
|
727
827
|
console.error("[plans] generate failed:", err);
|
|
728
828
|
return c.json({ error: err instanceof Error ? err.message : "Plan generation failed" }, 500);
|
|
729
829
|
}
|
|
@@ -742,6 +842,10 @@ function plansRoute(pool2) {
|
|
|
742
842
|
if (pool2.hasSession(c.req.param("sessionId"))) pool2.session(c.req.param("sessionId")).stopExecution();
|
|
743
843
|
return c.json({ status: "stopped" });
|
|
744
844
|
});
|
|
845
|
+
router.post("/:sessionId/planning/stop", (c) => {
|
|
846
|
+
const cancelled = pool2.cancelPlanning(c.req.param("sessionId"));
|
|
847
|
+
return c.json({ cancelled });
|
|
848
|
+
});
|
|
745
849
|
router.post("/:sessionId/tasks/:taskId/complete", async (c) => {
|
|
746
850
|
try {
|
|
747
851
|
await pool2.session(c.req.param("sessionId")).markTaskComplete(c.req.param("taskId"));
|
|
@@ -785,22 +889,26 @@ function plansRoute(pool2) {
|
|
|
785
889
|
if (hasRunner) result = await session.setTaskRunner(taskId, assignedRunner);
|
|
786
890
|
if (hasDeps) {
|
|
787
891
|
try {
|
|
788
|
-
result = session.setTaskDependencies(taskId, dependencies.map(String));
|
|
892
|
+
result = await session.setTaskDependencies(taskId, dependencies.map(String));
|
|
789
893
|
} catch (err) {
|
|
790
894
|
return c.json({ error: err.message }, 400);
|
|
791
895
|
}
|
|
792
896
|
}
|
|
793
|
-
if (Object.keys(rest).length > 0 || !hasRunner && !hasDeps) result = session.updateTask(taskId, rest);
|
|
897
|
+
if (Object.keys(rest).length > 0 || !hasRunner && !hasDeps) result = await session.updateTask(taskId, rest);
|
|
794
898
|
if (!result) return c.json({ error: "Task not found" }, 404);
|
|
795
899
|
return c.json({ ok: true });
|
|
796
900
|
} catch (err) {
|
|
797
|
-
return c
|
|
901
|
+
return editFailure(c, err);
|
|
798
902
|
}
|
|
799
903
|
});
|
|
800
|
-
router.delete("/:sessionId/tasks/:taskId", (c) => {
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
904
|
+
router.delete("/:sessionId/tasks/:taskId", async (c) => {
|
|
905
|
+
try {
|
|
906
|
+
const result = await pool2.session(c.req.param("sessionId")).removeTask(c.req.param("taskId"));
|
|
907
|
+
if (!result) return c.json({ error: "Task not found" }, 404);
|
|
908
|
+
return c.json({ ok: true });
|
|
909
|
+
} catch (err) {
|
|
910
|
+
return editFailure(c, err);
|
|
911
|
+
}
|
|
804
912
|
});
|
|
805
913
|
router.post("/:sessionId/tasks", async (c) => {
|
|
806
914
|
try {
|
|
@@ -809,7 +917,7 @@ function plansRoute(pool2) {
|
|
|
809
917
|
if (!result) return c.json({ error: "Session not found" }, 404);
|
|
810
918
|
return c.json({ ok: true });
|
|
811
919
|
} catch (err) {
|
|
812
|
-
return c
|
|
920
|
+
return editFailure(c, err);
|
|
813
921
|
}
|
|
814
922
|
});
|
|
815
923
|
router.post("/:sessionId/review/approve", async (c) => {
|
|
@@ -855,6 +963,7 @@ function plansRoute(pool2) {
|
|
|
855
963
|
const plan = await pool2.startPlanning(c.req.param("sessionId"), goal, runnerList, ws, model);
|
|
856
964
|
return c.json({ plan });
|
|
857
965
|
} catch (err) {
|
|
966
|
+
if (err instanceof core.WorkspaceNotFoundError) return c.json({ error: err.message }, 400);
|
|
858
967
|
return c.json({ error: err instanceof Error ? err.message : "Planning failed" }, 500);
|
|
859
968
|
}
|
|
860
969
|
});
|
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 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"]}
|
|
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","STOPPED_TOOL_RESULT","HeadlessRunner","RunnerRegistry","RunnerInstallation","SettingsService","PlannerModelMemory","ModelResolver","sessionRuntimeSettings","assertWorkspaceExists","Session","runnerForProvider","PROVIDER_PRIORITY","runnerModesFrom","migratePlanState","loadSession","scanWorkspaces","listSessions","deleteSession","pool","Hono","loadSessionPlanState","WorkspaceNotFoundError","PlanEditError","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; signal?: AbortSignal },\n): Promise<ExecResult> {\n return new Promise((resolve) => {\n try {\n execFile(file, args, {\n cwd: opts.cwd,\n timeout: opts.timeout,\n maxBuffer: MAX_OUTPUT_BYTES,\n encoding: 'utf8',\n shell: opts.shell,\n env: opts.env,\n // Node kills the child when this aborts, and calls back with an\n // ABORT_ERR — which lands on the `code: 1` branch below, i.e. a\n // failed tool call, exactly like any other command that did not\n // finish. Stopping the planner must not leave a research `bash`\n // running out its own timeout on the server.\n signal: opts.signal,\n }, (err, stdout, stderr) => {\n const code = err && typeof (err as { code?: unknown }).code === 'number' ? (err as { code: number }).code : err ? 1 : 0;\n resolve({ stdout: stdout ?? '', stderr: stderr ?? '', code });\n });\n } catch (err) {\n // `code: null` rather than 1 on purpose: the search adapters read 0 and 1\n // as \"ran, possibly no matches\", so a 1 here would report a confident\n // \"No matches found.\" for a search that never executed.\n resolve({ stdout: '', stderr: (err as Error).message, code: null });\n }\n });\n}","import {\n BaseFileSystem,\n buildGrepArgs,\n buildGlobArgs,\n buildFallbackGrepArgs,\n filterFallbackByAnchoredInclude,\n applyHeadLimit,\n formatSearchOutput,\n researchToolsPath,\n withPath,\n SEARCH_EXCLUSIONS,\n STOPPED_TOOL_RESULT,\n type GrepOptions,\n type ReadFileOpts,\n type ToolOutcome,\n} from '@ordewell/core';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { run } from './run';\n\n/**\n * Everything here is async. It used to be `execSync`/`readFileSync`, which on\n * the web server blocked the entire Node event loop: one session running\n * `tree -L 4` over a monorepo stalled every other session's WebSocket\n * streaming, HTTP API, and plan-token delivery. It also makes the parallel\n * tool-round pre-pass in BaseAiService pointless, since concurrent calls into\n * a synchronous adapter still serialize.\n */\n\nconst SEARCH_TIMEOUT_MS = 20_000;\n/** Generous, because an approved `bash` call may legitimately be a test suite. */\nconst BASH_TIMEOUT_MS = 120_000;\n\nexport class PoolFileSystem extends BaseFileSystem {\n constructor(private workspaceRoot: string) { super(); }\n getWorkspaceRoot(): string { return this.workspaceRoot; }\n\n /**\n * PATH for the search subprocesses. `execFile` starts them with no shell, so\n * on a Windows box whose POSIX tools live in the Git tree (`grep.exe` beside\n * the research shell) they are only resolvable with that directory prepended.\n * Identity on POSIX, where `utilsDir` is null. Kept in step with\n * VsCodeFileSystem.searchEnv.\n */\n private searchEnv(): NodeJS.ProcessEnv | undefined {\n const resolved = researchToolsPath(this.researchShell, process.env.PATH);\n // `withPath`, not a `PATH:` spread: on Windows the spread of `process.env`\n // carries `Path`, so adding `PATH` hands the child two and lets the OS pick.\n return resolved === (process.env.PATH ?? '') ? undefined : withPath(process.env, resolved);\n }\n\n private 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, signal?: AbortSignal): Promise<ToolOutcome> {\n // `shell: true` is required now that approved commands may legitimately\n // contain pipes; the tier classifier in core (not string filtering here)\n // is what decides whether this command was allowed to reach the shell.\n //\n // `file: null` is that host default, unchanged on POSIX. A resolved file is\n // the POSIX shell found on a Windows box, invoked explicitly so the command\n // runs in the dialect `BaseFileSystem` classified it under.\n const { file, args } = this.researchShell;\n const result = file === null\n ? await run(command, [], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, shell: true, signal })\n : await run(file, [...args, command], { cwd: this.workspaceRoot, timeout: BASH_TIMEOUT_MS, signal });\n const out = (result.stdout || '').trim();\n const err = (result.stderr || '').trim();\n\n // A stopped turn reports as a stop, not as a mysterious non-zero exit: the\n // child was killed on purpose and there is nothing here to diagnose.\n if (signal?.aborted) return { success: false, output: STOPPED_TOOL_RESULT, truncated: false };\n\n if (result.code !== 0) {\n const detail = err || out || `exited with code ${result.code}`;\n // A failing command is still research: the model asked to diagnose, and\n // the failure output is usually the answer. Report it, do not swallow it.\n return { success: false, output: `Command exited ${result.code}:\\n${detail.slice(0, 20_000)}`, truncated: detail.length > 20_000 };\n }\n\n const combined = err ? `${out}\\n[stderr]\\n${err}` : out;\n return { success: true, output: combined || '(no output)', truncated: combined.length > 20_000 };\n }\n}\n","import { HeadlessRunner, type ITerminalRunner, type ITerminalSession, type 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 assertWorkspaceExists,\n runnerForProvider,\n PlannerModelMemory,\n type AiProvider,\n type PlannerModelCandidate,\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 * Overrides the pool's own `ModelResolver`. Left undefined, behavior is\n * unchanged; tests inject one built with fake exec/fetch impls so a\n * planner-switch catalog lookup can be seeded without spawning real CLIs.\n */\n modelResolver?: ModelResolver;\n}\n\nexport class OrchestratorPool {\n private sessions = new Map<string, Session>();\n private clients = new Map<string, Set<WebSocket>>();\n /** The in-flight planning turn's abort controller, one per session — see `cancelPlanning`. */\n private planningAborts = new Map<string, AbortController>();\n private registry: CoreRunnerRegistry = (() => { const r = new RunnerRegistry(); r.loadUserPlugins(); return r; })();\n private modelResolver: ModelResolver;\n private runnerInstallation = new RunnerInstallation(this.registry);\n private cachedProviderLists: Record<string, string[]> | undefined;\n private settingsService = new SettingsService();\n private plannerModelMemory = new PlannerModelMemory(this.settingsService);\n private sharedRunner?: ITerminalRunner;\n\n constructor(deps: OrchestratorPoolDeps = {}) {\n this.sharedRunner = deps.runner;\n this.modelResolver = deps.modelResolver ?? new ModelResolver(this.registry, new WebConfig());\n }\n\n subscribe(sessionId: string, ws: WebSocket): void {\n if (!this.clients.has(sessionId)) this.clients.set(sessionId, new Set());\n this.clients.get(sessionId)!.add(ws);\n // 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 // Rejected here rather than left to the planner: a non-existent workspace\n // otherwise reaches the harness adapter's `spawn` as an ENOENT that reads\n // as a missing agent binary, not a missing directory.\n assertWorkspaceExists(workspace);\n 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 // The model remembered per planner backend (this task), so a surface can\n // render what's remembered without a second round-trip.\n plannerModels: userSettings.plannerModels,\n };\n }\n\n /**\n * The catalog `PlannerModelMemory.recall` should judge `provider`'s\n * remembered model against — a harness planner's own runner catalog, or the\n * cross-provider picker list for a vendor (ADR-0009), same split as\n * `plannerModelItems` in the TUI reducer. Read from whatever the resolver\n * has already cached so this stays synchronous; a cold cache degrades to an\n * empty catalog rather than kicking off discovery mid-settings-write.\n */\n private plannerCatalogFor(provider: AiProvider): PlannerModelCandidate[] {\n const runner = runnerForProvider(provider);\n if (runner) {\n return this.modelResolver.getCachedRunnerModels(runner).map((m) => ({ id: m.modelId, variants: m.variants }));\n }\n return this.modelResolver.getCachedPickerOptions().map((o) => ({ id: o.id }));\n }\n\n updateSettings(changes: Record<string, unknown>) {\n // Read before any of this call's changes land, so a switch is judged\n // against what was actually in effect a moment ago.\n const providerBefore = new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n providerModelLists: this.cachedProviderLists,\n }).aiProvider;\n\n const envChanges = changes.env && typeof changes.env === 'object' && !Array.isArray(changes.env)\n ? (changes.env as Record<string, unknown>)\n : undefined;\n const incomingAiProvider = typeof envChanges?.AI_PROVIDER === 'string' ? envChanges.AI_PROVIDER : undefined;\n // The name the client sent wins over re-deriving it from `config.aiProvider`\n // later: for a vendor pick that resolution reads the model id, and a switch\n // may have just cleared it — model-based resolution would misfire on the\n // very call meant to establish the new provider.\n const switchedToProvider: AiProvider | undefined =\n incomingAiProvider && incomingAiProvider !== providerBefore ? (incomingAiProvider as AiProvider) : undefined;\n // Read the incoming provider's catalog now, before the env-touched refresh\n // below clears the resolver's cache — recall must judge the memory against\n // what was already discovered, not force a fresh (async) discovery here.\n const switchRecall = switchedToProvider\n ? this.plannerModelMemory.recall(switchedToProvider, this.plannerCatalogFor(switchedToProvider))\n : undefined;\n\n if (typeof changes.orchestratorModel === 'string') {\n process.env.ORCHESTRATOR_MODEL = changes.orchestratorModel;\n }\n if (typeof changes.plannerThinkingEffort === 'string') {\n process.env.ORDEWELL_PLANNER_EFFORT = changes.plannerThinkingEffort;\n }\n if (changes.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 (envChanges) {\n let touched = false;\n for (const [key, value] of Object.entries(envChanges)) {\n if (typeof value === 'string' && /^[A-Z_]+$/.test(key)) {\n process.env[key] = value;\n // These three pick a planner and its model/effort — none of them\n // are a provider credential or endpoint, so none of them change\n // what a catalog contains. Invalidating on them would wipe the\n // very cache `plannerCatalogFor` reads synchronously below, right\n // before the next call's switch needs it.\n if (key !== 'AI_PROVIDER' && key !== 'ORCHESTRATOR_MODEL' && key !== 'ORDEWELL_PLANNER_EFFORT') {\n touched = true;\n }\n }\n }\n // A new/changed provider key or base URL must re-probe the catalog;\n // without this the picker keeps serving the pre-key cache until restart.\n if (touched) {\n this.modelResolver.invalidate();\n this.modelResolver.refreshRunnerModels();\n }\n }\n\n // A planner switch resolves through memory rather than whatever the\n // client's env carried for the model/effort — an older client still sends\n // a blind `ORCHESTRATOR_MODEL: ''` clear here, and even a current one\n // should land on the model this provider was last using, not nothing.\n // Applied after the env loop above so it overrides that clear rather than\n // being overwritten by it.\n if (switchRecall) {\n process.env.ORCHESTRATOR_MODEL = switchRecall.model;\n process.env.ORDEWELL_PLANNER_EFFORT = switchRecall.effort;\n }\n\n if (changes.modelAllowlist && typeof changes.modelAllowlist === 'object') {\n const allowlist = changes.modelAllowlist as Record<string, unknown>;\n for (const [runner, ids] of Object.entries(allowlist)) {\n if (Array.isArray(ids)) {\n this.settingsService.setModelAllowlist(runner, ids.map(String));\n } else if (ids === null) {\n this.settingsService.setModelAllowlist(runner, undefined);\n }\n }\n }\n\n // An explicit model/effort pick is remembered against whichever provider\n // is in effect: the one this same call just switched to, or — resolved\n // fresh, now that ORCHESTRATOR_MODEL reflects this call's changes —\n // today's, so a vendor pick keys correctly off its model id. The pick\n // arrives either as a top-level field (a vendor model, `ordewell model\n // set`) or through env (`ordewell planner-effort`, the TUI's effort\n // picker send ORDEWELL_PLANNER_EFFORT this way) — both are a real pick,\n // never the switch's own env, which always carries AI_PROVIDER too.\n const envCarriesModelOrEffort = envChanges?.AI_PROVIDER === undefined &&\n (typeof envChanges?.ORCHESTRATOR_MODEL === 'string' || typeof envChanges?.ORDEWELL_PLANNER_EFFORT === 'string');\n if (typeof changes.orchestratorModel === 'string' || typeof changes.plannerThinkingEffort === 'string' || envCarriesModelOrEffort) {\n const rememberProvider = switchedToProvider ?? new WebConfig({\n enabledRunners: this.enabledRunnerOverride(),\n providerModelLists: this.cachedProviderLists,\n }).aiProvider;\n this.plannerModelMemory.remember(\n rememberProvider,\n process.env.ORCHESTRATOR_MODEL || '',\n process.env.ORDEWELL_PLANNER_EFFORT || '',\n );\n }\n\n 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 controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n try {\n const plan = await session.generatePlan(goal, runners, { signal: controller.signal });\n return migratePlanState(plan);\n } finally {\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /**\n * Conversational planning (ADR-0002): start the planner dialogue for a\n * session. Returns the current plan state — a committed plan when the\n * planner had enough context, otherwise the dialogue so far (last\n * assistant message lives in conversationHistory).\n */\n async startPlanning(sessionId: string, goal: string, runners: RunnerId[], workspace: string, modelOverride?: string): 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 controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n try {\n return await session.startPlanning(goal, runners, { signal: controller.signal });\n } finally {\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /** Continue the planner dialogue with the user's reply. */\n async continuePlanning(sessionId: string, message: string): Promise<LegacyPlanState> {\n const controller = new AbortController();\n this.planningAborts.set(sessionId, controller);\n try {\n return await this.session(sessionId).continueConversation(message, { signal: controller.signal });\n } finally {\n this.clearPlanningAbort(sessionId, controller);\n }\n }\n\n /**\n * Abort the planning turn in flight for a session, if any. Answers whether\n * there was one to cancel — the route reports that rather than 404ing a\n * session that simply is not planning right now.\n */\n cancelPlanning(sessionId: string): boolean {\n const controller = this.planningAborts.get(sessionId);\n if (!controller) return false;\n controller.abort();\n return true;\n }\n\n /**\n * Only clears the map entry if it still holds the controller this turn\n * created — a later turn may already have installed its own by the time\n * this one's `finally` runs (a fresh request racing a slow abort).\n */\n private clearPlanningAbort(sessionId: string, controller: AbortController): void {\n if (this.planningAborts.get(sessionId) === controller) this.planningAborts.delete(sessionId);\n }\n\n /**\n * Register a session persisted on disk so its plan becomes executable and\n * editable. Only sessions planned in this process are otherwise addressable,\n * which left a restored plan readable but inert — every task endpoint\n * answered \"Session not found\".\n *\n * No LLM call happens here: the plan is adopted as saved, and the planner is\n * only contacted when the user next sends a message.\n */\n adoptSavedSession(sessionId: string, workspace: string): LegacyPlanState {\n // Re-adopting would clear the execution log and drop a running plan back to\n // its saved state, so a live session wins over the file.\n const live = this.sessions.get(sessionId);\n if (live?.planState) return live.planState;\n\n const saved = loadSession(sessionId, workspace);\n if (!saved) throw new Error('Session not found');\n\n const session = this.createSessionFor(sessionId, workspace);\n // The saved id is adopted too, so later persists rewrite the same file\n // instead of forking the session under a fresh identity.\n session.loadPlan(saved.plan, saved.meta.goal, workspace, { sessionId: saved.meta.id });\n this.sessions.set(sessionId, session);\n\n return session.planState ?? saved.plan;\n }\n\n /**\n * 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, WorkspaceNotFoundError } from '@ordewell/core';\n\nexport function sessionsRoute(pool: OrchestratorPool) {\n const router = new Hono();\n\n router.get('/', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const sessions = getSessionList(ws);\n return c.json(sessions);\n });\n\n /**\n * The saved file answers for a session nobody is holding. While the pool has\n * one, its store is the only honest source of task status: the file is\n * normalized as if nothing were running (`in_progress` → `pending`), so\n * serving it mid-run told every surface that the tasks it is watching had\n * never started.\n */\n router.get('/:id', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n const id = c.req.param('id');\n const saved = loadSessionPlanState(id, ws);\n if (!saved) return c.json({ error: 'Session not found' }, 404);\n return c.json({ meta: saved.meta, plan: pool.getPlanState(id) ?? saved.plan });\n });\n\n /**\n * Adopt a saved session into the running server. `GET /:id` only reads the\n * file; until a session is registered with the pool there is no orchestrator\n * behind it, so execution and task control answer \"Session not found\".\n */\n router.post('/:id/load', (c) => {\n const ws = c.req.query('workspace') || process.cwd();\n try {\n const id = c.req.param('id');\n const plan = pool.adoptSavedSession(id, ws);\n return c.json({ ok: true, plan, goal: pool.getGoal(id) });\n } catch (err: any) {\n if (err instanceof WorkspaceNotFoundError) return c.json({ error: err.message }, 400);\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, type Context } from 'hono';\nimport { PlanEditError, WorkspaceNotFoundError } from '@ordewell/core';\nimport { OrchestratorPool } from '../pool/orchestratorPool';\n\n/**\n * The three answers a task edit can have. A refusal is the request being wrong\n * (400), a missing session is 404, and only a real fault is 500 — collapsing\n * all three into 404/500 gave the TUI and VS Code nothing to show but \"Internal\n * error\", which reads as the edit having silently done nothing.\n */\nfunction editFailure(c: Context, err: unknown) {\n const e = err as Error;\n if (e.message === 'Session not found') return c.json({ error: e.message }, 404);\n if (e instanceof PlanEditError) return c.json({ error: e.message }, 400);\n console.error('[plans] task edit failed:', err);\n return c.json({ error: e.message || 'Internal error' }, 500);\n}\n\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 if (err instanceof WorkspaceNotFoundError) return c.json({ error: err.message }, 400);\n // Log before returning: the message alone travels to the client, so an\n // unexpected throw in here (a research tool crashing the whole turn, say)\n // left no stack anywhere — server.log showed nothing and the CLI showed\n // one line. Diagnosing that cost far more than this console.error.\n console.error('[plans] generate failed:', err);\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Plan generation failed' }, 500);\n }\n });\n\n router.post('/:sessionId/execute', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).executePlan();\n return c.json({ status: 'running' });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : e.message === 'No plan to execute' ? 400 : e.message === 'Session already executing' ? 409 : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/stop', (c) => {\n if (pool.hasSession(c.req.param('sessionId'))) pool.session(c.req.param('sessionId')).stopExecution();\n return c.json({ status: 'stopped' });\n });\n\n // Distinct from the stop route above, which halts *execution* (running\n // tasks). This aborts a planning turn in flight — a harmless no-op, not a\n // 404, when the session simply isn't planning right now.\n router.post('/:sessionId/planning/stop', (c) => {\n const cancelled = pool.cancelPlanning(c.req.param('sessionId'));\n return c.json({ cancelled });\n });\n\n router.post('/:sessionId/tasks/:taskId/complete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskComplete(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Not found' }, 404);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/uncomplete', async (c) => {\n try {\n await pool.session(c.req.param('sessionId')).markTaskIncomplete(c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n return c.json({ error: err instanceof Error ? (err as Error).message : 'Not found' }, 404);\n }\n });\n\n // Orchestrator controls — these spawn or kill runner processes, so they are\n // deliberately separate from the generic `PUT tasks/:taskId` status patch.\n for (const [segment, run] of [\n ['run', (s: ReturnType<typeof pool.session>, id: string) => s.runTask(id)],\n ['force-start', (s: ReturnType<typeof pool.session>, id: string) => s.forceStartTask(id)],\n ['retry', (s: ReturnType<typeof pool.session>, id: string) => s.retryTask(id)],\n ['cancel', (s: ReturnType<typeof pool.session>, id: string) => s.cancelTask(id)],\n ] as const) {\n router.post(`/:sessionId/tasks/:taskId/${segment}`, async (c) => {\n try {\n await run(pool.session(c.req.param('sessionId')), c.req.param('taskId'));\n return c.json({ ok: true });\n } catch (err) {\n const status = (err as Error).message === 'Session not found' ? 404 : 500;\n return c.json({ error: (err as Error).message }, status as never);\n }\n });\n }\n\n router.put('/:sessionId/tasks/:taskId', async (c) => {\n try {\n const { assignedRunner, dependencies, ...rest } = await c.req.json();\n const session = pool.session(c.req.param('sessionId'));\n const taskId = c.req.param('taskId');\n\n // Two fields are not field writes. A runner change carries the task's\n // model, effort and mode with it, and a dependency list has to be\n // validated against the whole graph — each has one owner on the session.\n // The runner goes first: its retarget derives a model, and an explicit\n // model in the same patch must win over that derived one.\n const hasRunner = typeof assignedRunner === 'string';\n const hasDeps = Array.isArray(dependencies);\n\n let result = null;\n if (hasRunner) result = await session.setTaskRunner(taskId, assignedRunner);\n if (hasDeps) {\n try {\n result = await session.setTaskDependencies(taskId, dependencies.map(String));\n } catch (err) {\n // A rejected dependency edit is the client's mistake, not a fault.\n return c.json({ error: (err as Error).message }, 400);\n }\n }\n // An empty patch still reaches updateTask — that is how a caller asks\n // whether the task exists at all.\n if (Object.keys(rest).length > 0 || (!hasRunner && !hasDeps)) result = await session.updateTask(taskId, rest);\n\n if (!result) return c.json({ error: 'Task not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.delete('/:sessionId/tasks/:taskId', async (c) => {\n try {\n const result = await pool.session(c.req.param('sessionId')).removeTask(c.req.param('taskId'));\n if (!result) return c.json({ error: 'Task not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/tasks', async (c) => {\n try {\n const body = await c.req.json();\n const result = await pool.session(c.req.param('sessionId')).addTask(body);\n if (!result) return c.json({ error: 'Session not found' }, 404);\n return c.json({ ok: true });\n } catch (err) {\n return editFailure(c, err);\n }\n });\n\n router.post('/:sessionId/review/approve', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).approveReview();\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404\n : e.message === 'No plan to review' ? 400\n : 500;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/tasks/merge', async (c) => {\n try {\n const { taskIds } = await c.req.json();\n if (!taskIds || !Array.isArray(taskIds) || taskIds.length < 2) {\n return c.json({ error: 'taskIds array with at least two ids is required' }, 400);\n }\n const plan = await pool.session(c.req.param('sessionId')).requestMerge(taskIds);\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 400;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n router.post('/:sessionId/tasks/:taskId/split', async (c) => {\n try {\n const plan = await pool.session(c.req.param('sessionId')).requestSplit(c.req.param('taskId'));\n return c.json({ plan });\n } catch (err) {\n const e = err as Error;\n const status = e.message === 'Session not found' ? 404 : 400;\n return c.json({ error: e.message }, status as Parameters<typeof c.json>[1]);\n }\n });\n\n // Conversational planning (ADR-0002): start the planner dialogue. The\n // response's plan carries conversationHistory; when tasks are non-empty the\n // planner committed the plan.\n router.post('/:sessionId/converse/start', async (c) => {\n try {\n const { goal, runners, workspace, model } = 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 if (err instanceof WorkspaceNotFoundError) return c.json({ error: err.message }, 400);\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"]}
|