@mcoda/codali 0.1.134 → 0.1.135-codali.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/ORCHESTRATION.md +387 -0
  3. package/README.md +103 -1
  4. package/config/alternate-local.example.json +49 -0
  5. package/config/docdex-runtime.json +21 -0
  6. package/config/orchestration.schema.json +548 -0
  7. package/config/raijin-suku.example.json +172 -0
  8. package/config/terminal-long-scenarios.v1.json +70 -0
  9. package/dist/agents/RoleResolution.d.ts.map +1 -1
  10. package/dist/agents/RoleResolution.js +4 -4
  11. package/dist/api/CodaliApi.d.ts +16 -0
  12. package/dist/api/CodaliApi.d.ts.map +1 -1
  13. package/dist/api/CodaliApi.js +39 -10
  14. package/dist/cli/AskCommand.d.ts +3 -0
  15. package/dist/cli/AskCommand.d.ts.map +1 -1
  16. package/dist/cli/AskCommand.js +76 -13
  17. package/dist/cli/RunCommand.d.ts +4 -0
  18. package/dist/cli/RunCommand.d.ts.map +1 -1
  19. package/dist/cli/RunCommand.js +110 -24
  20. package/dist/cli/TerminalCommand.d.ts +35 -0
  21. package/dist/cli/TerminalCommand.d.ts.map +1 -0
  22. package/dist/cli/TerminalCommand.js +616 -0
  23. package/dist/cli/TerminalCredentials.d.ts +3 -0
  24. package/dist/cli/TerminalCredentials.d.ts.map +1 -0
  25. package/dist/cli/TerminalCredentials.js +89 -0
  26. package/dist/cli/TerminalInput.d.ts +24 -0
  27. package/dist/cli/TerminalInput.d.ts.map +1 -0
  28. package/dist/cli/TerminalInput.js +98 -0
  29. package/dist/cli/TerminalText.d.ts +10 -0
  30. package/dist/cli/TerminalText.d.ts.map +1 -0
  31. package/dist/cli/TerminalText.js +53 -0
  32. package/dist/cli.d.ts.map +1 -1
  33. package/dist/cli.js +33 -4
  34. package/dist/cognitive/ConfiguredPipeline.d.ts +34 -0
  35. package/dist/cognitive/ConfiguredPipeline.d.ts.map +1 -0
  36. package/dist/cognitive/ConfiguredPipeline.js +50 -0
  37. package/dist/cognitive/ValidationRunner.d.ts +4 -0
  38. package/dist/cognitive/ValidationRunner.d.ts.map +1 -1
  39. package/dist/cognitive/ValidationRunner.js +18 -41
  40. package/dist/config/NodeOrchestration.d.ts +21 -0
  41. package/dist/config/NodeOrchestration.d.ts.map +1 -0
  42. package/dist/config/NodeOrchestration.js +54 -0
  43. package/dist/config/OrchestrationConfig.d.ts +100 -0
  44. package/dist/config/OrchestrationConfig.d.ts.map +1 -0
  45. package/dist/config/OrchestrationConfig.js +245 -0
  46. package/dist/connectors/mcp/McpClient.d.ts +3 -1
  47. package/dist/connectors/mcp/McpClient.d.ts.map +1 -1
  48. package/dist/connectors/mcp/McpClient.js +3 -2
  49. package/dist/connectors/mcp/McpServerRegistry.d.ts +2 -2
  50. package/dist/connectors/mcp/McpServerRegistry.d.ts.map +1 -1
  51. package/dist/connectors/mcp/McpServerRegistry.js +39 -16
  52. package/dist/connectors/mcp/McpToolAdapter.js +2 -2
  53. package/dist/connectors/media/ConfiguredMediaTools.d.ts +6 -0
  54. package/dist/connectors/media/ConfiguredMediaTools.d.ts.map +1 -0
  55. package/dist/connectors/media/ConfiguredMediaTools.js +41 -0
  56. package/dist/connectors/media/ImageGenerationTool.js +3 -3
  57. package/dist/connectors/media/MediaArtifactReceipt.d.ts +5 -0
  58. package/dist/connectors/media/MediaArtifactReceipt.d.ts.map +1 -0
  59. package/dist/connectors/media/MediaArtifactReceipt.js +65 -0
  60. package/dist/connectors/media/MediaJobStore.d.ts +68 -0
  61. package/dist/connectors/media/MediaJobStore.d.ts.map +1 -0
  62. package/dist/connectors/media/MediaJobStore.js +199 -0
  63. package/dist/connectors/media/MediaJobWorker.d.ts +2 -0
  64. package/dist/connectors/media/MediaJobWorker.d.ts.map +1 -0
  65. package/dist/connectors/media/MediaJobWorker.js +65 -0
  66. package/dist/connectors/media/RemoteMediaJob.d.ts +6 -0
  67. package/dist/connectors/media/RemoteMediaJob.d.ts.map +1 -0
  68. package/dist/connectors/media/RemoteMediaJob.js +80 -0
  69. package/dist/docdex/DocdexClient.d.ts +18 -1
  70. package/dist/docdex/DocdexClient.d.ts.map +1 -1
  71. package/dist/docdex/DocdexClient.js +135 -19
  72. package/dist/docdex/ManagedDocdex.d.ts +29 -0
  73. package/dist/docdex/ManagedDocdex.d.ts.map +1 -0
  74. package/dist/docdex/ManagedDocdex.js +215 -0
  75. package/dist/docdex/ManagedRuntime.d.ts +28 -0
  76. package/dist/docdex/ManagedRuntime.d.ts.map +1 -0
  77. package/dist/docdex/ManagedRuntime.js +212 -0
  78. package/dist/eval/EvaluationProcess.d.ts +13 -0
  79. package/dist/eval/EvaluationProcess.d.ts.map +1 -0
  80. package/dist/eval/EvaluationProcess.js +76 -0
  81. package/dist/eval/LongWorkflowJourney.d.ts +34 -0
  82. package/dist/eval/LongWorkflowJourney.d.ts.map +1 -0
  83. package/dist/eval/LongWorkflowJourney.js +243 -0
  84. package/dist/eval/PlanningCorpus.d.ts +45 -0
  85. package/dist/eval/PlanningCorpus.d.ts.map +1 -0
  86. package/dist/eval/PlanningCorpus.js +189 -0
  87. package/dist/eval/PlanningCorpusRunner.d.ts +13 -0
  88. package/dist/eval/PlanningCorpusRunner.d.ts.map +1 -0
  89. package/dist/eval/PlanningCorpusRunner.js +89 -0
  90. package/dist/eval/TerminalCorpusRunner.d.ts +36 -0
  91. package/dist/eval/TerminalCorpusRunner.d.ts.map +1 -0
  92. package/dist/eval/TerminalCorpusRunner.js +222 -0
  93. package/dist/eval/TerminalTaskCorpus.d.ts +26 -0
  94. package/dist/eval/TerminalTaskCorpus.d.ts.map +1 -0
  95. package/dist/eval/TerminalTaskCorpus.js +105 -0
  96. package/dist/eval/TerminalWorkflowCorpus.d.ts +11 -0
  97. package/dist/eval/TerminalWorkflowCorpus.d.ts.map +1 -0
  98. package/dist/eval/TerminalWorkflowCorpus.js +116 -0
  99. package/dist/eval/fixtures/TerminalRecoveryJourney.d.ts +4 -0
  100. package/dist/eval/fixtures/TerminalRecoveryJourney.d.ts.map +1 -0
  101. package/dist/eval/fixtures/TerminalRecoveryJourney.js +132 -0
  102. package/dist/gateway/CodaliGateway.d.ts +2 -0
  103. package/dist/gateway/CodaliGateway.d.ts.map +1 -1
  104. package/dist/gateway/CodaliGateway.js +11 -1
  105. package/dist/gateway/ConfiguredGateway.d.ts +23 -0
  106. package/dist/gateway/ConfiguredGateway.d.ts.map +1 -0
  107. package/dist/gateway/ConfiguredGateway.js +44 -0
  108. package/dist/gateway/GatewayTracer.d.ts +1 -1
  109. package/dist/gateway/GatewayTracer.d.ts.map +1 -1
  110. package/dist/gateway/GatewayTracer.js +2 -27
  111. package/dist/index.d.ts +23 -0
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +12 -0
  114. package/dist/permissions/PermissionGate.d.ts +44 -0
  115. package/dist/permissions/PermissionGate.d.ts.map +1 -0
  116. package/dist/permissions/PermissionGate.js +97 -0
  117. package/dist/providers/ConfiguredEmbeddings.d.ts +43 -0
  118. package/dist/providers/ConfiguredEmbeddings.d.ts.map +1 -0
  119. package/dist/providers/ConfiguredEmbeddings.js +87 -0
  120. package/dist/providers/ConfiguredModelScope.d.ts +69 -0
  121. package/dist/providers/ConfiguredModelScope.d.ts.map +1 -0
  122. package/dist/providers/ConfiguredModelScope.js +113 -0
  123. package/dist/providers/ConfiguredProvider.d.ts +79 -0
  124. package/dist/providers/ConfiguredProvider.d.ts.map +1 -0
  125. package/dist/providers/ConfiguredProvider.js +238 -0
  126. package/dist/providers/ModelServiceError.d.ts +10 -0
  127. package/dist/providers/ModelServiceError.d.ts.map +1 -0
  128. package/dist/providers/ModelServiceError.js +45 -0
  129. package/dist/providers/MswarmWorkerProvider.d.ts.map +1 -1
  130. package/dist/providers/MswarmWorkerProvider.js +4 -0
  131. package/dist/providers/OpenAiCompatibleProvider.d.ts.map +1 -1
  132. package/dist/providers/OpenAiCompatibleProvider.js +91 -50
  133. package/dist/providers/ProviderTypes.d.ts +12 -0
  134. package/dist/providers/ProviderTypes.d.ts.map +1 -1
  135. package/dist/runtime/CodaliJobRuntime.d.ts +6 -0
  136. package/dist/runtime/CodaliJobRuntime.d.ts.map +1 -1
  137. package/dist/runtime/CodaliJobRuntime.js +36 -1
  138. package/dist/runtime/CodaliRuntime.d.ts +28 -0
  139. package/dist/runtime/CodaliRuntime.d.ts.map +1 -1
  140. package/dist/runtime/CodaliRuntime.js +69 -1
  141. package/dist/runtime/CompletionReport.d.ts +5 -0
  142. package/dist/runtime/CompletionReport.d.ts.map +1 -0
  143. package/dist/runtime/CompletionReport.js +12 -0
  144. package/dist/runtime/ProgressTracker.d.ts +17 -0
  145. package/dist/runtime/ProgressTracker.d.ts.map +1 -0
  146. package/dist/runtime/ProgressTracker.js +27 -0
  147. package/dist/runtime/RequestedTestEvidence.d.ts +12 -0
  148. package/dist/runtime/RequestedTestEvidence.d.ts.map +1 -0
  149. package/dist/runtime/RequestedTestEvidence.js +16 -0
  150. package/dist/runtime/RequiredRetrieval.d.ts +13 -0
  151. package/dist/runtime/RequiredRetrieval.d.ts.map +1 -0
  152. package/dist/runtime/RequiredRetrieval.js +25 -0
  153. package/dist/runtime/ReviewSource.d.ts +6 -0
  154. package/dist/runtime/ReviewSource.d.ts.map +1 -0
  155. package/dist/runtime/ReviewSource.js +38 -0
  156. package/dist/runtime/Runner.d.ts +7 -0
  157. package/dist/runtime/Runner.d.ts.map +1 -1
  158. package/dist/runtime/Runner.js +215 -171
  159. package/dist/runtime/SecretRedaction.d.ts +11 -0
  160. package/dist/runtime/SecretRedaction.d.ts.map +1 -0
  161. package/dist/runtime/SecretRedaction.js +85 -0
  162. package/dist/runtime/SessionController.d.ts +148 -0
  163. package/dist/runtime/SessionController.d.ts.map +1 -0
  164. package/dist/runtime/SessionController.js +1356 -0
  165. package/dist/runtime/StructuralEvidence.d.ts +22 -0
  166. package/dist/runtime/StructuralEvidence.d.ts.map +1 -0
  167. package/dist/runtime/StructuralEvidence.js +87 -0
  168. package/dist/runtime/TaskReviewContext.d.ts +34 -0
  169. package/dist/runtime/TaskReviewContext.d.ts.map +1 -0
  170. package/dist/runtime/TaskReviewContext.js +34 -0
  171. package/dist/runtime/ValidationOutput.d.ts +5 -0
  172. package/dist/runtime/ValidationOutput.d.ts.map +1 -0
  173. package/dist/runtime/ValidationOutput.js +32 -0
  174. package/dist/runtime/VerificationCommand.d.ts +3 -0
  175. package/dist/runtime/VerificationCommand.d.ts.map +1 -0
  176. package/dist/runtime/VerificationCommand.js +48 -0
  177. package/dist/runtime/WorkStatusPage.d.ts +15 -0
  178. package/dist/runtime/WorkStatusPage.d.ts.map +1 -0
  179. package/dist/runtime/WorkStatusPage.js +58 -0
  180. package/dist/runtime/WorkspaceLedger.d.ts +13 -0
  181. package/dist/runtime/WorkspaceLedger.d.ts.map +1 -0
  182. package/dist/runtime/WorkspaceLedger.js +145 -0
  183. package/dist/runtime/WorkspaceLock.d.ts.map +1 -1
  184. package/dist/runtime/WorkspaceLock.js +20 -17
  185. package/dist/runtime/WorkspaceSnapshot.d.ts +13 -0
  186. package/dist/runtime/WorkspaceSnapshot.d.ts.map +1 -0
  187. package/dist/runtime/WorkspaceSnapshot.js +88 -0
  188. package/dist/session/AtomicState.d.ts +13 -0
  189. package/dist/session/AtomicState.d.ts.map +1 -0
  190. package/dist/session/AtomicState.js +109 -0
  191. package/dist/session/SessionStoragePath.d.ts +15 -0
  192. package/dist/session/SessionStoragePath.d.ts.map +1 -0
  193. package/dist/session/SessionStoragePath.js +89 -0
  194. package/dist/session/SessionStore.d.ts +9 -0
  195. package/dist/session/SessionStore.d.ts.map +1 -1
  196. package/dist/session/SessionStore.js +181 -47
  197. package/dist/session/WorkState.d.ts +23 -0
  198. package/dist/session/WorkState.d.ts.map +1 -0
  199. package/dist/session/WorkState.js +367 -0
  200. package/dist/session/WorkTypes.d.ts +94 -0
  201. package/dist/session/WorkTypes.d.ts.map +1 -0
  202. package/dist/session/WorkTypes.js +1 -0
  203. package/dist/tools/ToolRegistry.d.ts +2 -0
  204. package/dist/tools/ToolRegistry.d.ts.map +1 -1
  205. package/dist/tools/ToolRegistry.js +12 -2
  206. package/dist/tools/ToolTypes.d.ts +16 -0
  207. package/dist/tools/ToolTypes.d.ts.map +1 -1
  208. package/dist/tools/docdex/DocdexTools.d.ts +2 -0
  209. package/dist/tools/docdex/DocdexTools.d.ts.map +1 -1
  210. package/dist/tools/docdex/DocdexTools.js +17 -2
  211. package/dist/tools/filesystem/FileTools.d.ts.map +1 -1
  212. package/dist/tools/filesystem/FileTools.js +30 -10
  213. package/dist/tools/shell/AsyncProcess.d.ts +16 -0
  214. package/dist/tools/shell/AsyncProcess.d.ts.map +1 -0
  215. package/dist/tools/shell/AsyncProcess.js +94 -0
  216. package/dist/tools/shell/DarwinRuntimeLibraries.d.ts +13 -0
  217. package/dist/tools/shell/DarwinRuntimeLibraries.d.ts.map +1 -0
  218. package/dist/tools/shell/DarwinRuntimeLibraries.js +130 -0
  219. package/dist/tools/shell/HostToolchain.d.ts +19 -0
  220. package/dist/tools/shell/HostToolchain.d.ts.map +1 -0
  221. package/dist/tools/shell/HostToolchain.js +264 -0
  222. package/dist/tools/shell/IsolatedExecutor.d.ts +15 -0
  223. package/dist/tools/shell/IsolatedExecutor.d.ts.map +1 -0
  224. package/dist/tools/shell/IsolatedExecutor.js +134 -0
  225. package/dist/tools/shell/ShellTool.d.ts.map +1 -1
  226. package/dist/tools/shell/ShellTool.js +9 -29
  227. package/dist/tools/shell/ShellWorkingDirectory.d.ts +3 -0
  228. package/dist/tools/shell/ShellWorkingDirectory.d.ts.map +1 -0
  229. package/dist/tools/shell/ShellWorkingDirectory.js +30 -0
  230. package/package.json +27 -24
