muonroi-cli 1.8.4 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. package/LICENSE +17 -5
  2. package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
  3. package/dist/packages/agent-harness-core/src/driver.js +46 -0
  4. package/dist/packages/agent-harness-core/src/event-filter.js +11 -0
  5. package/dist/packages/agent-harness-core/src/event-redact.js +7 -0
  6. package/dist/packages/agent-harness-core/src/event-tee.d.ts +64 -0
  7. package/dist/packages/agent-harness-core/src/event-tee.js +104 -0
  8. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +25 -0
  9. package/dist/packages/agent-harness-core/src/mcp-server.js +169 -21
  10. package/dist/packages/agent-harness-core/src/predicate.d.ts +1 -1
  11. package/dist/packages/agent-harness-core/src/protocol.d.ts +90 -4
  12. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  13. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  14. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  15. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  16. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  17. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  18. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  19. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  20. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  21. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  22. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  23. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  24. package/dist/src/agent-harness/mock-model.d.ts +38 -0
  25. package/dist/src/agent-harness/mock-model.js +69 -3
  26. package/dist/src/agent-harness/test-spawn.js +31 -0
  27. package/dist/src/chat/chat-keychain.d.ts +7 -12
  28. package/dist/src/chat/chat-keychain.js +19 -86
  29. package/dist/src/cli/config/screen-providers.js +1 -1
  30. package/dist/src/cli/cost-forensics.d.ts +10 -0
  31. package/dist/src/cli/cost-forensics.js +18 -3
  32. package/dist/src/cli/keys-bundle.d.ts +1 -1
  33. package/dist/src/cli/keys-bundle.js +1 -1
  34. package/dist/src/cli/keys.d.ts +10 -47
  35. package/dist/src/cli/keys.js +31 -399
  36. package/dist/src/council/clarifier.d.ts +31 -3
  37. package/dist/src/council/clarifier.js +220 -32
  38. package/dist/src/council/context.js +49 -15
  39. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  40. package/dist/src/council/debate-checkpoint.js +176 -0
  41. package/dist/src/council/debate-planner.js +54 -5
  42. package/dist/src/council/debate-summary.d.ts +25 -0
  43. package/dist/src/council/debate-summary.js +85 -0
  44. package/dist/src/council/debate.d.ts +169 -2
  45. package/dist/src/council/debate.js +1265 -135
  46. package/dist/src/council/index.d.ts +108 -1
  47. package/dist/src/council/index.js +670 -197
  48. package/dist/src/council/leader.d.ts +26 -0
  49. package/dist/src/council/leader.js +150 -9
  50. package/dist/src/council/llm.d.ts +94 -0
  51. package/dist/src/council/llm.js +348 -55
  52. package/dist/src/council/panel-select.d.ts +30 -0
  53. package/dist/src/council/panel-select.js +82 -0
  54. package/dist/src/council/planner.js +40 -0
  55. package/dist/src/council/preflight.d.ts +17 -0
  56. package/dist/src/council/preflight.js +50 -2
  57. package/dist/src/council/prompts.d.ts +39 -4
  58. package/dist/src/council/prompts.js +256 -69
  59. package/dist/src/council/stance-recall.d.ts +42 -0
  60. package/dist/src/council/stance-recall.js +57 -0
  61. package/dist/src/council/strip-think.d.ts +17 -0
  62. package/dist/src/council/strip-think.js +33 -0
  63. package/dist/src/council/types.d.ts +138 -0
  64. package/dist/src/ee/artifact-cache.d.ts +16 -0
  65. package/dist/src/ee/artifact-cache.js +32 -0
  66. package/dist/src/ee/auth.d.ts +20 -0
  67. package/dist/src/ee/auth.js +54 -2
  68. package/dist/src/ee/bridge.d.ts +10 -0
  69. package/dist/src/ee/bridge.js +58 -0
  70. package/dist/src/ee/client.js +109 -21
  71. package/dist/src/ee/ee-onboarding.js +6 -26
  72. package/dist/src/ee/export-transcripts.d.ts +1 -0
  73. package/dist/src/ee/export-transcripts.js +8 -10
  74. package/dist/src/ee/extract-session.js +29 -0
  75. package/dist/src/ee/extract-style.d.ts +58 -0
  76. package/dist/src/ee/extract-style.js +270 -0
  77. package/dist/src/ee/recall-ledger.d.ts +9 -0
  78. package/dist/src/ee/recall-ledger.js +3 -0
  79. package/dist/src/ee/scope.d.ts +1 -0
  80. package/dist/src/ee/scope.js +26 -1
  81. package/dist/src/ee/search.d.ts +7 -0
  82. package/dist/src/ee/search.js +24 -0
  83. package/dist/src/ee/transcript-emit.js +2 -0
  84. package/dist/src/ee/types.d.ts +22 -0
  85. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  86. package/dist/src/ee/who-am-i-brain.js +220 -0
  87. package/dist/src/ee/who-am-i.d.ts +10 -3
  88. package/dist/src/ee/who-am-i.js +12 -0
  89. package/dist/src/ee/workflow-event.d.ts +48 -0
  90. package/dist/src/ee/workflow-event.js +81 -0
  91. package/dist/src/flow/compaction/compress.d.ts +3 -3
  92. package/dist/src/flow/compaction/compress.js +58 -8
  93. package/dist/src/flow/compaction/extract.d.ts +4 -7
  94. package/dist/src/flow/compaction/extract.js +50 -10
  95. package/dist/src/flow/compaction/index.d.ts +14 -1
  96. package/dist/src/flow/compaction/index.js +96 -3
  97. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  98. package/dist/src/flow/compaction/input-guard.js +43 -0
  99. package/dist/src/flow/compaction/progress.d.ts +35 -0
  100. package/dist/src/flow/compaction/progress.js +35 -0
  101. package/dist/src/flow/fold-planning.d.ts +36 -0
  102. package/dist/src/flow/fold-planning.js +83 -0
  103. package/dist/src/flow/hierarchy.d.ts +146 -0
  104. package/dist/src/flow/hierarchy.js +427 -0
  105. package/dist/src/flow/index.d.ts +1 -0
  106. package/dist/src/flow/index.js +2 -0
  107. package/dist/src/flow/run-artifacts.d.ts +102 -0
  108. package/dist/src/flow/run-artifacts.js +208 -0
  109. package/dist/src/generated/version.d.ts +1 -1
  110. package/dist/src/generated/version.js +1 -1
  111. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  112. package/dist/src/gsd/assessment-schema.js +134 -0
  113. package/dist/src/gsd/capability-registry.d.ts +45 -0
  114. package/dist/src/gsd/capability-registry.js +337 -0
  115. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  116. package/dist/src/gsd/complexity-assessor.js +152 -0
  117. package/dist/src/gsd/config-bridge.d.ts +7 -0
  118. package/dist/src/gsd/config-bridge.js +114 -0
  119. package/dist/src/gsd/config-loader.d.ts +27 -0
  120. package/dist/src/gsd/config-loader.js +50 -0
  121. package/dist/src/gsd/council-context.d.ts +44 -0
  122. package/dist/src/gsd/council-context.js +114 -0
  123. package/dist/src/gsd/ee-closure.d.ts +28 -0
  124. package/dist/src/gsd/ee-closure.js +49 -0
  125. package/dist/src/gsd/flags.d.ts +66 -0
  126. package/dist/src/gsd/flags.js +102 -0
  127. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  128. package/dist/src/gsd/gsd-dispatch.js +131 -0
  129. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  130. package/dist/src/gsd/gsd-runtime.js +37 -0
  131. package/dist/src/gsd/host-adapter.d.ts +11 -0
  132. package/dist/src/gsd/host-adapter.js +29 -0
  133. package/dist/src/gsd/index.d.ts +24 -1
  134. package/dist/src/gsd/index.js +27 -0
  135. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  136. package/dist/src/gsd/loop-host-contract.js +39 -0
  137. package/dist/src/gsd/loop-host.d.ts +69 -0
  138. package/dist/src/gsd/loop-host.js +245 -0
  139. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  140. package/dist/src/gsd/loop-resolver.js +79 -0
  141. package/dist/src/gsd/model-tier.d.ts +13 -0
  142. package/dist/src/gsd/model-tier.js +45 -0
  143. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  144. package/dist/src/gsd/mutation-gate.js +41 -0
  145. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  146. package/dist/src/gsd/native-roadmap.js +343 -0
  147. package/dist/src/gsd/native-state.d.ts +47 -0
  148. package/dist/src/gsd/native-state.js +220 -0
  149. package/dist/src/gsd/paths.d.ts +23 -0
  150. package/dist/src/gsd/paths.js +66 -0
  151. package/dist/src/gsd/phase-dag.d.ts +12 -0
  152. package/dist/src/gsd/phase-dag.js +94 -0
  153. package/dist/src/gsd/phase-sync.d.ts +42 -0
  154. package/dist/src/gsd/phase-sync.js +321 -0
  155. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  156. package/dist/src/gsd/pil-gate-context.js +64 -0
  157. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  158. package/dist/src/gsd/pil-gate-critic.js +74 -0
  159. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  160. package/dist/src/gsd/plan-council-prompts.js +79 -0
  161. package/dist/src/gsd/plan-council.d.ts +44 -0
  162. package/dist/src/gsd/plan-council.js +283 -0
  163. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  164. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  165. package/dist/src/gsd/product-workspace.d.ts +13 -0
  166. package/dist/src/gsd/product-workspace.js +124 -0
  167. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  168. package/dist/src/gsd/ship-bridge.js +65 -0
  169. package/dist/src/gsd/state-document.d.ts +40 -0
  170. package/dist/src/gsd/state-document.js +163 -0
  171. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  172. package/dist/src/gsd/verdict-schema.js +144 -0
  173. package/dist/src/gsd/verify-context.d.ts +22 -0
  174. package/dist/src/gsd/verify-context.js +27 -0
  175. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  176. package/dist/src/gsd/verify-council-prompts.js +85 -0
  177. package/dist/src/gsd/verify-council.d.ts +25 -0
  178. package/dist/src/gsd/verify-council.js +119 -0
  179. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  180. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  181. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  182. package/dist/src/gsd/workflow-engine.js +207 -0
  183. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  184. package/dist/src/gsd/workflow-tools.js +277 -0
  185. package/dist/src/headless/council-answers.js +4 -0
  186. package/dist/src/hooks/index.js +1 -1
  187. package/dist/src/index.js +172 -270
  188. package/dist/src/lsp/builtins.js +3 -1
  189. package/dist/src/lsp/manager.d.ts +5 -1
  190. package/dist/src/lsp/manager.js +249 -3
  191. package/dist/src/lsp/npm-cache.d.ts +11 -1
  192. package/dist/src/lsp/npm-cache.js +17 -1
  193. package/dist/src/lsp/runtime.d.ts +6 -1
  194. package/dist/src/lsp/runtime.js +17 -1
  195. package/dist/src/lsp/types.d.ts +83 -1
  196. package/dist/src/lsp/types.js +10 -0
  197. package/dist/src/maintain/pr-builder.js +23 -13
  198. package/dist/src/mcp/auto-setup.js +57 -32
  199. package/dist/src/mcp/client-pool.js +44 -16
  200. package/dist/src/mcp/lsp-tools.d.ts +5 -1
  201. package/dist/src/mcp/lsp-tools.js +93 -2
  202. package/dist/src/mcp/mcp-keychain.d.ts +3 -5
  203. package/dist/src/mcp/mcp-keychain.js +9 -49
  204. package/dist/src/mcp/research-onboarding.js +8 -7
  205. package/dist/src/mcp/runtime.js +34 -2
  206. package/dist/src/mcp/setup-guide-text.d.ts +1 -1
  207. package/dist/src/mcp/setup-guide-text.js +22 -2
  208. package/dist/src/mcp/tools-server.d.ts +10 -0
  209. package/dist/src/mcp/tools-server.js +10 -2
  210. package/dist/src/models/catalog-client.d.ts +87 -0
  211. package/dist/src/models/catalog-client.js +105 -38
  212. package/dist/src/models/catalog.json +528 -265
  213. package/dist/src/models/registry.d.ts +22 -7
  214. package/dist/src/models/registry.js +73 -10
  215. package/dist/src/ops/doctor.js +1 -1
  216. package/dist/src/orchestrator/ask-user.d.ts +61 -0
  217. package/dist/src/orchestrator/ask-user.js +65 -0
  218. package/dist/src/orchestrator/auto-commit.js +1 -1
  219. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  220. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  221. package/dist/src/orchestrator/cache-prefix.js +83 -0
  222. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  223. package/dist/src/orchestrator/compact-request.js +41 -0
  224. package/dist/src/orchestrator/compaction.d.ts +12 -3
  225. package/dist/src/orchestrator/compaction.js +35 -15
  226. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  227. package/dist/src/orchestrator/council-manager.js +74 -32
  228. package/dist/src/orchestrator/council-request.d.ts +49 -0
  229. package/dist/src/orchestrator/council-request.js +62 -0
  230. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  231. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  232. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  233. package/dist/src/orchestrator/error-utils.js +132 -24
  234. package/dist/src/orchestrator/grounding-check.js +39 -1
  235. package/dist/src/orchestrator/interactive-pause.d.ts +26 -0
  236. package/dist/src/orchestrator/interactive-pause.js +36 -0
  237. package/dist/src/orchestrator/message-processor.d.ts +4 -0
  238. package/dist/src/orchestrator/message-processor.js +268 -41
  239. package/dist/src/orchestrator/orchestrator.d.ts +64 -3
  240. package/dist/src/orchestrator/orchestrator.js +823 -120
  241. package/dist/src/orchestrator/preprocessor.js +3 -3
  242. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  243. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  244. package/dist/src/orchestrator/prompts.js +17 -17
  245. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  246. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  247. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  248. package/dist/src/orchestrator/retry-classifier.js +46 -2
  249. package/dist/src/orchestrator/safety-askcard.d.ts +1 -1
  250. package/dist/src/orchestrator/safety-askcard.js +5 -2
  251. package/dist/src/orchestrator/safety-intercept.d.ts +50 -0
  252. package/dist/src/orchestrator/safety-intercept.js +62 -0
  253. package/dist/src/orchestrator/scope-reminder.js +1 -1
  254. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  255. package/dist/src/orchestrator/session-experience.js +2 -1
  256. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  257. package/dist/src/orchestrator/should-run-gate.js +18 -0
  258. package/dist/src/orchestrator/stall-watchdog.d.ts +31 -3
  259. package/dist/src/orchestrator/stall-watchdog.js +65 -10
  260. package/dist/src/orchestrator/stream-runner.d.ts +13 -3
  261. package/dist/src/orchestrator/stream-runner.js +115 -49
  262. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  263. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  264. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  265. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  266. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  267. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  268. package/dist/src/orchestrator/tool-engine.d.ts +41 -0
  269. package/dist/src/orchestrator/tool-engine.js +846 -66
  270. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  271. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  272. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  273. package/dist/src/orchestrator/turn-watchdog.d.ts +44 -0
  274. package/dist/src/orchestrator/turn-watchdog.js +84 -0
  275. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  276. package/dist/src/pil/agent-operating-contract.js +6 -4
  277. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  278. package/dist/src/pil/cheap-model-playbook.js +5 -1
  279. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  280. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  281. package/dist/src/pil/discovery-types.d.ts +1 -0
  282. package/dist/src/pil/discovery.d.ts +1 -1
  283. package/dist/src/pil/discovery.js +18 -13
  284. package/dist/src/pil/layer1-intent.d.ts +18 -6
  285. package/dist/src/pil/layer1-intent.js +66 -757
  286. package/dist/src/pil/layer15-context-scan.js +15 -1
  287. package/dist/src/pil/layer1_5-complexity-size.d.ts +7 -0
  288. package/dist/src/pil/layer1_5-complexity-size.js +31 -5
  289. package/dist/src/pil/layer3-ee-injection.js +23 -8
  290. package/dist/src/pil/layer4-gsd.js +69 -16
  291. package/dist/src/pil/layer5-context.js +7 -3
  292. package/dist/src/pil/layer6-output.d.ts +23 -0
  293. package/dist/src/pil/layer6-output.js +5 -1
  294. package/dist/src/pil/llm-classify.d.ts +111 -5
  295. package/dist/src/pil/llm-classify.js +421 -189
  296. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  297. package/dist/src/pil/native-capabilities-workbook.js +8 -0
  298. package/dist/src/pil/pipeline.js +36 -2
  299. package/dist/src/pil/repo-grounding-probe.d.ts +15 -0
  300. package/dist/src/pil/repo-grounding-probe.js +136 -0
  301. package/dist/src/pil/repo-structure-hints.d.ts +7 -0
  302. package/dist/src/pil/repo-structure-hints.js +45 -0
  303. package/dist/src/pil/response-tools.js +5 -3
  304. package/dist/src/pil/schema.d.ts +1 -0
  305. package/dist/src/pil/schema.js +2 -0
  306. package/dist/src/pil/types.d.ts +18 -0
  307. package/dist/src/playbook/directives.d.ts +4 -0
  308. package/dist/src/playbook/directives.js +17 -5
  309. package/dist/src/product-loop/artifact-io.js +4 -0
  310. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  311. package/dist/src/product-loop/backlog-builder.js +30 -6
  312. package/dist/src/product-loop/criteria-seed.d.ts +51 -0
  313. package/dist/src/product-loop/criteria-seed.js +200 -0
  314. package/dist/src/product-loop/discovery-context-format.js +3 -1
  315. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  316. package/dist/src/product-loop/discovery-interview.d.ts +9 -0
  317. package/dist/src/product-loop/discovery-interview.js +60 -12
  318. package/dist/src/product-loop/discovery-recommender.js +2 -1
  319. package/dist/src/product-loop/discovery-schema.js +19 -2
  320. package/dist/src/product-loop/discovery-triage.d.ts +23 -0
  321. package/dist/src/product-loop/discovery-triage.js +109 -0
  322. package/dist/src/product-loop/gather.js +150 -2
  323. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  324. package/dist/src/product-loop/ideal-trace.js +64 -0
  325. package/dist/src/product-loop/index.d.ts +13 -1
  326. package/dist/src/product-loop/index.js +340 -52
  327. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  328. package/dist/src/product-loop/loop-driver.js +330 -106
  329. package/dist/src/product-loop/phase-plan.d.ts +21 -0
  330. package/dist/src/product-loop/phase-plan.js +81 -6
  331. package/dist/src/product-loop/phase-rituals.d.ts +3 -0
  332. package/dist/src/product-loop/phase-rituals.js +8 -3
  333. package/dist/src/product-loop/phase-runner.js +39 -12
  334. package/dist/src/product-loop/plan-adherence-review.d.ts +26 -0
  335. package/dist/src/product-loop/plan-adherence-review.js +144 -0
  336. package/dist/src/product-loop/sprint-runner.d.ts +173 -0
  337. package/dist/src/product-loop/sprint-runner.js +863 -19
  338. package/dist/src/product-loop/types.d.ts +61 -5
  339. package/dist/src/providers/adapter.d.ts +1 -1
  340. package/dist/src/providers/adapter.js +3 -4
  341. package/dist/src/providers/anthropic.d.ts +9 -8
  342. package/dist/src/providers/anthropic.js +13 -47
  343. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  344. package/dist/src/providers/auth/browser-flow.js +1 -1
  345. package/dist/src/providers/auth/grok-oauth.d.ts +1 -0
  346. package/dist/src/providers/auth/grok-oauth.js +30 -5
  347. package/dist/src/providers/auth/openai-oauth.d.ts +1 -0
  348. package/dist/src/providers/auth/openai-oauth.js +15 -1
  349. package/dist/src/providers/auth/registry.js +0 -34
  350. package/dist/src/providers/auth/token-store.d.ts +9 -9
  351. package/dist/src/providers/auth/token-store.js +8 -67
  352. package/dist/src/providers/auth/types.d.ts +9 -1
  353. package/dist/src/providers/auth/types.js +1 -1
  354. package/dist/src/providers/capabilities.d.ts +24 -5
  355. package/dist/src/providers/capabilities.js +42 -24
  356. package/dist/src/providers/endpoints.d.ts +2 -2
  357. package/dist/src/providers/endpoints.js +11 -10
  358. package/dist/src/providers/env-store.d.ts +17 -0
  359. package/dist/src/providers/env-store.js +228 -0
  360. package/dist/src/providers/keychain.d.ts +22 -18
  361. package/dist/src/providers/keychain.js +127 -140
  362. package/dist/src/providers/mcp-vision-bridge.js +56 -146
  363. package/dist/src/providers/openai-compatible.js +8 -1
  364. package/dist/src/providers/pricing.d.ts +2 -2
  365. package/dist/src/providers/pricing.js +3 -13
  366. package/dist/src/providers/runtime.d.ts +43 -3
  367. package/dist/src/providers/runtime.js +88 -14
  368. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  369. package/dist/src/providers/strategies/base.strategy.js +24 -1
  370. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  371. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  372. package/dist/src/providers/strategies/registry.js +4 -4
  373. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  374. package/dist/src/providers/strategies/thinking-mode.js +288 -1
  375. package/dist/src/providers/strategies/xai.strategy.js +27 -0
  376. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  377. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  378. package/dist/src/providers/types.d.ts +5 -6
  379. package/dist/src/providers/types.js +2 -2
  380. package/dist/src/providers/vision-backend.d.ts +47 -0
  381. package/dist/src/providers/vision-backend.js +258 -0
  382. package/dist/src/providers/vision-proxy.d.ts +22 -9
  383. package/dist/src/providers/vision-proxy.js +63 -132
  384. package/dist/src/providers/warm.d.ts +65 -0
  385. package/dist/src/providers/warm.js +145 -0
  386. package/dist/src/providers/wire-debug.js +95 -0
  387. package/dist/src/router/decide.d.ts +13 -0
  388. package/dist/src/router/decide.js +138 -36
  389. package/dist/src/router/peak-hour.d.ts +38 -0
  390. package/dist/src/router/peak-hour.js +107 -0
  391. package/dist/src/router/step-router.js +3 -2
  392. package/dist/src/router/warm.js +4 -5
  393. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  394. package/dist/src/scaffold/continuation-prompt.js +26 -0
  395. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  396. package/dist/src/scaffold/point-to-existing.js +25 -0
  397. package/dist/src/self-qa/agentic-loop.js +6 -5
  398. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  399. package/dist/src/{ui/state → state}/active-run.js +21 -0
  400. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  401. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  402. package/dist/src/state/turn-trace.d.ts +43 -0
  403. package/dist/src/state/turn-trace.js +32 -0
  404. package/dist/src/storage/db.js +2 -1
  405. package/dist/src/storage/index.d.ts +1 -1
  406. package/dist/src/storage/index.js +1 -1
  407. package/dist/src/storage/interaction-log.d.ts +1 -1
  408. package/dist/src/storage/migrations.js +71 -1
  409. package/dist/src/storage/sessions.d.ts +28 -10
  410. package/dist/src/storage/sessions.js +78 -21
  411. package/dist/src/storage/transcript-view.js +1 -1
  412. package/dist/src/storage/transcript.d.ts +51 -0
  413. package/dist/src/storage/transcript.js +340 -15
  414. package/dist/src/tools/file.d.ts +15 -0
  415. package/dist/src/tools/file.js +32 -0
  416. package/dist/src/tools/git-safety.d.ts +19 -0
  417. package/dist/src/tools/git-safety.js +168 -0
  418. package/dist/src/tools/native-tools.d.ts +1 -1
  419. package/dist/src/tools/native-tools.js +81 -1
  420. package/dist/src/tools/registry.d.ts +20 -0
  421. package/dist/src/tools/registry.js +576 -23
  422. package/dist/src/tools/research.d.ts +29 -0
  423. package/dist/src/tools/research.js +233 -0
  424. package/dist/src/types/index.d.ts +147 -4
  425. package/dist/src/ui/app.js +0 -0
  426. package/dist/src/ui/cards/product-status-card.js +1 -1
  427. package/dist/src/ui/components/agent-rail-activities.d.ts +26 -0
  428. package/dist/src/ui/components/agent-rail-activities.js +47 -0
  429. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  430. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  431. package/dist/src/ui/components/compact-progress-card.d.ts +24 -0
  432. package/dist/src/ui/components/compact-progress-card.js +42 -0
  433. package/dist/src/ui/components/context-rail.d.ts +26 -0
  434. package/dist/src/ui/components/context-rail.js +33 -0
  435. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  436. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  437. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  438. package/dist/src/ui/components/council-debate-pill.js +34 -0
  439. package/dist/src/ui/components/council-info-card.js +2 -2
  440. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  441. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  442. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  443. package/dist/src/ui/components/council-message-bubble.js +16 -15
  444. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  445. package/dist/src/ui/components/council-phase-timeline.js +66 -17
  446. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  447. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  448. package/dist/src/ui/components/council-question-card.js +13 -12
  449. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  450. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  451. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  452. package/dist/src/ui/components/council-round-group.js +88 -0
  453. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  454. package/dist/src/ui/components/council-status-list.js +36 -24
  455. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  456. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  457. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  458. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  459. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  460. package/dist/src/ui/components/message-view.d.ts +15 -0
  461. package/dist/src/ui/components/message-view.js +50 -1
  462. package/dist/src/ui/components/prompt-box.js +18 -16
  463. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  464. package/dist/src/ui/components/session-tree-card.js +46 -0
  465. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  466. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  467. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  468. package/dist/src/ui/components/task-list-panel.js +22 -2
  469. package/dist/src/ui/components/tool-group.d.ts +15 -3
  470. package/dist/src/ui/components/tool-group.js +69 -11
  471. package/dist/src/ui/containers/modals-layer.d.ts +4 -2
  472. package/dist/src/ui/containers/modals-layer.js +2 -2
  473. package/dist/src/ui/council-harness-event.d.ts +57 -0
  474. package/dist/src/ui/council-harness-event.js +46 -0
  475. package/dist/src/ui/heartbeat-debug.d.ts +29 -0
  476. package/dist/src/ui/heartbeat-debug.js +45 -0
  477. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  478. package/dist/src/ui/mcp-modal.js +2 -4
  479. package/dist/src/ui/modals/api-key-modal.js +1 -1
  480. package/dist/src/ui/modals/connect-modal.js +4 -3
  481. package/dist/src/ui/modals/model-picker-modal.d.ts +8 -18
  482. package/dist/src/ui/modals/model-picker-modal.js +8 -10
  483. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  484. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  485. package/dist/src/ui/picker-providers.d.ts +1 -1
  486. package/dist/src/ui/picker-providers.js +1 -1
  487. package/dist/src/ui/primitives/index.d.ts +1 -0
  488. package/dist/src/ui/primitives/index.js +2 -0
  489. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  490. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  491. package/dist/src/ui/slash/compact.js +5 -7
  492. package/dist/src/ui/slash/cost.js +1 -1
  493. package/dist/src/ui/slash/council.js +19 -1
  494. package/dist/src/ui/slash/debug.d.ts +3 -31
  495. package/dist/src/ui/slash/debug.js +9 -20
  496. package/dist/src/ui/slash/ee.js +81 -0
  497. package/dist/src/ui/slash/ideal.d.ts +6 -2
  498. package/dist/src/ui/slash/ideal.js +97 -7
  499. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  500. package/dist/src/ui/slash/menu-items.js +23 -20
  501. package/dist/src/ui/slash/registry.d.ts +2 -0
  502. package/dist/src/ui/slash/registry.js +4 -0
  503. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  504. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  505. package/dist/src/ui/status-bar/index.d.ts +1 -1
  506. package/dist/src/ui/status-bar/index.js +7 -3
  507. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  508. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  509. package/dist/src/ui/theme.d.ts +1 -0
  510. package/dist/src/ui/theme.js +2 -0
  511. package/dist/src/ui/types.d.ts +7 -0
  512. package/dist/src/ui/use-app-logic.js +0 -0
  513. package/dist/src/ui/utils/agent-activities.d.ts +39 -0
  514. package/dist/src/ui/utils/agent-activities.js +96 -0
  515. package/dist/src/ui/utils/format.d.ts +14 -0
  516. package/dist/src/ui/utils/format.js +23 -3
  517. package/dist/src/ui/utils/group-tool-entries.d.ts +26 -0
  518. package/dist/src/ui/utils/group-tool-entries.js +111 -0
  519. package/dist/src/ui/utils/tool-summary.d.ts +21 -0
  520. package/dist/src/ui/utils/tool-summary.js +91 -0
  521. package/dist/src/usage/downgrade.js +2 -2
  522. package/dist/src/usage/product-ledger.js +2 -2
  523. package/dist/src/utils/event-loop-monitor.d.ts +85 -0
  524. package/dist/src/utils/event-loop-monitor.js +107 -0
  525. package/dist/src/utils/install-manager.js +2 -1
  526. package/dist/src/utils/llm-deadline.d.ts +14 -0
  527. package/dist/src/utils/llm-deadline.js +19 -0
  528. package/dist/src/utils/logger.js +2 -2
  529. package/dist/src/utils/loop-profiler.d.ts +102 -0
  530. package/dist/src/utils/loop-profiler.js +202 -0
  531. package/dist/src/utils/permission-mode.js +5 -3
  532. package/dist/src/utils/redactor.js +1 -1
  533. package/dist/src/utils/settings.d.ts +180 -5
  534. package/dist/src/utils/settings.js +271 -31
  535. package/dist/src/utils/side-question.d.ts +1 -2
  536. package/dist/src/utils/side-question.js +2 -2
  537. package/dist/src/utils/visible-retry.d.ts +11 -0
  538. package/dist/src/utils/visible-retry.js +10 -1
  539. package/dist/src/verify/entrypoint.d.ts +1 -1
  540. package/dist/src/verify/entrypoint.js +52 -17
  541. package/dist/src/verify/orchestrator.d.ts +1 -1
  542. package/dist/src/verify/orchestrator.js +20 -3
  543. package/dist/src/verify/recipes.d.ts +13 -0
  544. package/dist/src/verify/recipes.js +15 -0
  545. package/package.json +134 -132
  546. package/dist/src/cli/bw-vault.d.ts +0 -55
  547. package/dist/src/cli/bw-vault.js +0 -133
  548. package/dist/src/mcp/ee-tools.d.ts +0 -46
  549. package/dist/src/mcp/ee-tools.js +0 -193
  550. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  551. package/dist/src/providers/auth/gcloud.js +0 -102
  552. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  553. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  554. package/dist/src/providers/gemini.d.ts +0 -11
  555. package/dist/src/providers/gemini.js +0 -45
  556. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  557. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  558. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  559. package/dist/src/providers/strategies/google.strategy.js +0 -174
  560. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  561. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  562. package/dist/src/ui/containers/chat-feed.js +0 -66
