muonroi-cli 1.4.0 → 1.4.1

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 (1831) hide show
  1. package/dist/src/generated/version.d.ts +1 -1
  2. package/dist/src/generated/version.js +1 -1
  3. package/package.json +3 -2
  4. package/dist/muonroi-cli-standalone.exe +0 -0
  5. package/dist/packages/agent-harness-core/src/driver.js.map +0 -1
  6. package/dist/packages/agent-harness-core/src/event-filter.js.map +0 -1
  7. package/dist/packages/agent-harness-core/src/event-redact.js.map +0 -1
  8. package/dist/packages/agent-harness-core/src/idle.js.map +0 -1
  9. package/dist/packages/agent-harness-core/src/index.js.map +0 -1
  10. package/dist/packages/agent-harness-core/src/mcp-server.js.map +0 -1
  11. package/dist/packages/agent-harness-core/src/mock-llm.js.map +0 -1
  12. package/dist/packages/agent-harness-core/src/predicate.js.map +0 -1
  13. package/dist/packages/agent-harness-core/src/protocol.js.map +0 -1
  14. package/dist/packages/agent-harness-core/src/registry.js.map +0 -1
  15. package/dist/packages/agent-harness-core/src/selector.js.map +0 -1
  16. package/dist/packages/agent-harness-core/src/spec-helpers.js.map +0 -1
  17. package/dist/packages/agent-harness-core/src/transports/sidechannel.js.map +0 -1
  18. package/dist/packages/agent-harness-core/src/transports/ws.js.map +0 -1
  19. package/dist/packages/agent-harness-opentui/src/agent-mode.js.map +0 -1
  20. package/dist/packages/agent-harness-opentui/src/index.js.map +0 -1
  21. package/dist/packages/agent-harness-opentui/src/input-bridge.js.map +0 -1
  22. package/dist/packages/agent-harness-opentui/src/install.js.map +0 -1
  23. package/dist/packages/agent-harness-opentui/src/reconciler-hook.js.map +0 -1
  24. package/dist/packages/agent-harness-opentui/src/semantic.js.map +0 -1
  25. package/dist/src/__test-helpers__/catalog-fixtures.js.map +0 -1
  26. package/dist/src/__test-stubs__/ee-server.js.map +0 -1
  27. package/dist/src/__test-stubs__/vitest-setup.js.map +0 -1
  28. package/dist/src/__tests__/council/bubble-layout.test.js.map +0 -1
  29. package/dist/src/__tests__/council/code-block-truncate.test.js.map +0 -1
  30. package/dist/src/__tests__/council/role-palette.test.js.map +0 -1
  31. package/dist/src/__tests__/first-run-wizard.test.js.map +0 -1
  32. package/dist/src/agent-harness/__tests__/cli-flags.spec.js.map +0 -1
  33. package/dist/src/agent-harness/__tests__/driver.spec.js.map +0 -1
  34. package/dist/src/agent-harness/__tests__/idle.spec.js.map +0 -1
  35. package/dist/src/agent-harness/__tests__/mock-llm.spec.js.map +0 -1
  36. package/dist/src/agent-harness/__tests__/mock-model.spec.js.map +0 -1
  37. package/dist/src/agent-harness/__tests__/predicate.spec.js.map +0 -1
  38. package/dist/src/agent-harness/__tests__/protocol.spec.js.map +0 -1
  39. package/dist/src/agent-harness/__tests__/schema.spec.js.map +0 -1
  40. package/dist/src/agent-harness/__tests__/selector.spec.js.map +0 -1
  41. package/dist/src/agent-harness/__tests__/sidechannel.spec.js.map +0 -1
  42. package/dist/src/agent-harness/__tests__/spec-helpers.spec.js.map +0 -1
  43. package/dist/src/agent-harness/index.js.map +0 -1
  44. package/dist/src/agent-harness/mock-model.js.map +0 -1
  45. package/dist/src/agent-harness/test-spawn.js.map +0 -1
  46. package/dist/src/billing/index.js.map +0 -1
  47. package/dist/src/chat/__tests__/broadcast-bus.test.js.map +0 -1
  48. package/dist/src/chat/__tests__/channel-manager.test.js.map +0 -1
  49. package/dist/src/chat/__tests__/client.test.js.map +0 -1
  50. package/dist/src/chat/__tests__/discord-integration.test.js.map +0 -1
  51. package/dist/src/chat/__tests__/intent-prompt.test.js.map +0 -1
  52. package/dist/src/chat/__tests__/verdict-resolver.test.js.map +0 -1
  53. package/dist/src/chat/broadcast-bus.js.map +0 -1
  54. package/dist/src/chat/channel-manager.js.map +0 -1
  55. package/dist/src/chat/chat-keychain.js.map +0 -1
  56. package/dist/src/chat/factory.js.map +0 -1
  57. package/dist/src/chat/intent-prompt.js.map +0 -1
  58. package/dist/src/chat/providers/discord/client.js.map +0 -1
  59. package/dist/src/chat/types.js.map +0 -1
  60. package/dist/src/chat/verdict-constants.js.map +0 -1
  61. package/dist/src/chat/verdict-resolver.js.map +0 -1
  62. package/dist/src/cli/__tests__/bw-vault.test.js.map +0 -1
  63. package/dist/src/cli/__tests__/keys-bundle.test.js.map +0 -1
  64. package/dist/src/cli/__tests__/share-cmd.test.js.map +0 -1
  65. package/dist/src/cli/bw-vault.js.map +0 -1
  66. package/dist/src/cli/config/__tests__/model-picker.test.js.map +0 -1
  67. package/dist/src/cli/config/__tests__/provider-fetch.test.js.map +0 -1
  68. package/dist/src/cli/config/index.js.map +0 -1
  69. package/dist/src/cli/config/model-picker.js.map +0 -1
  70. package/dist/src/cli/config/provider-fetch.js.map +0 -1
  71. package/dist/src/cli/config/screen-council.js.map +0 -1
  72. package/dist/src/cli/config/screen-models.js.map +0 -1
  73. package/dist/src/cli/config/screen-providers.js.map +0 -1
  74. package/dist/src/cli/config/tui.js.map +0 -1
  75. package/dist/src/cli/cost-forensics.js.map +0 -1
  76. package/dist/src/cli/cost-forensics.test.js.map +0 -1
  77. package/dist/src/cli/keys-bundle.js.map +0 -1
  78. package/dist/src/cli/keys.js.map +0 -1
  79. package/dist/src/cli/keys.test.js.map +0 -1
  80. package/dist/src/cli/pil-report.js.map +0 -1
  81. package/dist/src/cli/reporter-cmd.js.map +0 -1
  82. package/dist/src/cli/share-cmd.js.map +0 -1
  83. package/dist/src/cli/usage-report.js.map +0 -1
  84. package/dist/src/cloud/index.js.map +0 -1
  85. package/dist/src/council/__tests__/accounting.test.js.map +0 -1
  86. package/dist/src/council/__tests__/audit-replay.test.js.map +0 -1
  87. package/dist/src/council/__tests__/clarifier-max-rounds.test.js.map +0 -1
  88. package/dist/src/council/__tests__/clarifier-options.test.js.map +0 -1
  89. package/dist/src/council/__tests__/clarifier-ready-gate.test.js.map +0 -1
  90. package/dist/src/council/__tests__/cost-aware.test.js.map +0 -1
  91. package/dist/src/council/__tests__/debate-planner-structured.test.js.map +0 -1
  92. package/dist/src/council/__tests__/decisions-lock.test.js.map +0 -1
  93. package/dist/src/council/__tests__/evaluator-metrics.test.js.map +0 -1
  94. package/dist/src/council/__tests__/parse-outcome-fallback.test.js.map +0 -1
  95. package/dist/src/council/__tests__/research-tools.test.js.map +0 -1
  96. package/dist/src/council/__tests__/round-tools.test.js.map +0 -1
  97. package/dist/src/council/__tests__/tool-trace.test.js.map +0 -1
  98. package/dist/src/council/__tests__/types-contract.test.js.map +0 -1
  99. package/dist/src/council/clarifier.js.map +0 -1
  100. package/dist/src/council/context.js.map +0 -1
  101. package/dist/src/council/debate-planner.js.map +0 -1
  102. package/dist/src/council/debate.js.map +0 -1
  103. package/dist/src/council/decisions-lock.js.map +0 -1
  104. package/dist/src/council/executor.js.map +0 -1
  105. package/dist/src/council/index.js.map +0 -1
  106. package/dist/src/council/leader.js.map +0 -1
  107. package/dist/src/council/llm.js.map +0 -1
  108. package/dist/src/council/phase-events.js.map +0 -1
  109. package/dist/src/council/planner.js.map +0 -1
  110. package/dist/src/council/preflight.js.map +0 -1
  111. package/dist/src/council/prompts.js.map +0 -1
  112. package/dist/src/council/types.js.map +0 -1
  113. package/dist/src/daemon/scheduler.js.map +0 -1
  114. package/dist/src/daemon/scheduler.test.js.map +0 -1
  115. package/dist/src/ee/__tests__/bb-design.test.js.map +0 -1
  116. package/dist/src/ee/__tests__/export-transcripts.test.js.map +0 -1
  117. package/dist/src/ee/__tests__/pil-context-bridge.test.js.map +0 -1
  118. package/dist/src/ee/__tests__/pipeline.integration.test.js.map +0 -1
  119. package/dist/src/ee/__tests__/recall-format.test.js.map +0 -1
  120. package/dist/src/ee/__tests__/recall-ledger.test.js.map +0 -1
  121. package/dist/src/ee/__tests__/render-sink-wiring.test.js.map +0 -1
  122. package/dist/src/ee/auth.js.map +0 -1
  123. package/dist/src/ee/auth.test.js.map +0 -1
  124. package/dist/src/ee/bb-design.js.map +0 -1
  125. package/dist/src/ee/bb-retrieval.js.map +0 -1
  126. package/dist/src/ee/bridge.js.map +0 -1
  127. package/dist/src/ee/bridge.test.js.map +0 -1
  128. package/dist/src/ee/client-mode.js.map +0 -1
  129. package/dist/src/ee/client.js.map +0 -1
  130. package/dist/src/ee/client.test.js.map +0 -1
  131. package/dist/src/ee/council-bridge.js.map +0 -1
  132. package/dist/src/ee/embedding-cache.js.map +0 -1
  133. package/dist/src/ee/export-transcripts.js.map +0 -1
  134. package/dist/src/ee/extract-session.js.map +0 -1
  135. package/dist/src/ee/extract-session.test.js.map +0 -1
  136. package/dist/src/ee/health.js.map +0 -1
  137. package/dist/src/ee/index.js.map +0 -1
  138. package/dist/src/ee/intercept.js.map +0 -1
  139. package/dist/src/ee/intercept.test.js.map +0 -1
  140. package/dist/src/ee/judge.js.map +0 -1
  141. package/dist/src/ee/judge.test.js.map +0 -1
  142. package/dist/src/ee/mistake-detector.js.map +0 -1
  143. package/dist/src/ee/mistake-detector.test.js.map +0 -1
  144. package/dist/src/ee/offline-queue.js.map +0 -1
  145. package/dist/src/ee/offline-queue.test.js.map +0 -1
  146. package/dist/src/ee/phase-outcome.js.map +0 -1
  147. package/dist/src/ee/phase-outcome.test.js.map +0 -1
  148. package/dist/src/ee/phase-tracker.js.map +0 -1
  149. package/dist/src/ee/phase-tracker.test.js.map +0 -1
  150. package/dist/src/ee/posttool.js.map +0 -1
  151. package/dist/src/ee/posttool.test.js.map +0 -1
  152. package/dist/src/ee/prompt-stale.js.map +0 -1
  153. package/dist/src/ee/prompt-stale.test.js.map +0 -1
  154. package/dist/src/ee/recall-ledger.js.map +0 -1
  155. package/dist/src/ee/recall-mirror.test.js.map +0 -1
  156. package/dist/src/ee/render.js.map +0 -1
  157. package/dist/src/ee/render.test.js.map +0 -1
  158. package/dist/src/ee/scope.js.map +0 -1
  159. package/dist/src/ee/scope.test.js.map +0 -1
  160. package/dist/src/ee/search.js.map +0 -1
  161. package/dist/src/ee/session-trajectory.js.map +0 -1
  162. package/dist/src/ee/session-trajectory.test.js.map +0 -1
  163. package/dist/src/ee/tenant.js.map +0 -1
  164. package/dist/src/ee/touch.test.js.map +0 -1
  165. package/dist/src/ee/transcript-emit.js.map +0 -1
  166. package/dist/src/ee/types.js.map +0 -1
  167. package/dist/src/flow/__tests__/migration.test.js.map +0 -1
  168. package/dist/src/flow/__tests__/parser.test.js.map +0 -1
  169. package/dist/src/flow/__tests__/run-manager-product.test.js.map +0 -1
  170. package/dist/src/flow/__tests__/run-manager.test.js.map +0 -1
  171. package/dist/src/flow/__tests__/scaffold-checkpoint.test.js.map +0 -1
  172. package/dist/src/flow/__tests__/scaffold.test.js.map +0 -1
  173. package/dist/src/flow/__tests__/warning-persist.test.js.map +0 -1
  174. package/dist/src/flow/artifact-io.js.map +0 -1
  175. package/dist/src/flow/compaction/__tests__/compress.test.js.map +0 -1
  176. package/dist/src/flow/compaction/__tests__/extract.test.js.map +0 -1
  177. package/dist/src/flow/compaction/__tests__/preserve.test.js.map +0 -1
  178. package/dist/src/flow/compaction/compress.js.map +0 -1
  179. package/dist/src/flow/compaction/extract.js.map +0 -1
  180. package/dist/src/flow/compaction/index.js.map +0 -1
  181. package/dist/src/flow/compaction/preserve.js.map +0 -1
  182. package/dist/src/flow/index.js.map +0 -1
  183. package/dist/src/flow/migration.js.map +0 -1
  184. package/dist/src/flow/parser.js.map +0 -1
  185. package/dist/src/flow/run-manager.js.map +0 -1
  186. package/dist/src/flow/scaffold-checkpoint.js.map +0 -1
  187. package/dist/src/flow/scaffold.js.map +0 -1
  188. package/dist/src/flow/warning-persist.js.map +0 -1
  189. package/dist/src/generated/version.js.map +0 -1
  190. package/dist/src/gsd/__tests__/complexity.test.js.map +0 -1
  191. package/dist/src/gsd/__tests__/directives.test.js.map +0 -1
  192. package/dist/src/gsd/__tests__/gray-areas.test.js.map +0 -1
  193. package/dist/src/gsd/__tests__/types.test.js.map +0 -1
  194. package/dist/src/gsd/complexity.js.map +0 -1
  195. package/dist/src/gsd/directives.js.map +0 -1
  196. package/dist/src/gsd/gray-areas.js.map +0 -1
  197. package/dist/src/gsd/index.js.map +0 -1
  198. package/dist/src/gsd/types.js.map +0 -1
  199. package/dist/src/headless/__tests__/council-answers.test.js.map +0 -1
  200. package/dist/src/headless/council-answers.js.map +0 -1
  201. package/dist/src/headless/output.js.map +0 -1
  202. package/dist/src/headless/output.test.js.map +0 -1
  203. package/dist/src/hooks/config.js.map +0 -1
  204. package/dist/src/hooks/index.js.map +0 -1
  205. package/dist/src/hooks/types.js.map +0 -1
  206. package/dist/src/index.js.map +0 -1
  207. package/dist/src/lsp/builtins.js.map +0 -1
  208. package/dist/src/lsp/builtins.test.js.map +0 -1
  209. package/dist/src/lsp/client.js.map +0 -1
  210. package/dist/src/lsp/manager.js.map +0 -1
  211. package/dist/src/lsp/manager.test.js.map +0 -1
  212. package/dist/src/lsp/npm-cache.js.map +0 -1
  213. package/dist/src/lsp/npm-cache.test.js.map +0 -1
  214. package/dist/src/lsp/runtime.js.map +0 -1
  215. package/dist/src/lsp/smoke.test.js.map +0 -1
  216. package/dist/src/lsp/types.js.map +0 -1
  217. package/dist/src/maintain/__tests__/codebase-intel.test.js.map +0 -1
  218. package/dist/src/maintain/__tests__/gh-create-pr.test.js.map +0 -1
  219. package/dist/src/maintain/__tests__/pr-builder.test.js.map +0 -1
  220. package/dist/src/maintain/__tests__/repo-map.test.js.map +0 -1
  221. package/dist/src/maintain/__tests__/task-runner.test.js.map +0 -1
  222. package/dist/src/maintain/codebase-intel.js.map +0 -1
  223. package/dist/src/maintain/gh-create-pr.js.map +0 -1
  224. package/dist/src/maintain/index.js.map +0 -1
  225. package/dist/src/maintain/pr-builder.js.map +0 -1
  226. package/dist/src/maintain/repo-map.js.map +0 -1
  227. package/dist/src/maintain/task-runner.js.map +0 -1
  228. package/dist/src/maintain/types.js.map +0 -1
  229. package/dist/src/mcp/__tests__/auto-setup.test.js.map +0 -1
  230. package/dist/src/mcp/__tests__/cap-tool-result.test.js.map +0 -1
  231. package/dist/src/mcp/__tests__/ee-tools.test.js.map +0 -1
  232. package/dist/src/mcp/__tests__/forensics-tools.test.js.map +0 -1
  233. package/dist/src/mcp/__tests__/harness-driver-action-tools.spec.js.map +0 -1
  234. package/dist/src/mcp/__tests__/harness-driver-async-tools.spec.js.map +0 -1
  235. package/dist/src/mcp/__tests__/harness-driver-read-tools.spec.js.map +0 -1
  236. package/dist/src/mcp/__tests__/harness-driver-security.spec.js.map +0 -1
  237. package/dist/src/mcp/__tests__/harness-driver.spec.js.map +0 -1
  238. package/dist/src/mcp/__tests__/lazy-schema.spec.js.map +0 -1
  239. package/dist/src/mcp/__tests__/lsp-tools.test.js.map +0 -1
  240. package/dist/src/mcp/__tests__/mcp-keychain.test.js.map +0 -1
  241. package/dist/src/mcp/__tests__/research-onboarding.test.js.map +0 -1
  242. package/dist/src/mcp/__tests__/runtime-hydration.test.js.map +0 -1
  243. package/dist/src/mcp/__tests__/runtime-output-cap.test.js.map +0 -1
  244. package/dist/src/mcp/__tests__/runtime-sanitize.test.js.map +0 -1
  245. package/dist/src/mcp/__tests__/self-verify-jobs.test.js.map +0 -1
  246. package/dist/src/mcp/__tests__/smart-filter.test.js.map +0 -1
  247. package/dist/src/mcp/__tests__/tools-server.smoke.test.js.map +0 -1
  248. package/dist/src/mcp/auto-setup.js.map +0 -1
  249. package/dist/src/mcp/cap-tool-result.js.map +0 -1
  250. package/dist/src/mcp/catalog.js.map +0 -1
  251. package/dist/src/mcp/ee-tools.js.map +0 -1
  252. package/dist/src/mcp/forensics-tools.js.map +0 -1
  253. package/dist/src/mcp/lsp-tools.js.map +0 -1
  254. package/dist/src/mcp/mcp-keychain.js.map +0 -1
  255. package/dist/src/mcp/oauth-callback.js.map +0 -1
  256. package/dist/src/mcp/oauth-provider.js.map +0 -1
  257. package/dist/src/mcp/opentui-spawn.js.map +0 -1
  258. package/dist/src/mcp/parse-headers.js.map +0 -1
  259. package/dist/src/mcp/parse-headers.test.js.map +0 -1
  260. package/dist/src/mcp/research-onboarding.js.map +0 -1
  261. package/dist/src/mcp/runtime.js.map +0 -1
  262. package/dist/src/mcp/self-verify-jobs.js.map +0 -1
  263. package/dist/src/mcp/smart-filter.js.map +0 -1
  264. package/dist/src/mcp/smoke.test.js.map +0 -1
  265. package/dist/src/mcp/tools-server.js.map +0 -1
  266. package/dist/src/mcp/validate.js.map +0 -1
  267. package/dist/src/models/__tests__/registry.test.js.map +0 -1
  268. package/dist/src/models/catalog-client.js.map +0 -1
  269. package/dist/src/models/catalog-gemini.test.js.map +0 -1
  270. package/dist/src/models/catalog-url.test.js.map +0 -1
  271. package/dist/src/models/catalog-validation.test.js.map +0 -1
  272. package/dist/src/models/classify-tier.js.map +0 -1
  273. package/dist/src/models/index.js.map +0 -1
  274. package/dist/src/models/registry.js.map +0 -1
  275. package/dist/src/ops/__tests__/doctor-council-mcp.test.js.map +0 -1
  276. package/dist/src/ops/__tests__/doctor-ee-health.test.js.map +0 -1
  277. package/dist/src/ops/bug-report.js.map +0 -1
  278. package/dist/src/ops/bug-report.test.js.map +0 -1
  279. package/dist/src/ops/doctor.js.map +0 -1
  280. package/dist/src/ops/doctor.test.js.map +0 -1
  281. package/dist/src/orchestrator/__tests__/agent-base-url-switch.test.js.map +0 -1
  282. package/dist/src/orchestrator/__tests__/batch-turn-runner.test.js.map +0 -1
  283. package/dist/src/orchestrator/__tests__/council-manager.test.js.map +0 -1
  284. package/dist/src/orchestrator/__tests__/cross-turn-dedup.test.js.map +0 -1
  285. package/dist/src/orchestrator/__tests__/current-call-id.test.js.map +0 -1
  286. package/dist/src/orchestrator/__tests__/error-forensics.test.js.map +0 -1
  287. package/dist/src/orchestrator/__tests__/flow-resume.test.js.map +0 -1
  288. package/dist/src/orchestrator/__tests__/humanize-api-error.test.js.map +0 -1
  289. package/dist/src/orchestrator/__tests__/message-processor.test.js.map +0 -1
  290. package/dist/src/orchestrator/__tests__/message-write-ahead.test.js.map +0 -1
  291. package/dist/src/orchestrator/__tests__/read-path-budget.test.js.map +0 -1
  292. package/dist/src/orchestrator/__tests__/retry-classifier.test.js.map +0 -1
  293. package/dist/src/orchestrator/__tests__/retry-stream.test.js.map +0 -1
  294. package/dist/src/orchestrator/__tests__/route-feedback.test.js.map +0 -1
  295. package/dist/src/orchestrator/__tests__/stream-runner.test.js.map +0 -1
  296. package/dist/src/orchestrator/__tests__/sub-agent-model-tier.test.js.map +0 -1
  297. package/dist/src/orchestrator/__tests__/usage-events-shape.test.js.map +0 -1
  298. package/dist/src/orchestrator/__tests__/usage-normalizer-c1.test.js.map +0 -1
  299. package/dist/src/orchestrator/__tests__/usage-shape-threading.test.js.map +0 -1
  300. package/dist/src/orchestrator/__tests__/write-ahead.test.js.map +0 -1
  301. package/dist/src/orchestrator/abort.js.map +0 -1
  302. package/dist/src/orchestrator/abort.test.js.map +0 -1
  303. package/dist/src/orchestrator/agent-options.js.map +0 -1
  304. package/dist/src/orchestrator/agent.test.js.map +0 -1
  305. package/dist/src/orchestrator/batch-turn-runner.js.map +0 -1
  306. package/dist/src/orchestrator/batch-utils.js.map +0 -1
  307. package/dist/src/orchestrator/cleanup.test.js.map +0 -1
  308. package/dist/src/orchestrator/compaction.js.map +0 -1
  309. package/dist/src/orchestrator/compaction.test.js.map +0 -1
  310. package/dist/src/orchestrator/council-manager.js.map +0 -1
  311. package/dist/src/orchestrator/cross-turn-dedup.js.map +0 -1
  312. package/dist/src/orchestrator/delegations.js.map +0 -1
  313. package/dist/src/orchestrator/delegations.test.js.map +0 -1
  314. package/dist/src/orchestrator/error-utils.js.map +0 -1
  315. package/dist/src/orchestrator/flow-resume.js.map +0 -1
  316. package/dist/src/orchestrator/grounding-check.js.map +0 -1
  317. package/dist/src/orchestrator/grounding-check.test.js.map +0 -1
  318. package/dist/src/orchestrator/interrupted-turn.js.map +0 -1
  319. package/dist/src/orchestrator/interrupted-turn.test.js.map +0 -1
  320. package/dist/src/orchestrator/message-processor.js.map +0 -1
  321. package/dist/src/orchestrator/message-seq.js.map +0 -1
  322. package/dist/src/orchestrator/message-seq.test.js.map +0 -1
  323. package/dist/src/orchestrator/orchestrator.js.map +0 -1
  324. package/dist/src/orchestrator/pending-calls.js.map +0 -1
  325. package/dist/src/orchestrator/pending-calls.test.js.map +0 -1
  326. package/dist/src/orchestrator/prompts.js.map +0 -1
  327. package/dist/src/orchestrator/provider-options-shape.js.map +0 -1
  328. package/dist/src/orchestrator/provider-options-shape.spec.js.map +0 -1
  329. package/dist/src/orchestrator/read-path-budget.js.map +0 -1
  330. package/dist/src/orchestrator/reasoning.js.map +0 -1
  331. package/dist/src/orchestrator/reasoning.test.js.map +0 -1
  332. package/dist/src/orchestrator/repair-tool-call.js.map +0 -1
  333. package/dist/src/orchestrator/repetition-detector.js.map +0 -1
  334. package/dist/src/orchestrator/repetition-detector.test.js.map +0 -1
  335. package/dist/src/orchestrator/retry-classifier.js.map +0 -1
  336. package/dist/src/orchestrator/retry-stream.js.map +0 -1
  337. package/dist/src/orchestrator/sandbox.test.js.map +0 -1
  338. package/dist/src/orchestrator/scope-ceiling.js.map +0 -1
  339. package/dist/src/orchestrator/scope-ceiling.test.js.map +0 -1
  340. package/dist/src/orchestrator/scope-reminder.js.map +0 -1
  341. package/dist/src/orchestrator/scope-reminder.test.js.map +0 -1
  342. package/dist/src/orchestrator/stall-rescue.js.map +0 -1
  343. package/dist/src/orchestrator/stall-rescue.test.js.map +0 -1
  344. package/dist/src/orchestrator/stall-watchdog.js.map +0 -1
  345. package/dist/src/orchestrator/stall-watchdog.test.js.map +0 -1
  346. package/dist/src/orchestrator/stream-runner.js.map +0 -1
  347. package/dist/src/orchestrator/sub-agent-cap.js.map +0 -1
  348. package/dist/src/orchestrator/sub-agent-cap.test.js.map +0 -1
  349. package/dist/src/orchestrator/sub-agent-model-tier.js.map +0 -1
  350. package/dist/src/orchestrator/subagent-compactor.js.map +0 -1
  351. package/dist/src/orchestrator/subagent-compactor.spec.js.map +0 -1
  352. package/dist/src/orchestrator/text-tool-call-detector.js.map +0 -1
  353. package/dist/src/orchestrator/text-tool-call-detector.test.js.map +0 -1
  354. package/dist/src/orchestrator/token-counter.js.map +0 -1
  355. package/dist/src/orchestrator/token-counter.test.js.map +0 -1
  356. package/dist/src/orchestrator/tool-args-hash.js.map +0 -1
  357. package/dist/src/orchestrator/tool-args-hash.test.js.map +0 -1
  358. package/dist/src/orchestrator/tool-args-repair.js.map +0 -1
  359. package/dist/src/orchestrator/tool-args-repair.test.js.map +0 -1
  360. package/dist/src/orchestrator/tool-loop-cap.js.map +0 -1
  361. package/dist/src/orchestrator/tool-loop-cap.test.js.map +0 -1
  362. package/dist/src/orchestrator/tool-repetition-detector.js.map +0 -1
  363. package/dist/src/orchestrator/tool-repetition-detector.test.js.map +0 -1
  364. package/dist/src/orchestrator/tool-utils.js.map +0 -1
  365. package/dist/src/orchestrator/turn-runner-deps.js.map +0 -1
  366. package/dist/src/pil/__tests__/budget.test.js.map +0 -1
  367. package/dist/src/pil/__tests__/clarity-gate.test.js.map +0 -1
  368. package/dist/src/pil/__tests__/config.test.js.map +0 -1
  369. package/dist/src/pil/__tests__/discovery-cache.test.js.map +0 -1
  370. package/dist/src/pil/__tests__/discovery-types.test.js.map +0 -1
  371. package/dist/src/pil/__tests__/discovery.test.js.map +0 -1
  372. package/dist/src/pil/__tests__/dual-run.test.js.map +0 -1
  373. package/dist/src/pil/__tests__/layer1-intent-trace.test.js.map +0 -1
  374. package/dist/src/pil/__tests__/layer1-intent.test.js.map +0 -1
  375. package/dist/src/pil/__tests__/layer15-context-scan.test.js.map +0 -1
  376. package/dist/src/pil/__tests__/layer16-clarity.test.js.map +0 -1
  377. package/dist/src/pil/__tests__/layer17-feasibility.test.js.map +0 -1
  378. package/dist/src/pil/__tests__/layer18-acceptance.test.js.map +0 -1
  379. package/dist/src/pil/__tests__/layer2-personality.test.js.map +0 -1
  380. package/dist/src/pil/__tests__/layer3-ee-injection.test.js.map +0 -1
  381. package/dist/src/pil/__tests__/layer3-injected-chunk.test.js.map +0 -1
  382. package/dist/src/pil/__tests__/layer4-gsd.test.js.map +0 -1
  383. package/dist/src/pil/__tests__/layer5-context.test.js.map +0 -1
  384. package/dist/src/pil/__tests__/layer6-output.test.js.map +0 -1
  385. package/dist/src/pil/__tests__/llm-classify.test.js.map +0 -1
  386. package/dist/src/pil/__tests__/native-capabilities-workbook.test.js.map +0 -1
  387. package/dist/src/pil/__tests__/ollama-classify.test.js.map +0 -1
  388. package/dist/src/pil/__tests__/orchestrator-integration.test.js.map +0 -1
  389. package/dist/src/pil/__tests__/pipeline.test.js.map +0 -1
  390. package/dist/src/pil/__tests__/renderer-coverage.test.js.map +0 -1
  391. package/dist/src/pil/__tests__/response-tools.test.js.map +0 -1
  392. package/dist/src/pil/__tests__/schema.test.js.map +0 -1
  393. package/dist/src/pil/__tests__/scoreComplexity.test.js.map +0 -1
  394. package/dist/src/pil/__tests__/scoreSufficiency.test.js.map +0 -1
  395. package/dist/src/pil/__tests__/store.test.js.map +0 -1
  396. package/dist/src/pil/__tests__/task-tier-map.test.js.map +0 -1
  397. package/dist/src/pil/agent-operating-contract.js.map +0 -1
  398. package/dist/src/pil/agent-operating-contract.test.js.map +0 -1
  399. package/dist/src/pil/budget-log.js.map +0 -1
  400. package/dist/src/pil/budget.js.map +0 -1
  401. package/dist/src/pil/cheap-model-playbook.js.map +0 -1
  402. package/dist/src/pil/cheap-model-playbook.test.js.map +0 -1
  403. package/dist/src/pil/cheap-model-workbooks.js.map +0 -1
  404. package/dist/src/pil/cheap-model-workbooks.test.js.map +0 -1
  405. package/dist/src/pil/clarity-gate.js.map +0 -1
  406. package/dist/src/pil/config.js.map +0 -1
  407. package/dist/src/pil/discovery-cache.js.map +0 -1
  408. package/dist/src/pil/discovery-types.js.map +0 -1
  409. package/dist/src/pil/discovery.js.map +0 -1
  410. package/dist/src/pil/index.js.map +0 -1
  411. package/dist/src/pil/layer1-intent.js.map +0 -1
  412. package/dist/src/pil/layer1-intent.test.js.map +0 -1
  413. package/dist/src/pil/layer15-context-scan.js.map +0 -1
  414. package/dist/src/pil/layer16-clarity.js.map +0 -1
  415. package/dist/src/pil/layer16-clarity.test.js.map +0 -1
  416. package/dist/src/pil/layer17-feasibility.js.map +0 -1
  417. package/dist/src/pil/layer18-acceptance.js.map +0 -1
  418. package/dist/src/pil/layer1_5-complexity-size.js.map +0 -1
  419. package/dist/src/pil/layer1_5-complexity-size.test.js.map +0 -1
  420. package/dist/src/pil/layer2-personality.js.map +0 -1
  421. package/dist/src/pil/layer3-ee-injection.js.map +0 -1
  422. package/dist/src/pil/layer4-gsd.js.map +0 -1
  423. package/dist/src/pil/layer5-context.js.map +0 -1
  424. package/dist/src/pil/layer6-output.js.map +0 -1
  425. package/dist/src/pil/llm-classify.js.map +0 -1
  426. package/dist/src/pil/native-capabilities-workbook.js.map +0 -1
  427. package/dist/src/pil/ollama-classify.js.map +0 -1
  428. package/dist/src/pil/pipeline.js.map +0 -1
  429. package/dist/src/pil/response-tools.js.map +0 -1
  430. package/dist/src/pil/schema.js.map +0 -1
  431. package/dist/src/pil/session-state.js.map +0 -1
  432. package/dist/src/pil/session-state.test.js.map +0 -1
  433. package/dist/src/pil/store.js.map +0 -1
  434. package/dist/src/pil/task-tier-map.js.map +0 -1
  435. package/dist/src/pil/timeout.js.map +0 -1
  436. package/dist/src/pil/types.js.map +0 -1
  437. package/dist/src/product-loop/__tests__/artifact-io.test.js.map +0 -1
  438. package/dist/src/product-loop/__tests__/assumption-ledger.test.js.map +0 -1
  439. package/dist/src/product-loop/__tests__/backlog-builder.test.js.map +0 -1
  440. package/dist/src/product-loop/__tests__/backlog-store.test.js.map +0 -1
  441. package/dist/src/product-loop/__tests__/cb2-retry-bonus.test.js.map +0 -1
  442. package/dist/src/product-loop/__tests__/circuit-breakers-coverage.test.js.map +0 -1
  443. package/dist/src/product-loop/__tests__/circuit-breakers.test.js.map +0 -1
  444. package/dist/src/product-loop/__tests__/complexity-routing.spec.js.map +0 -1
  445. package/dist/src/product-loop/__tests__/context-policy.test.js.map +0 -1
  446. package/dist/src/product-loop/__tests__/cost-preview.test.js.map +0 -1
  447. package/dist/src/product-loop/__tests__/cost-scoper.test.js.map +0 -1
  448. package/dist/src/product-loop/__tests__/cross-run-memory.test.js.map +0 -1
  449. package/dist/src/product-loop/__tests__/design-output.spec.js.map +0 -1
  450. package/dist/src/product-loop/__tests__/discover.test.js.map +0 -1
  451. package/dist/src/product-loop/__tests__/discovery-context-format.test.js.map +0 -1
  452. package/dist/src/product-loop/__tests__/discovery-council-runner.test.js.map +0 -1
  453. package/dist/src/product-loop/__tests__/discovery-detection.test.js.map +0 -1
  454. package/dist/src/product-loop/__tests__/discovery-ecosystem.test.js.map +0 -1
  455. package/dist/src/product-loop/__tests__/discovery-integration.test.js.map +0 -1
  456. package/dist/src/product-loop/__tests__/discovery-interview.test.js.map +0 -1
  457. package/dist/src/product-loop/__tests__/discovery-migrations.test.js.map +0 -1
  458. package/dist/src/product-loop/__tests__/discovery-persistence.test.js.map +0 -1
  459. package/dist/src/product-loop/__tests__/discovery-prompt-parser.test.js.map +0 -1
  460. package/dist/src/product-loop/__tests__/discovery-prompt-specificity.test.js.map +0 -1
  461. package/dist/src/product-loop/__tests__/discovery-recommender-ecosystem.test.js.map +0 -1
  462. package/dist/src/product-loop/__tests__/discovery-recommender.test.js.map +0 -1
  463. package/dist/src/product-loop/__tests__/discovery-schema.test.js.map +0 -1
  464. package/dist/src/product-loop/__tests__/done-gate-coverage.test.js.map +0 -1
  465. package/dist/src/product-loop/__tests__/done-gate.test.js.map +0 -1
  466. package/dist/src/product-loop/__tests__/ee-extract-wiring.test.js.map +0 -1
  467. package/dist/src/product-loop/__tests__/extract-to-ee.test.js.map +0 -1
  468. package/dist/src/product-loop/__tests__/feedback-routing.test.js.map +0 -1
  469. package/dist/src/product-loop/__tests__/gather-selectable-alts.test.js.map +0 -1
  470. package/dist/src/product-loop/__tests__/hot-path.spec.js.map +0 -1
  471. package/dist/src/product-loop/__tests__/integration.test.js.map +0 -1
  472. package/dist/src/product-loop/__tests__/loop-driver-audit.test.js.map +0 -1
  473. package/dist/src/product-loop/__tests__/loop-driver.test.js.map +0 -1
  474. package/dist/src/product-loop/__tests__/maintenance-task-synthesis.test.js.map +0 -1
  475. package/dist/src/product-loop/__tests__/phase-a1-a3-sprint-runner.test.js.map +0 -1
  476. package/dist/src/product-loop/__tests__/phase-a2-backlog-build.test.js.map +0 -1
  477. package/dist/src/product-loop/__tests__/phase-budget.test.js.map +0 -1
  478. package/dist/src/product-loop/__tests__/phase-orchestrator-integration.test.js.map +0 -1
  479. package/dist/src/product-loop/__tests__/phase-plan.test.js.map +0 -1
  480. package/dist/src/product-loop/__tests__/phase-rituals.test.js.map +0 -1
  481. package/dist/src/product-loop/__tests__/phase-runner.test.js.map +0 -1
  482. package/dist/src/product-loop/__tests__/phase-tracker-bridge.test.js.map +0 -1
  483. package/dist/src/product-loop/__tests__/pick-backend-stack.test.js.map +0 -1
  484. package/dist/src/product-loop/__tests__/product-identity.test.js.map +0 -1
  485. package/dist/src/product-loop/__tests__/progress-snapshot.test.js.map +0 -1
  486. package/dist/src/product-loop/__tests__/reality-anchor.test.js.map +0 -1
  487. package/dist/src/product-loop/__tests__/repo-audit.test.js.map +0 -1
  488. package/dist/src/product-loop/__tests__/repo-brief.test.js.map +0 -1
  489. package/dist/src/product-loop/__tests__/role-memory.test.js.map +0 -1
  490. package/dist/src/product-loop/__tests__/role-registry.test.js.map +0 -1
  491. package/dist/src/product-loop/__tests__/role-routing-ee.test.js.map +0 -1
  492. package/dist/src/product-loop/__tests__/route-decision-emit.test.js.map +0 -1
  493. package/dist/src/product-loop/__tests__/seed-questions.test.js.map +0 -1
  494. package/dist/src/product-loop/__tests__/ship-polish.test.js.map +0 -1
  495. package/dist/src/product-loop/__tests__/sprint-planner.test.js.map +0 -1
  496. package/dist/src/product-loop/__tests__/sprint-runner-backlog.test.js.map +0 -1
  497. package/dist/src/product-loop/__tests__/sprint-runner-emit.test.js.map +0 -1
  498. package/dist/src/product-loop/__tests__/sprint-runner-phase-chunks.test.js.map +0 -1
  499. package/dist/src/product-loop/__tests__/sprint-runner.test.js.map +0 -1
  500. package/dist/src/product-loop/__tests__/sprint-self-verify.test.js.map +0 -1
  501. package/dist/src/product-loop/__tests__/sprint-store.test.js.map +0 -1
  502. package/dist/src/product-loop/__tests__/stakeholder-acl.test.js.map +0 -1
  503. package/dist/src/product-loop/__tests__/state-md-ee-injections.test.js.map +0 -1
  504. package/dist/src/product-loop/__tests__/sufficiency-routing.spec.js.map +0 -1
  505. package/dist/src/product-loop/__tests__/typed-artifacts.test.js.map +0 -1
  506. package/dist/src/product-loop/__tests__/types.test.js.map +0 -1
  507. package/dist/src/product-loop/__tests__/verify-failure-threshold.test.js.map +0 -1
  508. package/dist/src/product-loop/__tests__/verify-failure-tracking.test.js.map +0 -1
  509. package/dist/src/product-loop/__tests__/verify-result.test.js.map +0 -1
  510. package/dist/src/product-loop/artifact-io.js.map +0 -1
  511. package/dist/src/product-loop/assumption-ledger.js.map +0 -1
  512. package/dist/src/product-loop/backlog-builder.js.map +0 -1
  513. package/dist/src/product-loop/backlog-store.js.map +0 -1
  514. package/dist/src/product-loop/circuit-breakers.js.map +0 -1
  515. package/dist/src/product-loop/context-policy.js.map +0 -1
  516. package/dist/src/product-loop/cost-preview.js.map +0 -1
  517. package/dist/src/product-loop/cost-scoper.js.map +0 -1
  518. package/dist/src/product-loop/cross-run-memory.js.map +0 -1
  519. package/dist/src/product-loop/design-output.js.map +0 -1
  520. package/dist/src/product-loop/discover.js.map +0 -1
  521. package/dist/src/product-loop/discovery-context-format.js.map +0 -1
  522. package/dist/src/product-loop/discovery-council-runner.js.map +0 -1
  523. package/dist/src/product-loop/discovery-detection.js.map +0 -1
  524. package/dist/src/product-loop/discovery-ecosystem.js.map +0 -1
  525. package/dist/src/product-loop/discovery-interview.js.map +0 -1
  526. package/dist/src/product-loop/discovery-migrations.js.map +0 -1
  527. package/dist/src/product-loop/discovery-persistence.js.map +0 -1
  528. package/dist/src/product-loop/discovery-prompt-parser.js.map +0 -1
  529. package/dist/src/product-loop/discovery-recommender.js.map +0 -1
  530. package/dist/src/product-loop/discovery-schema.js.map +0 -1
  531. package/dist/src/product-loop/done-gate.js.map +0 -1
  532. package/dist/src/product-loop/feedback-routing.js.map +0 -1
  533. package/dist/src/product-loop/gather.js.map +0 -1
  534. package/dist/src/product-loop/index.js.map +0 -1
  535. package/dist/src/product-loop/loop-driver.js.map +0 -1
  536. package/dist/src/product-loop/phase-budget.js.map +0 -1
  537. package/dist/src/product-loop/phase-plan.js.map +0 -1
  538. package/dist/src/product-loop/phase-rituals.js.map +0 -1
  539. package/dist/src/product-loop/phase-runner.js.map +0 -1
  540. package/dist/src/product-loop/phase-tracker-bridge.js.map +0 -1
  541. package/dist/src/product-loop/product-identity.js.map +0 -1
  542. package/dist/src/product-loop/progress-snapshot.js.map +0 -1
  543. package/dist/src/product-loop/reality-anchor.js.map +0 -1
  544. package/dist/src/product-loop/repo-audit.js.map +0 -1
  545. package/dist/src/product-loop/repo-brief.js.map +0 -1
  546. package/dist/src/product-loop/role-memory.js.map +0 -1
  547. package/dist/src/product-loop/role-registry.js.map +0 -1
  548. package/dist/src/product-loop/seed-questions.js.map +0 -1
  549. package/dist/src/product-loop/ship-polish.js.map +0 -1
  550. package/dist/src/product-loop/sprint-planner.js.map +0 -1
  551. package/dist/src/product-loop/sprint-runner.js.map +0 -1
  552. package/dist/src/product-loop/sprint-self-verify.js.map +0 -1
  553. package/dist/src/product-loop/sprint-store.js.map +0 -1
  554. package/dist/src/product-loop/stakeholder-acl.js.map +0 -1
  555. package/dist/src/product-loop/typed-artifacts.js.map +0 -1
  556. package/dist/src/product-loop/types.js.map +0 -1
  557. package/dist/src/product-loop/verify-failure-tracking.js.map +0 -1
  558. package/dist/src/product-loop/verify-result.js.map +0 -1
  559. package/dist/src/providers/__test-utils__/load-fixture.js.map +0 -1
  560. package/dist/src/providers/__tests__/adapter-oauth-wiring.test.js.map +0 -1
  561. package/dist/src/providers/__tests__/capabilities-cosmetic.test.js.map +0 -1
  562. package/dist/src/providers/__tests__/capabilities-flags.test.js.map +0 -1
  563. package/dist/src/providers/__tests__/capabilities-provider-options.test.js.map +0 -1
  564. package/dist/src/providers/__tests__/capabilities-sanitize.test.js.map +0 -1
  565. package/dist/src/providers/__tests__/capabilities.test.js.map +0 -1
  566. package/dist/src/providers/__tests__/provider-coverage.test.js.map +0 -1
  567. package/dist/src/providers/__tests__/reasoning-roundtrip.test.js.map +0 -1
  568. package/dist/src/providers/__tests__/runtime-integration.test.js.map +0 -1
  569. package/dist/src/providers/__tests__/runtime.test.js.map +0 -1
  570. package/dist/src/providers/__tests__/siliconflow-sse-repair.test.js.map +0 -1
  571. package/dist/src/providers/__tests__/strategies-registry.test.js.map +0 -1
  572. package/dist/src/providers/__tests__/strategies-resolve.test.js.map +0 -1
  573. package/dist/src/providers/__tests__/wire-debug.test.js.map +0 -1
  574. package/dist/src/providers/adapter.js.map +0 -1
  575. package/dist/src/providers/adapter.test.js.map +0 -1
  576. package/dist/src/providers/anthropic.js.map +0 -1
  577. package/dist/src/providers/auth/__tests__/browser-flow.test.js.map +0 -1
  578. package/dist/src/providers/auth/__tests__/device-flow.test.js.map +0 -1
  579. package/dist/src/providers/auth/__tests__/gemini-oauth.test.js.map +0 -1
  580. package/dist/src/providers/auth/__tests__/grok-oauth.test.js.map +0 -1
  581. package/dist/src/providers/auth/__tests__/openai-oauth.test.js.map +0 -1
  582. package/dist/src/providers/auth/__tests__/token-store.test.js.map +0 -1
  583. package/dist/src/providers/auth/browser-flow.js.map +0 -1
  584. package/dist/src/providers/auth/device-flow.js.map +0 -1
  585. package/dist/src/providers/auth/gemini-oauth.js.map +0 -1
  586. package/dist/src/providers/auth/grok-oauth.js.map +0 -1
  587. package/dist/src/providers/auth/openai-oauth.js.map +0 -1
  588. package/dist/src/providers/auth/registry.js.map +0 -1
  589. package/dist/src/providers/auth/token-store.js.map +0 -1
  590. package/dist/src/providers/auth/types.js.map +0 -1
  591. package/dist/src/providers/capabilities.js.map +0 -1
  592. package/dist/src/providers/endpoints.js.map +0 -1
  593. package/dist/src/providers/errors.js.map +0 -1
  594. package/dist/src/providers/errors.test.js.map +0 -1
  595. package/dist/src/providers/gemini.js.map +0 -1
  596. package/dist/src/providers/gemini.test.js.map +0 -1
  597. package/dist/src/providers/index.js.map +0 -1
  598. package/dist/src/providers/keychain.js.map +0 -1
  599. package/dist/src/providers/keychain.test.js.map +0 -1
  600. package/dist/src/providers/mcp-vision-bridge.js.map +0 -1
  601. package/dist/src/providers/mcp-vision-bridge.test.js.map +0 -1
  602. package/dist/src/providers/ollama.js.map +0 -1
  603. package/dist/src/providers/ollama.test.js.map +0 -1
  604. package/dist/src/providers/openai-compatible.js.map +0 -1
  605. package/dist/src/providers/openai-compatible.test.js.map +0 -1
  606. package/dist/src/providers/openai.js.map +0 -1
  607. package/dist/src/providers/openai.test.js.map +0 -1
  608. package/dist/src/providers/patch-zod-schema.js.map +0 -1
  609. package/dist/src/providers/pricing.js.map +0 -1
  610. package/dist/src/providers/pricing.test.js.map +0 -1
  611. package/dist/src/providers/prompt-cache-key.spec.js.map +0 -1
  612. package/dist/src/providers/runtime-mock.spec.js.map +0 -1
  613. package/dist/src/providers/runtime.js.map +0 -1
  614. package/dist/src/providers/siliconflow-sse-repair.js.map +0 -1
  615. package/dist/src/providers/strategies/anthropic.strategy.js.map +0 -1
  616. package/dist/src/providers/strategies/base.strategy.js.map +0 -1
  617. package/dist/src/providers/strategies/deepseek.strategy.js.map +0 -1
  618. package/dist/src/providers/strategies/google.strategy.js.map +0 -1
  619. package/dist/src/providers/strategies/ollama.strategy.js.map +0 -1
  620. package/dist/src/providers/strategies/openai.strategy.js.map +0 -1
  621. package/dist/src/providers/strategies/registry.js.map +0 -1
  622. package/dist/src/providers/strategies/siliconflow.strategy.js.map +0 -1
  623. package/dist/src/providers/strategies/xai.strategy.js.map +0 -1
  624. package/dist/src/providers/stream-loop.js.map +0 -1
  625. package/dist/src/providers/types.js.map +0 -1
  626. package/dist/src/providers/vision-proxy.js.map +0 -1
  627. package/dist/src/providers/vision-proxy.test.js.map +0 -1
  628. package/dist/src/providers/wire-debug.js.map +0 -1
  629. package/dist/src/reporter/__tests__/acl-check.test.js.map +0 -1
  630. package/dist/src/reporter/__tests__/auto-fire.test.js.map +0 -1
  631. package/dist/src/reporter/__tests__/budget.test.js.map +0 -1
  632. package/dist/src/reporter/__tests__/handlers.test.js.map +0 -1
  633. package/dist/src/reporter/__tests__/query-router.test.js.map +0 -1
  634. package/dist/src/reporter/acl-check.js.map +0 -1
  635. package/dist/src/reporter/auto-fire.js.map +0 -1
  636. package/dist/src/reporter/budget.js.map +0 -1
  637. package/dist/src/reporter/handlers.js.map +0 -1
  638. package/dist/src/reporter/index.js.map +0 -1
  639. package/dist/src/reporter/query-router.js.map +0 -1
  640. package/dist/src/router/__tests__/step-router.test.js.map +0 -1
  641. package/dist/src/router/classifier/grammars.js.map +0 -1
  642. package/dist/src/router/classifier/index.js.map +0 -1
  643. package/dist/src/router/classifier/index.test.js.map +0 -1
  644. package/dist/src/router/classifier/regex.js.map +0 -1
  645. package/dist/src/router/classifier/regex.test.js.map +0 -1
  646. package/dist/src/router/classifier/tree-sitter.js.map +0 -1
  647. package/dist/src/router/classifier/tree-sitter.test.js.map +0 -1
  648. package/dist/src/router/cold.js.map +0 -1
  649. package/dist/src/router/cold.test.js.map +0 -1
  650. package/dist/src/router/decide.js.map +0 -1
  651. package/dist/src/router/decide.test.js.map +0 -1
  652. package/dist/src/router/health.js.map +0 -1
  653. package/dist/src/router/health.test.js.map +0 -1
  654. package/dist/src/router/provider-sentinel.js.map +0 -1
  655. package/dist/src/router/provider-sentinel.test.js.map +0 -1
  656. package/dist/src/router/role-override.test.js.map +0 -1
  657. package/dist/src/router/step-router.js.map +0 -1
  658. package/dist/src/router/store.js.map +0 -1
  659. package/dist/src/router/types.js.map +0 -1
  660. package/dist/src/router/warm.js.map +0 -1
  661. package/dist/src/router/warm.test.js.map +0 -1
  662. package/dist/src/scaffold/__tests__/continuation-prompt.test.js.map +0 -1
  663. package/dist/src/scaffold/__tests__/continue-as-council.spec.js.map +0 -1
  664. package/dist/src/scaffold/__tests__/dotnet-assembly-name.test.js.map +0 -1
  665. package/dist/src/scaffold/__tests__/fe-scaffold-contents.test.js.map +0 -1
  666. package/dist/src/scaffold/__tests__/init-new.smoke.spec.js.map +0 -1
  667. package/dist/src/scaffold/__tests__/init-new.spec.js.map +0 -1
  668. package/dist/src/scaffold/__tests__/install-bb-templates.spec.js.map +0 -1
  669. package/dist/src/scaffold/__tests__/point-to-existing.spec.js.map +0 -1
  670. package/dist/src/scaffold/bb-ecosystem-apply.js.map +0 -1
  671. package/dist/src/scaffold/bb-quality-gate.js.map +0 -1
  672. package/dist/src/scaffold/continuation-prompt.js.map +0 -1
  673. package/dist/src/scaffold/continue-as-council.js.map +0 -1
  674. package/dist/src/scaffold/init-new.js.map +0 -1
  675. package/dist/src/scaffold/point-to-existing.js.map +0 -1
  676. package/dist/src/scaffold/resume-from-gate-failures.js.map +0 -1
  677. package/dist/src/self-qa/__tests__/agentic-context.test.js.map +0 -1
  678. package/dist/src/self-qa/__tests__/agentic-loop.test.js.map +0 -1
  679. package/dist/src/self-qa/__tests__/delta-encoder.test.js.map +0 -1
  680. package/dist/src/self-qa/__tests__/judge.test.js.map +0 -1
  681. package/dist/src/self-qa/__tests__/scenario-planner.test.js.map +0 -1
  682. package/dist/src/self-qa/__tests__/spec-emitter.test.js.map +0 -1
  683. package/dist/src/self-qa/agentic-context.js.map +0 -1
  684. package/dist/src/self-qa/agentic-loop.js.map +0 -1
  685. package/dist/src/self-qa/delta-encoder.js.map +0 -1
  686. package/dist/src/self-qa/index.js.map +0 -1
  687. package/dist/src/self-qa/judge.js.map +0 -1
  688. package/dist/src/self-qa/orchestrator.js.map +0 -1
  689. package/dist/src/self-qa/scenario-planner.js.map +0 -1
  690. package/dist/src/self-qa/spec-emitter.js.map +0 -1
  691. package/dist/src/self-qa/types.js.map +0 -1
  692. package/dist/src/storage/__tests__/migrations.test.js.map +0 -1
  693. package/dist/src/storage/__tests__/sweep-stale-pending.test.js.map +0 -1
  694. package/dist/src/storage/__tests__/ui-interaction-log.test.js.map +0 -1
  695. package/dist/src/storage/atomic-io.js.map +0 -1
  696. package/dist/src/storage/atomic-io.test.js.map +0 -1
  697. package/dist/src/storage/config.js.map +0 -1
  698. package/dist/src/storage/config.test.js.map +0 -1
  699. package/dist/src/storage/db.js.map +0 -1
  700. package/dist/src/storage/index.js.map +0 -1
  701. package/dist/src/storage/interaction-log.js.map +0 -1
  702. package/dist/src/storage/migrations.js.map +0 -1
  703. package/dist/src/storage/session-dir.js.map +0 -1
  704. package/dist/src/storage/sessions.js.map +0 -1
  705. package/dist/src/storage/tool-results.js.map +0 -1
  706. package/dist/src/storage/transcript-response-entry.test.js.map +0 -1
  707. package/dist/src/storage/transcript-view.js.map +0 -1
  708. package/dist/src/storage/transcript.js.map +0 -1
  709. package/dist/src/storage/transcript.test.js.map +0 -1
  710. package/dist/src/storage/ui-interaction-log.js.map +0 -1
  711. package/dist/src/storage/usage-cap.js.map +0 -1
  712. package/dist/src/storage/usage-cap.test.js.map +0 -1
  713. package/dist/src/storage/usage.js.map +0 -1
  714. package/dist/src/storage/workspaces.js.map +0 -1
  715. package/dist/src/tools/__tests__/vision-gate.test.js.map +0 -1
  716. package/dist/src/tools/bash-output-cache.js.map +0 -1
  717. package/dist/src/tools/bash-output-cache.test.js.map +0 -1
  718. package/dist/src/tools/bash-output-integration.test.js.map +0 -1
  719. package/dist/src/tools/bash.js.map +0 -1
  720. package/dist/src/tools/bash.test.js.map +0 -1
  721. package/dist/src/tools/computer.js.map +0 -1
  722. package/dist/src/tools/computer.test.js.map +0 -1
  723. package/dist/src/tools/file-tracker.js.map +0 -1
  724. package/dist/src/tools/file-tracker.test.js.map +0 -1
  725. package/dist/src/tools/file.js.map +0 -1
  726. package/dist/src/tools/file.test.js.map +0 -1
  727. package/dist/src/tools/grep.js.map +0 -1
  728. package/dist/src/tools/registry-bash-empty-command.test.js.map +0 -1
  729. package/dist/src/tools/registry-bash-footer.test.js.map +0 -1
  730. package/dist/src/tools/registry-ee-query.test.js.map +0 -1
  731. package/dist/src/tools/registry-session-repeat.test.js.map +0 -1
  732. package/dist/src/tools/registry.js.map +0 -1
  733. package/dist/src/tools/registry.test.js.map +0 -1
  734. package/dist/src/tools/schedule.js.map +0 -1
  735. package/dist/src/tools/schedule.test.js.map +0 -1
  736. package/dist/src/tools/todo-write-snapshot.js.map +0 -1
  737. package/dist/src/tools/todo-write-snapshot.test.js.map +0 -1
  738. package/dist/src/tools/vision-gate.js.map +0 -1
  739. package/dist/src/types/index.js.map +0 -1
  740. package/dist/src/ui/__tests__/picker-providers.test.js.map +0 -1
  741. package/dist/src/ui/agents-modal.js.map +0 -1
  742. package/dist/src/ui/app.js.map +0 -1
  743. package/dist/src/ui/cards/__tests__/product-status-card.test.js.map +0 -1
  744. package/dist/src/ui/cards/product-status-card.js.map +0 -1
  745. package/dist/src/ui/components/SuggestionOverlay.js.map +0 -1
  746. package/dist/src/ui/components/Toast.js.map +0 -1
  747. package/dist/src/ui/components/__tests__/council-leader-bubble.test.js.map +0 -1
  748. package/dist/src/ui/components/__tests__/council-message-bubble.test.js.map +0 -1
  749. package/dist/src/ui/components/__tests__/council-phase-timeline.test.js.map +0 -1
  750. package/dist/src/ui/components/__tests__/council-placeholder-bubble.test.js.map +0 -1
  751. package/dist/src/ui/components/__tests__/council-question-card.test.js.map +0 -1
  752. package/dist/src/ui/components/__tests__/council-synthesis-banner.test.js.map +0 -1
  753. package/dist/src/ui/components/__tests__/task-list-panel.test.js.map +0 -1
  754. package/dist/src/ui/components/__tests__/use-pair-quote-buffer.test.js.map +0 -1
  755. package/dist/src/ui/components/btw-overlay.js.map +0 -1
  756. package/dist/src/ui/components/bubble-layout.js.map +0 -1
  757. package/dist/src/ui/components/code-block-truncate.js.map +0 -1
  758. package/dist/src/ui/components/copy-flash-banner.js.map +0 -1
  759. package/dist/src/ui/components/council-info-card.js.map +0 -1
  760. package/dist/src/ui/components/council-leader-bubble.js.map +0 -1
  761. package/dist/src/ui/components/council-message-bubble.js.map +0 -1
  762. package/dist/src/ui/components/council-phase-timeline.js.map +0 -1
  763. package/dist/src/ui/components/council-placeholder-bubble.js.map +0 -1
  764. package/dist/src/ui/components/council-question-card.js.map +0 -1
  765. package/dist/src/ui/components/council-status-list.js.map +0 -1
  766. package/dist/src/ui/components/council-synthesis-banner.js.map +0 -1
  767. package/dist/src/ui/components/diff-view.js.map +0 -1
  768. package/dist/src/ui/components/halt-recovery-card.js.map +0 -1
  769. package/dist/src/ui/components/hero-logo.js.map +0 -1
  770. package/dist/src/ui/components/init-new-form-card.js.map +0 -1
  771. package/dist/src/ui/components/lsp-views.js.map +0 -1
  772. package/dist/src/ui/components/media-views.js.map +0 -1
  773. package/dist/src/ui/components/message-view.js.map +0 -1
  774. package/dist/src/ui/components/point-to-existing-form-card.js.map +0 -1
  775. package/dist/src/ui/components/prompt-box.js.map +0 -1
  776. package/dist/src/ui/components/role-palette.js.map +0 -1
  777. package/dist/src/ui/components/session-header.js.map +0 -1
  778. package/dist/src/ui/components/slash-inline-menu.js.map +0 -1
  779. package/dist/src/ui/components/structured-response-view.js.map +0 -1
  780. package/dist/src/ui/components/task-list-panel.js.map +0 -1
  781. package/dist/src/ui/components/tool-group.js.map +0 -1
  782. package/dist/src/ui/components/tool-result-views.js.map +0 -1
  783. package/dist/src/ui/components/use-pair-quote-buffer.js.map +0 -1
  784. package/dist/src/ui/constants.js.map +0 -1
  785. package/dist/src/ui/hooks/use-agent-editor.js.map +0 -1
  786. package/dist/src/ui/hooks/use-mcp-editor.js.map +0 -1
  787. package/dist/src/ui/hooks/use-model-picker.js.map +0 -1
  788. package/dist/src/ui/hooks/useTypeahead.js.map +0 -1
  789. package/dist/src/ui/markdown.js.map +0 -1
  790. package/dist/src/ui/mcp-modal-types.js.map +0 -1
  791. package/dist/src/ui/mcp-modal.js.map +0 -1
  792. package/dist/src/ui/modals/api-key-modal.js.map +0 -1
  793. package/dist/src/ui/modals/connect-modal.js.map +0 -1
  794. package/dist/src/ui/modals/model-picker-modal.js.map +0 -1
  795. package/dist/src/ui/modals/sandbox-picker-modal.js.map +0 -1
  796. package/dist/src/ui/modals/update-modal.js.map +0 -1
  797. package/dist/src/ui/modals/wallet-picker-modal.js.map +0 -1
  798. package/dist/src/ui/picker-providers.js.map +0 -1
  799. package/dist/src/ui/plan.js.map +0 -1
  800. package/dist/src/ui/schedule-modal.js.map +0 -1
  801. package/dist/src/ui/slash/__tests__/clear.test.js.map +0 -1
  802. package/dist/src/ui/slash/__tests__/compact.test.js.map +0 -1
  803. package/dist/src/ui/slash/__tests__/cost.test.js.map +0 -1
  804. package/dist/src/ui/slash/__tests__/discuss.test.js.map +0 -1
  805. package/dist/src/ui/slash/__tests__/execute.test.js.map +0 -1
  806. package/dist/src/ui/slash/__tests__/expand.test.js.map +0 -1
  807. package/dist/src/ui/slash/__tests__/ideal.test.js.map +0 -1
  808. package/dist/src/ui/slash/__tests__/menu-parity.test.js.map +0 -1
  809. package/dist/src/ui/slash/__tests__/optimize.test.js.map +0 -1
  810. package/dist/src/ui/slash/__tests__/pin.test.js.map +0 -1
  811. package/dist/src/ui/slash/__tests__/plan.test.js.map +0 -1
  812. package/dist/src/ui/slash/__tests__/status-render.test.js.map +0 -1
  813. package/dist/src/ui/slash/clear.js.map +0 -1
  814. package/dist/src/ui/slash/compact.js.map +0 -1
  815. package/dist/src/ui/slash/cost.js.map +0 -1
  816. package/dist/src/ui/slash/council-inspect.js.map +0 -1
  817. package/dist/src/ui/slash/council.js.map +0 -1
  818. package/dist/src/ui/slash/debug.js.map +0 -1
  819. package/dist/src/ui/slash/discuss.js.map +0 -1
  820. package/dist/src/ui/slash/ee.js.map +0 -1
  821. package/dist/src/ui/slash/execute.js.map +0 -1
  822. package/dist/src/ui/slash/expand.js.map +0 -1
  823. package/dist/src/ui/slash/export.js.map +0 -1
  824. package/dist/src/ui/slash/ideal.js.map +0 -1
  825. package/dist/src/ui/slash/menu-items.js.map +0 -1
  826. package/dist/src/ui/slash/optimize.js.map +0 -1
  827. package/dist/src/ui/slash/pin.js.map +0 -1
  828. package/dist/src/ui/slash/plan.js.map +0 -1
  829. package/dist/src/ui/slash/registry.js.map +0 -1
  830. package/dist/src/ui/slash/route.js.map +0 -1
  831. package/dist/src/ui/slash/route.test.js.map +0 -1
  832. package/dist/src/ui/slash/status.js.map +0 -1
  833. package/dist/src/ui/state/active-run.js.map +0 -1
  834. package/dist/src/ui/status-bar/index.js.map +0 -1
  835. package/dist/src/ui/status-bar/index.test.js.map +0 -1
  836. package/dist/src/ui/status-bar/store.js.map +0 -1
  837. package/dist/src/ui/status-bar/store.test.js.map +0 -1
  838. package/dist/src/ui/status-bar/tier-badge.js.map +0 -1
  839. package/dist/src/ui/status-bar/tier-badge.test.js.map +0 -1
  840. package/dist/src/ui/status-bar/usd-meter.js.map +0 -1
  841. package/dist/src/ui/status-bar/usd-meter.test.js.map +0 -1
  842. package/dist/src/ui/syntax-highlight.js.map +0 -1
  843. package/dist/src/ui/terminal-selection-text.js.map +0 -1
  844. package/dist/src/ui/theme.js.map +0 -1
  845. package/dist/src/ui/types.js.map +0 -1
  846. package/dist/src/ui/utils/__tests__/format.test.js.map +0 -1
  847. package/dist/src/ui/utils/__tests__/tools.test.js.map +0 -1
  848. package/dist/src/ui/utils/color.js.map +0 -1
  849. package/dist/src/ui/utils/format.js.map +0 -1
  850. package/dist/src/ui/utils/modal.js.map +0 -1
  851. package/dist/src/ui/utils/text.js.map +0 -1
  852. package/dist/src/ui/utils/tools.js.map +0 -1
  853. package/dist/src/usage/__tests__/product-ledger.test.js.map +0 -1
  854. package/dist/src/usage/cost-log.js.map +0 -1
  855. package/dist/src/usage/decision-log.js.map +0 -1
  856. package/dist/src/usage/downgrade.js.map +0 -1
  857. package/dist/src/usage/downgrade.test.js.map +0 -1
  858. package/dist/src/usage/estimator.js.map +0 -1
  859. package/dist/src/usage/estimator.test.js.map +0 -1
  860. package/dist/src/usage/ledger.js.map +0 -1
  861. package/dist/src/usage/ledger.test.js.map +0 -1
  862. package/dist/src/usage/midstream.js.map +0 -1
  863. package/dist/src/usage/midstream.test.js.map +0 -1
  864. package/dist/src/usage/product-ledger.js.map +0 -1
  865. package/dist/src/usage/thresholds.js.map +0 -1
  866. package/dist/src/usage/thresholds.test.js.map +0 -1
  867. package/dist/src/usage/types.js.map +0 -1
  868. package/dist/src/utils/__tests__/auto-council-settings.test.js.map +0 -1
  869. package/dist/src/utils/__tests__/ee-logger.test.js.map +0 -1
  870. package/dist/src/utils/__tests__/file-lock.test.js.map +0 -1
  871. package/dist/src/utils/__tests__/llm-deadline.test.js.map +0 -1
  872. package/dist/src/utils/__tests__/rate-limit.test.js.map +0 -1
  873. package/dist/src/utils/__tests__/settings-disabled-models.test.js.map +0 -1
  874. package/dist/src/utils/__tests__/settings-web-research.test.js.map +0 -1
  875. package/dist/src/utils/__tests__/slugify.test.js.map +0 -1
  876. package/dist/src/utils/__tests__/visible-retry.test.js.map +0 -1
  877. package/dist/src/utils/at-mentions.js.map +0 -1
  878. package/dist/src/utils/clipboard-image.js.map +0 -1
  879. package/dist/src/utils/ee-logger.js.map +0 -1
  880. package/dist/src/utils/file-index.js.map +0 -1
  881. package/dist/src/utils/file-lock.js.map +0 -1
  882. package/dist/src/utils/git-root.js.map +0 -1
  883. package/dist/src/utils/host-clipboard.js.map +0 -1
  884. package/dist/src/utils/install-manager.js.map +0 -1
  885. package/dist/src/utils/install-manager.test.js.map +0 -1
  886. package/dist/src/utils/instructions.js.map +0 -1
  887. package/dist/src/utils/instructions.test.js.map +0 -1
  888. package/dist/src/utils/llm-deadline.js.map +0 -1
  889. package/dist/src/utils/permission-mode.js.map +0 -1
  890. package/dist/src/utils/permission-mode.test.js.map +0 -1
  891. package/dist/src/utils/rate-limit.js.map +0 -1
  892. package/dist/src/utils/redactor.js.map +0 -1
  893. package/dist/src/utils/redactor.test.js.map +0 -1
  894. package/dist/src/utils/settings.js.map +0 -1
  895. package/dist/src/utils/settings.test.js.map +0 -1
  896. package/dist/src/utils/shell.js.map +0 -1
  897. package/dist/src/utils/shell.test.js.map +0 -1
  898. package/dist/src/utils/side-question.js.map +0 -1
  899. package/dist/src/utils/skills.js.map +0 -1
  900. package/dist/src/utils/skills.test.js.map +0 -1
  901. package/dist/src/utils/slugify.js.map +0 -1
  902. package/dist/src/utils/subagent-display.js.map +0 -1
  903. package/dist/src/utils/subagent-display.test.js.map +0 -1
  904. package/dist/src/utils/subagents-settings.test.js.map +0 -1
  905. package/dist/src/utils/telegram-audio-settings.test.js.map +0 -1
  906. package/dist/src/utils/update-checker.js.map +0 -1
  907. package/dist/src/utils/update-checker.test.js.map +0 -1
  908. package/dist/src/utils/visible-retry.js.map +0 -1
  909. package/dist/src/verify/__tests__/coverage-parsers.test.js.map +0 -1
  910. package/dist/src/verify/__tests__/dotnet-recipe.test.js.map +0 -1
  911. package/dist/src/verify/checkpoint.js.map +0 -1
  912. package/dist/src/verify/checkpoint.test.js.map +0 -1
  913. package/dist/src/verify/coverage-parsers.js.map +0 -1
  914. package/dist/src/verify/entrypoint.js.map +0 -1
  915. package/dist/src/verify/entrypoint.test.js.map +0 -1
  916. package/dist/src/verify/environment.js.map +0 -1
  917. package/dist/src/verify/environment.test.js.map +0 -1
  918. package/dist/src/verify/evidence.js.map +0 -1
  919. package/dist/src/verify/orchestrator.js.map +0 -1
  920. package/dist/src/verify/orchestrator.test.js.map +0 -1
  921. package/dist/src/verify/recipes.js.map +0 -1
  922. package/dist/src/verify/retry.js.map +0 -1
  923. package/dist/src/verify/runtime-prep.test.js.map +0 -1
  924. package/src/__test-helpers__/catalog-fixtures.ts +0 -57
  925. package/src/__test-stubs__/ee-server.ts +0 -173
  926. package/src/__test-stubs__/vitest-setup.ts +0 -36
  927. package/src/__tests__/council/bubble-layout.test.ts +0 -45
  928. package/src/__tests__/council/code-block-truncate.test.ts +0 -50
  929. package/src/__tests__/council/role-palette.test.ts +0 -66
  930. package/src/__tests__/first-run-wizard.test.ts +0 -9
  931. package/src/agent-harness/__tests__/cli-flags.spec.ts +0 -35
  932. package/src/agent-harness/__tests__/driver.spec.ts +0 -154
  933. package/src/agent-harness/__tests__/idle.spec.ts +0 -90
  934. package/src/agent-harness/__tests__/mock-llm.spec.ts +0 -126
  935. package/src/agent-harness/__tests__/mock-model.spec.ts +0 -195
  936. package/src/agent-harness/__tests__/predicate.spec.ts +0 -33
  937. package/src/agent-harness/__tests__/protocol.spec.ts +0 -62
  938. package/src/agent-harness/__tests__/schema.spec.ts +0 -81
  939. package/src/agent-harness/__tests__/selector.spec.ts +0 -82
  940. package/src/agent-harness/__tests__/sidechannel.spec.ts +0 -40
  941. package/src/agent-harness/__tests__/spec-helpers.spec.ts +0 -76
  942. package/src/agent-harness/index.ts +0 -24
  943. package/src/agent-harness/mock-model.ts +0 -445
  944. package/src/agent-harness/test-spawn.ts +0 -221
  945. package/src/billing/index.ts +0 -5
  946. package/src/bun-sqlite.d.ts +0 -15
  947. package/src/chat/__tests__/broadcast-bus.test.ts +0 -90
  948. package/src/chat/__tests__/channel-manager.test.ts +0 -149
  949. package/src/chat/__tests__/client.test.ts +0 -118
  950. package/src/chat/__tests__/discord-integration.test.ts +0 -162
  951. package/src/chat/__tests__/intent-prompt.test.ts +0 -92
  952. package/src/chat/__tests__/verdict-resolver.test.ts +0 -336
  953. package/src/chat/broadcast-bus.ts +0 -53
  954. package/src/chat/channel-manager.ts +0 -146
  955. package/src/chat/chat-keychain.ts +0 -137
  956. package/src/chat/factory.ts +0 -37
  957. package/src/chat/intent-prompt.ts +0 -72
  958. package/src/chat/providers/discord/client.ts +0 -91
  959. package/src/chat/types.ts +0 -42
  960. package/src/chat/verdict-constants.ts +0 -26
  961. package/src/chat/verdict-resolver.ts +0 -231
  962. package/src/cli/__tests__/bw-vault.test.ts +0 -97
  963. package/src/cli/__tests__/keys-bundle.test.ts +0 -46
  964. package/src/cli/__tests__/share-cmd.test.ts +0 -197
  965. package/src/cli/bw-vault.ts +0 -184
  966. package/src/cli/config/__tests__/model-picker.test.ts +0 -59
  967. package/src/cli/config/__tests__/provider-fetch.test.ts +0 -38
  968. package/src/cli/config/index.ts +0 -112
  969. package/src/cli/config/model-picker.ts +0 -193
  970. package/src/cli/config/provider-fetch.ts +0 -75
  971. package/src/cli/config/screen-council.ts +0 -245
  972. package/src/cli/config/screen-models.ts +0 -104
  973. package/src/cli/config/screen-providers.ts +0 -197
  974. package/src/cli/config/tui.ts +0 -153
  975. package/src/cli/cost-forensics.test.ts +0 -273
  976. package/src/cli/cost-forensics.ts +0 -337
  977. package/src/cli/keys-bundle.ts +0 -91
  978. package/src/cli/keys.test.ts +0 -104
  979. package/src/cli/keys.ts +0 -816
  980. package/src/cli/pil-report.ts +0 -202
  981. package/src/cli/reporter-cmd.ts +0 -154
  982. package/src/cli/share-cmd.ts +0 -132
  983. package/src/cli/usage-report.ts +0 -398
  984. package/src/cloud/index.ts +0 -5
  985. package/src/council/__tests__/accounting.test.ts +0 -72
  986. package/src/council/__tests__/audit-replay.test.ts +0 -344
  987. package/src/council/__tests__/clarifier-max-rounds.test.ts +0 -90
  988. package/src/council/__tests__/clarifier-options.test.ts +0 -63
  989. package/src/council/__tests__/clarifier-ready-gate.test.ts +0 -268
  990. package/src/council/__tests__/cost-aware.test.ts +0 -60
  991. package/src/council/__tests__/debate-planner-structured.test.ts +0 -236
  992. package/src/council/__tests__/decisions-lock.test.ts +0 -404
  993. package/src/council/__tests__/evaluator-metrics.test.ts +0 -513
  994. package/src/council/__tests__/parse-outcome-fallback.test.ts +0 -125
  995. package/src/council/__tests__/research-tools.test.ts +0 -239
  996. package/src/council/__tests__/round-tools.test.ts +0 -334
  997. package/src/council/__tests__/tool-trace.test.ts +0 -152
  998. package/src/council/__tests__/types-contract.test.ts +0 -88
  999. package/src/council/clarifier.ts +0 -507
  1000. package/src/council/context.ts +0 -249
  1001. package/src/council/debate-planner.ts +0 -303
  1002. package/src/council/debate.ts +0 -1179
  1003. package/src/council/decisions-lock.ts +0 -312
  1004. package/src/council/executor.ts +0 -27
  1005. package/src/council/index.ts +0 -956
  1006. package/src/council/leader.ts +0 -281
  1007. package/src/council/llm.ts +0 -939
  1008. package/src/council/phase-events.ts +0 -64
  1009. package/src/council/planner.ts +0 -303
  1010. package/src/council/preflight.ts +0 -86
  1011. package/src/council/prompts.ts +0 -698
  1012. package/src/council/types.ts +0 -304
  1013. package/src/daemon/scheduler.test.ts +0 -128
  1014. package/src/daemon/scheduler.ts +0 -152
  1015. package/src/ee/.gitkeep +0 -0
  1016. package/src/ee/__tests__/bb-design.test.ts +0 -223
  1017. package/src/ee/__tests__/export-transcripts.test.ts +0 -222
  1018. package/src/ee/__tests__/pil-context-bridge.test.ts +0 -59
  1019. package/src/ee/__tests__/pipeline.integration.test.ts +0 -193
  1020. package/src/ee/__tests__/recall-format.test.ts +0 -66
  1021. package/src/ee/__tests__/recall-ledger.test.ts +0 -55
  1022. package/src/ee/__tests__/render-sink-wiring.test.ts +0 -89
  1023. package/src/ee/auth.test.ts +0 -76
  1024. package/src/ee/auth.ts +0 -80
  1025. package/src/ee/bb-design.ts +0 -284
  1026. package/src/ee/bb-retrieval.ts +0 -467
  1027. package/src/ee/bridge.test.ts +0 -283
  1028. package/src/ee/bridge.ts +0 -443
  1029. package/src/ee/client-mode.ts +0 -161
  1030. package/src/ee/client.test.ts +0 -201
  1031. package/src/ee/client.ts +0 -683
  1032. package/src/ee/council-bridge.ts +0 -89
  1033. package/src/ee/embedding-cache.ts +0 -42
  1034. package/src/ee/export-transcripts.ts +0 -160
  1035. package/src/ee/extract-session.test.ts +0 -231
  1036. package/src/ee/extract-session.ts +0 -71
  1037. package/src/ee/health.ts +0 -83
  1038. package/src/ee/index.ts +0 -33
  1039. package/src/ee/intercept.test.ts +0 -197
  1040. package/src/ee/intercept.ts +0 -168
  1041. package/src/ee/judge.test.ts +0 -213
  1042. package/src/ee/judge.ts +0 -126
  1043. package/src/ee/mistake-detector.test.ts +0 -252
  1044. package/src/ee/mistake-detector.ts +0 -297
  1045. package/src/ee/offline-queue.test.ts +0 -302
  1046. package/src/ee/offline-queue.ts +0 -205
  1047. package/src/ee/phase-outcome.test.ts +0 -107
  1048. package/src/ee/phase-outcome.ts +0 -165
  1049. package/src/ee/phase-tracker.test.ts +0 -175
  1050. package/src/ee/phase-tracker.ts +0 -180
  1051. package/src/ee/posttool.test.ts +0 -81
  1052. package/src/ee/posttool.ts +0 -16
  1053. package/src/ee/prompt-stale.test.ts +0 -92
  1054. package/src/ee/prompt-stale.ts +0 -39
  1055. package/src/ee/recall-ledger.ts +0 -71
  1056. package/src/ee/recall-mirror.test.ts +0 -74
  1057. package/src/ee/render.test.ts +0 -74
  1058. package/src/ee/render.ts +0 -68
  1059. package/src/ee/scope.test.ts +0 -112
  1060. package/src/ee/scope.ts +0 -93
  1061. package/src/ee/search.ts +0 -259
  1062. package/src/ee/session-trajectory.test.ts +0 -139
  1063. package/src/ee/session-trajectory.ts +0 -226
  1064. package/src/ee/tenant.ts +0 -14
  1065. package/src/ee/touch.test.ts +0 -73
  1066. package/src/ee/transcript-emit.ts +0 -174
  1067. package/src/ee/types.ts +0 -432
  1068. package/src/flow/.gitkeep +0 -0
  1069. package/src/flow/__tests__/migration.test.ts +0 -133
  1070. package/src/flow/__tests__/parser.test.ts +0 -77
  1071. package/src/flow/__tests__/run-manager-product.test.ts +0 -59
  1072. package/src/flow/__tests__/run-manager.test.ts +0 -95
  1073. package/src/flow/__tests__/scaffold-checkpoint.test.ts +0 -113
  1074. package/src/flow/__tests__/scaffold.test.ts +0 -57
  1075. package/src/flow/__tests__/warning-persist.test.ts +0 -112
  1076. package/src/flow/artifact-io.ts +0 -41
  1077. package/src/flow/compaction/__tests__/compress.test.ts +0 -69
  1078. package/src/flow/compaction/__tests__/extract.test.ts +0 -74
  1079. package/src/flow/compaction/__tests__/preserve.test.ts +0 -69
  1080. package/src/flow/compaction/compress.ts +0 -67
  1081. package/src/flow/compaction/extract.ts +0 -60
  1082. package/src/flow/compaction/index.ts +0 -86
  1083. package/src/flow/compaction/preserve.ts +0 -48
  1084. package/src/flow/index.ts +0 -18
  1085. package/src/flow/migration.ts +0 -139
  1086. package/src/flow/parser.ts +0 -78
  1087. package/src/flow/run-manager.ts +0 -162
  1088. package/src/flow/scaffold-checkpoint.ts +0 -132
  1089. package/src/flow/scaffold.ts +0 -52
  1090. package/src/flow/warning-persist.ts +0 -84
  1091. package/src/generated/version.ts +0 -5
  1092. package/src/gsd/.gitkeep +0 -0
  1093. package/src/gsd/__tests__/complexity.test.ts +0 -0
  1094. package/src/gsd/__tests__/directives.test.ts +0 -88
  1095. package/src/gsd/__tests__/gray-areas.test.ts +0 -33
  1096. package/src/gsd/__tests__/types.test.ts +0 -91
  1097. package/src/gsd/complexity.ts +0 -124
  1098. package/src/gsd/directives.ts +0 -141
  1099. package/src/gsd/gray-areas.ts +0 -144
  1100. package/src/gsd/index.ts +0 -1
  1101. package/src/gsd/types.ts +0 -63
  1102. package/src/headless/__tests__/council-answers.test.ts +0 -300
  1103. package/src/headless/council-answers.ts +0 -152
  1104. package/src/headless/output.test.ts +0 -201
  1105. package/src/headless/output.ts +0 -312
  1106. package/src/hooks/config.ts +0 -41
  1107. package/src/hooks/index.ts +0 -569
  1108. package/src/hooks/types.ts +0 -263
  1109. package/src/index.ts +0 -1762
  1110. package/src/lsp/builtins.test.ts +0 -129
  1111. package/src/lsp/builtins.ts +0 -453
  1112. package/src/lsp/client.ts +0 -342
  1113. package/src/lsp/manager.test.ts +0 -198
  1114. package/src/lsp/manager.ts +0 -343
  1115. package/src/lsp/npm-cache.test.ts +0 -70
  1116. package/src/lsp/npm-cache.ts +0 -111
  1117. package/src/lsp/runtime.ts +0 -70
  1118. package/src/lsp/smoke.test.ts +0 -74
  1119. package/src/lsp/types.ts +0 -119
  1120. package/src/maintain/__tests__/codebase-intel.test.ts +0 -320
  1121. package/src/maintain/__tests__/gh-create-pr.test.ts +0 -195
  1122. package/src/maintain/__tests__/pr-builder.test.ts +0 -282
  1123. package/src/maintain/__tests__/repo-map.test.ts +0 -128
  1124. package/src/maintain/__tests__/task-runner.test.ts +0 -347
  1125. package/src/maintain/codebase-intel.ts +0 -595
  1126. package/src/maintain/gh-create-pr.ts +0 -148
  1127. package/src/maintain/index.ts +0 -14
  1128. package/src/maintain/pr-builder.ts +0 -373
  1129. package/src/maintain/repo-map.ts +0 -205
  1130. package/src/maintain/task-runner.ts +0 -481
  1131. package/src/maintain/types.ts +0 -49
  1132. package/src/mcp/__tests__/auto-setup.test.ts +0 -88
  1133. package/src/mcp/__tests__/cap-tool-result.test.ts +0 -65
  1134. package/src/mcp/__tests__/ee-tools.test.ts +0 -248
  1135. package/src/mcp/__tests__/forensics-tools.test.ts +0 -66
  1136. package/src/mcp/__tests__/harness-driver-action-tools.spec.ts +0 -116
  1137. package/src/mcp/__tests__/harness-driver-async-tools.spec.ts +0 -129
  1138. package/src/mcp/__tests__/harness-driver-read-tools.spec.ts +0 -140
  1139. package/src/mcp/__tests__/harness-driver-security.spec.ts +0 -69
  1140. package/src/mcp/__tests__/harness-driver.spec.ts +0 -21
  1141. package/src/mcp/__tests__/lazy-schema.spec.ts +0 -173
  1142. package/src/mcp/__tests__/lsp-tools.test.ts +0 -72
  1143. package/src/mcp/__tests__/mcp-keychain.test.ts +0 -46
  1144. package/src/mcp/__tests__/research-onboarding.test.ts +0 -163
  1145. package/src/mcp/__tests__/runtime-hydration.test.ts +0 -86
  1146. package/src/mcp/__tests__/runtime-output-cap.test.ts +0 -49
  1147. package/src/mcp/__tests__/runtime-sanitize.test.ts +0 -44
  1148. package/src/mcp/__tests__/self-verify-jobs.test.ts +0 -102
  1149. package/src/mcp/__tests__/smart-filter.test.ts +0 -139
  1150. package/src/mcp/__tests__/tools-server.smoke.test.ts +0 -41
  1151. package/src/mcp/auto-setup.ts +0 -99
  1152. package/src/mcp/cap-tool-result.ts +0 -68
  1153. package/src/mcp/catalog.ts +0 -155
  1154. package/src/mcp/ee-tools.ts +0 -204
  1155. package/src/mcp/forensics-tools.ts +0 -65
  1156. package/src/mcp/lsp-tools.ts +0 -78
  1157. package/src/mcp/mcp-keychain.ts +0 -85
  1158. package/src/mcp/oauth-callback.ts +0 -75
  1159. package/src/mcp/oauth-provider.ts +0 -128
  1160. package/src/mcp/opentui-spawn.ts +0 -64
  1161. package/src/mcp/parse-headers.test.ts +0 -54
  1162. package/src/mcp/parse-headers.ts +0 -35
  1163. package/src/mcp/research-onboarding.ts +0 -143
  1164. package/src/mcp/runtime.ts +0 -182
  1165. package/src/mcp/self-verify-jobs.ts +0 -137
  1166. package/src/mcp/smart-filter.ts +0 -138
  1167. package/src/mcp/smoke.test.ts +0 -170
  1168. package/src/mcp/tools-server.ts +0 -174
  1169. package/src/mcp/validate.ts +0 -48
  1170. package/src/models/__tests__/registry.test.ts +0 -95
  1171. package/src/models/catalog-client.ts +0 -234
  1172. package/src/models/catalog-gemini.test.ts +0 -52
  1173. package/src/models/catalog-url.test.ts +0 -27
  1174. package/src/models/catalog-validation.test.ts +0 -74
  1175. package/src/models/catalog.README.md +0 -136
  1176. package/src/models/catalog.json +0 -349
  1177. package/src/models/classify-tier.ts +0 -48
  1178. package/src/models/index.ts +0 -9
  1179. package/src/models/registry.ts +0 -87
  1180. package/src/ops/__tests__/doctor-council-mcp.test.ts +0 -161
  1181. package/src/ops/__tests__/doctor-ee-health.test.ts +0 -129
  1182. package/src/ops/bug-report.test.ts +0 -172
  1183. package/src/ops/bug-report.ts +0 -80
  1184. package/src/ops/doctor.test.ts +0 -108
  1185. package/src/ops/doctor.ts +0 -366
  1186. package/src/orchestrator/__tests__/agent-base-url-switch.test.ts +0 -87
  1187. package/src/orchestrator/__tests__/batch-turn-runner.test.ts +0 -186
  1188. package/src/orchestrator/__tests__/council-manager.test.ts +0 -171
  1189. package/src/orchestrator/__tests__/cross-turn-dedup.test.ts +0 -201
  1190. package/src/orchestrator/__tests__/current-call-id.test.ts +0 -160
  1191. package/src/orchestrator/__tests__/error-forensics.test.ts +0 -99
  1192. package/src/orchestrator/__tests__/flow-resume.test.ts +0 -71
  1193. package/src/orchestrator/__tests__/humanize-api-error.test.ts +0 -74
  1194. package/src/orchestrator/__tests__/message-processor.test.ts +0 -201
  1195. package/src/orchestrator/__tests__/message-write-ahead.test.ts +0 -170
  1196. package/src/orchestrator/__tests__/read-path-budget.test.ts +0 -170
  1197. package/src/orchestrator/__tests__/retry-classifier.test.ts +0 -131
  1198. package/src/orchestrator/__tests__/retry-stream.test.ts +0 -186
  1199. package/src/orchestrator/__tests__/route-feedback.test.ts +0 -55
  1200. package/src/orchestrator/__tests__/stream-runner.test.ts +0 -201
  1201. package/src/orchestrator/__tests__/sub-agent-model-tier.test.ts +0 -53
  1202. package/src/orchestrator/__tests__/usage-events-shape.test.ts +0 -80
  1203. package/src/orchestrator/__tests__/usage-normalizer-c1.test.ts +0 -172
  1204. package/src/orchestrator/__tests__/usage-shape-threading.test.ts +0 -111
  1205. package/src/orchestrator/__tests__/write-ahead.test.ts +0 -162
  1206. package/src/orchestrator/abort.test.ts +0 -37
  1207. package/src/orchestrator/abort.ts +0 -51
  1208. package/src/orchestrator/agent-options.ts +0 -167
  1209. package/src/orchestrator/agent.test.ts +0 -191
  1210. package/src/orchestrator/batch-turn-runner.ts +0 -425
  1211. package/src/orchestrator/batch-utils.ts +0 -340
  1212. package/src/orchestrator/cleanup.test.ts +0 -86
  1213. package/src/orchestrator/compaction.test.ts +0 -200
  1214. package/src/orchestrator/compaction.ts +0 -626
  1215. package/src/orchestrator/council-manager.ts +0 -572
  1216. package/src/orchestrator/cross-turn-dedup.ts +0 -208
  1217. package/src/orchestrator/delegations.test.ts +0 -145
  1218. package/src/orchestrator/delegations.ts +0 -370
  1219. package/src/orchestrator/error-utils.ts +0 -165
  1220. package/src/orchestrator/flow-resume.ts +0 -54
  1221. package/src/orchestrator/grounding-check.test.ts +0 -111
  1222. package/src/orchestrator/grounding-check.ts +0 -138
  1223. package/src/orchestrator/interrupted-turn.test.ts +0 -39
  1224. package/src/orchestrator/interrupted-turn.ts +0 -27
  1225. package/src/orchestrator/message-processor.ts +0 -3364
  1226. package/src/orchestrator/message-seq.test.ts +0 -29
  1227. package/src/orchestrator/message-seq.ts +0 -19
  1228. package/src/orchestrator/orchestrator.ts +0 -2752
  1229. package/src/orchestrator/pending-calls.test.ts +0 -226
  1230. package/src/orchestrator/pending-calls.ts +0 -240
  1231. package/src/orchestrator/prompts.ts +0 -579
  1232. package/src/orchestrator/provider-options-shape.spec.ts +0 -67
  1233. package/src/orchestrator/provider-options-shape.ts +0 -70
  1234. package/src/orchestrator/read-path-budget.ts +0 -205
  1235. package/src/orchestrator/reasoning.test.ts +0 -114
  1236. package/src/orchestrator/reasoning.ts +0 -116
  1237. package/src/orchestrator/repair-tool-call.ts +0 -54
  1238. package/src/orchestrator/repetition-detector.test.ts +0 -127
  1239. package/src/orchestrator/repetition-detector.ts +0 -140
  1240. package/src/orchestrator/retry-classifier.ts +0 -140
  1241. package/src/orchestrator/retry-stream.ts +0 -159
  1242. package/src/orchestrator/sandbox.test.ts +0 -117
  1243. package/src/orchestrator/scope-ceiling.test.ts +0 -215
  1244. package/src/orchestrator/scope-ceiling.ts +0 -234
  1245. package/src/orchestrator/scope-reminder.test.ts +0 -232
  1246. package/src/orchestrator/scope-reminder.ts +0 -230
  1247. package/src/orchestrator/stall-rescue.test.ts +0 -100
  1248. package/src/orchestrator/stall-rescue.ts +0 -95
  1249. package/src/orchestrator/stall-watchdog.test.ts +0 -83
  1250. package/src/orchestrator/stall-watchdog.ts +0 -87
  1251. package/src/orchestrator/stream-runner.ts +0 -939
  1252. package/src/orchestrator/sub-agent-cap.test.ts +0 -227
  1253. package/src/orchestrator/sub-agent-cap.ts +0 -240
  1254. package/src/orchestrator/sub-agent-model-tier.ts +0 -58
  1255. package/src/orchestrator/subagent-compactor.spec.ts +0 -332
  1256. package/src/orchestrator/subagent-compactor.ts +0 -456
  1257. package/src/orchestrator/text-tool-call-detector.test.ts +0 -99
  1258. package/src/orchestrator/text-tool-call-detector.ts +0 -200
  1259. package/src/orchestrator/token-counter.test.ts +0 -69
  1260. package/src/orchestrator/token-counter.ts +0 -81
  1261. package/src/orchestrator/tool-args-hash.test.ts +0 -121
  1262. package/src/orchestrator/tool-args-hash.ts +0 -221
  1263. package/src/orchestrator/tool-args-repair.test.ts +0 -156
  1264. package/src/orchestrator/tool-args-repair.ts +0 -227
  1265. package/src/orchestrator/tool-loop-cap.test.ts +0 -193
  1266. package/src/orchestrator/tool-loop-cap.ts +0 -174
  1267. package/src/orchestrator/tool-repetition-detector.test.ts +0 -119
  1268. package/src/orchestrator/tool-repetition-detector.ts +0 -0
  1269. package/src/orchestrator/tool-utils.ts +0 -214
  1270. package/src/orchestrator/turn-runner-deps.ts +0 -85
  1271. package/src/pil/__tests__/budget.test.ts +0 -39
  1272. package/src/pil/__tests__/clarity-gate.test.ts +0 -299
  1273. package/src/pil/__tests__/config.test.ts +0 -78
  1274. package/src/pil/__tests__/discovery-cache.test.ts +0 -45
  1275. package/src/pil/__tests__/discovery-types.test.ts +0 -68
  1276. package/src/pil/__tests__/discovery.test.ts +0 -141
  1277. package/src/pil/__tests__/dual-run.test.ts +0 -53
  1278. package/src/pil/__tests__/layer1-intent-trace.test.ts +0 -142
  1279. package/src/pil/__tests__/layer1-intent.test.ts +0 -365
  1280. package/src/pil/__tests__/layer15-context-scan.test.ts +0 -76
  1281. package/src/pil/__tests__/layer16-clarity.test.ts +0 -184
  1282. package/src/pil/__tests__/layer17-feasibility.test.ts +0 -42
  1283. package/src/pil/__tests__/layer18-acceptance.test.ts +0 -116
  1284. package/src/pil/__tests__/layer2-personality.test.ts +0 -63
  1285. package/src/pil/__tests__/layer3-ee-injection.test.ts +0 -189
  1286. package/src/pil/__tests__/layer3-injected-chunk.test.ts +0 -122
  1287. package/src/pil/__tests__/layer4-gsd.test.ts +0 -109
  1288. package/src/pil/__tests__/layer5-context.test.ts +0 -157
  1289. package/src/pil/__tests__/layer6-output.test.ts +0 -362
  1290. package/src/pil/__tests__/llm-classify.test.ts +0 -140
  1291. package/src/pil/__tests__/native-capabilities-workbook.test.ts +0 -45
  1292. package/src/pil/__tests__/ollama-classify.test.ts +0 -81
  1293. package/src/pil/__tests__/orchestrator-integration.test.ts +0 -107
  1294. package/src/pil/__tests__/pipeline.test.ts +0 -191
  1295. package/src/pil/__tests__/renderer-coverage.test.ts +0 -46
  1296. package/src/pil/__tests__/response-tools.test.ts +0 -239
  1297. package/src/pil/__tests__/schema.test.ts +0 -233
  1298. package/src/pil/__tests__/scoreComplexity.test.ts +0 -134
  1299. package/src/pil/__tests__/scoreSufficiency.test.ts +0 -104
  1300. package/src/pil/__tests__/store.test.ts +0 -49
  1301. package/src/pil/__tests__/task-tier-map.test.ts +0 -41
  1302. package/src/pil/agent-operating-contract.test.ts +0 -84
  1303. package/src/pil/agent-operating-contract.ts +0 -70
  1304. package/src/pil/budget-log.ts +0 -86
  1305. package/src/pil/budget.ts +0 -18
  1306. package/src/pil/cheap-model-playbook.test.ts +0 -191
  1307. package/src/pil/cheap-model-playbook.ts +0 -153
  1308. package/src/pil/cheap-model-workbooks.test.ts +0 -154
  1309. package/src/pil/cheap-model-workbooks.ts +0 -109
  1310. package/src/pil/clarity-gate.ts +0 -188
  1311. package/src/pil/config.ts +0 -25
  1312. package/src/pil/discovery-cache.ts +0 -20
  1313. package/src/pil/discovery-types.ts +0 -97
  1314. package/src/pil/discovery.ts +0 -397
  1315. package/src/pil/index.ts +0 -24
  1316. package/src/pil/layer1-intent.test.ts +0 -520
  1317. package/src/pil/layer1-intent.ts +0 -1236
  1318. package/src/pil/layer15-context-scan.ts +0 -159
  1319. package/src/pil/layer16-clarity.test.ts +0 -35
  1320. package/src/pil/layer16-clarity.ts +0 -417
  1321. package/src/pil/layer17-feasibility.ts +0 -40
  1322. package/src/pil/layer18-acceptance.ts +0 -98
  1323. package/src/pil/layer1_5-complexity-size.test.ts +0 -279
  1324. package/src/pil/layer1_5-complexity-size.ts +0 -175
  1325. package/src/pil/layer2-personality.ts +0 -46
  1326. package/src/pil/layer3-ee-injection.ts +0 -406
  1327. package/src/pil/layer4-gsd.ts +0 -124
  1328. package/src/pil/layer5-context.ts +0 -171
  1329. package/src/pil/layer6-output.ts +0 -364
  1330. package/src/pil/llm-classify.ts +0 -199
  1331. package/src/pil/native-capabilities-workbook.ts +0 -124
  1332. package/src/pil/ollama-classify.ts +0 -49
  1333. package/src/pil/pipeline.ts +0 -313
  1334. package/src/pil/response-tools.ts +0 -187
  1335. package/src/pil/schema.ts +0 -111
  1336. package/src/pil/session-state.test.ts +0 -88
  1337. package/src/pil/session-state.ts +0 -157
  1338. package/src/pil/store.ts +0 -29
  1339. package/src/pil/task-tier-map.ts +0 -97
  1340. package/src/pil/timeout.ts +0 -10
  1341. package/src/pil/types.ts +0 -168
  1342. package/src/product-loop/__tests__/artifact-io.test.ts +0 -97
  1343. package/src/product-loop/__tests__/assumption-ledger.test.ts +0 -292
  1344. package/src/product-loop/__tests__/backlog-builder.test.ts +0 -200
  1345. package/src/product-loop/__tests__/backlog-store.test.ts +0 -119
  1346. package/src/product-loop/__tests__/cb2-retry-bonus.test.ts +0 -182
  1347. package/src/product-loop/__tests__/circuit-breakers-coverage.test.ts +0 -82
  1348. package/src/product-loop/__tests__/circuit-breakers.test.ts +0 -90
  1349. package/src/product-loop/__tests__/complexity-routing.spec.ts +0 -315
  1350. package/src/product-loop/__tests__/context-policy.test.ts +0 -280
  1351. package/src/product-loop/__tests__/cost-preview.test.ts +0 -118
  1352. package/src/product-loop/__tests__/cost-scoper.test.ts +0 -76
  1353. package/src/product-loop/__tests__/cross-run-memory.test.ts +0 -195
  1354. package/src/product-loop/__tests__/design-output.spec.ts +0 -39
  1355. package/src/product-loop/__tests__/discover.test.ts +0 -98
  1356. package/src/product-loop/__tests__/discovery-context-format.test.ts +0 -111
  1357. package/src/product-loop/__tests__/discovery-council-runner.test.ts +0 -13
  1358. package/src/product-loop/__tests__/discovery-detection.test.ts +0 -180
  1359. package/src/product-loop/__tests__/discovery-ecosystem.test.ts +0 -246
  1360. package/src/product-loop/__tests__/discovery-integration.test.ts +0 -133
  1361. package/src/product-loop/__tests__/discovery-interview.test.ts +0 -305
  1362. package/src/product-loop/__tests__/discovery-migrations.test.ts +0 -75
  1363. package/src/product-loop/__tests__/discovery-persistence.test.ts +0 -171
  1364. package/src/product-loop/__tests__/discovery-prompt-parser.test.ts +0 -77
  1365. package/src/product-loop/__tests__/discovery-prompt-specificity.test.ts +0 -65
  1366. package/src/product-loop/__tests__/discovery-recommender-ecosystem.test.ts +0 -192
  1367. package/src/product-loop/__tests__/discovery-recommender.test.ts +0 -382
  1368. package/src/product-loop/__tests__/discovery-schema.test.ts +0 -102
  1369. package/src/product-loop/__tests__/done-gate-coverage.test.ts +0 -151
  1370. package/src/product-loop/__tests__/done-gate.test.ts +0 -140
  1371. package/src/product-loop/__tests__/ee-extract-wiring.test.ts +0 -222
  1372. package/src/product-loop/__tests__/extract-to-ee.test.ts +0 -205
  1373. package/src/product-loop/__tests__/feedback-routing.test.ts +0 -93
  1374. package/src/product-loop/__tests__/gather-selectable-alts.test.ts +0 -119
  1375. package/src/product-loop/__tests__/hot-path.spec.ts +0 -177
  1376. package/src/product-loop/__tests__/integration.test.ts +0 -350
  1377. package/src/product-loop/__tests__/loop-driver-audit.test.ts +0 -327
  1378. package/src/product-loop/__tests__/loop-driver.test.ts +0 -253
  1379. package/src/product-loop/__tests__/maintenance-task-synthesis.test.ts +0 -78
  1380. package/src/product-loop/__tests__/phase-a1-a3-sprint-runner.test.ts +0 -315
  1381. package/src/product-loop/__tests__/phase-a2-backlog-build.test.ts +0 -189
  1382. package/src/product-loop/__tests__/phase-budget.test.ts +0 -172
  1383. package/src/product-loop/__tests__/phase-orchestrator-integration.test.ts +0 -143
  1384. package/src/product-loop/__tests__/phase-plan.test.ts +0 -241
  1385. package/src/product-loop/__tests__/phase-rituals.test.ts +0 -205
  1386. package/src/product-loop/__tests__/phase-runner.test.ts +0 -454
  1387. package/src/product-loop/__tests__/phase-tracker-bridge.test.ts +0 -85
  1388. package/src/product-loop/__tests__/pick-backend-stack.test.ts +0 -117
  1389. package/src/product-loop/__tests__/product-identity.test.ts +0 -47
  1390. package/src/product-loop/__tests__/progress-snapshot.test.ts +0 -180
  1391. package/src/product-loop/__tests__/reality-anchor.test.ts +0 -58
  1392. package/src/product-loop/__tests__/repo-audit.test.ts +0 -103
  1393. package/src/product-loop/__tests__/repo-brief.test.ts +0 -155
  1394. package/src/product-loop/__tests__/role-memory.test.ts +0 -70
  1395. package/src/product-loop/__tests__/role-registry.test.ts +0 -235
  1396. package/src/product-loop/__tests__/role-routing-ee.test.ts +0 -90
  1397. package/src/product-loop/__tests__/route-decision-emit.test.ts +0 -258
  1398. package/src/product-loop/__tests__/seed-questions.test.ts +0 -33
  1399. package/src/product-loop/__tests__/ship-polish.test.ts +0 -109
  1400. package/src/product-loop/__tests__/sprint-planner.test.ts +0 -166
  1401. package/src/product-loop/__tests__/sprint-runner-backlog.test.ts +0 -248
  1402. package/src/product-loop/__tests__/sprint-runner-emit.test.ts +0 -324
  1403. package/src/product-loop/__tests__/sprint-runner-phase-chunks.test.ts +0 -220
  1404. package/src/product-loop/__tests__/sprint-runner.test.ts +0 -501
  1405. package/src/product-loop/__tests__/sprint-self-verify.test.ts +0 -77
  1406. package/src/product-loop/__tests__/sprint-store.test.ts +0 -98
  1407. package/src/product-loop/__tests__/stakeholder-acl.test.ts +0 -94
  1408. package/src/product-loop/__tests__/state-md-ee-injections.test.ts +0 -229
  1409. package/src/product-loop/__tests__/sufficiency-routing.spec.ts +0 -183
  1410. package/src/product-loop/__tests__/typed-artifacts.test.ts +0 -259
  1411. package/src/product-loop/__tests__/types.test.ts +0 -103
  1412. package/src/product-loop/__tests__/verify-failure-threshold.test.ts +0 -178
  1413. package/src/product-loop/__tests__/verify-failure-tracking.test.ts +0 -154
  1414. package/src/product-loop/__tests__/verify-result.test.ts +0 -60
  1415. package/src/product-loop/artifact-io.ts +0 -239
  1416. package/src/product-loop/assumption-ledger.ts +0 -270
  1417. package/src/product-loop/backlog-builder.ts +0 -253
  1418. package/src/product-loop/backlog-store.ts +0 -62
  1419. package/src/product-loop/circuit-breakers.ts +0 -76
  1420. package/src/product-loop/context-policy.ts +0 -180
  1421. package/src/product-loop/cost-preview.ts +0 -139
  1422. package/src/product-loop/cost-scoper.ts +0 -49
  1423. package/src/product-loop/cross-run-memory.ts +0 -450
  1424. package/src/product-loop/design-output.ts +0 -24
  1425. package/src/product-loop/discover.ts +0 -159
  1426. package/src/product-loop/discovery-context-format.ts +0 -56
  1427. package/src/product-loop/discovery-council-runner.ts +0 -78
  1428. package/src/product-loop/discovery-detection.ts +0 -161
  1429. package/src/product-loop/discovery-ecosystem.ts +0 -239
  1430. package/src/product-loop/discovery-interview.ts +0 -288
  1431. package/src/product-loop/discovery-migrations.ts +0 -40
  1432. package/src/product-loop/discovery-persistence.ts +0 -219
  1433. package/src/product-loop/discovery-prompt-parser.ts +0 -80
  1434. package/src/product-loop/discovery-recommender.ts +0 -514
  1435. package/src/product-loop/discovery-schema.ts +0 -143
  1436. package/src/product-loop/done-gate.ts +0 -224
  1437. package/src/product-loop/feedback-routing.ts +0 -82
  1438. package/src/product-loop/gather.ts +0 -386
  1439. package/src/product-loop/index.ts +0 -1855
  1440. package/src/product-loop/loop-driver.ts +0 -900
  1441. package/src/product-loop/phase-budget.ts +0 -182
  1442. package/src/product-loop/phase-plan.ts +0 -158
  1443. package/src/product-loop/phase-rituals.ts +0 -158
  1444. package/src/product-loop/phase-runner.ts +0 -455
  1445. package/src/product-loop/phase-tracker-bridge.ts +0 -60
  1446. package/src/product-loop/product-identity.ts +0 -11
  1447. package/src/product-loop/progress-snapshot.ts +0 -216
  1448. package/src/product-loop/reality-anchor.ts +0 -45
  1449. package/src/product-loop/repo-audit.ts +0 -314
  1450. package/src/product-loop/repo-brief.ts +0 -235
  1451. package/src/product-loop/role-memory.ts +0 -72
  1452. package/src/product-loop/role-registry.ts +0 -175
  1453. package/src/product-loop/seed-questions.ts +0 -51
  1454. package/src/product-loop/ship-polish.ts +0 -164
  1455. package/src/product-loop/sprint-planner.ts +0 -241
  1456. package/src/product-loop/sprint-runner.ts +0 -801
  1457. package/src/product-loop/sprint-self-verify.ts +0 -189
  1458. package/src/product-loop/sprint-store.ts +0 -96
  1459. package/src/product-loop/stakeholder-acl.ts +0 -82
  1460. package/src/product-loop/typed-artifacts.ts +0 -332
  1461. package/src/product-loop/types.ts +0 -570
  1462. package/src/product-loop/verify-failure-tracking.ts +0 -225
  1463. package/src/product-loop/verify-result.ts +0 -39
  1464. package/src/providers/.gitkeep +0 -0
  1465. package/src/providers/__test-utils__/load-fixture.ts +0 -36
  1466. package/src/providers/__tests__/adapter-oauth-wiring.test.ts +0 -147
  1467. package/src/providers/__tests__/capabilities-cosmetic.test.ts +0 -119
  1468. package/src/providers/__tests__/capabilities-flags.test.ts +0 -166
  1469. package/src/providers/__tests__/capabilities-provider-options.test.ts +0 -232
  1470. package/src/providers/__tests__/capabilities-sanitize.test.ts +0 -66
  1471. package/src/providers/__tests__/capabilities.test.ts +0 -44
  1472. package/src/providers/__tests__/provider-coverage.test.ts +0 -48
  1473. package/src/providers/__tests__/reasoning-roundtrip.test.ts +0 -150
  1474. package/src/providers/__tests__/runtime-integration.test.ts +0 -106
  1475. package/src/providers/__tests__/runtime.test.ts +0 -94
  1476. package/src/providers/__tests__/siliconflow-sse-repair.test.ts +0 -300
  1477. package/src/providers/__tests__/strategies-registry.test.ts +0 -55
  1478. package/src/providers/__tests__/strategies-resolve.test.ts +0 -137
  1479. package/src/providers/__tests__/wire-debug.test.ts +0 -42
  1480. package/src/providers/adapter.test.ts +0 -21
  1481. package/src/providers/adapter.ts +0 -156
  1482. package/src/providers/anthropic.ts +0 -174
  1483. package/src/providers/auth/__tests__/browser-flow.test.ts +0 -230
  1484. package/src/providers/auth/__tests__/device-flow.test.ts +0 -263
  1485. package/src/providers/auth/__tests__/gemini-oauth.test.ts +0 -387
  1486. package/src/providers/auth/__tests__/grok-oauth.test.ts +0 -283
  1487. package/src/providers/auth/__tests__/openai-oauth.test.ts +0 -378
  1488. package/src/providers/auth/__tests__/token-store.test.ts +0 -152
  1489. package/src/providers/auth/browser-flow.ts +0 -140
  1490. package/src/providers/auth/device-flow.ts +0 -221
  1491. package/src/providers/auth/gemini-oauth.ts +0 -351
  1492. package/src/providers/auth/grok-oauth.ts +0 -406
  1493. package/src/providers/auth/openai-oauth.ts +0 -455
  1494. package/src/providers/auth/registry.ts +0 -138
  1495. package/src/providers/auth/token-store.ts +0 -154
  1496. package/src/providers/auth/types.ts +0 -111
  1497. package/src/providers/capabilities.ts +0 -355
  1498. package/src/providers/endpoints.ts +0 -68
  1499. package/src/providers/errors.test.ts +0 -76
  1500. package/src/providers/errors.ts +0 -46
  1501. package/src/providers/gemini.test.ts +0 -46
  1502. package/src/providers/gemini.ts +0 -42
  1503. package/src/providers/index.ts +0 -28
  1504. package/src/providers/keychain.test.ts +0 -100
  1505. package/src/providers/keychain.ts +0 -278
  1506. package/src/providers/mcp-vision-bridge.test.ts +0 -513
  1507. package/src/providers/mcp-vision-bridge.ts +0 -1020
  1508. package/src/providers/ollama.test.ts +0 -46
  1509. package/src/providers/ollama.ts +0 -36
  1510. package/src/providers/openai-compatible.test.ts +0 -63
  1511. package/src/providers/openai-compatible.ts +0 -62
  1512. package/src/providers/openai.test.ts +0 -65
  1513. package/src/providers/openai.ts +0 -56
  1514. package/src/providers/patch-zod-schema.ts +0 -126
  1515. package/src/providers/pricing.test.ts +0 -97
  1516. package/src/providers/pricing.ts +0 -128
  1517. package/src/providers/prompt-cache-key.spec.ts +0 -28
  1518. package/src/providers/runtime-mock.spec.ts +0 -86
  1519. package/src/providers/runtime.ts +0 -311
  1520. package/src/providers/siliconflow-sse-repair.ts +0 -201
  1521. package/src/providers/strategies/anthropic.strategy.ts +0 -25
  1522. package/src/providers/strategies/base.strategy.ts +0 -76
  1523. package/src/providers/strategies/deepseek.strategy.ts +0 -55
  1524. package/src/providers/strategies/google.strategy.ts +0 -28
  1525. package/src/providers/strategies/ollama.strategy.ts +0 -22
  1526. package/src/providers/strategies/openai.strategy.ts +0 -55
  1527. package/src/providers/strategies/registry.ts +0 -43
  1528. package/src/providers/strategies/siliconflow.strategy.ts +0 -28
  1529. package/src/providers/strategies/xai.strategy.ts +0 -33
  1530. package/src/providers/stream-loop.ts +0 -83
  1531. package/src/providers/types.ts +0 -145
  1532. package/src/providers/vision-proxy.test.ts +0 -252
  1533. package/src/providers/vision-proxy.ts +0 -317
  1534. package/src/providers/wire-debug.ts +0 -163
  1535. package/src/reporter/__tests__/acl-check.test.ts +0 -71
  1536. package/src/reporter/__tests__/auto-fire.test.ts +0 -161
  1537. package/src/reporter/__tests__/budget.test.ts +0 -74
  1538. package/src/reporter/__tests__/handlers.test.ts +0 -192
  1539. package/src/reporter/__tests__/query-router.test.ts +0 -115
  1540. package/src/reporter/acl-check.ts +0 -54
  1541. package/src/reporter/auto-fire.ts +0 -168
  1542. package/src/reporter/budget.ts +0 -59
  1543. package/src/reporter/handlers.ts +0 -212
  1544. package/src/reporter/index.ts +0 -210
  1545. package/src/reporter/query-router.ts +0 -51
  1546. package/src/router/.gitkeep +0 -0
  1547. package/src/router/__tests__/step-router.test.ts +0 -150
  1548. package/src/router/classifier/grammars.ts +0 -17
  1549. package/src/router/classifier/index.test.ts +0 -33
  1550. package/src/router/classifier/index.ts +0 -21
  1551. package/src/router/classifier/regex.test.ts +0 -51
  1552. package/src/router/classifier/regex.ts +0 -160
  1553. package/src/router/classifier/tree-sitter.test.ts +0 -26
  1554. package/src/router/classifier/tree-sitter.ts +0 -87
  1555. package/src/router/cold.test.ts +0 -62
  1556. package/src/router/cold.ts +0 -27
  1557. package/src/router/decide.test.ts +0 -209
  1558. package/src/router/decide.ts +0 -509
  1559. package/src/router/health.test.ts +0 -59
  1560. package/src/router/health.ts +0 -49
  1561. package/src/router/provider-sentinel.test.ts +0 -22
  1562. package/src/router/provider-sentinel.ts +0 -20
  1563. package/src/router/role-override.test.ts +0 -37
  1564. package/src/router/step-router.ts +0 -194
  1565. package/src/router/store.ts +0 -47
  1566. package/src/router/types.ts +0 -20
  1567. package/src/router/warm.test.ts +0 -234
  1568. package/src/router/warm.ts +0 -93
  1569. package/src/scaffold/__tests__/continuation-prompt.test.ts +0 -93
  1570. package/src/scaffold/__tests__/continue-as-council.spec.ts +0 -122
  1571. package/src/scaffold/__tests__/dotnet-assembly-name.test.ts +0 -28
  1572. package/src/scaffold/__tests__/fe-scaffold-contents.test.ts +0 -127
  1573. package/src/scaffold/__tests__/init-new.smoke.spec.ts +0 -99
  1574. package/src/scaffold/__tests__/init-new.spec.ts +0 -450
  1575. package/src/scaffold/__tests__/install-bb-templates.spec.ts +0 -86
  1576. package/src/scaffold/__tests__/point-to-existing.spec.ts +0 -114
  1577. package/src/scaffold/bb-ecosystem-apply.ts +0 -457
  1578. package/src/scaffold/bb-quality-gate.ts +0 -287
  1579. package/src/scaffold/continuation-prompt.ts +0 -80
  1580. package/src/scaffold/continue-as-council.ts +0 -99
  1581. package/src/scaffold/init-new.ts +0 -1691
  1582. package/src/scaffold/point-to-existing.ts +0 -83
  1583. package/src/scaffold/resume-from-gate-failures.ts +0 -167
  1584. package/src/self-qa/__tests__/agentic-context.test.ts +0 -104
  1585. package/src/self-qa/__tests__/agentic-loop.test.ts +0 -70
  1586. package/src/self-qa/__tests__/delta-encoder.test.ts +0 -113
  1587. package/src/self-qa/__tests__/judge.test.ts +0 -152
  1588. package/src/self-qa/__tests__/scenario-planner.test.ts +0 -87
  1589. package/src/self-qa/__tests__/spec-emitter.test.ts +0 -67
  1590. package/src/self-qa/agentic-context.ts +0 -211
  1591. package/src/self-qa/agentic-loop.ts +0 -590
  1592. package/src/self-qa/delta-encoder.ts +0 -149
  1593. package/src/self-qa/index.ts +0 -117
  1594. package/src/self-qa/judge.ts +0 -248
  1595. package/src/self-qa/orchestrator.ts +0 -269
  1596. package/src/self-qa/scenario-planner.ts +0 -289
  1597. package/src/self-qa/spec-emitter.ts +0 -152
  1598. package/src/self-qa/types.ts +0 -98
  1599. package/src/storage/__tests__/migrations.test.ts +0 -395
  1600. package/src/storage/__tests__/sweep-stale-pending.test.ts +0 -112
  1601. package/src/storage/__tests__/ui-interaction-log.test.ts +0 -136
  1602. package/src/storage/atomic-io.test.ts +0 -92
  1603. package/src/storage/atomic-io.ts +0 -160
  1604. package/src/storage/config.test.ts +0 -33
  1605. package/src/storage/config.ts +0 -53
  1606. package/src/storage/db.ts +0 -184
  1607. package/src/storage/index.ts +0 -26
  1608. package/src/storage/interaction-log.ts +0 -126
  1609. package/src/storage/migrations.ts +0 -205
  1610. package/src/storage/session-dir.ts +0 -37
  1611. package/src/storage/sessions.ts +0 -225
  1612. package/src/storage/tool-results.ts +0 -56
  1613. package/src/storage/transcript-response-entry.test.ts +0 -115
  1614. package/src/storage/transcript-view.ts +0 -45
  1615. package/src/storage/transcript.test.ts +0 -24
  1616. package/src/storage/transcript.ts +0 -637
  1617. package/src/storage/ui-interaction-log.ts +0 -170
  1618. package/src/storage/usage-cap.test.ts +0 -59
  1619. package/src/storage/usage-cap.ts +0 -81
  1620. package/src/storage/usage.ts +0 -117
  1621. package/src/storage/workspaces.ts +0 -84
  1622. package/src/tools/__tests__/vision-gate.test.ts +0 -66
  1623. package/src/tools/bash-output-cache.test.ts +0 -113
  1624. package/src/tools/bash-output-cache.ts +0 -156
  1625. package/src/tools/bash-output-integration.test.ts +0 -33
  1626. package/src/tools/bash.test.ts +0 -447
  1627. package/src/tools/bash.ts +0 -769
  1628. package/src/tools/computer.test.ts +0 -187
  1629. package/src/tools/computer.ts +0 -632
  1630. package/src/tools/file-tracker.test.ts +0 -101
  1631. package/src/tools/file-tracker.ts +0 -70
  1632. package/src/tools/file.test.ts +0 -151
  1633. package/src/tools/file.ts +0 -203
  1634. package/src/tools/grep.ts +0 -187
  1635. package/src/tools/registry-bash-empty-command.test.ts +0 -64
  1636. package/src/tools/registry-bash-footer.test.ts +0 -95
  1637. package/src/tools/registry-ee-query.test.ts +0 -57
  1638. package/src/tools/registry-session-repeat.test.ts +0 -105
  1639. package/src/tools/registry.test.ts +0 -38
  1640. package/src/tools/registry.ts +0 -704
  1641. package/src/tools/schedule.test.ts +0 -143
  1642. package/src/tools/schedule.ts +0 -610
  1643. package/src/tools/todo-write-snapshot.test.ts +0 -53
  1644. package/src/tools/todo-write-snapshot.ts +0 -63
  1645. package/src/tools/vision-gate.ts +0 -74
  1646. package/src/types/index.ts +0 -550
  1647. package/src/ui/__tests__/picker-providers.test.ts +0 -37
  1648. package/src/ui/agents-modal.tsx +0 -293
  1649. package/src/ui/app.tsx +0 -7084
  1650. package/src/ui/cards/__tests__/product-status-card.test.ts +0 -30
  1651. package/src/ui/cards/product-status-card.tsx +0 -117
  1652. package/src/ui/components/SuggestionOverlay.tsx +0 -38
  1653. package/src/ui/components/Toast.tsx +0 -100
  1654. package/src/ui/components/__tests__/council-leader-bubble.test.ts +0 -16
  1655. package/src/ui/components/__tests__/council-message-bubble.test.ts +0 -85
  1656. package/src/ui/components/__tests__/council-phase-timeline.test.ts +0 -57
  1657. package/src/ui/components/__tests__/council-placeholder-bubble.test.ts +0 -16
  1658. package/src/ui/components/__tests__/council-question-card.test.ts +0 -133
  1659. package/src/ui/components/__tests__/council-synthesis-banner.test.ts +0 -12
  1660. package/src/ui/components/__tests__/task-list-panel.test.ts +0 -37
  1661. package/src/ui/components/__tests__/use-pair-quote-buffer.test.ts +0 -41
  1662. package/src/ui/components/btw-overlay.tsx +0 -66
  1663. package/src/ui/components/bubble-layout.ts +0 -66
  1664. package/src/ui/components/code-block-truncate.ts +0 -24
  1665. package/src/ui/components/copy-flash-banner.tsx +0 -31
  1666. package/src/ui/components/council-info-card.tsx +0 -44
  1667. package/src/ui/components/council-leader-bubble.tsx +0 -40
  1668. package/src/ui/components/council-message-bubble.tsx +0 -110
  1669. package/src/ui/components/council-phase-timeline.tsx +0 -112
  1670. package/src/ui/components/council-placeholder-bubble.tsx +0 -64
  1671. package/src/ui/components/council-question-card.tsx +0 -256
  1672. package/src/ui/components/council-status-list.tsx +0 -111
  1673. package/src/ui/components/council-synthesis-banner.tsx +0 -36
  1674. package/src/ui/components/diff-view.tsx +0 -225
  1675. package/src/ui/components/halt-recovery-card.tsx +0 -84
  1676. package/src/ui/components/hero-logo.tsx +0 -62
  1677. package/src/ui/components/init-new-form-card.tsx +0 -470
  1678. package/src/ui/components/lsp-views.tsx +0 -104
  1679. package/src/ui/components/media-views.tsx +0 -66
  1680. package/src/ui/components/message-view.tsx +0 -442
  1681. package/src/ui/components/point-to-existing-form-card.tsx +0 -136
  1682. package/src/ui/components/prompt-box.tsx +0 -306
  1683. package/src/ui/components/role-palette.ts +0 -62
  1684. package/src/ui/components/session-header.tsx +0 -68
  1685. package/src/ui/components/slash-inline-menu.tsx +0 -63
  1686. package/src/ui/components/structured-response-view.tsx +0 -191
  1687. package/src/ui/components/task-list-panel.tsx +0 -127
  1688. package/src/ui/components/tool-group.tsx +0 -129
  1689. package/src/ui/components/tool-result-views.tsx +0 -258
  1690. package/src/ui/components/use-pair-quote-buffer.ts +0 -23
  1691. package/src/ui/constants.ts +0 -242
  1692. package/src/ui/hooks/use-agent-editor.ts +0 -61
  1693. package/src/ui/hooks/use-mcp-editor.ts +0 -39
  1694. package/src/ui/hooks/use-model-picker.ts +0 -50
  1695. package/src/ui/hooks/useTypeahead.ts +0 -160
  1696. package/src/ui/markdown.tsx +0 -49
  1697. package/src/ui/mcp-modal-types.ts +0 -33
  1698. package/src/ui/mcp-modal.tsx +0 -484
  1699. package/src/ui/modals/api-key-modal.tsx +0 -99
  1700. package/src/ui/modals/connect-modal.tsx +0 -259
  1701. package/src/ui/modals/model-picker-modal.tsx +0 -347
  1702. package/src/ui/modals/sandbox-picker-modal.tsx +0 -99
  1703. package/src/ui/modals/update-modal.tsx +0 -67
  1704. package/src/ui/modals/wallet-picker-modal.tsx +0 -186
  1705. package/src/ui/picker-providers.ts +0 -41
  1706. package/src/ui/plan.tsx +0 -346
  1707. package/src/ui/schedule-modal.tsx +0 -138
  1708. package/src/ui/slash/__tests__/clear.test.ts +0 -86
  1709. package/src/ui/slash/__tests__/compact.test.ts +0 -56
  1710. package/src/ui/slash/__tests__/cost.test.ts +0 -62
  1711. package/src/ui/slash/__tests__/discuss.test.ts +0 -101
  1712. package/src/ui/slash/__tests__/execute.test.ts +0 -86
  1713. package/src/ui/slash/__tests__/expand.test.ts +0 -86
  1714. package/src/ui/slash/__tests__/ideal.test.ts +0 -182
  1715. package/src/ui/slash/__tests__/menu-parity.test.ts +0 -44
  1716. package/src/ui/slash/__tests__/optimize.test.ts +0 -155
  1717. package/src/ui/slash/__tests__/pin.test.ts +0 -47
  1718. package/src/ui/slash/__tests__/plan.test.ts +0 -98
  1719. package/src/ui/slash/__tests__/status-render.test.ts +0 -82
  1720. package/src/ui/slash/clear.ts +0 -89
  1721. package/src/ui/slash/compact.ts +0 -46
  1722. package/src/ui/slash/cost.ts +0 -63
  1723. package/src/ui/slash/council-inspect.ts +0 -188
  1724. package/src/ui/slash/council.ts +0 -30
  1725. package/src/ui/slash/debug.ts +0 -153
  1726. package/src/ui/slash/discuss.ts +0 -71
  1727. package/src/ui/slash/ee.ts +0 -304
  1728. package/src/ui/slash/execute.ts +0 -44
  1729. package/src/ui/slash/expand.ts +0 -51
  1730. package/src/ui/slash/export.ts +0 -309
  1731. package/src/ui/slash/ideal.ts +0 -292
  1732. package/src/ui/slash/menu-items.ts +0 -107
  1733. package/src/ui/slash/optimize.ts +0 -47
  1734. package/src/ui/slash/pin.ts +0 -41
  1735. package/src/ui/slash/plan.ts +0 -62
  1736. package/src/ui/slash/registry.ts +0 -47
  1737. package/src/ui/slash/route.test.ts +0 -82
  1738. package/src/ui/slash/route.ts +0 -43
  1739. package/src/ui/slash/status.ts +0 -36
  1740. package/src/ui/state/active-run.ts +0 -56
  1741. package/src/ui/status-bar/index.test.tsx +0 -154
  1742. package/src/ui/status-bar/index.tsx +0 -126
  1743. package/src/ui/status-bar/store.test.ts +0 -131
  1744. package/src/ui/status-bar/store.ts +0 -332
  1745. package/src/ui/status-bar/tier-badge.test.tsx +0 -38
  1746. package/src/ui/status-bar/tier-badge.tsx +0 -29
  1747. package/src/ui/status-bar/usd-meter.test.tsx +0 -37
  1748. package/src/ui/status-bar/usd-meter.tsx +0 -22
  1749. package/src/ui/syntax-highlight.ts +0 -627
  1750. package/src/ui/terminal-selection-text.ts +0 -72
  1751. package/src/ui/theme.ts +0 -95
  1752. package/src/ui/types.ts +0 -83
  1753. package/src/ui/utils/__tests__/format.test.ts +0 -71
  1754. package/src/ui/utils/__tests__/tools.test.ts +0 -57
  1755. package/src/ui/utils/color.ts +0 -19
  1756. package/src/ui/utils/format.ts +0 -133
  1757. package/src/ui/utils/modal.ts +0 -9
  1758. package/src/ui/utils/text.ts +0 -32
  1759. package/src/ui/utils/tools.ts +0 -137
  1760. package/src/usage/.gitkeep +0 -0
  1761. package/src/usage/__tests__/product-ledger.test.ts +0 -86
  1762. package/src/usage/cost-log.ts +0 -158
  1763. package/src/usage/decision-log.ts +0 -86
  1764. package/src/usage/downgrade.test.ts +0 -86
  1765. package/src/usage/downgrade.ts +0 -88
  1766. package/src/usage/estimator.test.ts +0 -43
  1767. package/src/usage/estimator.ts +0 -58
  1768. package/src/usage/ledger.test.ts +0 -200
  1769. package/src/usage/ledger.ts +0 -253
  1770. package/src/usage/midstream.test.ts +0 -55
  1771. package/src/usage/midstream.ts +0 -51
  1772. package/src/usage/product-ledger.ts +0 -119
  1773. package/src/usage/thresholds.test.ts +0 -83
  1774. package/src/usage/thresholds.ts +0 -74
  1775. package/src/usage/types.ts +0 -41
  1776. package/src/utils/__tests__/auto-council-settings.test.ts +0 -46
  1777. package/src/utils/__tests__/ee-logger.test.ts +0 -197
  1778. package/src/utils/__tests__/file-lock.test.ts +0 -74
  1779. package/src/utils/__tests__/llm-deadline.test.ts +0 -64
  1780. package/src/utils/__tests__/rate-limit.test.ts +0 -42
  1781. package/src/utils/__tests__/settings-disabled-models.test.ts +0 -113
  1782. package/src/utils/__tests__/settings-web-research.test.ts +0 -45
  1783. package/src/utils/__tests__/slugify.test.ts +0 -45
  1784. package/src/utils/__tests__/visible-retry.test.ts +0 -195
  1785. package/src/utils/at-mentions.ts +0 -120
  1786. package/src/utils/clipboard-image.ts +0 -139
  1787. package/src/utils/ee-logger.ts +0 -163
  1788. package/src/utils/file-index.ts +0 -152
  1789. package/src/utils/file-lock.ts +0 -66
  1790. package/src/utils/git-root.ts +0 -17
  1791. package/src/utils/host-clipboard.ts +0 -68
  1792. package/src/utils/install-manager.test.ts +0 -167
  1793. package/src/utils/install-manager.ts +0 -429
  1794. package/src/utils/instructions.test.ts +0 -112
  1795. package/src/utils/instructions.ts +0 -149
  1796. package/src/utils/llm-deadline.ts +0 -80
  1797. package/src/utils/permission-mode.test.ts +0 -121
  1798. package/src/utils/permission-mode.ts +0 -94
  1799. package/src/utils/rate-limit.ts +0 -21
  1800. package/src/utils/redactor.test.ts +0 -100
  1801. package/src/utils/redactor.ts +0 -223
  1802. package/src/utils/settings.test.ts +0 -181
  1803. package/src/utils/settings.ts +0 -1163
  1804. package/src/utils/shell.test.ts +0 -102
  1805. package/src/utils/shell.ts +0 -204
  1806. package/src/utils/side-question.ts +0 -39
  1807. package/src/utils/skills.test.ts +0 -58
  1808. package/src/utils/skills.ts +0 -207
  1809. package/src/utils/slugify.ts +0 -9
  1810. package/src/utils/subagent-display.test.ts +0 -23
  1811. package/src/utils/subagent-display.ts +0 -11
  1812. package/src/utils/subagents-settings.test.ts +0 -84
  1813. package/src/utils/telegram-audio-settings.test.ts +0 -44
  1814. package/src/utils/update-checker.test.ts +0 -182
  1815. package/src/utils/update-checker.ts +0 -33
  1816. package/src/utils/visible-retry.ts +0 -56
  1817. package/src/verify/__tests__/coverage-parsers.test.ts +0 -86
  1818. package/src/verify/__tests__/dotnet-recipe.test.ts +0 -88
  1819. package/src/verify/checkpoint.test.ts +0 -186
  1820. package/src/verify/checkpoint.ts +0 -239
  1821. package/src/verify/coverage-parsers.ts +0 -76
  1822. package/src/verify/entrypoint.test.ts +0 -293
  1823. package/src/verify/entrypoint.ts +0 -495
  1824. package/src/verify/environment.test.ts +0 -119
  1825. package/src/verify/environment.ts +0 -115
  1826. package/src/verify/evidence.ts +0 -104
  1827. package/src/verify/orchestrator.test.ts +0 -159
  1828. package/src/verify/orchestrator.ts +0 -129
  1829. package/src/verify/recipes.ts +0 -592
  1830. package/src/verify/retry.ts +0 -62
  1831. package/src/verify/runtime-prep.test.ts +0 -47