@@ -1,11 +1,13 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { spawnSync } from "node:child_process";
2
+ import { runProcess } from "../tools/shell/AsyncProcess.js";
3
3
  import { createWriteStream, existsSync } from "node:fs";
4
4
  import { readFile, mkdir } from "node:fs/promises";
5
5
  import path from "node:path";
6
6
  import { createInterface } from "node:readline/promises";
7
7
  import process from "node:process";
8
8
  import { loadConfig } from "../config/ConfigLoader.js";
9
+ import { loadOrchestrationConfig } from "../config/OrchestrationConfig.js";
10
+ import { ConfiguredModelScope } from "../providers/ConfiguredModelScope.js";
9
11
  import { createProvider } from "../providers/ProviderRegistry.js";
10
12
  import { OpenAiCompatibleProvider } from "../providers/OpenAiCompatibleProvider.js";
11
13
  import { OllamaRemoteProvider } from "../providers/OllamaRemoteProvider.js";
@@ -277,6 +279,20 @@ export const parseArgs = (argv) => {
277
279
  i += 1;
278
280
  continue;
279
281
  }
282
+ if (arg === "--orchestration-config") {
283
+ if (!next || next.startsWith("--"))
284
+ throw new Error("--orchestration-config requires a file path");
285
+ parsed.orchestrationConfig = next;
286
+ i += 1;
287
+ continue;
288
+ }
289
+ if (arg === "--effort") {
290
+ if (!["low", "medium", "high", "max"].includes(next ?? ""))
291
+ throw new Error("--effort requires low|medium|high|max");
292
+ parsed.effort = next;
293
+ i += 1;
294
+ continue;
295
+ }
280
296
  if (arg === "--config" && next) {
281
297
  parsed.configPath = next;
282
298
  i += 1;
@@ -627,7 +643,7 @@ const createStreamState = (flushEveryMs, outputStream) => {
627
643
  },
628
644
  };