@@ -95,7 +95,7 @@ export interface SubAgentCompactorOptions {
95
95
  * stub (full raw content available here). Fire-and-forget EE persist under
96
96
  * source:"tool-artifact" so layer3/ee.query can later fetch "full tool result id=xxx".
97
97
  */
98
- persistArtifact?: (toolCallId: string, toolName: string, fullContent: string, reason: string) => void;
98
+ persistArtifact?: (toolCallId: string, toolName: string, fullContent: string, reason: string, summary?: string) => void;
99
99
  /**
100
100
  * T1.1 — strip reasoning parts from old assistant turns (older than
101
101
  * keepLastTurns). Reasoning tokens (CoT / <think>) from prior turns are
@@ -104,6 +104,18 @@ export interface SubAgentCompactorOptions {
104
104
  * models, false otherwise.
105
105
  */
106
106
  stripOldReasoning?: boolean;
107
+ /**
108
+ * O2 — max cumulative chars of the verbatim tail (the last keepLastTurns
109
+ * turns). The G2 shrink is FILL-ratio based, so on a large-context model a
110
+ * read-heavy tail (five 8-30k tool results) stays verbatim at only ~50%
111
+ * fill — pinning every tool round at 60-80k input (measured: July-8 message
112
+ * calls, 83 in the 60-80k bucket = 44% of message-fresh). When set, keepLast
113
+ * is reduced further (floor 2) until the kept tail fits this budget,
114
+ * regardless of fill ratio. High-value results (isHighValueToolResult) are
115
+ * still kept verbatim independently, so only bulk dumps get stubbed.
116
+ * Undefined = off (sub-agent path unchanged).
117
+ */
118
+ tailBudgetChars?: number;
107
119
  }