@@ -1,2752 +0,0 @@
1
- // Multi-provider wired — runtime dispatch via providers/runtime.ts.
2
-
3
- import type { ModelMessage, ToolSet } from "ai";
4
- import { extractSession } from "../ee/extract-session.js";
5
- import {
6
- bootstrapEEClient,
7
- getDefaultEEClient,
8
- getLastSurfacedState,
9
- updateLastSurfacedState,
10
- } from "../ee/intercept.js";
11
- import { getTenantId } from "../ee/tenant.js";
12
- import { emitTranscriptToDisk } from "../ee/transcript-emit.js";
13
- import { createRun, getActiveRunId, setActiveRunId } from "../flow/run-manager.js";
14
- import { ensureFlowDir } from "../flow/scaffold.js";
15
- import { executeEventHooks } from "../hooks/index";
16
- import type {
17
- NotificationHookInput,
18
- PostCompactHookInput,
19
- PreCompactHookInput,
20
- SessionEndHookInput,
21
- SubagentStartHookInput,
22
- SubagentStopHookInput,
23
- TaskCompletedHookInput,
24
- TaskCreatedHookInput,
25
- } from "../hooks/types";
26
- import { shutdownWorkspaceLspManager } from "../lsp/runtime";
27
- import { ensureDefaultMcpServers } from "../mcp/auto-setup.js";
28
- import { getModelInfo, normalizeModelId } from "../models/registry.js";
29
- import { getProviderCapabilities } from "../providers/capabilities.js";
30
- import { apiBaseFor } from "../providers/endpoints.js";
31
- import { loadKeyForProvider } from "../providers/keychain.js";
32
- import {
33
- createProviderFactory,
34
- createProviderFactoryAsync,
35
- detectProviderForModel,
36
- requireRuntimeProvider,
37
- resolveModelRuntime as resolveRuntime,
38
- } from "../providers/runtime.js";
39
- import { ALL_PROVIDER_IDS, type ProviderId } from "../providers/types.js";
40
- import {
41
- appendCompaction,
42
- appendMessages,
43
- appendSystemMessage,
44
- buildChatEntries,
45
- getNextMessageSequence,
46
- getSessionTotalTokens,
47
- loadTranscript,
48
- loadTranscriptState,
49
- logInteraction,
50
- markMessageCompleted,
51
- recordUsageEvent,
52
- SessionStore,
53
- } from "../storage/index.js";
54
- import { BashTool } from "../tools/bash";
55
- import { createBuiltinTools } from "../tools/registry.js";
56
- import { type ScheduleDaemonStatus, ScheduleManager, type StoredSchedule } from "../tools/schedule";
57
- import type {
58
- AgentMode,
59
- ChatEntry,
60
- SessionInfo,
61
- SessionSnapshot,
62
- StreamChunk,
63
- SubagentStatus,
64
- TaskRequest,
65
- ToolCall,
66
- ToolResult,
67
- UsageSource,
68
- VerifyRecipe,
69
- WorkspaceInfo,
70
- } from "../types/index";
71
- import { statusBarStore } from "../ui/status-bar/store.js";
72
- import { appendCostLog } from "../usage/cost-log.js";
73
- import { appendDecisionLog } from "../usage/decision-log.js";
74
- import { projectCostUSD } from "../usage/estimator.js";
75
- import type { PermissionMode } from "../utils/permission-mode.js";
76
- import {
77
- type CustomSubagentConfig,
78
- getAutoCompactThresholdPct,
79
- getCouncilRounds,
80
- getCurrentModel,
81
- getCurrentShellSettings,
82
- getModeSpecificModel,
83
- getRoleModel,
84
- getRoleModels,
85
- isAutoCompactAfterTurnEnabled,
86
- isCouncilMultiProviderPreferred,
87
- isProviderDisabled,
88
- type ModelRole,
89
- type SandboxMode,
90
- type SandboxSettings,
91
- } from "../utils/settings";
92
- import { runSideQuestion, type SideQuestionResult } from "../utils/side-question";
93
- import { buildVerifyDetectPrompt, normalizeVerifyRecipe } from "../verify/entrypoint";
94
- import { runVerifyOrchestration } from "../verify/orchestrator";
95
- import {
96
- type AgentOptions,
97
- type BatchChatCompletionResponse,
98
- type BatchClientOptions,
99
- type BatchFunctionTool,
100
- COUNCIL_COLOR_BG,
101
- COUNCIL_COLOR_RESET,
102
- COUNCIL_ROLE_COLORS,
103
- type LegacyProvider,
104
- type ProcessMessageObserver,
105
- type ProcessMessageUsage,
106
- type ResolvedModelRuntime,
107
- } from "./agent-options";
108
- import { BatchTurnRunner, type BatchTurnRunnerDeps } from "./batch-turn-runner.js";
109
- import {
110
- accumulateUsage,
111
- buildAssistantBatchMessage,
112
- buildBatchChatCompletionRequest,
113
- buildBatchName,
114
- buildToolBatchMessage,
115
- type ExecutedBatchTool,
116
- extractJsonObject,
117
- getBatchUsage,
118
- hasUsage,
119
- parseToolArgumentsOrRaw,
120
- toLocalToolCall,
121
- } from "./batch-utils";
122
- import {
123
- type CompactionSettings,
124
- createCompactionSummaryMessage,
125
- DEFAULT_KEEP_RECENT_TOKENS,
126
- DEFAULT_RESERVE_TOKENS,
127
- estimateConversationTokens,
128
- extractUserContent,
129
- generateCompactionSummary,
130
- POST_TURN_MIN_TOKENS,
131
- prepareCompaction,
132
- shouldCompactContext,
133
- } from "./compaction";
134
- import { CouncilManager } from "./council-manager.js";
135
- import { CrossTurnDedup, isCrossTurnDedupEnabled } from "./cross-turn-dedup.js";
136
- import { DelegationManager } from "./delegations";
137
- import { loadFlowResumeDigest } from "./flow-resume.js";
138
- import { MessageProcessor, type MessageProcessorDeps } from "./message-processor.js";
139
- import { lastPersistedSeq } from "./message-seq.js";
140
- import { buildSystemPrompt, MAX_TOOL_ROUNDS } from "./prompts";
141
- import { getReadPathBudgetCap, ReadPathBudget } from "./read-path-budget.js";
142
- import { withStreamRetry } from "./retry-stream.js";
143
- import { StreamRunner, type StreamRunnerDeps } from "./stream-runner.js";
144
- import { type ModelTaskKind, resolveModelForTask } from "./sub-agent-model-tier.js";
145
- import { setProviderHint } from "./token-counter.js";
146
- import type { ToolLoopCapAsk } from "./tool-loop-cap.js";
147
- import { firstLine, formatSubagentActivity, toToolResult } from "./tool-utils";
148
-
149
- // ---------------------------------------------------------------------------
150
- // Provider implementations
151
- // ---------------------------------------------------------------------------
152
-
153
- /**
154
- * Create a provider factory for the given provider ID using the shared runtime module.
155
- */
156
- function createProvider(providerId: ProviderId, apiKey: string, baseURL?: string): LegacyProvider {
157
- return createProviderFactory(providerId, { apiKey, baseURL }).factory;
158
- }
159
-
160
- /**
161
- * True iff `url` equals the default apiBase of ANY registered provider.
162
- * Used to detect stale carryover of one provider's default URL into another
163
- * provider's factory after a /model switch (see setModel + setApiKey).
164
- */
165
- function isAnyProviderApiBase(url: string | null | undefined): boolean {
166
- if (!url) return false;
167
- for (const id of ALL_PROVIDER_IDS) {
168
- if (url === apiBaseFor(id)) return true;
169
- }
170
- return false;
171
- }
172
-
173
- /**
174
- * Generate a session title using the Anthropic provider.
175
- * Kept as a lightweight stub for Phase 0 — title generation ships in Phase 1.
176
- */
177
- function genTitle(
178
- _provider: LegacyProvider,
179
- userMessage: string,
180
- ): Promise<{ title: string; modelId: string; usage?: { totalTokens?: number } }> {
181
- // Phase 0 stub: return a truncated version of the first user message as title.
182
- // Phase 1 will replace this with a real LLM-based title generation call.
183
- const title = userMessage.slice(0, 60).trim() || "New session";
184
- return Promise.resolve({ title, modelId: getCurrentModel() });
185
- }
186
-
187
- /**
188
- * Resolve a model ID to a runnable AI SDK LanguageModel.
189
- * Uses the Anthropic provider factory created by createProvider().
190
- */
191
- function resolveModelRuntime(provider: LegacyProvider, modelId: string): ResolvedModelRuntime {
192
- return resolveRuntime(provider, modelId);
193
- }
194
-
195
- async function toolSetToBatchTools(_tools: ToolSet): Promise<BatchFunctionTool[]> {
196
- // Batch API not supported with Anthropic in Phase 0. Phase 1 may add this.
197
- throw new Error("Batch API not available in Phase 0. Use standard streaming mode.");
198
- }
199
-
200
- async function createBatch(_opts: BatchClientOptions & { name?: string }): Promise<{ batch_id: string }> {
201
- throw new Error("Batch API not available in Phase 0. Use standard streaming mode.");
202
- }
203
-
204
- async function addBatchRequests(
205
- _opts: BatchClientOptions & { batchId: string; batchRequests: unknown[] },
206
- ): Promise<void> {
207
- throw new Error("Batch API not available in Phase 0. Use standard streaming mode.");
208
- }
209
-
210
- async function pollBatchRequestResult(
211
- _opts: BatchClientOptions & { batchId: string; batchRequestId: string },
212
- ): Promise<unknown> {
213
- throw new Error("Batch API not available in Phase 0. Use standard streaming mode.");
214
- }
215
-
216
- function getBatchChatCompletion(_result: unknown): BatchChatCompletionResponse {
217
- throw new Error("Batch API not available in Phase 0. Use standard streaming mode.");
218
- }
219
-
220
- function createTools(
221
- _bash: unknown,
222
- _provider: LegacyProvider,
223
- _mode: unknown,
224
- _opts?: {
225
- runTask?: (request: TaskRequest, abortSignal?: AbortSignal) => Promise<ToolResult>;
226
- runDelegation?: (request: TaskRequest, abortSignal?: AbortSignal) => Promise<ToolResult>;
227
- readDelegation?: (id: string) => Promise<ToolResult>;
228
- listDelegations?: () => Promise<ToolResult>;
229
- scheduleManager?: unknown;
230
- subagents?: unknown[];
231
- sendTelegramFile?: (filePath: string) => Promise<ToolResult>;
232
- sessionId?: string;
233
- modelId?: string;
234
- },
235
- ): ToolSet {
236
- return createBuiltinTools(_bash as BashTool, (_mode ?? "agent") as AgentMode, {
237
- runTask: _opts?.runTask,
238
- runDelegation: _opts?.runDelegation,
239
- readDelegation: _opts?.readDelegation,
240
- listDelegations: _opts?.listDelegations,
241
- modelId: _opts?.modelId,
242
- });
243
- }
244
-
245
- // ---------------------------------------------------------------------------
246
- // END Plan 00-05 provider implementations
247
- // (Phase 12.3 — `buildVisionUserMessages` was inlined into StreamRunner;
248
- // vision is an anti-feature per PROJECT.md Out-of-Scope so the helper is gone.)
249
- // ---------------------------------------------------------------------------
250
-
251
- // ============================================================================
252
- // Agent class — fields, constructor, session management, core processing loop
253
- // ============================================================================
254
-
255
- export class Agent {
256
- private provider: LegacyProvider | null = null;
257
- private providerId: ProviderId = null!;
258
- private apiKey: string | null = null;
259
- private baseURL: string | null = null;
260
- private bash: BashTool;
261
- private delegations: DelegationManager;
262
- private schedules: ScheduleManager;
263
- private sessionStore: SessionStore | null = null;
264
- private workspace: WorkspaceInfo | null = null;
265
- private session: SessionInfo | null = null;
266
- private messages: ModelMessage[] = [];
267
- private messageSeqs: Array<number | null> = [];
268
- private abortController: AbortController | null = null;
269
- private maxToolRounds: number;
270
- private mode: AgentMode = "agent";
271
- private modelId: string;
272
- private maxTokens: number;
273
- private planContext: string | null = null;
274
- private subagentStatusListeners = new Set<(status: SubagentStatus | null) => void>();
275
- private sendTelegramFile: ((filePath: string) => Promise<ToolResult>) | null = null;
276
- private batchApi = false;
277
- private sessionStartHookFired = false;
278
- /** PIL context for current turn — set after runPipeline, cleared after recordUsage. */
279
- private _pilActive = false;
280
- private _pilEnrichmentDelta = 0;
281
- /**
282
- * Breakdown of the system prompt + messages + tools sent on the last call.
283
- * Captured immediately before streamText and consumed by recordUsage to
284
- * attach to the cost-log entry. Cleared after recordUsage so subsequent
285
- * non-message calls don't reuse stale data.
286
- */
287
- private _lastPromptBreakdown: Record<string, number> | null = null;
288
- /**
289
- * Phase O1 — JSON-shape of the providerOptions object on the most
290
- * recent streamText call. Captured immediately before streamText and
291
- * consumed by recordUsage; cleared after. Cost-leak forensics surfaces
292
- * this so we can answer "did this billed call carry store=true?" etc.
293
- */
294
- private _lastProviderOptionsShape: string | null = null;
295
- /** External abort context from src/index.ts SIGINT handler (TUI-04). */
296
- private externalAbortContext: import("./abort.js").AbortContext | null = null;
297
- /** Pending calls log for Pitfall 9 staged-write tracking. */
298
- private pendingCalls: import("./pending-calls.js").PendingCallsLog | null = null;
299
- /** Active permission mode — controls which tool calls auto-approve vs require user confirmation. */
300
- private permissionMode: PermissionMode = "safe";
301
- /** Flow run init promise — awaited before first message turn. */
302
- private _flowReady: Promise<void> | null = null;
303
- /** Active .muonroi-flow/ run ID for this session. */
304
- private _activeRunId: string | null = null;
305
- /** Resume digest loaded from active flow run state.md. */
306
- private _resumeDigest: string | null = null;
307
- /**
308
- * Phase 12.1-02: All council state (synthesis/continuation flags, resolver
309
- * + buffer maps, stats) lives inside CouncilManager. Agent holds one ref.
310
- */
311
- private councilManager: CouncilManager;
312
- /** Whether compaction already ran during the current turn (prevents double-compact). */
313
- private _compactedThisTurn = false;
314
- /** Guard: OAuth provider init runs at most once per Agent instance. */
315
- private _oauthInitDone = false;
316
- /** P0 native observation: warning IDs surfaced earlier in this session — sent as intent_context.priorWarningIdsInSession. */
317
- private _priorWarningIdsInSession = new Set<string>();
318
- /** EE session guidance: structured warnings accumulated across turns — injected into model context at turn start. Keyed by principle_uuid to deduplicate. */
319
- private _sessionEEGuidance = new Map<
320
- string,
321
- { toolName: string; message: string; why: string; confidence: number }
322
- >();
323
- /** P0 native observation: rolling buffer of assistant reasoning text in current turn — last 200 chars sent as intent_context.assistantReasoningExcerpt. */
324
- private _turnAssistantReasoning = "";
325
- /** Per-call correlation id for top-level streamText; set in MessageProcessor, consumed by recordUsage / onFinish llm-done. */
326
- private _currentCallId = "";
327
- /** P0 native observation: first 200 chars of the user's current turn — sent as intent_context.userGoalExcerpt to PreToolUse. */
328
- private _turnUserGoalExcerpt = "";
329
- /** Compaction statistics tracking count and total tokens saved. */
330
- private _compactionStats: { count: number; totalSaved: number } = { count: 0, totalSaved: 0 };
331
- /**
332
- * Pinned message sequences. A pinned user message is preserved verbatim across
333
- * compaction — it is re-injected as a system note immediately after the
334
- * compaction summary, so the model still sees the original wording.
335
- * V1 only supports user messages (avoids splitting tool-call/result pairs).
336
- */
337
- private _pinnedSeqs = new Set<number>();
338
- /** One-shot cwd note injected at the start of the next processMessage turn after setCwd(). Cleared after injection. */
339
- private _pendingCwdNote: string | null = null;
340
-
341
- // Phase C3: cross-turn tool-output dedup. One instance per session; bumped
342
- // on each user turn. Lazily initialized so disabled-via-env path stays cheap.
343
- private _crossTurnDedup: CrossTurnDedup | null = isCrossTurnDedupEnabled() ? new CrossTurnDedup() : null;
344
- // Phase C4 — input-keyed read-path budget. Complements C3 (output hash) by
345
- // catching re-reads of files the agent edited between rounds. Disabled
346
- // when MUONROI_MAX_READS_PER_PATH=0.
347
- private _readBudget: ReadPathBudget | null = (() => {
348
- const cap = getReadPathBudgetCap();
349
- return cap > 0 ? new ReadPathBudget(cap) : null;
350
- })();
351
-
352
- constructor(
353
- apiKey: string | undefined,
354
- baseURL?: string,
355
- model?: string,
356
- maxToolRounds?: number,
357
- options: AgentOptions = {},
358
- ) {
359
- this.baseURL = baseURL || null;
360
- this.bash = new BashTool(process.cwd(), {
361
- sandboxMode: options.sandboxMode ?? "off",
362
- sandboxSettings: options.sandboxSettings,
363
- shellSettings: options.shellSettings ?? getCurrentShellSettings(),
364
- });
365
- this.delegations = new DelegationManager(() => this.bash.getCwd());
366
- // Phase 12.1-02: council state + helpers live in CouncilManager. DI via
367
- // getter callbacks so the manager reads live Agent state without holding
368
- // a circular reference to the Agent instance.
369
- this.councilManager = new CouncilManager({
370
- getModelId: () => this.modelId,
371
- getSessionId: () => this.session?.id ?? null,
372
- hasSessionStore: () => this.sessionStore !== null,
373
- getMessages: () => this.messages,
374
- getBash: () => this.bash,
375
- getMode: () => this.mode,
376
- });
377
-
378
- const initialMode: AgentMode = "agent";
379
- this.modelId = normalizeModelId(model || getCurrentModel(initialMode));
380
- this.providerId = detectProviderForModel(this.modelId);
381
- setProviderHint(this.providerId);
382
- if (apiKey) {
383
- this.setApiKey(apiKey, baseURL);
384
- }
385
- this.schedules = new ScheduleManager(
386
- () => this.bash.getCwd(),
387
- () => this.modelId,
388
- );
389
- this.maxToolRounds = maxToolRounds || MAX_TOOL_ROUNDS;
390
- const envMax = Number(process.env.MUONROI_MAX_TOKENS);
391
- this.maxTokens = Number.isFinite(envMax) && envMax > 0 ? envMax : 16_384;
392
- this.batchApi = options.batchApi ?? false;
393
- // TUI-04: wire external abort context and pending calls log if provided.
394
- this.externalAbortContext = options.abortContext ?? null;
395
- this.pendingCalls = options.pendingCalls ?? null;
396
- this.permissionMode = options.permissionMode ?? "safe";
397
- ensureDefaultMcpServers();
398
-
399
- if (options.persistSession !== false) {
400
- this.sessionStore = new SessionStore(this.bash.getCwd());
401
- this.workspace = this.sessionStore.getWorkspace();
402
- this.session = this.sessionStore.openSession(options.session, this.modelId, this.mode, this.bash.getCwd());
403
- this.mode = this.session.mode;
404
- const transcript = loadTranscriptState(this.session.id);
405
- this.messages = transcript.messages;
406
- this.messageSeqs = transcript.seqs;
407
- this.sessionStore.setModel(this.session.id, this.modelId);
408
-
409
- // Flow run setup — fire-and-forget, awaited before first message turn.
410
- this._flowReady = this._initFlow();
411
- }
412
- }
413
-
414
- /**
415
- * Initialize .muonroi-flow/ run for this session.
416
- * Fail-open: any error sets _activeRunId = null silently.
417
- */
418
- private async _initFlow(): Promise<void> {
419
- await bootstrapEEClient().catch(() => {});
420
- try {
421
- const flowDir = await ensureFlowDir(this.bash.getCwd());
422
- const existing = await getActiveRunId(flowDir);
423
- if (existing) {
424
- this._activeRunId = existing;
425
- return;
426
- }
427
- const run = await createRun(flowDir);
428
- await setActiveRunId(flowDir, run.id);
429
- this._activeRunId = run.id;
430
- } catch {
431
- this._activeRunId = null;
432
- }
433
-
434
- // Load resume digest for PIL context injection (fail-open).
435
- try {
436
- this._resumeDigest = await loadFlowResumeDigest(this.bash.getCwd());
437
- } catch {
438
- this._resumeDigest = null;
439
- }
440
- }
441
-
442
- getModel(): string {
443
- return this.modelId;
444
- }
445
-
446
- getActiveRunId(): string | null {
447
- return this._activeRunId;
448
- }
449
-
450
- setModel(model: string): void {
451
- this.modelId = normalizeModelId(model);
452
- const newProviderId = detectProviderForModel(this.modelId);
453
- if (newProviderId !== this.providerId && this.apiKey) {
454
- this.providerId = newProviderId;
455
- setProviderHint(this.providerId);
456
- // Drop this.baseURL when it points at a DIFFERENT provider's default
457
- // apiBase — otherwise the rebuilt factory binds the new provider's
458
- // strategy to the OLD provider's URL, sending requests to the wrong
459
- // host. Evidence: session 2492d6579b1d — user switched defaultProvider
460
- // siliconflow→ (via UI), this.baseURL was still api.deepseek.com from
461
- // startup, SiliconflowStrategy.createFactory was created with that
462
- // baseURL, requests landed at api.deepseek.com which rejected the SF-
463
- // style model id ("deepseek-ai/DeepSeek-V4-Flash") with "supported API
464
- // model names are deepseek-v4-pro or deepseek-v4-flash".
465
- // A user-supplied custom baseURL is preserved only when it does NOT
466
- // match any known provider's apiBase (i.e. it's a real override, not
467
- // a stale default).
468
- const staleBaseURL = isAnyProviderApiBase(this.baseURL) && this.baseURL !== apiBaseFor(this.providerId);
469
- const effectiveBaseURL = staleBaseURL ? undefined : (this.baseURL ?? undefined);
470
- if (staleBaseURL) this.baseURL = null;
471
- this.provider = createProvider(this.providerId, this.apiKey, effectiveBaseURL);
472
- }
473
- if (this.sessionStore && this.session) {
474
- this.sessionStore.setModel(this.session.id, this.modelId);
475
- this.session = this.sessionStore.getRequiredSession(this.session.id);
476
- }
477
- }
478
-
479
- getMode(): AgentMode {
480
- return this.mode;
481
- }
482
-
483
- getSandboxMode(): SandboxMode {
484
- return this.bash.getSandboxMode();
485
- }
486
-
487
- setSandboxMode(mode: SandboxMode): void {
488
- this.bash.setSandboxMode(mode);
489
- }
490
-
491
- getSandboxSettings(): SandboxSettings {
492
- return this.bash.getSandboxSettings();
493
- }
494
-
495
- setSandboxSettings(settings: SandboxSettings): void {
496
- this.bash.setSandboxSettings(settings);
497
- }
498
-
499
- setMode(mode: AgentMode): void {
500
- if (mode !== this.mode) {
501
- this.mode = mode;
502
- const modeModel = getModeSpecificModel(mode);
503
- if (modeModel) {
504
- this.modelId = normalizeModelId(modeModel);
505
- }
506
- if (this.sessionStore && this.session) {
507
- this.sessionStore.setMode(this.session.id, mode);
508
- this.sessionStore.setModel(this.session.id, this.modelId);
509
- this.session = this.sessionStore.getRequiredSession(this.session.id);
510
- }
511
- }
512
- }
513
-
514
- setPlanContext(ctx: string | null): void {
515
- this.planContext = ctx;
516
- }
517
-
518
- setSendTelegramFile(fn: ((filePath: string) => Promise<ToolResult>) | null): void {
519
- this.sendTelegramFile = fn;
520
- }
521
-
522
- hasApiKey(): boolean {
523
- return !!this.apiKey;
524
- }
525
-
526
- setApiKey(apiKey: string, baseURL?: string): void {
527
- this.apiKey = apiKey;
528
- // Drop baseURL when it points at a DIFFERENT provider's default apiBase
529
- // (e.g. caller passed the legacy anthropic URL while providerId is
530
- // siliconflow — without this we'd send siliconflow requests to
531
- // api.anthropic.com or similar). User-supplied custom URLs that don't
532
- // match any known provider's apiBase are preserved as real overrides.
533
- const stale = isAnyProviderApiBase(baseURL) && baseURL !== apiBaseFor(this.providerId);
534
- const effectiveBaseURL = stale ? undefined : baseURL;
535
- this.baseURL = stale ? null : baseURL || null;
536
- this.provider = createProvider(this.providerId, apiKey, effectiveBaseURL);
537
- }
538
-
539
- setProviderAndKey(providerId: ProviderId, apiKey: string, baseURL?: string): void {
540
- this.providerId = providerId;
541
- setProviderHint(this.providerId);
542
- this.setApiKey(apiKey, baseURL);
543
- }
544
-
545
- getProviderId(): ProviderId {
546
- return this.providerId;
547
- }
548
-
549
- getCwd(): string {
550
- return this.bash.getCwd();
551
- }
552
-
553
- setCwd(dir: string): void {
554
- this.bash.setCwd(dir);
555
- this._pendingCwdNote = `(system: working directory has been changed to ${dir} — subsequent shell commands run from there; do NOT cd to that path again)`;
556
- }
557
-
558
- getMessages(): ModelMessage[] {
559
- return this.messages;
560
- }
561
-
562
- async listSchedules(): Promise<StoredSchedule[]> {
563
- return this.schedules.list();
564
- }
565
-
566
- async removeSchedule(id: string): Promise<string> {
567
- const removed = await this.schedules.remove(id);
568
- return removed ? `Removed schedule "${removed.name}".` : `Schedule "${id}" not found.`;
569
- }
570
-
571
- async getScheduleDaemonStatus(): Promise<ScheduleDaemonStatus> {
572
- return this.schedules.getDaemonStatus();
573
- }
574
-
575
- getContextStats(
576
- contextWindow: number,
577
- inFlightText = "",
578
- ): {
579
- contextWindow: number;
580
- usedTokens: number;
581
- remainingTokens: number;
582
- ratioUsed: number;
583
- ratioRemaining: number;
584
- } {
585
- const system = buildSystemPrompt(
586
- this.bash.getCwd(),
587
- this.mode,
588
- this.bash.getSandboxMode(),
589
- this.planContext,
590
- undefined,
591
- this.bash.getSandboxSettings(),
592
- this.providerId,
593
- );
594
- const usedTokens = Math.min(contextWindow, estimateConversationTokens(system, this.messages, inFlightText));
595
- const remainingTokens = Math.max(0, contextWindow - usedTokens);
596
-
597
- return {
598
- contextWindow,
599
- usedTokens,
600
- remainingTokens,
601
- ratioUsed: usedTokens / contextWindow,
602
- ratioRemaining: remainingTokens / contextWindow,
603
- };
604
- }
605
-
606
- async generateTitle(userMessage: string): Promise<string> {
607
- const provider = this.provider;
608
- if (!provider) {
609
- return "New session";
610
- }
611
-
612
- const generated = await genTitle(provider, userMessage);
613
- this.recordUsage(generated.usage, "title", generated.modelId);
614
- if (this.sessionStore && this.session && !this.session.title && generated.title) {
615
- this.sessionStore.setTitle(this.session.id, generated.title);
616
- this.session = this.sessionStore.getRequiredSession(this.session.id);
617
- }
618
- return generated.title;
619
- }
620
-
621
- async askSideQuestion(question: string, signal?: AbortSignal): Promise<SideQuestionResult> {
622
- if (!this.provider) {
623
- return { response: "No API key configured." };
624
- }
625
-
626
- const contextParts: string[] = [];
627
- let charBudget = 2000;
628
- for (let i = this.messages.length - 1; i >= 0 && charBudget > 0; i--) {
629
- const msg = this.messages[i];
630
- if (msg.role !== "user" && msg.role !== "assistant") continue;
631
- const text =
632
- typeof msg.content === "string"
633
- ? msg.content
634
- : Array.isArray(msg.content)
635
- ? msg.content
636
- .filter((p: { type: string }) => p.type === "text")
637
- .map((p: { type: string; text?: string }) => p.text ?? "")
638
- .join("")
639
- : "";
640
- if (!text) continue;
641
- const snippet = text.length > 400 ? `${text.slice(0, 400)}…` : text;
642
- contextParts.unshift(`[${msg.role}]: ${snippet}`);
643
- charBudget -= snippet.length;
644
- }
645
- const conversationContext = contextParts.join("\n\n");
646
-
647
- const result = await runSideQuestion(question, this.provider, this.modelId, conversationContext, signal);
648
- this.recordUsage(result.usage, "other");
649
- return result;
650
- }
651
-
652
- abort(): void {
653
- this.abortController?.abort();
654
- this.emitSubagentStatus(null);
655
- }
656
-
657
- async cleanup(): Promise<void> {
658
- // Slow-path sidecar — write transcript to disk SYNCHRONOUSLY before
659
- // racing the async HTTP extract. Survives X-close + EE-offline.
660
- try {
661
- emitTranscriptToDisk(this.messages, this.getSessionId(), "cli-exit", this.bash.getCwd());
662
- } catch {
663
- /* fail-open */
664
- }
665
- await Promise.allSettled([
666
- this.bash.cleanup(),
667
- shutdownWorkspaceLspManager(this.bash.getCwd()),
668
- extractSession(this.messages, this.bash.getCwd(), "cli-exit", this.getSessionId()),
669
- ]);
670
- }
671
-
672
- // Tool-loop cap handler — set by the UI (app.tsx) at startup. Invoked from
673
- // the message-processor streamText loop when stepCount reaches the current
674
- // cap. The UI surfaces an askcard ("Continue +50? / Stop and answer") and
675
- // resolves with the verdict. When unset, the loop stops gracefully — no
676
- // hard-throw, matches the user-friendly behaviour we promised.
677
- private _toolLoopCapHandler: ToolLoopCapAsk | null = null;
678
-
679
- setToolLoopCapHandler(fn: ToolLoopCapAsk | null): void {
680
- this._toolLoopCapHandler = fn;
681
- }
682
-
683
- respondToToolApproval(approvalId: string, approved: boolean): void {
684
- const toolApprovalResponse: ModelMessage = {
685
- role: "tool",
686
- content: [
687
- {
688
- type: "tool-approval-response" as const,
689
- approvalId,
690
- approved,
691
- },
692
- ],
693
- };
694
- this.messages.push(toolApprovalResponse);
695
- this.messageSeqs.push(null);
696
- }
697
-
698
- async clearHistory(): Promise<void> {
699
- // D-09: Extract messages accumulated since last clear BEFORE reset
700
- try {
701
- emitTranscriptToDisk(this.messages, this.getSessionId(), "cli-clear", this.bash.getCwd());
702
- } catch {
703
- /* fail-open */
704
- }
705
- await extractSession(this.messages, this.bash.getCwd(), "cli-clear", this.getSessionId()).catch(() => {}); // D-05: redundant safety — extractSession already swallows
706
- this.startNewSession();
707
- }
708
-
709
- startNewSession(): SessionSnapshot | null {
710
- if (this.sessionStartHookFired) {
711
- const endInput: SessionEndHookInput = {
712
- hook_event_name: "SessionEnd",
713
- session_id: this.session?.id,
714
- cwd: this.bash.getCwd(),
715
- };
716
- this.fireHook(endInput).catch(() => {});
717
- this.sessionStartHookFired = false;
718
- }
719
-
720
- // Reset token counters, cost, and compaction state for the new session
721
- statusBarStore.setState({
722
- in_tokens: 0,
723
- out_tokens: 0,
724
- cache_read_tokens: 0,
725
- cache_creation_tokens: 0,
726
- session_usd: 0,
727
- ctx_tokens: 0,
728
- compaction_summary: undefined,
729
- });
730
-
731
- this._compactionStats = { count: 0, totalSaved: 0 };
732
- this._pinnedSeqs.clear();
733
-
734
- if (!this.sessionStore) {
735
- this.messages = [];
736
- this.messageSeqs = [];
737
- return null;
738
- }
739
-
740
- this.sessionStore = new SessionStore(this.bash.getCwd());
741
- this.workspace = this.sessionStore.getWorkspace();
742
- // Collapse double startNewSession() calls into a single row. The current
743
- // session is REUSED (not orphaned with a fresh createSession) when it is
744
- // brand-new and empty — no persisted messages in memory AND no title.
745
- // Root cause of ~60% orphaned session rows (1187/1966): the /clear slash
746
- // path calls clearHistory() — which already starts a new session — and then
747
- // resetToNewSession(), which started ANOTHER. The first session never
748
- // received any work and was left title-less and empty. The first call here
749
- // still sees the prior conversation in `this.messages` (non-empty → new
750
- // row, correct); the immediate second call sees the just-cleared empty
751
- // session and reuses it instead of creating a twin.
752
- const cur = this.session;
753
- if (cur && this.messages.length === 0 && !cur.title) {
754
- this.messageSeqs = [];
755
- return this.getSessionSnapshot();
756
- }
757
- this.session = this.sessionStore.createSession(this.modelId, this.mode, this.bash.getCwd());
758
- this.messages = [];
759
- this.messageSeqs = [];
760
- return this.getSessionSnapshot();
761
- }
762
-
763
- getSessionInfo(): SessionInfo | null {
764
- return this.session;
765
- }
766
-
767
- getSessionId(): string | null {
768
- return this.session?.id || null;
769
- }
770
-
771
- getSessionTitle(): string | null {
772
- return this.session?.title || null;
773
- }
774
-
775
- getCompactionStats(): { count: number; totalSaved: number } {
776
- return { ...this._compactionStats };
777
- }
778
-
779
- /**
780
- * Pin a user message by its sequence number. Pinned messages survive
781
- * compaction verbatim — re-injected as a system note after the summary.
782
- * Returns true if the message was found, is a user message, and got pinned.
783
- */
784
- pinMessageBySeq(seq: number): boolean {
785
- const idx = this.messageSeqs.indexOf(seq);
786
- if (idx < 0) return false;
787
- if (this.messages[idx]?.role !== "user") return false;
788
- this._pinnedSeqs.add(seq);
789
- return true;
790
- }
791
-
792
- /** Pin the most recent user message in the live conversation. Returns its seq, or null. */
793
- pinLastUserMessage(): number | null {
794
- for (let i = this.messages.length - 1; i >= 0; i--) {
795
- if (this.messages[i]?.role !== "user") continue;
796
- const seq = this.messageSeqs[i];
797
- if (typeof seq === "number") {
798
- this._pinnedSeqs.add(seq);
799
- return seq;
800
- }
801
- }
802
- return null;
803
- }
804
-
805
- unpinMessageBySeq(seq: number): boolean {
806
- return this._pinnedSeqs.delete(seq);
807
- }
808
-
809
- getPinnedSeqs(): number[] {
810
- return [...this._pinnedSeqs].sort((a, b) => a - b);
811
- }
812
-
813
- getChatEntries(): ChatEntry[] {
814
- if (!this.session) return [];
815
- return buildChatEntries(this.session.id);
816
- }
817
-
818
- getSessionSnapshot(): SessionSnapshot | null {
819
- if (!this.session || !this.workspace) return null;
820
- return {
821
- workspace: this.workspace,
822
- session: this.session,
823
- messages: loadTranscript(this.session.id),
824
- entries: buildChatEntries(this.session.id),
825
- totalTokens: getSessionTotalTokens(this.session.id),
826
- };
827
- }
828
-
829
- onSubagentStatus(listener: (status: SubagentStatus | null) => void): () => void {
830
- this.subagentStatusListeners.add(listener);
831
- return () => {
832
- this.subagentStatusListeners.delete(listener);
833
- };
834
- }
835
-
836
- private emitSubagentStatus(status: SubagentStatus | null): void {
837
- for (const listener of this.subagentStatusListeners) {
838
- listener(status);
839
- }
840
- }
841
-
842
- private discardAbortedTurn(userMessage: ModelMessage): void {
843
- const idx = this.messages.lastIndexOf(userMessage);
844
- if (idx >= 0) {
845
- // Keep the user message but add a stub assistant response so the
846
- // conversation remains valid for follow-up messages after ESC.
847
- const alreadyHasResponse = idx < this.messages.length - 1 && this.messages[idx + 1]?.role === "assistant";
848
- if (!alreadyHasResponse) {
849
- this.messages.splice(idx + 1, 0, { role: "assistant", content: "[Interrupted]" });
850
- this.messageSeqs.splice(idx + 1, 0, null);
851
- }
852
- }
853
- }
854
-
855
- private recordUsage(
856
- usage?: {
857
- totalTokens?: number;
858
- inputTokens?: number;
859
- outputTokens?: number;
860
- cacheReadTokens?: number;
861
- cacheCreationTokens?: number;
862
- },
863
- source: UsageSource = "message",
864
- model = this.modelId,
865
- /**
866
- * Phase O1 — the providerOptions shape of the call that produced THIS event,
867
- * threaded explicitly per call. Multi-step turns emit one event per step and
868
- * a `task` sub-agent can run mid-turn, so a single mutable
869
- * `_lastProviderOptionsShape` corrupted later events (the clear nulled it
870
- * after step 1; an interleaved task overwrote it). When omitted (title /
871
- * other one-shot calls that set no shape), fall back to the mutable field,
872
- * which is cleared after each message event so they record null, not stale.
873
- */
874
- providerOptionsShape?: string | null,
875
- ): void {
876
- if (!usage) return;
877
- if (this.session) {
878
- const pilActive = source === "message" ? this._pilActive : false;
879
- const enrichmentDelta = source === "message" ? this._pilEnrichmentDelta : 0;
880
- // Attribute usage to the most recent persisted message — this lets
881
- // per-prompt cost analysis work (was null hardcoded → impossible).
882
- const lastSeq = lastPersistedSeq(this.messageSeqs);
883
- // Phase O1 — providerOptions shape (types only, no values) attached
884
- // to every usage event so post-mortem can answer "what provider
885
- // options did this billed call carry?". Prefer the explicitly-threaded
886
- // shape (correct per-event, immune to the clear + task interleaving);
887
- // fall back to the mutable field only when the caller passed nothing
888
- // (title / other), which is cleared below so they record null, not stale.
889
- const resolvedShape = providerOptionsShape !== undefined ? providerOptionsShape : this._lastProviderOptionsShape;
890
- recordUsageEvent(this.session.id, source, model, usage, lastSeq, pilActive, enrichmentDelta, resolvedShape);
891
- if (source === "message") {
892
- this._pilActive = false;
893
- this._pilEnrichmentDelta = 0;
894
- this._lastProviderOptionsShape = null;
895
- }
896
- }
897
- // Phase D — surfaced for harness E2E verification. Mirror the recorded usage
898
- // event onto the agent-mode sidechannel so spec processes can assert on
899
- // cacheReadTokens / cacheCreationTokens normalization without poking at the
900
- // child's sqlite. Best-effort, only fires when agent-mode runtime is set.
901
- try {
902
- const rt = (globalThis as Record<string, unknown>).__muonroiAgentRuntime as
903
- | { emitEvent?: (e: unknown) => void }
904
- | undefined;
905
- if (rt?.emitEvent) {
906
- const lastSeqForEvent = this.session ? lastPersistedSeq(this.messageSeqs) : null;
907
- rt.emitEvent({
908
- t: "event",
909
- kind: "usage",
910
- source,
911
- model,
912
- inputTokens: usage.inputTokens,
913
- outputTokens: usage.outputTokens,
914
- cacheReadTokens: usage.cacheReadTokens,
915
- cacheCreationTokens: usage.cacheCreationTokens,
916
- messageSeq: lastSeqForEvent,
917
- });
918
- }
919
- } catch {
920
- // best-effort: do not let sidechannel failures interrupt usage recording
921
- }
922
- // Update status bar token counters + provider/model + cache metrics + cost
923
- const prev = statusBarStore.getState();
924
- const info = getModelInfo(model);
925
- const totalInput = usage.inputTokens ?? 0;
926
- const cacheRead = usage.cacheReadTokens ?? 0;
927
- const cacheCreate = usage.cacheCreationTokens ?? 0;
928
- const output = usage.outputTokens ?? 0;
929
- const priceIn = info?.inputPrice ?? 0;
930
- const priceCached = info?.cachedInputPrice ?? priceIn * 0.1;
931
- const priceOut = info?.outputPrice ?? 0;
932
- // API inputTokens includes cacheRead — subtract to get non-cached portion
933
- const nonCachedInput = Math.max(0, totalInput - cacheRead - cacheCreate);
934
- const turnCostMicros =
935
- nonCachedInput * priceIn + cacheRead * priceCached + cacheCreate * priceIn + output * priceOut;
936
- // F5 — ctx_tokens reflects the CURRENT call's input size (≈ context
937
- // window usage), not cumulative. Lets the user see "how full is my
938
- // window" instead of "how much have I billed in total this session".
939
- // Pair with context-fill % derived from model contextWindow.
940
- const ctxWindow = info?.contextWindow ?? 0;
941
- const ctxPct = ctxWindow > 0 ? Math.min(100, Math.round((totalInput / ctxWindow) * 100)) : undefined;
942
- statusBarStore.setState({
943
- in_tokens: prev.in_tokens + totalInput,
944
- out_tokens: prev.out_tokens + output,
945
- cache_read_tokens: (prev.cache_read_tokens ?? 0) + cacheRead,
946
- cache_creation_tokens: (prev.cache_creation_tokens ?? 0) + cacheCreate,
947
- session_usd: prev.session_usd + turnCostMicros / 1_000_000,
948
- provider: this.providerId,
949
- model,
950
- ctx_tokens: totalInput,
951
- ctx_pct: ctxPct,
952
- });
953
-
954
- // Append to cost-log JSONL so `usage report --by callsite` can surface
955
- // where orchestrator/task/title traffic is actually spending.
956
- // Best-effort: failures inside appendCostLog are swallowed (see cost-log.ts).
957
- const breakdown = source === "message" ? (this._lastPromptBreakdown ?? undefined) : undefined;
958
- appendCostLog({
959
- ts: Date.now(),
960
- provider: this.providerId,
961
- model,
962
- estimatedUsd: turnCostMicros / 1_000_000,
963
- callsite: `orchestrator.${source}`,
964
- phase: source,
965
- actualInputTokens: totalInput,
966
- actualOutputTokens: output,
967
- cachedInputTokens: cacheRead,
968
- systemChars: breakdown?.systemChars,
969
- promptChars: breakdown?.messagesChars,
970
- breakdown,
971
- }).catch(() => undefined);
972
- // Don't clear breakdown — onStepFinish fires recordUsage per step within
973
- // the same streamText call, and they all share the same prompt structure.
974
- // It is overwritten on the next streamText setup, which is the right scope.
975
- }
976
-
977
- async consumeBackgroundNotifications(): Promise<string[]> {
978
- try {
979
- const notifications = await this.delegations.consumeNotifications();
980
- for (const notification of notifications) {
981
- this.messages.push({ role: "system", content: notification.message });
982
- let seq: number | null = null;
983
- if (this.session) {
984
- seq = appendSystemMessage(this.session.id, notification.message);
985
- }
986
- this.messageSeqs.push(seq);
987
-
988
- const notifInput: NotificationHookInput = {
989
- hook_event_name: "Notification",
990
- message: notification.message,
991
- session_id: this.session?.id,
992
- cwd: this.bash.getCwd(),
993
- };
994
- this.fireHook(notifInput).catch(() => {});
995
- }
996
- return notifications.map((notification) => notification.message);
997
- } catch {
998
- return [];
999
- }
1000
- }
1001
-
1002
- private getBatchClientOptions(signal?: AbortSignal): BatchClientOptions {
1003
- if (!this.apiKey) {
1004
- throw new Error("API key required. Add an API key to continue.");
1005
- }
1006
-
1007
- return {
1008
- apiKey: this.apiKey,
1009
- baseURL: this.baseURL ?? undefined,
1010
- signal,
1011
- };
1012
- }
1013
-
1014
- private async executeBatchToolCall(
1015
- tools: ToolSet,
1016
- toolCall: ToolCall,
1017
- messages: ModelMessage[],
1018
- signal?: AbortSignal,
1019
- ): Promise<{ input: unknown; result: ToolResult }> {
1020
- const tool = tools[toolCall.function.name];
1021
- if (!tool || tool.type === "provider" || typeof tool.execute !== "function") {
1022
- return {
1023
- input: parseToolArgumentsOrRaw(toolCall.function.arguments),
1024
- result: {
1025
- success: false,
1026
- output: `Tool "${toolCall.function.name}" is unavailable in batch mode.`,
1027
- },
1028
- };
1029
- }
1030
-
1031
- let parsedInput: unknown;
1032
- try {
1033
- parsedInput = toolCall.function.arguments.trim() ? JSON.parse(toolCall.function.arguments) : {};
1034
- } catch (error) {
1035
- const message = error instanceof Error ? error.message : String(error);
1036
- return {
1037
- input: toolCall.function.arguments,
1038
- result: {
1039
- success: false,
1040
- output: `Tool "${toolCall.function.name}" received invalid JSON arguments: ${message}`,
1041
- },
1042
- };
1043
- }
1044
-
1045
- try {
1046
- const output = await tool.execute(parsedInput as never, {
1047
- toolCallId: toolCall.id,
1048
- messages,
1049
- abortSignal: signal,
1050
- });
1051
- return {
1052
- input: parsedInput,
1053
- result: toToolResult(output),
1054
- };
1055
- } catch (error) {
1056
- if (signal?.aborted) {
1057
- throw error;
1058
- }
1059
- const message = error instanceof Error ? error.message : String(error);
1060
- return {
1061
- input: parsedInput,
1062
- result: {
1063
- success: false,
1064
- output: `Tool "${toolCall.function.name}" failed: ${message}`,
1065
- },
1066
- };
1067
- }
1068
- }
1069
-
1070
- private async runTaskRequestBatch(args: {
1071
- request: TaskRequest;
1072
- childMessages: ModelMessage[];
1073
- childSystem: string;
1074
- childRuntime: ReturnType<typeof resolveModelRuntime>;
1075
- childTools: ToolSet;
1076
- maxSteps: number;
1077
- initialDetail: string;
1078
- onActivity?: (detail: string) => void;
1079
- signal?: AbortSignal;
1080
- }): Promise<ToolResult> {
1081
- const {
1082
- request,
1083
- childMessages,
1084
- childSystem,
1085
- childRuntime,
1086
- childTools,
1087
- maxSteps,
1088
- initialDetail,
1089
- onActivity,
1090
- signal,
1091
- } = args;
1092
-
1093
- const childCaps = getProviderCapabilities(requireRuntimeProvider(childRuntime));
1094
- if (childCaps.usesResponsesAPI(childRuntime.modelInfo)) {
1095
- throw new Error("Batch mode currently supports chat-completions models only.");
1096
- }
1097
-
1098
- const batchTools = !childCaps.supportsClientTools(childRuntime.modelInfo)
1099
- ? []
1100
- : await toolSetToBatchTools(childTools);
1101
- const batch = await createBatch({
1102
- ...this.getBatchClientOptions(signal),
1103
- name: buildBatchName(`task-${request.agent}`, request.description),
1104
- });
1105
-
1106
- const turnMessages: ModelMessage[] = [];
1107
- const totalUsage: ProcessMessageUsage = {};
1108
- let assistantText = "";
1109
- let lastActivity = initialDetail;
1110
-
1111
- for (let round = 0; round < maxSteps; round++) {
1112
- const batchRequestId = `task-${Date.now()}-${round + 1}`;
1113
- await addBatchRequests({
1114
- ...this.getBatchClientOptions(signal),
1115
- batchId: batch.batch_id,
1116
- batchRequests: [
1117
- {
1118
- batch_request_id: batchRequestId,
1119
- batch_request: {
1120
- chat_get_completion: buildBatchChatCompletionRequest({
1121
- modelId: childRuntime.modelId,
1122
- system: childSystem,
1123
- messages: [...childMessages, ...turnMessages],
1124
- temperature: request.agent === "explore" ? 0.2 : 0.5,
1125
- maxOutputTokens: !childCaps.acceptsParam("maxOutputTokens", childRuntime.modelInfo)
1126
- ? undefined
1127
- : Math.min(this.maxTokens, 8_192),
1128
- reasoningEffort: childRuntime.providerOptions?.xai.reasoningEffort,
1129
- tools: batchTools,
1130
- }),
1131
- },
1132
- },
1133
- ],
1134
- });
1135
-
1136
- const result = await pollBatchRequestResult({
1137
- ...this.getBatchClientOptions(signal),
1138
- batchId: batch.batch_id,
1139
- batchRequestId,
1140
- });
1141
- const response = getBatchChatCompletion(result);
1142
- accumulateUsage(totalUsage, getBatchUsage(response));
1143
-
1144
- const choice = response.choices[0];
1145
- if (!choice) {
1146
- throw new Error("Batch response did not contain any choices.");
1147
- }
1148
- const content = choice?.message.content ?? "";
1149
- if (content) {
1150
- assistantText += content;
1151
- }
1152
-
1153
- const requestMessages = [...childMessages, ...turnMessages];
1154
- const toolCalls = (choice?.message.tool_calls ?? []).map(toLocalToolCall);
1155
- const assistantMessage = buildAssistantBatchMessage(content, toolCalls);
1156
- if (assistantMessage) {
1157
- turnMessages.push(assistantMessage);
1158
- }
1159
-
1160
- if (toolCalls.length === 0) {
1161
- if (hasUsage(totalUsage)) {
1162
- this.recordUsage(totalUsage, "task", childRuntime.modelId);
1163
- }
1164
- const output = assistantText.trim() || `Task completed. Last action: ${lastActivity}`;
1165
- return {
1166
- success: true,
1167
- output,
1168
- task: {
1169
- agent: request.agent,
1170
- description: request.description,
1171
- summary: firstLine(output),
1172
- activity: lastActivity,
1173
- },
1174
- };
1175
- }
1176
-
1177
- const toolParts: ExecutedBatchTool[] = [];
1178
- for (const toolCall of toolCalls) {
1179
- const nextActivity = formatSubagentActivity(
1180
- toolCall.function.name,
1181
- parseToolArgumentsOrRaw(toolCall.function.arguments),
1182
- );
1183
- lastActivity = nextActivity;
1184
- onActivity?.(nextActivity);
1185
-
1186
- const executed = await this.executeBatchToolCall(childTools, toolCall, requestMessages, signal);
1187
- toolParts.push({
1188
- toolCall,
1189
- input: executed.input,
1190
- toolResult: executed.result,
1191
- });
1192
- }
1193
-
1194
- const toolMessage = buildToolBatchMessage(toolParts);
1195
- if (toolMessage) {
1196
- turnMessages.push(toolMessage);
1197
- }
1198
- }
1199
-
1200
- if (hasUsage(totalUsage)) {
1201
- this.recordUsage(totalUsage, "task", childRuntime.modelId);
1202
- }
1203
- const output = assistantText.trim() || `Task stopped after ${maxSteps} batch rounds. Last action: ${lastActivity}`;
1204
- return {
1205
- success: false,
1206
- output,
1207
- task: {
1208
- agent: request.agent,
1209
- description: request.description,
1210
- summary: output,
1211
- activity: lastActivity,
1212
- },
1213
- };
1214
- }
1215
-
1216
- /**
1217
- * Run a sub-agent task by spawning a child `streamText` session.
1218
- *
1219
- * Phase 12.3 — body extracted to `StreamRunner` (`./stream-runner.ts`).
1220
- * This method now builds the DI dep set and delegates to
1221
- * `StreamRunner.run()`. Public signature is unchanged so all callers
1222
- * (`runTask`, `tools/registry`, batch path, council path) work as before.
1223
- */
1224
- async runTaskRequest(
1225
- request: TaskRequest,
1226
- onActivity?: (detail: string) => void,
1227
- abortSignal?: AbortSignal,
1228
- ): Promise<ToolResult> {
1229
- const provider = this.requireProvider();
1230
- const deps: StreamRunnerDeps = {
1231
- getProvider: () => provider,
1232
- resolveModelForTask: (task) => this._resolveModelForTask(task),
1233
- getModelId: () => this.modelId,
1234
- getProviderId: () => this.providerId,
1235
- getBash: () => this.bash,
1236
- getMaxToolRounds: () => this.maxToolRounds,
1237
- getMaxTokens: () => this.maxTokens,
1238
- isBatchApiEnabled: () => this.batchApi,
1239
- getCrossTurnDedup: () => this._crossTurnDedup,
1240
- getReadBudget: () => this._readBudget,
1241
- recordUsage: (usage, source, model, shape) => this.recordUsage(usage, source, model, shape),
1242
- setCurrentCallId: (id) => {
1243
- this._currentCallId = id;
1244
- },
1245
- setLastProviderOptionsShape: (shape) => {
1246
- this._lastProviderOptionsShape = shape;
1247
- },
1248
- getSessionId: () => this.session?.id,
1249
- runTaskRequestBatch: (args) => this.runTaskRequestBatch(args),
1250
- };
1251
- const runner = new StreamRunner(deps);
1252
- return runner.run(request, onActivity, abortSignal);
1253
- }
1254
-
1255
- private async runTask(request: TaskRequest, abortSignal?: AbortSignal): Promise<ToolResult> {
1256
- const startInput: SubagentStartHookInput = {
1257
- hook_event_name: "SubagentStart",
1258
- agent_type: request.agent,
1259
- description: request.description,
1260
- session_id: this.session?.id,
1261
- cwd: this.bash.getCwd(),
1262
- };
1263
- await this.fireHook(startInput, abortSignal).catch(() => {});
1264
-
1265
- let result: ToolResult;
1266
- try {
1267
- result = await withStreamRetry(
1268
- () =>
1269
- this.runTaskRequest(
1270
- request,
1271
- (detail) => {
1272
- if (abortSignal?.aborted) return;
1273
- this.emitSubagentStatus({
1274
- agent: request.agent,
1275
- description: request.description,
1276
- detail,
1277
- });
1278
- },
1279
- abortSignal,
1280
- ),
1281
- {
1282
- signal: abortSignal,
1283
- onRetry: (info) => {
1284
- // Emit harness telemetry
1285
- try {
1286
- const _ar = (globalThis as Record<string, unknown>).__muonroiAgentRuntime as
1287
- | { emitEvent: (e: unknown) => void }
1288
- | undefined;
1289
- _ar?.emitEvent({
1290
- t: "event",
1291
- kind: "stream-retry",
1292
- ...info,
1293
- });
1294
- } catch {
1295
- /* best-effort */
1296
- }
1297
- try {
1298
- if (this.session) {
1299
- logInteraction(this.session.id, "stream_retry", {
1300
- data: {
1301
- attempt: info.attempt,
1302
- maxAttempts: info.maxAttempts,
1303
- errorName: info.errorName,
1304
- errorMessage: info.errorMessage.slice(0, 200),
1305
- nextDelayMs: info.nextDelayMs,
1306
- },
1307
- });
1308
- }
1309
- } catch {
1310
- /* fail-open */
1311
- }
1312
- },
1313
- },
1314
- );
1315
- } finally {
1316
- this.emitSubagentStatus(null);
1317
- }
1318
-
1319
- const stopInput: SubagentStopHookInput = {
1320
- hook_event_name: "SubagentStop",
1321
- agent_type: request.agent,
1322
- description: request.description,
1323
- success: result.success,
1324
- session_id: this.session?.id,
1325
- cwd: this.bash.getCwd(),
1326
- };
1327
- await this.fireHook(stopInput, abortSignal).catch(() => {});
1328
-
1329
- return result;
1330
- }
1331
-
1332
- private async runDelegation(request: TaskRequest, abortSignal?: AbortSignal): Promise<ToolResult> {
1333
- const taskCreatedInput: TaskCreatedHookInput = {
1334
- hook_event_name: "TaskCreated",
1335
- agent_type: request.agent,
1336
- description: request.description,
1337
- session_id: this.session?.id,
1338
- cwd: this.bash.getCwd(),
1339
- };
1340
- await this.fireHook(taskCreatedInput, abortSignal).catch(() => {});
1341
-
1342
- let result: ToolResult;
1343
- try {
1344
- if (abortSignal?.aborted) {
1345
- return { success: false, output: "[Cancelled]" };
1346
- }
1347
-
1348
- result = await this.delegations.start(request, {
1349
- model: this.modelId,
1350
- sandboxMode: this.bash.getSandboxMode(),
1351
- sandboxSettings: this.bash.getSandboxSettings(),
1352
- maxToolRounds: this.maxToolRounds,
1353
- maxTokens: this.maxTokens,
1354
- batchApi: this.batchApi,
1355
- });
1356
- } catch (err: unknown) {
1357
- if (abortSignal?.aborted) throw err;
1358
- const msg = err instanceof Error ? err.message : String(err);
1359
- result = {
1360
- success: false,
1361
- output: `Delegation failed: ${msg}`,
1362
- };
1363
- }
1364
-
1365
- const taskCompletedInput: TaskCompletedHookInput = {
1366
- hook_event_name: "TaskCompleted",
1367
- agent_type: request.agent,
1368
- description: request.description,
1369
- success: result.success,
1370
- session_id: this.session?.id,
1371
- cwd: this.bash.getCwd(),
1372
- };
1373
- await this.fireHook(taskCompletedInput, abortSignal).catch(() => {});
1374
-
1375
- return result;
1376
- }
1377
-
1378
- private async readDelegation(id: string): Promise<ToolResult> {
1379
- try {
1380
- return {
1381
- success: true,
1382
- output: await this.delegations.read(id),
1383
- };
1384
- } catch (err: unknown) {
1385
- const msg = err instanceof Error ? err.message : String(err);
1386
- return {
1387
- success: false,
1388
- output: `Failed to read delegation: ${msg}`,
1389
- };
1390
- }
1391
- }
1392
-
1393
- private async listDelegations(): Promise<ToolResult> {
1394
- try {
1395
- const delegations = await this.delegations.list();
1396
- if (delegations.length === 0) {
1397
- return {
1398
- success: true,
1399
- output: "No delegations found for this project.",
1400
- };
1401
- }
1402
-
1403
- const lines = delegations.map((delegation) => {
1404
- const title = delegation.description || delegation.id;
1405
- return `- \`${delegation.id}\` [${delegation.status}] ${title}\n ${delegation.summary}`;
1406
- });
1407
-
1408
- return {
1409
- success: true,
1410
- output: `## Delegations\n\n${lines.join("\n")}`,
1411
- };
1412
- } catch (err: unknown) {
1413
- const msg = err instanceof Error ? err.message : String(err);
1414
- return {
1415
- success: false,
1416
- output: `Failed to list delegations: ${msg}`,
1417
- };
1418
- }
1419
- }
1420
-
1421
- private getCompactionSettings(contextWindow?: number): CompactionSettings {
1422
- let keepRecentTokens = DEFAULT_KEEP_RECENT_TOKENS;
1423
-
1424
- // For models with very large context windows, keep more recent tokens
1425
- if (contextWindow && contextWindow > 200_000) {
1426
- keepRecentTokens = Math.min(100_000, Math.max(20_000, Math.floor(contextWindow * 0.1)));
1427
- }
1428
-
1429
- // Compact more aggressively for long sessions to prevent runaway token growth
1430
- if (this._compactionStats.count >= 2) {
1431
- keepRecentTokens = Math.floor(keepRecentTokens * 0.75);
1432
- }
1433
-
1434
- return {
1435
- reserveTokens: Math.max(this.maxTokens, DEFAULT_RESERVE_TOKENS),
1436
- keepRecentTokens,
1437
- };
1438
- }
1439
-
1440
- private _resolveCompactModel(): string {
1441
- return this._resolveModelForTask("compact");
1442
- }
1443
-
1444
- private _resolveModelForTask(task: ModelTaskKind): string {
1445
- return resolveModelForTask(task, this.providerId, this.modelId);
1446
- }
1447
-
1448
- private async compactForContext(
1449
- provider: LegacyProvider,
1450
- system: string,
1451
- contextWindow: number,
1452
- signal: AbortSignal,
1453
- settings = this.getCompactionSettings(contextWindow),
1454
- force = false,
1455
- ): Promise<boolean> {
1456
- if (!this.session) return false;
1457
-
1458
- const preparation = prepareCompaction(this.messages, system, settings);
1459
- if (!preparation) return false;
1460
- if (!force && !shouldCompactContext(preparation.tokensBefore, contextWindow, settings)) {
1461
- return false;
1462
- }
1463
-
1464
- const trigger = force ? "manual" : "auto";
1465
-
1466
- // Fire-and-forget: notify EE of stale suggestions before compaction
1467
- const { surfacedIds, timestamp } = getLastSurfacedState();
1468
- if (surfacedIds.length > 0) {
1469
- getDefaultEEClient()
1470
- .promptStale({
1471
- state: { surfacedIds, timestamp },
1472
- nextPromptMeta: { trigger: "auto-compact", cwd: this.bash.getCwd(), tenantId: getTenantId() },
1473
- })
1474
- .catch(() => {});
1475
- }
1476
-
1477
- // Emit pre-compact transcript snapshot so lessons survive the rewrite.
1478
- try {
1479
- emitTranscriptToDisk(this.messages, this.session?.id ?? null, "cli-compact", this.bash.getCwd());
1480
- } catch {
1481
- /* fail-open */
1482
- }
1483
-
1484
- const preCompactInput: PreCompactHookInput = {
1485
- hook_event_name: "PreCompact",
1486
- trigger,
1487
- session_id: this.session?.id,
1488
- cwd: this.bash.getCwd(),
1489
- };
1490
- await this.fireHook(preCompactInput, signal).catch(() => {});
1491
-
1492
- const keptSeqs = this.messageSeqs.slice(preparation.firstKeptIndex);
1493
- const firstKeptSeq = keptSeqs.find((seq): seq is number => seq !== null) ?? getNextMessageSequence(this.session.id);
1494
- const compactModelId = this._resolveCompactModel();
1495
- const compactStartedAt = Date.now();
1496
- const { summary, usage: compactUsage } = await generateCompactionSummary(
1497
- provider,
1498
- compactModelId,
1499
- preparation,
1500
- undefined,
1501
- signal,
1502
- );
1503
-
1504
- // Record compaction call in cost-log — bypasses recordUsage because
1505
- // compaction returns usage separately and isn't routed through the
1506
- // status-bar / usage event pipeline (intentional: it's overhead, not user spend).
1507
- const compactProvider = detectProviderForModel(compactModelId);
1508
- appendCostLog({
1509
- ts: compactStartedAt,
1510
- provider: compactProvider,
1511
- model: compactModelId,
1512
- estimatedUsd: projectCostUSD(
1513
- compactProvider,
1514
- compactModelId,
1515
- compactUsage.promptTokens,
1516
- compactUsage.completionTokens,
1517
- ),
1518
- callsite: "orchestrator.compaction",
1519
- phase: "compaction",
1520
- iteration: this._compactionStats.count + 1,
1521
- actualInputTokens: compactUsage.promptTokens,
1522
- actualOutputTokens: compactUsage.completionTokens,
1523
- durationMs: Date.now() - compactStartedAt,
1524
- }).catch(() => undefined);
1525
-
1526
- appendCompaction(this.session.id, firstKeptSeq, summary, preparation.tokensBefore);
1527
-
1528
- // Re-inject pinned user messages that were about to be summarized away.
1529
- // Pinned seqs that are still inside keptMessages don't need re-injection.
1530
- const keptSeqSet = new Set(keptSeqs.filter((s): s is number => s !== null));
1531
- const pinnedReinjections: ModelMessage[] = [];
1532
- const pinnedReinjectionSeqs: Array<number | null> = [];
1533
- for (const seq of [...this._pinnedSeqs].sort((a, b) => a - b)) {
1534
- if (keptSeqSet.has(seq)) continue;
1535
- const idx = this.messageSeqs.indexOf(seq);
1536
- if (idx < 0) {
1537
- // Pinned seq no longer present (shouldn't happen, but stay defensive).
1538
- this._pinnedSeqs.delete(seq);
1539
- continue;
1540
- }
1541
- const original = this.messages[idx];
1542
- if (!original || original.role !== "user") continue;
1543
- const text = extractUserContent(original.content).trim();
1544
- if (!text) continue;
1545
- pinnedReinjections.push({
1546
- role: "system",
1547
- content: `[Pinned user message — kept verbatim across compaction]\n${text}`,
1548
- });
1549
- pinnedReinjectionSeqs.push(null);
1550
- }
1551
-
1552
- this.messages = [createCompactionSummaryMessage(summary), ...pinnedReinjections, ...preparation.keptMessages];
1553
- this.messageSeqs = [null, ...pinnedReinjectionSeqs, ...keptSeqs];
1554
-
1555
- // EE anti-mù (Phase 1 of docs/ee-anti-mu-compaction-plan.md): immediately extract the fresh structured checkpoint summary
1556
- // so pilContext / layer3 search / ee.query can recall exact prior ✔ DONE items + progress for the rest of this long session
1557
- // (and sub-agents) even after further B3/B4 rewrites. Uses same client + fail-open pattern as promptStale above (1449).
1558
- // Transcript is the summary itself (not full history) to keep it small and focused on task state.
1559
- getDefaultEEClient()
1560
- .extract(
1561
- {
1562
- transcript: `[Context checkpoint summary]\n${summary}`,
1563
- projectPath: this.bash.getCwd(),
1564
- meta: {
1565
- source: "cli-compact-checkpoint",
1566
- sessionId: this.session?.id ?? undefined,
1567
- iteration: this._compactionStats.count + 1,
1568
- tokensBefore: preparation.tokensBefore,
1569
- },
1570
- },
1571
- AbortSignal.timeout(1500),
1572
- )
1573
- .catch(() => {});
1574
-
1575
- // Mark as surfaced for prompt-stale reconciliation (per plan Phase 1).
1576
- updateLastSurfacedState([`compact-checkpoint-${this._compactionStats.count + 1}`]);
1577
-
1578
- // Track compaction stats — net of the tokens spent ON compaction itself.
1579
- const tokensAfter = estimateConversationTokens(system, this.messages);
1580
- const grossSaved = Math.max(0, preparation.tokensBefore - tokensAfter);
1581
- const compactCost = compactUsage.promptTokens + compactUsage.completionTokens;
1582
- const saved = Math.max(0, grossSaved - compactCost);
1583
- const pct = preparation.tokensBefore > 0 ? ((saved / preparation.tokensBefore) * 100).toFixed(1) : "0.0";
1584
- this._compactionStats.count++;
1585
- this._compactionStats.totalSaved += saved;
1586
-
1587
- // Update status bar with current context size and compaction summary
1588
- const fmtCompact = (n: number) => (n >= 1000 ? `${(n / 1000).toFixed(1)}K` : String(n));
1589
- const modelSuffix = compactModelId !== this.modelId ? ` via ${compactModelId}` : "";
1590
- const userMsgCount = this.messages.filter((m) => m.role === "user").length;
1591
- const isLongSession = this._compactionStats.count >= 3 || userMsgCount >= 200;
1592
- const sessionHint = isLongSession ? " ⚠ long session — consider /clear" : "";
1593
- const compactLabel = `${this._compactionStats.count} cmp, ${fmtCompact(this._compactionStats.totalSaved)} saved${modelSuffix}${sessionHint}`;
1594
- statusBarStore.setState({ ctx_tokens: tokensAfter, compaction_summary: compactLabel });
1595
-
1596
- const postCompactInput: PostCompactHookInput = {
1597
- hook_event_name: "PostCompact",
1598
- trigger,
1599
- session_id: this.session?.id,
1600
- cwd: this.bash.getCwd(),
1601
- };
1602
- await this.fireHook(postCompactInput, signal).catch(() => {});
1603
-
1604
- // Interaction log: compaction
1605
- try {
1606
- if (this.session) {
1607
- logInteraction(this.session.id, "compaction", {
1608
- data: {
1609
- count: this._compactionStats.count,
1610
- tokensBefore: preparation.tokensBefore,
1611
- tokensAfter,
1612
- saved,
1613
- grossSaved,
1614
- compactCost,
1615
- pct,
1616
- isLongSession,
1617
- },
1618
- });
1619
- }
1620
- } catch {
1621
- /* fail-open */
1622
- }
1623
-
1624
- this._compactedThisTurn = true;
1625
- return true;
1626
- }
1627
-
1628
- private async postTurnCompact(
1629
- provider: LegacyProvider,
1630
- system: string,
1631
- contextWindow: number,
1632
- signal: AbortSignal,
1633
- ): Promise<void> {
1634
- const log = (taken: boolean, reason: string, extra?: Record<string, unknown>): void => {
1635
- appendDecisionLog({
1636
- ts: Date.now(),
1637
- sessionId: this.session?.id ?? null,
1638
- kind: "post-turn-compact",
1639
- taken,
1640
- reason,
1641
- meta: { contextWindow, ...extra },
1642
- }).catch(() => undefined);
1643
- };
1644
-
1645
- if (this._compactedThisTurn) return log(false, "already-compacted-this-turn");
1646
- if (!isAutoCompactAfterTurnEnabled()) return log(false, "feature-disabled");
1647
- const tokens = estimateConversationTokens(system, this.messages);
1648
- const thresholdPct = getAutoCompactThresholdPct();
1649
- const minMeaningfulTokens = Math.max(POST_TURN_MIN_TOKENS, Math.floor(contextWindow * thresholdPct));
1650
- if (tokens < minMeaningfulTokens) {
1651
- return log(false, `under-threshold (${tokens} < ${minMeaningfulTokens})`, {
1652
- tokens,
1653
- thresholdPct,
1654
- minMeaningfulTokens,
1655
- });
1656
- }
1657
- log(true, `over-threshold (${tokens} >= ${minMeaningfulTokens})`, { tokens, thresholdPct, minMeaningfulTokens });
1658
- await this.compactForContext(
1659
- provider,
1660
- system,
1661
- contextWindow,
1662
- signal,
1663
- this.getCompactionSettings(contextWindow),
1664
- true,
1665
- ).catch((err) => console.warn("[compact] failed:", (err as Error)?.message));
1666
- }
1667
-
1668
- // ========================================================================
1669
- // Council system — delegated to CouncilManager (Phase 12.1-02)
1670
- //
1671
- // All council state + sub-call helpers (generate/research/prompt builders/
1672
- // outcome parser/executor/candidate resolution) live in CouncilManager.
1673
- // The thin facade below preserves the public API the UI + tests rely on
1674
- // (respondToCouncilQuestion/Preflight + the internal _create*Responder
1675
- // hooks used by orchestrator.agent.test.ts).
1676
- // ========================================================================
1677
-
1678
- respondToCouncilQuestion(questionId: string, answer: string): void {
1679
- this.councilManager.respondToQuestion(questionId, answer);
1680
- }
1681
-
1682
- respondToCouncilPreflight(preflightId: string, approved: boolean): void {
1683
- this.councilManager.respondToPreflight(preflightId, approved);
1684
- }
1685
-
1686
- // ========================================================================
1687
- // Council v2 — Clarify → Confirm → Debate → Plan → Execute
1688
- // ========================================================================
1689
-
1690
- async *runCouncilV2(
1691
- topic: string,
1692
- options?: {
1693
- skipClarification?: boolean;
1694
- observer?: ProcessMessageObserver;
1695
- userModelMessage?: ModelMessage;
1696
- },
1697
- ): AsyncGenerator<StreamChunk, void, unknown> {
1698
- const { runCouncil } = await import("../council/index.js");
1699
- const { createCouncilLLM } = await import("../council/llm.js");
1700
- const councilStats = { calls: 0, startMs: Date.now(), phases: [] as Array<{ name: string; durationMs: number }> };
1701
- const llm = createCouncilLLM(this.bash, this.mode, this.session?.id, councilStats);
1702
-
1703
- const processMessageFn = (message: string) => this.processMessage(message, options?.observer);
1704
-
1705
- const gen = runCouncil(
1706
- topic,
1707
- this.modelId,
1708
- this.messages as Array<{ role: string; content: string | unknown }>,
1709
- this.session?.id,
1710
- llm,
1711
- this.councilManager.createQuestionResponder(),
1712
- this.councilManager.createPreflightResponder(),
1713
- processMessageFn,
1714
- {
1715
- skipClarification: options?.skipClarification,
1716
- userModelMessage: options?.userModelMessage,
1717
- cwd: this.bash.getCwd(),
1718
- councilStats, // NEW — share orchestrator's stats object with runCouncil (Phase 14 CQ-01)
1719
- },
1720
- );
1721
-
1722
- let result: IteratorResult<StreamChunk, string | null>;
1723
- do {
1724
- result = await gen.next();
1725
- if (!result.done && result.value) {
1726
- yield result.value;
1727
- }
1728
- } while (!result.done);
1729
-
1730
- const synthesis = result.value;
1731
- this.councilManager.setLastSynthesis(synthesis);
1732
-
1733
- if (options?.userModelMessage && synthesis) {
1734
- this.appendCompletedTurn(options.userModelMessage, [{ role: "assistant", content: synthesis }]);
1735
- }
1736
- }
1737
-
1738
- // ========================================================================
1739
- // Product Ideal Loop (Phase 13) — mirror of runCouncilV2 wiring.
1740
- // ========================================================================
1741
-
1742
- async *runProductLoopV1(
1743
- payload: {
1744
- subcommand: "start" | "status" | "resume" | "abort" | "ship";
1745
- idea?: string;
1746
- runId?: string;
1747
- flags: {
1748
- maxCost: number;
1749
- maxSprints: number;
1750
- doneThreshold: number;
1751
- budgetTokens?: number;
1752
- stack?: string;
1753
- noCustomerDebate?: boolean;
1754
- noPriorContext?: boolean;
1755
- forceCouncil?: boolean;
1756
- mode?: "maintain" | "new";
1757
- ghPr?: boolean;
1758
- };
1759
- },
1760
- options?: {
1761
- observer?: ProcessMessageObserver;
1762
- userModelMessage?: ModelMessage;
1763
- },
1764
- ): AsyncGenerator<StreamChunk, void, unknown> {
1765
- const { runProductLoop } = await import("../product-loop/index.js");
1766
- const { createCouncilLLM } = await import("../council/llm.js");
1767
- const nodePath = await import("node:path");
1768
-
1769
- const productStats = {
1770
- calls: 0,
1771
- startMs: Date.now(),
1772
- phases: [] as Array<{ name: string; durationMs: number }>,
1773
- };
1774
- const llm = createCouncilLLM(this.bash, this.mode, this.session?.id, productStats);
1775
- const processMessageFn = (m: string) => this.processMessage(m, options?.observer);
1776
- const flowDir = nodePath.join(this.bash.getCwd(), ".muonroi-flow");
1777
-
1778
- // P2.7: compute complexity from the idea using PIL Layer 1 heuristics (cheap,
1779
- // no LLM calls). Only meaningful for "start"; other subcommands ignore it.
1780
- let complexity: "low" | "medium" | "high" | undefined;
1781
- let sufficiencyMissing: readonly import("../pil/layer1-intent.js").SufficiencyMissing[] | undefined;
1782
- if (payload.subcommand === "start" && payload.idea) {
1783
- const { scoreComplexity, scoreSufficiency } = await import("../pil/layer1-intent.js");
1784
- const result = scoreComplexity({
1785
- rawText: payload.idea,
1786
- taskType: null,
1787
- t0HitCount: 0,
1788
- hasMaxSprintsOne: payload.flags.maxSprints === 1,
1789
- });
1790
- complexity = result.complexity;
1791
- // Sufficiency gate — vague briefs ("todo app") force Council so the
1792
- // discovery AskCard can fill in persona/MVP/architecture/verify before
1793
- // any code is scaffolded.
1794
- const suff = scoreSufficiency({ rawText: payload.idea });
1795
- sufficiencyMissing = suff.sufficient ? undefined : suff.missing;
1796
- }
1797
-
1798
- const gen = runProductLoop({
1799
- subcommand: payload.subcommand,
1800
- idea: payload.idea ?? "",
1801
- runId: payload.runId,
1802
- flowDir,
1803
- sessionModelId: this.modelId,
1804
- llm,
1805
- flags: {
1806
- maxCost: payload.flags.maxCost,
1807
- maxSprints: payload.flags.maxSprints,
1808
- doneThreshold: payload.flags.doneThreshold,
1809
- budgetTokens: payload.flags.budgetTokens,
1810
- stack: payload.flags.stack,
1811
- forceCouncil: payload.flags.forceCouncil,
1812
- },
1813
- respondToQuestion: this.councilManager.createQuestionResponder(),
1814
- respondToPreflight: this.councilManager.createPreflightResponder(),
1815
- cwd: this.bash.getCwd(),
1816
- processMessageFn,
1817
- // Mode C — wire verify-recipe detector so runProductLoop auto-detect can probe cwd.
1818
- detectVerifyRecipe: () => this.detectVerifyRecipe(),
1819
- skipPriorContext: payload.flags.noPriorContext === true,
1820
- complexity,
1821
- sufficiencyMissing,
1822
- // Mode C explicit override + gh pr create opt-in (see .planning/MAINTAIN-MODE.md).
1823
- mode: payload.flags.mode,
1824
- ghPr: payload.flags.ghPr === true,
1825
- // Chat session id — used as the FK key for interaction_logs telemetry.
1826
- // The /ideal runId is NOT a sessions.id and would silently fail FK insert.
1827
- sessionId: this.session?.id,
1828
- } as Parameters<typeof runProductLoop>[0]);
1829
-
1830
- for await (const chunk of gen) {
1831
- yield chunk;
1832
- }
1833
- }
1834
-
1835
- // ========================================================================
1836
- // Legacy council — kept for backward compatibility, will be removed
1837
- // ========================================================================
1838
-
1839
- async *runCouncilRound(
1840
- topic: string,
1841
- _observer?: ProcessMessageObserver,
1842
- rounds?: number,
1843
- userModelMessage?: ModelMessage,
1844
- ): AsyncGenerator<StreamChunk, void, unknown> {
1845
- const maxRounds = rounds ?? getCouncilRounds();
1846
- const ALL_ROLES: ModelRole[] = ["implement", "verify", "research"];
1847
- this.councilManager.resetStats(Date.now());
1848
-
1849
- // Resolve council participants: same-provider by default, multi-provider only when configured
1850
- const candidates: Array<{ role: ModelRole; model: string }> = [];
1851
- const configuredRoleModels = getRoleModels();
1852
- const hasExplicitMultiProvider = this.councilManager.hasMultiProviderConfig(configuredRoleModels);
1853
-
1854
- if (hasExplicitMultiProvider && isCouncilMultiProviderPreferred()) {
1855
- // Multi-provider path: use explicitly configured role models across providers
1856
- for (const role of ALL_ROLES) {
1857
- const modelId = getRoleModel(role);
1858
- if (!modelId) continue;
1859
- const provider = detectProviderForModel(modelId);
1860
- if (isProviderDisabled(provider as ProviderId)) continue;
1861
- const canReach = await loadKeyForProvider(provider)
1862
- .then(() => true)
1863
- .catch(() => false);
1864
- if (canReach) candidates.push({ role, model: modelId });
1865
- }
1866
- if (candidates.length >= 2) {
1867
- const providers = new Set(candidates.map((c) => detectProviderForModel(c.model)));
1868
- yield {
1869
- type: "content",
1870
- content: `\n[Multi-provider mode: ${candidates.length} roles across ${providers.size} provider(s)]\n`,
1871
- };
1872
- }
1873
- }
1874
-
1875
- // Default: same-provider mode — pick diverse models from the session's provider
1876
- if (candidates.length < 2) {
1877
- const mainProviderId = detectProviderForModel(this.modelId);
1878
- // Skip same-provider resolution if the session's provider is disabled
1879
- if (!isProviderDisabled(mainProviderId as ProviderId)) {
1880
- const sameCandidates = await this.councilManager.resolveSameProviderCandidates(mainProviderId, ALL_ROLES);
1881
- if (sameCandidates.length >= 2) {
1882
- candidates.length = 0;
1883
- candidates.push(...sameCandidates);
1884
- const uniqueModels = new Set(sameCandidates.map((c) => c.model));
1885
- yield {
1886
- type: "content",
1887
- content: `\n[Same-provider mode: ${uniqueModels.size} ${mainProviderId} model(s) for ${sameCandidates.length} roles]\n`,
1888
- };
1889
- }
1890
- }
1891
- }
1892
-
1893
- // Final fallback: use main model for all roles
1894
- if (candidates.length < 2) {
1895
- const mainProviderId = detectProviderForModel(this.modelId);
1896
- const mainDisabled = isProviderDisabled(mainProviderId as ProviderId);
1897
- const mainCanReach =
1898
- !mainDisabled &&
1899
- (await loadKeyForProvider(mainProviderId)
1900
- .then(() => true)
1901
- .catch(() => false));
1902
- if (mainCanReach) {
1903
- candidates.length = 0;
1904
- for (const role of ALL_ROLES) {
1905
- candidates.push({ role, model: this.modelId });
1906
- }
1907
- yield {
1908
- type: "content",
1909
- content: `\n[Fallback: using \x1b[36m${this.modelId}\x1b[0m for all roles]\n`,
1910
- };
1911
- }
1912
- }
1913
-
1914
- if (candidates.length < 2) {
1915
- yield {
1916
- type: "content",
1917
- content: "\nNo reachable provider. Check API keys in user-settings.json or environment.\n",
1918
- };
1919
- yield { type: "done" };
1920
- return;
1921
- }
1922
-
1923
- // Build conversation context for all participants
1924
- const conversationContext = this.councilManager.buildContext();
1925
-
1926
- // ── Phase 0: Research — gather facts from codebase before discussion ──
1927
- const p0Start = Date.now();
1928
- yield { type: "content", content: `\n## Phase 0 — Codebase Research\n` };
1929
-
1930
- // Find the research candidate (prefer configured research role, fallback to first available)
1931
- const researchCandidate = candidates.find((c) => c.role === "research") ?? candidates[0];
1932
- yield { type: "content", content: `\n### \x1b[35m[research]\x1b[0m ${researchCandidate.model}\n` };
1933
-
1934
- const researchFindings = await this.councilManager.research(researchCandidate.model, topic, conversationContext);
1935
- yield { type: "content", content: `${researchFindings}\n` };
1936
- yield { type: "content", content: `\n> Phase 0: ${((Date.now() - p0Start) / 1000).toFixed(1)}s\n` };
1937
-
1938
- // Inject research findings into conversation context for subsequent phases
1939
- const enrichedContext = conversationContext
1940
- ? `${conversationContext}\n\n---\n\n## Research Findings (Phase 0)\n${researchFindings}`
1941
- : `## Research Findings (Phase 0)\n${researchFindings}`;
1942
-
1943
- // ── Phase 1: Parallel opening statements ──
1944
- const p1Start = Date.now();
1945
- yield { type: "content", content: "\n## Phase 1 — Opening Analysis\n" };
1946
-
1947
- const openingPromises = candidates.map(({ role, model }) => {
1948
- const { system, prompt } = this.councilManager.buildDiscussPrompt("open", {
1949
- speakerRole: role,
1950
- partnerRole: candidates.find((c) => c.role !== role)?.role ?? "colleague",
1951
- topic,
1952
- conversationContext: enrichedContext,
1953
- });
1954
- return this.councilManager
1955
- .generate(model, system, prompt)
1956
- .then((text) => ({ role, model, position: text, error: null as string | null }))
1957
- .catch((err: unknown) => ({
1958
- role,
1959
- model,
1960
- position: "",
1961
- error: err instanceof Error ? err.message : String(err),
1962
- }));
1963
- });
1964
-
1965
- const openings = await Promise.all(openingPromises);
1966
- const active: Array<{ role: ModelRole; model: string; position: string }> = [];
1967
-
1968
- for (const o of openings) {
1969
- const roleColor = COUNCIL_ROLE_COLORS[o.role] ?? "";
1970
- yield { type: "content", content: `\n### ${roleColor}[${o.role}]${COUNCIL_COLOR_RESET} ${o.model}\n` };
1971
- if (o.error) {
1972
- yield { type: "content", content: `[Error: ${o.error}]\n` };
1973
- } else {
1974
- active.push({ role: o.role, model: o.model, position: o.position });
1975
- const bgColor = COUNCIL_COLOR_BG[o.role] ?? "";
1976
- yield { type: "content", content: `${bgColor} ${o.role.toUpperCase()} ${COUNCIL_COLOR_RESET} ${o.position}\n` };
1977
- }
1978
- }
1979
-
1980
- yield {
1981
- type: "content",
1982
- content: `\n> Phase 1: ${active.length} participants, ${((Date.now() - p1Start) / 1000).toFixed(1)}s (parallel)\n`,
1983
- };
1984
-
1985
- if (active.length < 2) {
1986
- yield { type: "content", content: "\nNot enough successful openings for discussion.\n" };
1987
- yield { type: "done" };
1988
- return;
1989
- }
1990
-
1991
- // ── Phase 2: Discussion rounds with parallel pair debates ──
1992
- const exchangeLogs: Map<string, string[]> = new Map();
1993
- const pairConverged: Map<string, boolean> = new Map();
1994
- let runningSummary = "";
1995
-
1996
- for (let round = 1; round <= maxRounds; round++) {
1997
- const p2Start = Date.now();
1998
- yield { type: "content", content: `\n## Phase 2 — Discussion Round ${round}/${maxRounds}\n` };
1999
-
2000
- // Build independent pairs
2001
- const pairs: Array<{ a: (typeof active)[0]; b: (typeof active)[0]; key: string }> = [];
2002
- for (let i = 0; i < active.length; i++) {
2003
- const a = active[i];
2004
- const b = active[(i + 1) % active.length];
2005
- const key = `${a.role}<>${b.role}`;
2006
- if (pairConverged.get(key)) continue;
2007
- if (!exchangeLogs.has(key)) exchangeLogs.set(key, []);
2008
- pairs.push({ a, b, key });
2009
- }
2010
-
2011
- if (pairs.length === 0) break;
2012
-
2013
- // Run pair debates in parallel
2014
- const pairResults = await Promise.all(
2015
- pairs.map(async ({ a, b, key }) => {
2016
- const log = exchangeLogs.get(key)!;
2017
- const chunks: Array<{ label: string; text: string }> = [];
2018
-
2019
- try {
2020
- let aResponse: string;
2021
- let bResponse: string;
2022
-
2023
- if (round === 1) {
2024
- const aPrompt = this.councilManager.buildDiscussPrompt("respond", {
2025
- speakerRole: a.role,
2026
- partnerRole: b.role,
2027
- topic,
2028
- speakerPosition: a.position,
2029
- partnerPosition: b.position,
2030
- conversationContext: enrichedContext,
2031
- });
2032
- aResponse = await this.councilManager.generate(a.model, aPrompt.system, aPrompt.prompt);
2033
- log.push(`[${a.role}]: ${aResponse}`);
2034
- chunks.push({ label: `[${a.role}] → [${b.role}]`, text: aResponse });
2035
-
2036
- const bPrompt = this.councilManager.buildDiscussPrompt("respond", {
2037
- speakerRole: b.role,
2038
- partnerRole: a.role,
2039
- topic,
2040
- speakerPosition: b.position,
2041
- partnerPosition: aResponse,
2042
- conversationContext: enrichedContext,
2043
- });
2044
- bResponse = await this.councilManager.generate(b.model, bPrompt.system, bPrompt.prompt);
2045
- log.push(`[${b.role}]: ${bResponse}`);
2046
- chunks.push({ label: `[${b.role}] → [${a.role}]`, text: bResponse });
2047
- } else {
2048
- const historyText = log.join("\n\n");
2049
- const aPrompt = this.councilManager.buildDiscussPrompt("followup", {
2050
- speakerRole: a.role,
2051
- partnerRole: b.role,
2052
- topic,
2053
- partnerPosition: b.position,
2054
- exchangeHistory: historyText,
2055
- round,
2056
- conversationContext: enrichedContext,
2057
- runningSummary,
2058
- });
2059
- aResponse = await this.councilManager.generate(a.model, aPrompt.system, aPrompt.prompt, 1024);
2060
- log.push(`[${a.role}] (round ${round}): ${aResponse}`);
2061
- chunks.push({ label: `[${a.role}] → [${b.role}]`, text: aResponse });
2062
-
2063
- const bPrompt = this.councilManager.buildDiscussPrompt("followup", {
2064
- speakerRole: b.role,
2065
- partnerRole: a.role,
2066
- topic,
2067
- partnerPosition: aResponse,
2068
- exchangeHistory: historyText,
2069
- round,
2070
- conversationContext: enrichedContext,
2071
- runningSummary,
2072
- });
2073
- bResponse = await this.councilManager.generate(b.model, bPrompt.system, bPrompt.prompt, 1024);
2074
- log.push(`[${b.role}] (round ${round}): ${bResponse}`);
2075
- chunks.push({ label: `[${b.role}] → [${a.role}]`, text: bResponse });
2076
- }
2077
-
2078
- b.position = bResponse;
2079
- a.position = aResponse;
2080
-
2081
- // Convergence check
2082
- const convPrompt = this.councilManager.buildDiscussPrompt("convergence-check", {
2083
- speakerRole: a.role,
2084
- partnerRole: b.role,
2085
- topic,
2086
- exchangeHistory: log.slice(-4).join("\n\n"),
2087
- conversationContext: enrichedContext,
2088
- });
2089
- let converged = false;
2090
- let convReason = "";
2091
- try {
2092
- const raw = await this.councilManager.generate(a.model, convPrompt.system, convPrompt.prompt, 256);
2093
- const match = raw.match(/\{[\s\S]*\}/);
2094
- if (match) {
2095
- const parsed = JSON.parse(match[0]) as { converged?: boolean; reason?: string };
2096
- converged = parsed.converged === true;
2097
- convReason = parsed.reason ?? "";
2098
- }
2099
- } catch {
2100
- /* not converged */
2101
- }
2102
-
2103
- return { key, chunks, converged, convReason, error: null as string | null };
2104
- } catch (err: unknown) {
2105
- return {
2106
- key,
2107
- chunks,
2108
- converged: false,
2109
- convReason: "",
2110
- error: err instanceof Error ? err.message : String(err),
2111
- };
2112
- }
2113
- }),
2114
- );
2115
-
2116
- // Emit results (sequential yield — maintains readable order)
2117
- let allConverged = true;
2118
- for (const pr of pairResults) {
2119
- for (const chunk of pr.chunks) {
2120
- const labelParts = chunk.label.match(/\[(\w+)\] → \[(\w+)\]/);
2121
- let coloredLabel = chunk.label;
2122
- if (labelParts) {
2123
- const fromColor = COUNCIL_ROLE_COLORS[labelParts[1]] ?? "";
2124
- const toColor = COUNCIL_ROLE_COLORS[labelParts[2]] ?? "";
2125
- coloredLabel = `${fromColor}[${labelParts[1]}]${COUNCIL_COLOR_RESET} → ${toColor}[${labelParts[2]}]${COUNCIL_COLOR_RESET}`;
2126
- }
2127
- yield { type: "content", content: `\n### ${coloredLabel}\n${chunk.text}\n` };
2128
- }
2129
- if (pr.error) {
2130
- yield { type: "content", content: `[Discussion error: ${pr.error}]\n` };
2131
- allConverged = false;
2132
- } else if (pr.converged) {
2133
- pairConverged.set(pr.key, true);
2134
- yield { type: "content", content: `\n> ✓ ${pr.key.replace("<>", " ↔ ")} converged: ${pr.convReason}\n` };
2135
- } else {
2136
- allConverged = false;
2137
- }
2138
- }
2139
-
2140
- yield {
2141
- type: "content",
2142
- content: `\n> Round ${round}: ${((Date.now() - p2Start) / 1000).toFixed(1)}s (${pairs.length} pairs parallel)\n`,
2143
- };
2144
-
2145
- if (allConverged) {
2146
- yield { type: "content", content: `\n> All pairs converged at round ${round}. Moving to synthesis.\n` };
2147
- break;
2148
- }
2149
-
2150
- // Generate inter-round summary for next round's focus
2151
- if (round < maxRounds) {
2152
- try {
2153
- runningSummary = await this.councilManager.generateRoundSummary(exchangeLogs, topic, round, active[0].model);
2154
- yield {
2155
- type: "content",
2156
- content: `\n> **Discussion state:** ${runningSummary
2157
- .split("\n")
2158
- .filter((l) => l.trim())
2159
- .slice(0, 3)
2160
- .join(" | ")}\n`,
2161
- };
2162
- } catch {
2163
- // Non-critical — continue without summary
2164
- }
2165
- }
2166
- }
2167
-
2168
- // ── Phase 3: Leader synthesis ──
2169
- const p3Start = Date.now();
2170
- yield { type: "content", content: "\n## Phase 3 — Leader Synthesis\n" };
2171
-
2172
- const leaderModelId = getRoleModel("leader") ?? this.modelId;
2173
- yield { type: "content", content: `\n### \x1b[32m[leader]\x1b[0m ${leaderModelId}\n` };
2174
-
2175
- const allExchanges = [...exchangeLogs.entries()]
2176
- .map(([pair, log]) => `### Discussion: ${pair}\n${log.join("\n\n")}`)
2177
- .join("\n\n---\n\n");
2178
-
2179
- const finalPositions = active.map((p) => `**${p.role}** (${p.model}): ${p.position.slice(0, 500)}...`).join("\n\n");
2180
-
2181
- let synthesisText = "";
2182
- try {
2183
- synthesisText = await this.councilManager.generate(
2184
- leaderModelId,
2185
- "You are the team lead. Multiple specialists just had a structured discussion about a topic.\n\n" +
2186
- "Output TWO parts separated by the exact line `---READABLE---`:\n\n" +
2187
- "**Part 1: JSON** — a single JSON object:\n" +
2188
- "```\n" +
2189
- '{ "type": "decision"|"action_items"|"plan_update"|"resolve_question",\n' +
2190
- ' "summary": "1-2 sentence executive summary",\n' +
2191
- ' "agreed": ["point 1", "point 2"],\n' +
2192
- ' "tradeoffs": ["trade-off 1"],\n' +
2193
- ' "recommendation": "Your decisive recommendation",\n' +
2194
- ' "actionItems": ["step 1", "step 2"],\n' +
2195
- ' "planUpdate": "paragraph for plan update (only if type=plan_update)",\n' +
2196
- ' "resolvedQuestion": {"question": "...", "answer": "..."} }\n' +
2197
- "```\n" +
2198
- "Choose type: decision (general), action_items (concrete steps), plan_update (modify active plan), resolve_question (answer a specific question).\n\n" +
2199
- "**Part 2: Human-readable** — after `---READABLE---`, write the synthesis in markdown:\n" +
2200
- "## AGREED\n## TRADE-OFFS\n## RECOMMENDATION\n## NEXT STEPS\n\n" +
2201
- "Be decisive. Output Part 1 JSON first, then ---READABLE---, then Part 2.",
2202
- `Topic: ${topic}\n\nFinal positions:\n${finalPositions}\n\nFull discussion:\n${allExchanges}`,
2203
- 4096,
2204
- );
2205
-
2206
- // Display human-readable part
2207
- const readablePart = synthesisText.includes("---READABLE---")
2208
- ? synthesisText.split("---READABLE---")[1]?.trim()
2209
- : synthesisText;
2210
- yield { type: "content", content: `${readablePart || synthesisText}\n` };
2211
-
2212
- // Parse structured outcome and execute actions
2213
- const structuredOutcome = this.councilManager.parseOutcome(synthesisText, topic);
2214
- if (structuredOutcome) {
2215
- yield* this.councilManager.executeOutcome(structuredOutcome, topic);
2216
- if (this.session) {
2217
- try {
2218
- appendSystemMessage(this.session.id, `[Council Outcome]\n${JSON.stringify(structuredOutcome)}`);
2219
- } catch {
2220
- /* non-critical */
2221
- }
2222
- }
2223
- } else {
2224
- // Fallback: store text-only outcome (backward compatible)
2225
- if (this.session) {
2226
- try {
2227
- appendSystemMessage(this.session.id, `[Council Outcome]\nTopic: ${topic}\n${synthesisText.slice(0, 2000)}`);
2228
- } catch {
2229
- /* non-critical */
2230
- }
2231
- }
2232
- }
2233
- } catch (err: unknown) {
2234
- yield { type: "content", content: `[Synthesis error: ${err instanceof Error ? err.message : err}]\n` };
2235
- }
2236
-
2237
- // ── Stats + Memory ──
2238
- const councilStats = this.councilManager.stats;
2239
- const totalMs = Date.now() - councilStats.startMs;
2240
- yield {
2241
- type: "content",
2242
- content:
2243
- `\n---\n` +
2244
- `> Council stats: ${councilStats.calls} API calls, ${(totalMs / 1000).toFixed(1)}s total, ` +
2245
- `${active.length} participants, synthesis ${((Date.now() - p3Start) / 1000).toFixed(1)}s\n`,
2246
- };
2247
-
2248
- // Save council result to session for memory across conversations
2249
- if (this.session && this.sessionStore) {
2250
- const councilRecord = {
2251
- topic,
2252
- participants: active.map((a) => ({ role: a.role, model: a.model })),
2253
- finalPositions: active.map((a) => ({ role: a.role, position: a.position.slice(0, 1000) })),
2254
- synthesis: synthesisText.slice(0, 2000),
2255
- convergedPairs: [...pairConverged.entries()].filter(([, v]) => v).map(([k]) => k),
2256
- stats: { calls: councilStats.calls, durationMs: totalMs },
2257
- timestamp: new Date().toISOString(),
2258
- };
2259
- try {
2260
- appendSystemMessage(this.session.id, `[Council Memory] ${JSON.stringify(councilRecord)}`);
2261
- } catch {
2262
- /* non-critical */
2263
- }
2264
- }
2265
-
2266
- // Store council output as assistant message so the conversation history
2267
- // stays valid (user→assistant alternation required by most APIs).
2268
- const councilResponse = synthesisText || "[Council completed — see discussion above]";
2269
- if (userModelMessage) {
2270
- this.appendCompletedTurn(userModelMessage, [{ role: "assistant", content: councilResponse }]);
2271
- }
2272
- this.councilManager.setLastSynthesis(councilResponse);
2273
-
2274
- yield { type: "done" };
2275
- }
2276
-
2277
- // ========================================================================
2278
- // processMessageBatchTurn — batch API message processing loop.
2279
- // Body extracted into BatchTurnRunner (Phase 12.5). Thin wrapper preserved
2280
- // so MessageProcessorDeps' `processMessageBatchTurn` callback continues to
2281
- // dispatch through `Agent.processMessageBatchTurn` unchanged.
2282
- // ========================================================================
2283
-
2284
- private async *processMessageBatchTurn(args: {
2285
- userModelMessage: ModelMessage;
2286
- observer?: ProcessMessageObserver;
2287
- provider: LegacyProvider;
2288
- subagents: CustomSubagentConfig[];
2289
- system: string;
2290
- runtime: ReturnType<typeof resolveModelRuntime>;
2291
- modelInfo: ReturnType<typeof getModelInfo>;
2292
- signal: AbortSignal;
2293
- }): AsyncGenerator<StreamChunk, void, unknown> {
2294
- const runner = new BatchTurnRunner(this._buildBatchTurnRunnerDeps());
2295
- yield* runner.run(args);
2296
- }
2297
-
2298
- /**
2299
- * Build the DI surface BatchTurnRunner (Phase 12.5) needs to reach back
2300
- * into Agent state without holding a circular reference. Callback names
2301
- * align with `MessageProcessorDeps` where the signature matches so a
2302
- * future `TurnRunnerDepsBase` hoist is mechanical. Built per call —
2303
- * allocation cost is negligible against the batch polling spend.
2304
- */
2305
- private _buildBatchTurnRunnerDeps(): BatchTurnRunnerDeps {
2306
- const self = this;
2307
- return {
2308
- get messages() {
2309
- return self.messages;
2310
- },
2311
- get bash() {
2312
- return self.bash;
2313
- },
2314
- get mode() {
2315
- return self.mode;
2316
- },
2317
- get maxToolRounds() {
2318
- return self.maxToolRounds;
2319
- },
2320
- get maxTokens() {
2321
- return self.maxTokens;
2322
- },
2323
- get schedules() {
2324
- return self.schedules;
2325
- },
2326
- get sendTelegramFile() {
2327
- return self.sendTelegramFile;
2328
- },
2329
- getSessionId: () => self.session?.id ?? null,
2330
- getCompactedThisTurn: () => self._compactedThisTurn,
2331
- setCompactedThisTurn: (v) => {
2332
- self._compactedThisTurn = v;
2333
- },
2334
- setLastProviderOptionsShape: (shape) => {
2335
- self._lastProviderOptionsShape = shape;
2336
- },
2337
- getBatchClientOptions: (signal) => self.getBatchClientOptions(signal),
2338
- getCompactionSettings: (cw) => self.getCompactionSettings(cw),
2339
- compactForContext: (provider, system, cw, signal, settings, overflow) =>
2340
- self.compactForContext(provider, system, cw, signal, settings, overflow),
2341
- postTurnCompact: (provider, system, cw, signal) => self.postTurnCompact(provider, system, cw, signal),
2342
- createTools: (bash, provider, mode, opts) => createTools(bash, provider, mode, opts),
2343
- runTask: (request, signal) => self.runTask(request, signal),
2344
- runDelegation: (request, signal) => self.runDelegation(request, signal),
2345
- readDelegation: (id) => self.readDelegation(id),
2346
- listDelegations: () => self.listDelegations(),
2347
- executeBatchToolCall: (tools, toolCall, messages, signal) =>
2348
- self.executeBatchToolCall(tools, toolCall, messages, signal),
2349
- appendCompletedTurn: (user, asst) => self.appendCompletedTurn(user, asst),
2350
- discardAbortedTurn: (user) => self.discardAbortedTurn(user),
2351
- recordUsage: (usage, source, model, shape) => self.recordUsage(usage, source, model, shape),
2352
- };
2353
- }
2354
-
2355
- private appendCompletedTurn(userMessage: ModelMessage, newMessages: ModelMessage[]): void {
2356
- if (newMessages.length === 0) return;
2357
-
2358
- const userIndex = this.messages.lastIndexOf(userMessage);
2359
- if (!this.sessionStore || !this.session) {
2360
- if (userIndex >= 0 && this.messageSeqs[userIndex] == null) {
2361
- this.messageSeqs[userIndex] = null;
2362
- }
2363
- this.messages.push(...newMessages);
2364
- this.messageSeqs.push(...newMessages.map(() => null));
2365
- return;
2366
- }
2367
-
2368
- // Phase A5 — if the user message already has a persisted seq (set by
2369
- // the write-ahead path), skip re-inserting it. The write-ahead row
2370
- // will be upserted to status='completed' on the next `appendMessages`
2371
- // call that sees it via ON CONFLICT, but here we only need to insert
2372
- // the *new* assistant/tool messages so they get fresh sequence
2373
- // numbers contiguous with the user row.
2374
- const existingUserSeq = userIndex >= 0 ? this.messageSeqs[userIndex] : null;
2375
- if (typeof existingUserSeq === "number") {
2376
- // User row is already persisted (write-ahead). Insert only the new
2377
- // assistant/tool messages so they get fresh sequence numbers
2378
- // contiguous with the user row. Then flip the user row's status
2379
- // from 'pending' to 'completed' so forensics + replay tooling can
2380
- // tell the turn settled cleanly.
2381
- const insertedSeqs = appendMessages(this.session.id, newMessages);
2382
- markMessageCompleted(this.session.id, existingUserSeq);
2383
- this.messages.push(...newMessages);
2384
- this.messageSeqs.push(...insertedSeqs);
2385
- this.sessionStore.touchSession(this.session.id, this.bash.getCwd());
2386
- this.session = this.sessionStore.getRequiredSession(this.session.id);
2387
- return;
2388
- }
2389
-
2390
- const insertedSeqs = appendMessages(this.session.id, [userMessage, ...newMessages]);
2391
- if (userIndex >= 0) {
2392
- this.messageSeqs[userIndex] = insertedSeqs[0] ?? this.messageSeqs[userIndex];
2393
- }
2394
- this.messages.push(...newMessages);
2395
- this.messageSeqs.push(...insertedSeqs.slice(1));
2396
- this.sessionStore.touchSession(this.session.id, this.bash.getCwd());
2397
- this.session = this.sessionStore.getRequiredSession(this.session.id);
2398
- }
2399
-
2400
- private fireHook(
2401
- input: Parameters<typeof executeEventHooks>[0],
2402
- signal?: AbortSignal,
2403
- ): Promise<Awaited<ReturnType<typeof executeEventHooks>>> {
2404
- return executeEventHooks(input, this.bash.getCwd(), signal);
2405
- }
2406
-
2407
- // ========================================================================
2408
- // processMessage — main streaming turn loop (PIL enrichment, routing, LLM
2409
- // stream, tool execution, compaction, hooks, observer notifications)
2410
- // ========================================================================
2411
-
2412
- async *processMessage(
2413
- userMessage: string,
2414
- observer?: ProcessMessageObserver,
2415
- images?: Array<{ path: string; mediaType: string; base64: string }>,
2416
- ): AsyncGenerator<StreamChunk, void, unknown> {
2417
- const processor = new MessageProcessor(this._buildMessageProcessorDeps());
2418
- yield* processor.run(userMessage, observer, images);
2419
- }
2420
-
2421
- /**
2422
- * Build the DI surface MessageProcessor (Phase 12.4) needs to reach back
2423
- * into Agent state without holding a circular reference. Exposes array
2424
- * references for in-place mutation (messages/messageSeqs) and bound
2425
- * callbacks for behavior. Built per call — allocation cost is negligible
2426
- * against the streamText spend.
2427
- */
2428
- private _buildMessageProcessorDeps(): MessageProcessorDeps {
2429
- const self = this;
2430
- return {
2431
- get messages() {
2432
- return self.messages;
2433
- },
2434
- get messageSeqs() {
2435
- return self.messageSeqs;
2436
- },
2437
- get session() {
2438
- return self.session;
2439
- },
2440
- get sessionStore() {
2441
- return self.sessionStore;
2442
- },
2443
- get bash() {
2444
- return self.bash;
2445
- },
2446
- get mode() {
2447
- return self.mode;
2448
- },
2449
- get modelId() {
2450
- return self.modelId;
2451
- },
2452
- get providerId() {
2453
- return self.providerId;
2454
- },
2455
- get maxToolRounds() {
2456
- return self.maxToolRounds;
2457
- },
2458
- get batchApi() {
2459
- return self.batchApi;
2460
- },
2461
- get permissionMode() {
2462
- return self.permissionMode;
2463
- },
2464
- get schedules() {
2465
- return self.schedules;
2466
- },
2467
- get sendTelegramFile() {
2468
- return self.sendTelegramFile;
2469
- },
2470
- get externalAbortContext() {
2471
- return self.externalAbortContext;
2472
- },
2473
- get pendingCalls() {
2474
- return self.pendingCalls;
2475
- },
2476
- get councilManager() {
2477
- return self.councilManager;
2478
- },
2479
- get crossTurnDedup() {
2480
- return self._crossTurnDedup;
2481
- },
2482
- get readBudget() {
2483
- return self._readBudget;
2484
- },
2485
- get priorWarningIdsInSession() {
2486
- return self._priorWarningIdsInSession;
2487
- },
2488
- get sessionEEGuidance() {
2489
- return self._sessionEEGuidance;
2490
- },
2491
- get flowReady() {
2492
- return self._flowReady;
2493
- },
2494
- getAbortController: () => self.abortController,
2495
- setAbortController: (c) => {
2496
- self.abortController = c;
2497
- },
2498
- getSessionStartHookFired: () => self.sessionStartHookFired,
2499
- setSessionStartHookFired: (v) => {
2500
- self.sessionStartHookFired = v;
2501
- },
2502
- getPlanContext: () => self.planContext,
2503
- setPlanContext: (v) => {
2504
- self.planContext = v;
2505
- },
2506
- getResumeDigest: () => self._resumeDigest,
2507
- setResumeDigest: (v) => {
2508
- self._resumeDigest = v;
2509
- },
2510
- getActiveRunId: () => self._activeRunId,
2511
- getPendingCwdNote: () => self._pendingCwdNote,
2512
- setPendingCwdNote: (v) => {
2513
- self._pendingCwdNote = v;
2514
- },
2515
- setPilActive: (v) => {
2516
- self._pilActive = v;
2517
- },
2518
- setPilEnrichmentDelta: (n) => {
2519
- self._pilEnrichmentDelta = n;
2520
- },
2521
- setCurrentCallId: (id) => {
2522
- self._currentCallId = id;
2523
- },
2524
- setLastProviderOptionsShape: (shape) => {
2525
- self._lastProviderOptionsShape = shape;
2526
- },
2527
- setLastPromptBreakdown: (b) => {
2528
- self._lastPromptBreakdown = b;
2529
- },
2530
- setCompactedThisTurn: (v) => {
2531
- self._compactedThisTurn = v;
2532
- },
2533
- getCompactedThisTurn: () => self._compactedThisTurn,
2534
- setTurnUserGoalExcerpt: (v) => {
2535
- self._turnUserGoalExcerpt = v;
2536
- },
2537
- setTurnAssistantReasoning: (v) => {
2538
- self._turnAssistantReasoning = v;
2539
- },
2540
- appendTurnAssistantReasoning: (delta) => {
2541
- self._turnAssistantReasoning = (self._turnAssistantReasoning + delta).slice(-400);
2542
- },
2543
- getTurnAssistantReasoning: () => self._turnAssistantReasoning,
2544
- setPriorWarningIdsInSession: (s) => {
2545
- self._priorWarningIdsInSession = s;
2546
- },
2547
- setMessages: (m) => {
2548
- self.messages = m;
2549
- },
2550
- requireProvider: () => self.requireProvider(),
2551
- emitSubagentStatus: (s) => self.emitSubagentStatus(s),
2552
- fireHook: (input, signal) =>
2553
- self.fireHook(input as Parameters<Agent["fireHook"]>[0], signal) as ReturnType<
2554
- MessageProcessorDeps["fireHook"]
2555
- >,
2556
- consumeBackgroundNotifications: () => self.consumeBackgroundNotifications(),
2557
- initOAuthProvider: () => self._initOAuthProvider(),
2558
- buildRecentTurnsSummary: () => self._buildRecentTurnsSummary(),
2559
- estimateProjectSize: () => self._estimateProjectSize(),
2560
- countFilesTouched: () => self._countFilesTouched(),
2561
- getCompactionSettings: (cw) => self.getCompactionSettings(cw),
2562
- compactForContext: (provider, system, cw, signal, settings, overflow) =>
2563
- self.compactForContext(provider, system, cw, signal, settings, overflow),
2564
- postTurnCompact: (provider, system, cw, signal) => self.postTurnCompact(provider, system, cw, signal),
2565
- runTask: (request, signal) => self.runTask(request, signal),
2566
- runDelegation: (request, signal) => self.runDelegation(request, signal),
2567
- readDelegation: (id) => self.readDelegation(id),
2568
- listDelegations: () => self.listDelegations(),
2569
- appendCompletedTurn: (user, asst) => self.appendCompletedTurn(user, asst),
2570
- discardAbortedTurn: (user) => self.discardAbortedTurn(user),
2571
- recordUsage: (usage, source, model, shape) => self.recordUsage(usage, source, model, shape),
2572
- respondToToolApproval: (id, ok) => self.respondToToolApproval(id, ok),
2573
- askToolLoopContinue: async (info) => {
2574
- const h = self._toolLoopCapHandler;
2575
- if (!h) return "stop";
2576
- try {
2577
- return await h(info);
2578
- } catch (err) {
2579
- console.error(`[Agent] askToolLoopContinue crashed: ${(err as Error)?.message ?? err}`);
2580
- return "stop";
2581
- }
2582
- },
2583
- runCouncilV2: (msg, opts) => self.runCouncilV2(msg, opts),
2584
- processMessage: (msg, obs, imgs) => self.processMessage(msg, obs, imgs),
2585
- processMessageBatchTurn: (args) => self.processMessageBatchTurn(args),
2586
- };
2587
- }
2588
-
2589
- // ========================================================================
2590
- // processMessage body extracted into MessageProcessor (Phase 12.4).
2591
- // The single original implementation now lives in
2592
- // `src/orchestrator/message-processor.ts`. The thin wrapper above is the
2593
- // only entry point.
2594
- // ========================================================================
2595
-
2596
- // ========================================================================
2597
- // Private helper methods — summary, estimation, verify
2598
- // ========================================================================
2599
-
2600
- private _buildRecentTurnsSummary(): string | null {
2601
- if (this.messages.length < 2) return null;
2602
- const recent = this.messages.slice(-6);
2603
- const parts: string[] = [];
2604
- for (const msg of recent) {
2605
- if (msg.role !== "user" && msg.role !== "assistant") continue;
2606
- const text =
2607
- typeof msg.content === "string"
2608
- ? msg.content
2609
- : Array.isArray(msg.content)
2610
- ? msg.content
2611
- .filter((p: { type: string }) => p.type === "text")
2612
- .map((p: { type: string; text?: string }) => p.text ?? "")
2613
- .join("")
2614
- : "";
2615
- if (!text) continue;
2616
- const snippet = text.length > 80 ? `${text.slice(0, 77)}...` : text;
2617
- parts.push(`[${msg.role}]: ${snippet}`);
2618
- }
2619
- return parts.length > 0 ? parts.join(" | ") : null;
2620
- }
2621
-
2622
- private _estimateProjectSize(): "small" | "medium" | "large" | null {
2623
- try {
2624
- const fs = require("fs");
2625
- const path = require("path");
2626
- const cwd = this.bash.getCwd();
2627
- const srcDir = path.join(cwd, "src");
2628
- if (!fs.existsSync(srcDir)) return null;
2629
- let count = 0;
2630
- const walk = (dir: string) => {
2631
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
2632
- if (entry.name === "node_modules" || entry.name === ".git") continue;
2633
- if (entry.isDirectory()) walk(path.join(dir, entry.name));
2634
- else if (/\.(ts|tsx|js|jsx|py|go|rs)$/.test(entry.name)) count++;
2635
- if (count > 200) return;
2636
- }
2637
- };
2638
- walk(srcDir);
2639
- if (count <= 20) return "small";
2640
- if (count <= 100) return "medium";
2641
- return "large";
2642
- } catch {
2643
- return null;
2644
- }
2645
- }
2646
-
2647
- private _countFilesTouched(): number {
2648
- let count = 0;
2649
- for (const msg of this.messages) {
2650
- if (msg.role !== "assistant" || !Array.isArray(msg.content)) continue;
2651
- for (const part of msg.content) {
2652
- if ((part as { type: string }).type === "tool-call") {
2653
- const tc = part as { type: string; toolName?: string; args?: Record<string, unknown> };
2654
- if (tc.toolName === "write_file" || tc.toolName === "edit_file" || tc.toolName === "bash") count++;
2655
- }
2656
- }
2657
- }
2658
- return count;
2659
- }
2660
-
2661
- private requireProvider(): LegacyProvider {
2662
- if (!this.provider) {
2663
- throw new Error("API key required. Add an API key to continue.");
2664
- }
2665
-
2666
- return this.provider;
2667
- }
2668
-
2669
- /**
2670
- * One-shot async init: upgrades the OpenAI provider to use OAuth tokens when
2671
- * stored tokens are available and no explicit API key was supplied by the user.
2672
- * Called at the start of processMessage so the first real LLM call benefits
2673
- * from OAuth without requiring a sync constructor change.
2674
- *
2675
- * Idempotent: skips on second call and for non-OpenAI providers.
2676
- * Fail-open: any error leaves the existing provider untouched.
2677
- */
2678
- private async _initOAuthProvider(): Promise<void> {
2679
- if (this._oauthInitDone) return;
2680
- this._oauthInitDone = true;
2681
-
2682
- // Only upgrade when there is no explicit API key — OAuth is an alternative
2683
- // auth path, not an override when the user deliberately passed a key.
2684
- // The boot wizard in src/index.ts uses the literal "oauth" as a sentinel
2685
- // to signal "no API key but OAuth tokens exist", so treat that as "no
2686
- // key" here.
2687
- if (this.apiKey && this.apiKey !== "oauth") return;
2688
-
2689
- try {
2690
- const { listOAuthProviderIds } = await import("../providers/auth/registry.js");
2691
- const ids = await listOAuthProviderIds();
2692
- if (!ids.includes(this.providerId)) return;
2693
-
2694
- const effectiveBaseURL =
2695
- this.baseURL &&
2696
- this.baseURL !== (await import("../providers/endpoints.js").then((m) => m.apiBaseFor("anthropic")))
2697
- ? this.baseURL
2698
- : undefined;
2699
- const result = await createProviderFactoryAsync(this.providerId, {
2700
- baseURL: effectiveBaseURL ?? undefined,
2701
- });
2702
- this.provider = result.factory;
2703
- } catch {
2704
- // Fail-open — provider remains null; requireProvider() will surface the error
2705
- }
2706
- }
2707
-
2708
- async detectVerifyRecipe(settings?: SandboxSettings, abortSignal?: AbortSignal): Promise<VerifyRecipe | null> {
2709
- try {
2710
- const result = await this.runTaskRequest(
2711
- {
2712
- agent: "verify-detect",
2713
- description: "Detect verification recipe",
2714
- prompt: buildVerifyDetectPrompt(this.bash.getCwd(), settings ?? this.bash.getSandboxSettings()),
2715
- },
2716
- undefined,
2717
- abortSignal,
2718
- );
2719
- if (!result.success || !result.output) return null;
2720
- const maybeJson = extractJsonObject(result.output);
2721
- if (!maybeJson) return null;
2722
- return normalizeVerifyRecipe(JSON.parse(maybeJson));
2723
- } catch {
2724
- return null;
2725
- }
2726
- }
2727
-
2728
- async runVerify(onProgress?: (detail: string) => void, abortSignal?: AbortSignal): Promise<ToolResult> {
2729
- this.abortController = new AbortController();
2730
- const signal = abortSignal ?? this.abortController.signal;
2731
- const userModelMessage: ModelMessage = { role: "user", content: "/verify" };
2732
- this.messages.push(userModelMessage);
2733
- this.messageSeqs.push(null);
2734
-
2735
- try {
2736
- await this.consumeBackgroundNotifications();
2737
- const result = await runVerifyOrchestration(this, { onProgress, abortSignal: signal });
2738
- const assistantText = result.output || result.error || "Verification completed.";
2739
- this.appendCompletedTurn(userModelMessage, [{ role: "assistant", content: assistantText }]);
2740
- return result;
2741
- } catch (err: unknown) {
2742
- const msg = err instanceof Error ? err.message : String(err);
2743
- const failureText = signal.aborted ? "Verification aborted." : `Verification failed: ${msg}`;
2744
- this.appendCompletedTurn(userModelMessage, [{ role: "assistant", content: failureText }]);
2745
- return { success: false, output: failureText };
2746
- } finally {
2747
- if (this.abortController?.signal === signal) {
2748
- this.abortController = null;
2749
- }
2750
- }
2751
- }
2752
- }