629
645
  };
630
- const createPatchValidator = (workspaceRoot, allowShell, shellAllowlist) => {
646
+ const createPatchValidator = (workspaceRoot, allowShell, shellAllowlist, scope) => {
631
647
  if (!allowShell)
632
648
  return undefined;
633
649
  const allowlist = new Set(shellAllowlist ?? []);
@@ -639,16 +655,8 @@ const createPatchValidator = (workspaceRoot, allowShell, shellAllowlist) => {
639
655
  if (!allowlist.has("node")) {
640
656
  return;
641
657
  }
642
- const result = spawnSync("node", ["--check", filePath], {
643
- cwd: workspaceRoot,
644
- encoding: "utf8",
645
- });
646
- if (result.error) {
647
- throw result.error;
648
- }
649
- if (result.status !== 0) {
650
- throw new Error(result.stderr?.toString() || "node --check failed");
651
- }
658
+ scope?.reserveTool();
659
+ await runProcess(process.execPath, ["--check", filePath], { workspaceRoot, signal: scope?.signal, shellTimeoutMs: 30000 });
652
660
  };
653
661
  };
654
662
  const isPhaseProvider = (value) => value === "librarian" ||
@@ -1154,8 +1162,35 @@ const registerBuiltins = () => {
1154
1162
  };
1155
1163
  export class RunCommand {
1156
1164
  static async run(argv) {
1157
- registerBuiltins();
1158
1165
  const parsed = parseArgs(argv);
1166
+ const file = parsed.orchestrationConfig ?? process.env.CODALI_ORCHESTRATION_CONFIG;
1167
+ if (!file) {
1168
+ if (parsed.effort)
1169
+ throw new Error("Legacy run requires --orchestration-config to select an effort budget");
1170
+ return this.runParsed(parsed);
1171
+ }
1172
+ if ([parsed.agent, parsed.agentId, parsed.agentSlug, parsed.agentLibrarian, parsed.agentArchitect, parsed.agentBuilder,
1173
+ parsed.agentCritic, parsed.agentInterpreter, parsed.provider, parsed.model, parsed.baseUrl, parsed.apiKey,
1174
+ parsed.interpreterProvider, parsed.interpreterModel].some(value => value !== undefined))
1175
+ throw new Error("Configured run cannot accept legacy model/provider/agent overrides; edit role bindings in the orchestration file");
1176
+ const resolved = await loadOrchestrationConfig(file);
1177
+ const abort = new AbortController();
1178
+ const stop = () => abort.abort(new Error("Configured run cancelled"));
1179
+ const scope = new ConfiguredModelScope(resolved, { effort: parsed.effort, signal: abort.signal });
1180
+ process.once("SIGINT", stop);
1181
+ process.once("SIGTERM", stop);
1182
+ try {
1183
+ await this.runParsed(parsed, { resolved, scope });
1184
+ }
1185
+ finally {
1186
+ scope.close();
1187
+ process.removeListener("SIGINT", stop);
1188
+ process.removeListener("SIGTERM", stop);
1189
+ }
1190
+ }
1191
+ static async runParsed(parsed, orchestration) {
1192
+ registerBuiltins();
1193
+ const scope = orchestration?.scope;
1159
1194
  const resolvedWorkspaceRoot = resolveWorkspaceRoot(process.cwd(), parsed.workspaceRoot);
1160
1195
  const agentRef = parsed.agent ?? parsed.agentId ?? parsed.agentSlug;
1161
1196
  const resolvedAgent = agentRef
@@ -1372,6 +1407,23 @@ export class RunCommand {
1372
1407
  configPath: parsed.configPath,
1373
1408
  cwd: resolvedWorkspaceRoot,
1374
1409
  });
1410
+ if (scope) {
1411
+ const limits = scope.budget();
1412
+ config.limits = { ...config.limits, maxSteps: Math.min(config.limits.maxSteps, limits.maxSteps),
1413
+ maxToolCalls: Math.min(config.limits.maxToolCalls, limits.maxToolCalls),
1414
+ maxTokens: Math.min(config.limits.maxTokens ?? limits.maxOutputTokens, limits.maxOutputTokens),
1415
+ timeoutMs: Math.min(config.limits.timeoutMs, limits.timeoutMs) };
1416
+ config.routing = {};
1417
+ // The legacy configuration still controls workflow/validation; model identity comes only from bindings.
1418
+ config.provider = "configured";
1419
+ config.model = scope.models("lead")[0].model.catalogId;
1420
+ for (const binding of config.smart ? ["router", "architect", "worker"] : ["lead"])
1421
+ scope.models(binding);
1422
+ if (config.localContext.enabled && config.localContext.summarize.enabled)
1423
+ scope.models("summarizer");
1424
+ if (config.builder.mode === "freeform" || config.builder.fallbackToInterpreter)
1425
+ scope.models("repair");
1426
+ }
1375
1427
  if (config.deepInvestigation?.enabled && !config.smart) {
1376
1428
  throw new Error("Deep investigation requires --smart. Enable smart mode or disable deep investigation.");
1377
1429
  }
@@ -1420,7 +1472,7 @@ export class RunCommand {
1420
1472
  const outputLogPath = path.join(path.dirname(logger.logPath), `${runId}.output.log`);
1421
1473
  await mkdir(path.dirname(outputLogPath), { recursive: true });
1422
1474
  const outputStream = createWriteStream(outputLogPath, { flags: "a" });
1423
- const unregisterSignals = lock.registerSignalHandlers({
1475
+ const unregisterSignals = scope ? () => { } : lock.registerSignalHandlers({
1424
1476
  onSignal: async (signal) => {
1425
1477
  try {
1426
1478
  await logger.log("run_cancelled", {
@@ -1625,6 +1677,9 @@ export class RunCommand {
1625
1677
  registerIfEnabled(createSearchTool());
1626
1678
  registerIfEnabled(createShellTool());
1627
1679
  const docdexClient = new DocdexClient({
1680
+ signal: () => scope?.signal,
1681
+ beforeRequest: scope ? () => scope.reserveTool() : undefined,
1682
+ localSearchOnly: Boolean(scope),
1628
1683
  baseUrl: config.docdex.baseUrl,
1629
1684
  repoId: config.docdex.repoId,
1630
1685
  repoRoot: config.docdex.repoRoot ?? config.workspaceRoot,
@@ -1633,6 +1688,8 @@ export class RunCommand {
1633
1688
  for (const tool of createDocdexTools(docdexClient))
1634
1689
  registerIfEnabled(tool);
1635
1690
  const toolContext = {
1691
+ signal: scope?.signal,
1692
+ beforeTool: scope && config.smart ? async () => scope.reserveTool() : undefined,
1636
1693
  workspaceRoot: config.workspaceRoot,
1637
1694
  recordTouchedFile: (filePath) => runContext.recordTouchedFile(filePath),
1638
1695
  allowOutsideWorkspace: config.tools.allowOutsideWorkspace,
@@ -1641,11 +1698,25 @@ export class RunCommand {
1641
1698
  shellAllowlist: config.tools.shellAllowlist,
1642
1699
  };
1643
1700
  const streamState = createStreamState(config.streaming.flushEveryMs, outputStream);
1701
+ const scopedProvider = (binding) => {
1702
+ const provider = scope.provider(binding);
1703
+ return { ...provider, generate: async (request) => {
1704
+ try {
1705
+ const response = await provider.generate(request);
1706
+ await logger.log("configured_model_route", { ...response.route, usage: scope.snapshot() });
1707
+ return response;
1708
+ }
1709
+ catch (error) {
1710
+ await logger.log("configured_model_failure", { binding, configHash: scope.configHash, usage: scope.snapshot() });
1711
+ throw error;
1712
+ }
1713
+ } };
1714
+ };
1644
1715
  if (config.smart) {
1645
1716
  const hasRoutingAgent = Object.values(config.routing ?? {}).some((phase) => Boolean(phase?.agent));
1646
1717
  const hasExplicitProvider = Boolean(parsed.provider || parsed.model || parsed.baseUrl || parsed.apiKey);
1647
- const shouldForceAgentDefaults = !agentRef && !hasRoutingAgent && !hasExplicitProvider;
1648
- const shouldSelectAgents = config.provider !== "stub";
1718
+ const shouldForceAgentDefaults = !scope && !agentRef && !hasRoutingAgent && !hasExplicitProvider;
1719
+ const shouldSelectAgents = !scope && config.provider !== "stub";
1649
1720
  const emptySelection = (phase) => ({
1650
1721
  phase,
1651
1722
  capabilities: [],
@@ -1751,6 +1822,14 @@ export class RunCommand {
1751
1822
  });
1752
1823
  }
1753
1824
  const buildDefaultsForPhase = (phase) => {
1825
+ if (scope) {
1826
+ const binding = { librarian: "router", architect: "architect", builder: "worker", critic: "lead", interpreter: "repair" }[phase];
1827
+ // An unused interpreter does not require an enabled repair binding.
1828
+ const required = phase !== "interpreter" || config.builder.mode === "freeform" || config.builder.fallbackToInterpreter;
1829
+ const model = scope.models(required ? binding : "lead")[0].model;
1830
+ config.localContext.modelTokenLimits = { ...config.localContext.modelTokenLimits, [model.catalogId]: model.contextWindow };
1831
+ return { provider: `configured:${binding}`, config: { model: model.catalogId, timeoutMs: config.limits.timeoutMs } };
1832
+ }
1754
1833
  const selected = phaseSelections[phase].resolved;
1755
1834
  return selected
1756
1835
  ? {
@@ -1799,9 +1878,9 @@ export class RunCommand {
1799
1878
  provider: criticRoute.provider,
1800
1879
  model: criticRoute.config.model,
1801
1880
  };
1802
- const librarianProvider = createProvider(librarianRoute.provider, librarianRoute.config);
1803
- const architectProvider = createProvider(architectRoute.provider, architectRoute.config);
1804
- const builderProvider = createProvider(builderRoute.provider, builderRoute.config);
1881
+ const librarianProvider = scope ? scopedProvider("router") : createProvider(librarianRoute.provider, librarianRoute.config);
1882
+ const architectProvider = scope ? scopedProvider("architect") : createProvider(architectRoute.provider, architectRoute.config);
1883
+ const builderProvider = scope ? scopedProvider("worker") : createProvider(builderRoute.provider, builderRoute.config);
1805
1884
  const profileAgentId = config.agentId ??
1806
1885
  config.agentSlug ??
1807
1886
  phaseSelections.architect.resolved?.agent.id ??
@@ -1842,7 +1921,7 @@ export class RunCommand {
1842
1921
  model: config.localContext.summarize.model,
1843
1922
  };
1844
1923
  }
1845
- const summarizerProvider = createProvider(summarizerProviderName, summarizerConfig);
1924
+ const summarizerProvider = scope ? scopedProvider("summarizer") : createProvider(summarizerProviderName, summarizerConfig);
1846
1925
  summarizer = new ContextSummarizer(summarizerProvider, {
1847
1926
  maxTokens: config.localContext.summarize.targetTokens,
1848
1927
  temperature: summarizerTemperature,
@@ -1937,7 +2016,7 @@ export class RunCommand {
1937
2016
  onEvent: streamState.onEvent,
1938
2017
  });
1939
2018
  const builderResponseFormat = builderRoute.responseFormat ?? (config.builder.mode === "patch_json" ? { type: "json" } : undefined);
1940
- const patchValidator = createPatchValidator(config.workspaceRoot, config.tools.allowShell ?? false, config.tools.shellAllowlist ?? []);
2019
+ const patchValidator = createPatchValidator(config.workspaceRoot, config.tools.allowShell ?? false, config.tools.shellAllowlist ?? [], scope);
1941
2020
  const needsPatchApplier = config.builder.mode === "patch_json" || config.builder.mode === "freeform" || config.builder.mode === "tool_calls";
1942
2021
  const patchApplier = needsPatchApplier
1943
2022
  ? new PatchApplier({
@@ -1954,7 +2033,7 @@ export class RunCommand {
1954
2033
  ? resolveInterpreterRoute(config, phaseRoutes)
1955
2034
  : undefined;
1956
2035
  const interpreterProvider = interpreterRoute
1957
- ? createProvider(interpreterRoute.provider, {
2036
+ ? scope ? scopedProvider("repair") : createProvider(interpreterRoute.provider, {
1958
2037
  ...interpreterRoute.config,
1959
2038
  timeoutMs: config.interpreter.timeoutMs ??
1960
2039
  interpreterRoute.config.timeoutMs ??
@@ -2003,6 +2082,7 @@ export class RunCommand {
2003
2082
  model: builderRoute.config.model,
2004
2083
  });
2005
2084
  const validator = new ValidationRunner({
2085
+ signal: scope?.signal,
2006
2086
  allowShell: config.tools.allowShell ?? false,
2007
2087
  shellAllowlist: config.tools.shellAllowlist ?? [],
2008
2088
  workspaceRoot: config.workspaceRoot,
@@ -2206,13 +2286,15 @@ export class RunCommand {
2206
2286
  minimumVerificationChecks: workflowProfile?.verificationMinimumChecks,
2207
2287
  enforceVerificationHighConfidence: workflowProfile?.verificationEnforceHighConfidence,
2208
2288
  onEvent: streamState.onEvent,
2209
- onPhaseProviderFailure: recoverPhaseProvider,
2289
+ onPhaseProviderFailure: scope ? undefined : recoverPhaseProvider,
2210
2290
  });
2211
2291
  const result = await pipeline.run(workflowTaskInput);
2292
+ scope?.signal.throwIfAborted();
2212
2293
  for (const file of result.builderResult.touchedFiles ?? []) {
2213
2294
  runContext.recordTouchedFile(file);
2214
2295
  }
2215
2296
  smartRuntimeSummary = {
2297
+ orchestration: scope ? { configHash: scope.configHash, usage: scope.snapshot(), toolCalls: scope.toolsUsed } : undefined,
2216
2298
  attempts: result.attempts,
2217
2299
  maxRetries: config.limits.maxRetries,
2218
2300
  maxContextRefreshes: config.context.maxContextRefreshes,
@@ -2292,8 +2374,10 @@ export class RunCommand {
2292
2374
  throw new Error("Run cancelled due to cost limit");
2293
2375
  }
2294
2376
  }
2295
- const provider = createProvider(config.provider, buildDefaultProviderConfig(config));
2377
+ const provider = scope ? undefined : createProvider(config.provider, buildDefaultProviderConfig(config));
2296
2378
  const result = await runCodaliTask({
2379
+ orchestration: orchestration ? { ...orchestration, effort: scope.effort } : undefined,
2380
+ signal: scope?.signal,
2297
2381
  task: workflowTaskInput,
2298
2382
  workspace: { root: config.workspaceRoot },
2299
2383
  provider: {
@@ -2356,6 +2440,8 @@ export class RunCommand {
2356
2440
  finalMessageContent = result.finalMessage;
2357
2441
  usage = result.usage;
2358
2442
  toolCallsExecuted = result.toolCallsExecuted;
2443
+ if (result.orchestration)
2444
+ await logger.log("configured_runtime_usage", result.orchestration);
2359
2445
  }
2360
2446
  streamState.flush();
2361
2447
  if (streamState.didStream()) {
@@ -0,0 +1,35 @@
1
+ import { type EffortLevel, type ResolvedOrchestrationConfig } from "../config/OrchestrationConfig.js";
2
+ import { type PermissionProfile } from "../permissions/PermissionGate.js";
3
+ import { type ProjectTaskAuthority } from "@mcoda/shared";
4
+ import { type ManagedRuntimeIdentity } from "../docdex/ManagedRuntime.js";
5
+ interface Arguments {
6
+ command: string;
7
+ prompt: string;
8
+ workspaceRoot: string;
9
+ config?: string;
10
+ docdexBinary?: string;
11
+ projectTask?: string;
12
+ effort: EffortLevel;
13
+ permissions: PermissionProfile;
14
+ json: boolean;
15
+ plain: boolean;
16
+ stdin: boolean;
17
+ allowWeb?: boolean;
18
+ allowMemory?: boolean;
19
+ allowMedia?: boolean;
20
+ allowNetwork?: boolean;
21
+ }
22
+ export interface TerminalHost {
23
+ projectTaskAuthority?: ProjectTaskAuthority;
24
+ }
25
+ export declare const parseTerminalArguments: (argv: string[]) => Arguments;
26
+ export declare const setupTerminalConfig: (destination: string, options?: {
27
+ prepareRuntime?: () => Promise<ManagedRuntimeIdentity>;
28
+ }) => Promise<ResolvedOrchestrationConfig>;
29
+ export declare const terminalDoctor: (configPath?: string) => Promise<Record<string, unknown>>;
30
+ export declare class TerminalCommand {
31
+ static run(argv: string[], host?: TerminalHost): Promise<void>;
32
+ private static execute;
33
+ }
34
+ export {};
35
+ //# sourceMappingURL=TerminalCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalCommand.d.ts","sourceRoot":"","sources":["../../src/cli/TerminalCommand.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2E,KAAK,WAAW,EAA4B,KAAK,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAEzM,OAAO,EAAkB,KAAK,iBAAiB,EAAyB,MAAM,kCAAkC,CAAC;AAMjH,OAAO,EAAkC,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAI1F,OAAO,EAA2D,KAAK,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAOnI,UAAU,SAAS;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,WAAW,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CAAE;AAC1U,MAAM,WAAW,YAAY;IAAG,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAAE;AAC9E,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,EAAE,KAAG,SAmBvD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,aAAa,MAAM,EAAE,UAAS;IAAE,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAA;CAAO,KAAG,OAAO,CAAC,2BAA2B,CAqD5K,CAAC;AAOF,eAAO,MAAM,cAAc,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuBzF,CAAC;AAEF,qBAAa,eAAe;WACb,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;mBAUnD,OAAO;CAiI7B"}