108
120
  /**
109
121
  * G1 — coarse char→token conversion. The real ratio is provider/tokenizer
@@ -136,6 +148,7 @@ export declare const HIGH_VALUE_MCP_PREFIXES: readonly ["mcp_muonroi-docs__"];
136
148
  */
137
149
  export declare function isHighValueToolResult(toolName: string, preview: string, explicitKeepIds?: Set<string>, toolCallId?: string): boolean;
138
150
  export declare function cumulativeMessageChars(messages: ReadonlyArray<ModelMessage>): number;
151
+ export declare function buildSlimContext(msgs: ModelMessage[]): ModelMessage[];
139
152
  /**
140
153
  * Compact a sub-agent message array in place-like fashion. The input is never
141
154
  * mutated. When compaction actually elides something a NEW array is returned.
@@ -148,6 +161,45 @@ export declare function cumulativeMessageChars(messages: ReadonlyArray<ModelMess
148
161
  * step.
149
162
  */
150
163
  export declare function compactSubAgentMessages(messages: ReadonlyArray<ModelMessage>, opts?: SubAgentCompactorOptions): ModelMessage[];
164
+ /**
165
+ * O3 — compaction hysteresis state, threaded across `prepareStep` calls within
166
+ * a single top-level turn. `frozenCompacted` is the compacted history captured
167
+ * at the last real compaction; `frozenStrippedLen` is the message count of the
168
+ * (un-compacted) history at that moment, so the append delta can be recovered.
169
+ */
170
+ export interface CompactionHysteresisState {
171
+ frozenCompacted: ModelMessage[] | null;
172
+ frozenStrippedLen: number;
173
+ lastCompactTriggerChars: number;
174
+ }
175
+ export declare function initCompactionHysteresisState(): CompactionHysteresisState;
176
+ /**
177
+ * Decide whether to hold the frozen compacted prefix or (re)compact.
178
+ *
179
+ * Re-running the compactor on every step slides the keepLast boundary forward
180
+ * one tool result per step, flipping that result verbatim→stub and breaking the
181
+ * provider prompt-cache prefix at its position — measured as 63% of a real
182
+ * session's FRESH input (session 1afb2728e67a). Between compactions we instead
183
+ * reuse the frozen compacted prefix and append only the messages added since
184
+ * (history is append-only within a turn), keeping the cached prefix byte-stable
185
+ * until cumulative size grows past `lastCompactTriggerChars * hysteresis`.
186
+ *
187
+ * Pure: returns the next state rather than mutating. `hysteresis <= 1.0`
188
+ * disables the freeze (legacy per-step compaction). The delta slice uses the
189
+ * ORIGINAL (pre-compaction) length, so it is correct whether or not the
190
+ * compactor preserves message count.
191
+ */
192
+ export declare function applyCompactionHysteresis(args: {
193
+ stripped: ModelMessage[];
194
+ currChars: number;
195
+ hysteresis: number;
196
+ state: CompactionHysteresisState;
197
+ runCompaction: () => ModelMessage[];
198
+ }): {
199
+ compacted: ModelMessage[];
200
+ didRecompact: boolean;
201
+ state: CompactionHysteresisState;
202
+ };
151
203
  /**
152
204
  * Injects Anthropic prompt caching (cacheControl) into the last message's content
153
205
  * block(s) if the model is Claude (starts with 'claude').
@@ -47,6 +47,9 @@
47
47
  * MUONROI_SUBAGENT_COMPACT_THRESHOLD_CHARS — 20_000..500_000, default 80_000
48
48
  * MUONROI_SUBAGENT_COMPACT_KEEP_LAST — 1..20, default 3
49
49
  */
50
+ /** O2 — floor for the tail-budget keepLast shrink; never break the live step's
51
+ * assistant↔tool pairing (that needs at least the current turn). */
52
+ const TAIL_BUDGET_MIN_KEEP = 2;
50
53
  /**
51
54
  * G1 — coarse char→token conversion. The real ratio is provider/tokenizer
52
55
  * specific (cl100k ≈ 3.5-4 chars/token for English code-heavy content, more
@@ -96,6 +99,10 @@ export function isHighValueToolResult(toolName, preview, explicitKeepIds, toolCa
96
99
  // work/findings. Truncating it causes the agent to think it lost its answer.
97
100
  if (name.startsWith("respond_"))
98
101
  return true;
102
+ // Plan context bias (user-halt + "tiếp tục" resume): keep plan text verbatim so
103
+ // compaction does not drop the APPROVED PLAN the user just approved.
104
+ if (/APPROVED PLAN|plan v|khuyến nghị hành động|sprint plan|work plan/i.test(preview))
105
+ return true;
99
106
  // Authoritative ecosystem-docs MCP results: the agent is nudged to fetch these
100
107
  // FIRST, so eliding them strands it (session 584ba476c07a). Keep verbatim.
101
108
  if (HIGH_VALUE_MCP_PREFIXES.some((p) => name.startsWith(p)))
@@ -128,8 +135,31 @@ function resolveOpts(o) {
128
135
  keepToolIds: keepIds,
129
136
  persistArtifact: o?.persistArtifact,
130
137
  stripOldReasoning: o?.stripOldReasoning ?? false,
138
+ tailBudgetChars: Math.max(0, o?.tailBudgetChars ?? 0),
131
139
  };
132
140
  }
141
+ /**
142
+ * O2 — given the fill-ratio-derived keepLast, shrink it further so the kept
143
+ * verbatim tail (the last N tool turns) fits `tailBudgetChars`. Walks keepLast
144
+ * down from its input value, measuring the actual chars of the tail each step,
145
+ * and stops at the first count that fits (or the TAIL_BUDGET_MIN_KEEP floor).
146
+ * Off (returns keepLast unchanged) when tailBudgetChars <= 0.
147
+ */
148
+ function shrinkKeepLastToTailBudget(messages, keepLast, tailBudgetChars) {
149
+ if (tailBudgetChars <= 0 || keepLast <= TAIL_BUDGET_MIN_KEEP)
150
+ return keepLast;
151
+ let k = keepLast;
152
+ while (k > TAIL_BUDGET_MIN_KEEP) {
153
+ const keepFrom = findKeepFromIndex(messages, k);
154
+ let tailChars = 0;
155
+ for (let i = keepFrom; i < messages.length; i++)
156
+ tailChars += messageChars(messages[i]);
157
+ if (tailChars <= tailBudgetChars)
158
+ return k;
159
+ k -= 1;
160
+ }
161
+ return TAIL_BUDGET_MIN_KEEP;
162
+ }
133
163
  /**
134
164
  * G1 + G2 — compute effective threshold (chars) and dynamic keepLastTurns
135
165
  * based on context-window utilization. When the prompt approaches the
@@ -276,6 +306,36 @@ function isStubbedToolResult(msg) {
276
306
  }
277
307
  return false;
278
308
  }
309
+ function generateShortSummary(toolName, content) {
310
+ if (content.length < 500)
311
+ return `${toolName}: ${content.length} chars`;
312
+ const clean = content.trim().replace(/\s+/g, " ");
313
+ if (!clean)
314
+ return `Empty ${toolName} output`;
315
+ const fileMatch = content.match(/File Path: `file:\/\/\/(.+?)`/);
316
+ if (fileMatch) {
317
+ const parts = fileMatch[1].split(/[/\\]/);
318
+ const filename = parts[parts.length - 1];
319
+ return `Read ${filename} (${clean.length} chars)`;
320
+ }
321
+ const grepMatch = content.match(/"LineContent"/);
322
+ if (grepMatch) {
323
+ try {
324
+ const lines = content.trim().split("\n");
325
+ let count = 0;
326
+ for (const line of lines) {
327
+ if (line.includes(`"LineContent"`))
328
+ count++;
329
+ }
330
+ return `Grep found ${count} matches`;
331
+ }
332
+ catch {
333
+ // fallback
334
+ }
335
+ }
336
+ const excerpt = clean.slice(0, 60);
337
+ return `${toolName}: ${excerpt}${clean.length > 60 ? "..." : ""}`;
338
+ }
279
339
  function rewriteOlderToolMessage(msg, previewChars, label, keepToolIds, persistArtifact) {
280
340
  if (!isToolResultMessage(msg) || !Array.isArray(msg.content))
281
341
  return msg;
@@ -292,10 +352,11 @@ function rewriteOlderToolMessage(msg, previewChars, label, keepToolIds, persistA
292
352
  }
293
353
  const preview = rawPreview.slice(0, previewChars).replace(/\s+/g, " ").trim();
294
354
  const stub = `[earlier tool_result for tool=${tr.toolName} (id=${tr.toolCallId}) — ${fullLen} chars elided by ${label} compactor; output: ${preview}]`;
355
+ const summary = generateShortSummary(tr.toolName, rawPreview);
295
356
  // Idea 4: for the ones we actually elide, give caller a chance to persist full raw to EE for later on-demand fetch.
296
357
  if (persistArtifact && fullLen > 200) {
297
358
  try {
298
- persistArtifact(toolCallId, tr.toolName, rawPreview, "elided-by-compactor");
359
+ persistArtifact(toolCallId, tr.toolName, rawPreview, "elided-by-compactor", summary);
299
360
  }
300
361
  catch {
301
362
  /* fail-open */
@@ -312,6 +373,9 @@ function rewriteOlderToolMessage(msg, previewChars, label, keepToolIds, persistA
312
373
  // dragging in the full provider-utils type graph at this layer.
313
374
  return { ...msg, content: rewritten };
314
375
  }
376
+ export function buildSlimContext(msgs) {
377
+ return msgs.slice(-6); // goal + last 2 turns + refs (YAGNI)
378
+ }
315
379
  /**
316
380
  * Compact a sub-agent message array in place-like fashion. The input is never
317
381
  * mutated. When compaction actually elides something a NEW array is returned.
@@ -326,25 +390,31 @@ function rewriteOlderToolMessage(msg, previewChars, label, keepToolIds, persistA
326
390
  export function compactSubAgentMessages(messages, opts = {}) {
327
391
  const resolved = resolveOpts(opts);
328
392
  const { outputPreviewChars, label, envelopeChars } = resolved;
329
- // Step 4: Hard-limit message history sent to the model to prevent token bloating
330
- // When input (messages + envelope) exceeds 50K characters and messages array is > 30,
331
- // we slice the history to keep at most 30 messages (preserving system and user start).
332
- let processedMessages = messages;
333
393
  const messagesTotal = cumulativeMessageChars(messages);
334
394
  const total = messagesTotal + envelopeChars;
335
- if (total > 50_000 && messages.length > 30) {
395
+ const { effectiveThresholdChars, effectiveKeepLastTurns } = computeDynamicParams(total, resolved);
396
+ // No-op: return the input BY REFERENCE (contract above) so `compacted === input`.
397
+ // Identity contract: callers (tool-engine.ts, stream-runner.ts) use
398
+ // `compacted !== stripped` to decide whether to fire recordCompaction. A false
399
+ // identity change (new array with zero elision) produces phantom compaction
400
+ // records — observed as 28 compactions / 0 elisions in session c43cc481a16e.
401
+ // Fix: check threshold on the ORIGINAL total before slicing.
402
+ if (total < effectiveThresholdChars)
403
+ return messages;
404
+ // Step 4: Hard-limit message history sent to the model to prevent token bloating.
405
+ // Only slice when compaction is actually warranted (threshold exceeded), so the
406
+ // slice's identity change pairs with real content reduction, not a phantom no-op.
407
+ let processedMessages = messages;
408
+ if (messages.length > 30) {
336
409
  processedMessages = sliceMessageHistory(messages, 30);
337
410
  }
338
- // Calculate effective thresholds and keep last turns using the processed messages
339
- const processedMessagesTotal = cumulativeMessageChars(processedMessages);
340
- const processedTotal = processedMessagesTotal + envelopeChars;
341
- const { effectiveThresholdChars, effectiveKeepLastTurns } = computeDynamicParams(processedTotal, resolved);
342
- // No-op: return the input BY REFERENCE (contract above) so `compacted === input`.
343
- if (processedTotal < effectiveThresholdChars)
344
- return processedMessages;
345
- const keepFrom = findKeepFromIndex(processedMessages, effectiveKeepLastTurns);
411
+ // O2 after the fill-ratio shrink, further reduce keepLast so the verbatim
412
+ // tail fits the byte budget (targets read-heavy tails that stay large at low
413
+ // fill). No-op when tailBudgetChars is unset (sub-agent path).
414
+ const budgetedKeepLast = shrinkKeepLastToTailBudget(processedMessages, effectiveKeepLastTurns, resolved.tailBudgetChars);
415
+ const keepFrom = findKeepFromIndex(processedMessages, budgetedKeepLast);
346
416
  if (keepFrom <= 0)
347
- return processedMessages;
417
+ return messages;
348
418
  // Walk older messages; rewrite fresh tool results into stubs, super-shrink
349
419
  // already-stubbed results (F1), and strip args off older assistant
350
420
  // tool-call shells (F1). The 1:1 assistant↔tool pairing required by the AI
@@ -455,6 +525,47 @@ function stripAssistantToolCallArgs(msg) {
455
525
  return msg;
456
526
  return { ...msg, content: next };
457
527
  }
528
+ export function initCompactionHysteresisState() {
529
+ return { frozenCompacted: null, frozenStrippedLen: 0, lastCompactTriggerChars: 0 };
530
+ }
531
+ /**
532
+ * Decide whether to hold the frozen compacted prefix or (re)compact.
533
+ *
534
+ * Re-running the compactor on every step slides the keepLast boundary forward
535
+ * one tool result per step, flipping that result verbatim→stub and breaking the
536
+ * provider prompt-cache prefix at its position — measured as 63% of a real
537
+ * session's FRESH input (session 1afb2728e67a). Between compactions we instead
538
+ * reuse the frozen compacted prefix and append only the messages added since
539
+ * (history is append-only within a turn), keeping the cached prefix byte-stable
540
+ * until cumulative size grows past `lastCompactTriggerChars * hysteresis`.
541
+ *
542
+ * Pure: returns the next state rather than mutating. `hysteresis <= 1.0`
543
+ * disables the freeze (legacy per-step compaction). The delta slice uses the
544
+ * ORIGINAL (pre-compaction) length, so it is correct whether or not the
545
+ * compactor preserves message count.
546
+ */
547
+ export function applyCompactionHysteresis(args) {
548
+ const { stripped, currChars, hysteresis, state, runCompaction } = args;
549
+ if (hysteresis > 1.0 && state.frozenCompacted !== null && currChars <= state.lastCompactTriggerChars * hysteresis) {
550
+ const delta = stripped.slice(state.frozenStrippedLen);
551
+ const compacted = delta.length > 0 ? [...state.frozenCompacted, ...delta] : state.frozenCompacted;
552
+ return { compacted, didRecompact: false, state };
553
+ }
554
+ const compacted = runCompaction();
555
+ const changed = compacted !== stripped;
556
+ if (changed && hysteresis > 1.0) {
557
+ return {
558
+ compacted,
559
+ didRecompact: true,
560
+ state: {
561
+ frozenCompacted: compacted,
562
+ frozenStrippedLen: stripped.length,
563
+ lastCompactTriggerChars: currChars,
564
+ },
565
+ };
566
+ }
567
+ return { compacted, didRecompact: changed, state };
568
+ }
458
569
  /**
459
570
  * Injects Anthropic prompt caching (cacheControl) into the last message's content
460
571
  * block(s) if the model is Claude (starts with 'claude').
@@ -7,12 +7,34 @@ import type { SessionInfo, StreamChunk, SubagentStatus } from "../types/index.js
7
7
  import { type PermissionMode } from "../utils/permission-mode.js";
8
8
  import type { AbortContext } from "./abort.js";
9
9
  import type { LegacyProvider, ProcessMessageObserver } from "./agent-options.js";
10
+ import type { AskUserAskInfo } from "./ask-user.js";
10
11
  import type { CouncilManager } from "./council-manager.js";
11
12
  import type { CrossTurnDedup } from "./cross-turn-dedup.js";
12
13
  import type { PendingCallsLog } from "./pending-calls.js";
13
14
  import type { ReadPathBudget } from "./read-path-budget.js";
14
15
  import type { SafetyOverrideAskInfo, SafetyOverrideVerdict } from "./safety-askcard.js";
15
16
  import { type ToolLoopCapAsk } from "./tool-loop-cap.js";
17
+ /**
18
+ * Resolve the per-turn `maxOutputTokens` budget.
19
+ *
20
+ * Normally the budget is derived from the PIL-classified `taskType`
21
+ * (`taskTypeToMaxTokens`). But a sprint IMPLEMENTATION turn — the /ideal
22
+ * loop's handoff into the host orchestrator via `processMessageFn`, marked
23
+ * with `SPRINT_EXECUTION_MARKER` — is a KNOWN code-writing task that must not
24
+ * be starved by a noisy classify. Observed live (2026-07-10, gsd-core
25
+ * migration): the impl prompt was classified `analyze`/default → capped at
26
+ * 4_096 output → the model spent the whole budget narrating its plan, hit
27
+ * `finishReason:"length"` mid-word, produced ZERO code, and the turn wedged.
28
+ *
29
+ * Fix: for a sprint-execution turn, floor the budget at the build/generate
30
+ * tier (12_288) regardless of the classified type. Scoped to the marker only
31
+ * (NOT the broad `isImplementationIntent`) so ordinary refactor/debug turns
32
+ * keep their intentionally tighter L6 budgets.
33
+ */
34
+ export declare function resolveTurnMaxOutputTokens(pilCtx: {
35
+ taskType: string | null;
36
+ raw?: string;
37
+ }): number;
16
38
  import type { TurnRunnerDepsBase } from "./turn-runner-deps.js";
17
39
  /**
18
40
  * Dependency surface the MessageProcessor needs to reach back into Agent
@@ -115,6 +137,8 @@ export interface MessageProcessorDeps extends TurnRunnerDepsBase {
115
137
  askToolLoopContinue?: ToolLoopCapAsk;
116
138
  /** Safety override handler — invoked when a tool call is blocked by the safety filter. */
117
139
  askSafetyOverride?: (info: SafetyOverrideAskInfo) => Promise<SafetyOverrideVerdict>;
140
+ /** ask_user handler — invoked when the model calls the `ask_user` tool; resolves the human's answer. */
141
+ askUser?: (info: AskUserAskInfo) => Promise<string>;
118
142
  runCouncilV2(userMessage: string, opts: {
119
143
  skipClarification: boolean;
120
144
  observer?: ProcessMessageObserver;
@@ -147,6 +171,22 @@ export declare function rewriteSafetyApprovedToolResults<T extends {
147
171
  role: string;
148
172
  content?: any;
149
173
  }>(messages: T[]): T[];
174
+ /**
175
+ * Replace the `result` value of a single tool-result part (matched by
176
+ * toolCallId) in an AI-SDK message history, in place, preserving the
177
+ * tool-call/tool-result pairing. Used by the convene_council path to splice the
178
+ * council synthesis into the placeholder tool_result the model saw, so on the
179
+ * restarted step the model reads the conclusion as that tool's result. Pure +
180
+ * exported for unit testing. Returns the same array reference untouched when the
181
+ * toolCallId is absent (with a caller-visible `replaced` flag).
182
+ */
183
+ export declare function spliceConveneToolResult<T extends {
184
+ role: string;
185
+ content?: any;
186
+ }>(messages: T[], toolCallId: string | null, value: string): {
187
+ messages: T[];
188
+ replaced: boolean;
189
+ };
150
190
  export declare class SimpleMutex {
151
191
  private queue;
152
192
  run<T>(fn: () => Promise<T> | T): Promise<T>;
@@ -155,3 +195,4 @@ export interface ToolEngineArgs {
155
195
  [key: string]: any;
156
196
  }
157
197
  export declare function executeToolEngine(args: ToolEngineArgs): AsyncGenerator<StreamChunk, void, unknown>;
198
+ export declare function coalesceReadOnlyMessages(messages: any[]): any[];