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
@@ -40,3 +40,10 @@ export interface SlashMenuItem {
40
40
  export declare const SLASH_MENU_ITEMS: SlashMenuItem[];
41
41
  /** Items shown in the splash autocomplete + /help listing. */
42
42
  export declare const VISIBLE_SLASH_MENU_ITEMS: SlashMenuItem[];
43
+ /**
44
+ * Arrow-navigation order for the empty-query ("just /") dropdown: primary
45
+ * surface first, then the hidden commands. The dropdown renders a scrolling
46
+ * viewport, so listing the full set here makes every command reachable by
47
+ * arrow keys without cluttering the top of the list (primary stays on top).
48
+ */
49
+ export declare const SLASH_MENU_ITEMS_ARROW_ORDER: SlashMenuItem[];
@@ -28,32 +28,36 @@
28
28
  export const SLASH_MENU_ITEMS = [
29
29
  // ── Primary surface ────────────────────────────────────────────────────
30
30
  { id: "exit", label: "exit", description: "Quit the CLI" },
31
- { id: "providers", label: "providers", description: "Manage providers + API keys (enable/disable, set default)" },
31
+ {
32
+ id: "providers",
33
+ label: "providers",
34
+ description: "Providers, keys and sign-in (K adds a key, Enter signs in with OAuth)",
35
+ },
32
36
  { id: "compact", label: "compact", description: "Compact conversation context" },
33
37
  { id: "clear", label: "clear", description: "Clear conversation and start fresh" },
34
- { id: "ideal", label: "ideal", description: "Product Ideal Loop — autonomous build from idea to ship" },
38
+ { id: "ideal", label: "ideal", description: "Product Ideal Loop — from idea to shipped product, autonomously" },
35
39
  { id: "council", label: "council", description: "Multi-model adversarial debate" },
36
40
  // ── Hidden (still functional when typed in full) ───────────────────────
37
41
  { id: "help", label: "help", description: "Show available commands", hidden: true },
38
- { id: "config", label: "config", description: "Open provider and council configuration", hidden: true },
39
42
  { id: "remote-control", label: "remote-control", description: "Remote control", hidden: true },
40
- { id: "agents", label: "agents", description: "Manage custom sub-agents", hidden: true },
41
- { id: "schedule", label: "schedule", description: "View scheduled runs", hidden: true },
42
43
  { id: "mcp", label: "mcp", description: "Manage MCP servers", hidden: true },
43
44
  { id: "sandbox", label: "sandbox", description: "Select shell sandbox mode", hidden: true },
44
45
  { id: "wallet", label: "wallet", description: "Wallet and payment settings", hidden: true },
45
46
  { id: "models", label: "models", description: "Alias of /providers", hidden: true },
46
47
  { id: "new", label: "new session", description: "Start a new session", hidden: true },
47
- { id: "sessions", label: "sessions", description: "List recent sessions to resume", hidden: true },
48
+ { id: "resume", label: "resume", description: "List recent sessions to resume" },
48
49
  { id: "commit-push", label: "commit & push", description: "Commit and push", hidden: true },
49
50
  { id: "commit-pr", label: "commit & pr", description: "Commit and open PR", hidden: true },
50
51
  { id: "review", label: "review", description: "Review recent changes", hidden: true },
51
52
  { id: "verify", label: "verify", description: "Run local verification", hidden: true },
52
- { id: "skills", label: "skills", description: "Manage skills", hidden: true },
53
- { id: "btw", label: "btw", description: "Ask a side question without interrupting", hidden: true },
54
53
  { id: "update", label: "update", description: "Update muonroi-cli to the latest version", hidden: true },
55
54
  { id: "cost", label: "cost", description: "Show session cost breakdown", hidden: true },
56
- { id: "ee", label: "ee", description: "Experience Engine status and controls", hidden: true },
55
+ {
56
+ id: "ee",
57
+ label: "ee",
58
+ description: "Experience Engine — connect a brain (/ee config <url> [token]), stats, search",
59
+ hidden: true,
60
+ },
57
61
  { id: "route", label: "route", description: "Show current model routing info", hidden: true },
58
62
  { id: "plan", label: "plan", description: "Show active GSD plan", hidden: true },
59
63
  { id: "execute", label: "execute", description: "Execute active GSD plan", hidden: true },
@@ -74,21 +78,20 @@ export const SLASH_MENU_ITEMS = [
74
78
  { id: "pin", label: "pin", description: "Pin a user message so it survives compaction", hidden: true },
75
79
  { id: "unpin", label: "unpin", description: "Remove a pinned message by sequence number", hidden: true },
76
80
  { id: "pins", label: "pins", description: "List currently pinned message sequences", hidden: true },
77
- { id: "ee-stats", label: "ee stats", description: "Knowledge base statistics", hidden: true },
78
- { id: "ee-gates", label: "ee gates", description: "Quality gate checklist", hidden: true },
79
- { id: "ee-evolve", label: "ee evolve", description: "Trigger EE evolution cycle", hidden: true },
80
- { id: "ee-user", label: "ee user", description: "Current EE user identity", hidden: true },
81
- { id: "ee-search", label: "ee search", description: "Semantic search across knowledge base", hidden: true },
82
- { id: "ee-timeline", label: "ee timeline", description: "Principle evolution for a topic", hidden: true },
83
- { id: "ee-graph", label: "ee graph", description: "Principle relationship graph", hidden: true },
84
- { id: "ee-route", label: "ee route", description: "Route task to workflow", hidden: true },
85
- { id: "ee-context-on", label: "ee-context on", description: "Enable BB-aware EE context injection", hidden: true },
86
- { id: "ee-context-off", label: "ee-context off", description: "Disable BB-aware EE context injection", hidden: true },
87
- { id: "ee-context-status", label: "ee-context status", description: "Show current BB-context setting", hidden: true },
88
81
  { id: "export", label: "export", description: "Export entire conversation to a .txt file", hidden: true },
89
82
  { id: "status", label: "status", description: "Show Agile sprint progress dashboard", hidden: true },
90
83
  { id: "ponytail", label: "ponytail", description: "Toggle Lazy Senior AI Mode (on/off/status)", hidden: false },
91
84
  ];
92
85
  /** Items shown in the splash autocomplete + /help listing. */
93
86
  export const VISIBLE_SLASH_MENU_ITEMS = SLASH_MENU_ITEMS.filter((m) => !m.hidden);
87
+ /**
88
+ * Arrow-navigation order for the empty-query ("just /") dropdown: primary
89
+ * surface first, then the hidden commands. The dropdown renders a scrolling
90
+ * viewport, so listing the full set here makes every command reachable by
91
+ * arrow keys without cluttering the top of the list (primary stays on top).
92
+ */
93
+ export const SLASH_MENU_ITEMS_ARROW_ORDER = [
94
+ ...VISIBLE_SLASH_MENU_ITEMS,
95
+ ...SLASH_MENU_ITEMS.filter((m) => m.hidden),
96
+ ];
94
97
  //# sourceMappingURL=menu-items.js.map
@@ -23,6 +23,8 @@ export interface SlashContext {
23
23
  export type SlashHandler = (args: string[], ctx: SlashContext) => Promise<string> | string;
24
24
  /** Register a slash command handler. */
25
25
  export declare function registerSlash(name: string, handler: SlashHandler): void;
26
+ /** Unregister a slash command handler (used for tests). */
27
+ export declare function unregisterSlash(name: string): void;
26
28
  /**
27
29
  * Dispatch a slash command by name.
28
30
  * Returns null if command not registered (caller falls back to legacy switch).
@@ -9,6 +9,10 @@ const registry = new Map();
9
9
  export function registerSlash(name, handler) {
10
10
  registry.set(name, handler);
11
11
  }
12
+ /** Unregister a slash command handler (used for tests). */
13
+ export function unregisterSlash(name) {
14
+ registry.delete(name);
15
+ }
12
16
  /**
13
17
  * Dispatch a slash command by name.
14
18
  * Returns null if command not registered (caller falls back to legacy switch).
@@ -0,0 +1,6 @@
1
+ /** Cache-hit ratio = cache_read / total input (cumulative). `in_tokens` already
2
+ * includes cache-read tokens (verified: usage_events cache_read ⊆ input_tokens). */
3
+ export declare function computeCacheHitPct(s: {
4
+ in_tokens: number;
5
+ cache_read_tokens: number;
6
+ }): number | null;
@@ -0,0 +1,9 @@
1
+ /** Cache-hit ratio = cache_read / total input (cumulative). `in_tokens` already
2
+ * includes cache-read tokens (verified: usage_events cache_read ⊆ input_tokens). */
3
+ export function computeCacheHitPct(s) {
4
+ if (s.in_tokens <= 0)
5
+ return null;
6
+ const pct = (s.cache_read_tokens / s.in_tokens) * 100;
7
+ return Math.max(0, Math.min(100, Math.round(pct)));
8
+ }
9
+ //# sourceMappingURL=cache-hit.js.map
@@ -7,7 +7,7 @@
7
7
  * Subscribes to statusBarStore for live updates (no polling).
8
8
  */
9
9
  import * as React from "react";
10
- import { type SprintProgressSegment, type StatusBarState } from "./store.js";
10
+ import { type SprintProgressSegment, type StatusBarState } from "../../state/status-bar-store.js";
11
11
  /**
12
12
  * Format a SprintProgressSegment into the StatusBar display string.
13
13
  * Format: Sprint N/M · X/Y stories · Z%
@@ -9,7 +9,8 @@ import { jsx as _jsx } from "@opentui/react/jsx-runtime";
9
9
  */
10
10
  import { Semantic } from "@muonroi/agent-harness-opentui";
11
11
  import * as React from "react";
12
- import { statusBarStore } from "./store.js";
12
+ import { statusBarStore } from "../../state/status-bar-store.js";
13
+ import { computeCacheHitPct } from "./cache-hit.js";
13
14
  import { TierBadge } from "./tier-badge.js";
14
15
  import { UsdMeter } from "./usd-meter.js";
15
16
  function useStatusBarState() {
@@ -57,7 +58,11 @@ export function renderStatusBar(s) {
57
58
  : s.ctx_tokens !== undefined
58
59
  ? ` [ctx: ${fmtTokens(s.ctx_tokens)}]`
59
60
  : "";
60
- const tokenStr = `↑${fmtTokens(s.in_tokens)} ↓${fmtTokens(s.out_tokens)}${s.cache_read_tokens ? ` ⊚${fmtTokens(s.cache_read_tokens)}` : ""}${ctxFill}`;
61
+ const hitPct = computeCacheHitPct(s);
62
+ const cacheSeg = s.cache_read_tokens
63
+ ? ` ⊚${fmtTokens(s.cache_read_tokens)}${hitPct !== null ? ` ${hitPct}%` : ""}`
64
+ : "";
65
+ const tokenStr = `↑${fmtTokens(s.in_tokens)} ↓${fmtTokens(s.out_tokens)}${cacheSeg}${ctxFill}`;
61
66
  const ee = EE_DOT[s.ee_status] ?? EE_DOT.unknown;
62
67
  const slots = [
63
68
  React.createElement("text", { key: "pm", fg: "#5c9cf5", "data-testid": "slot-provider-model" }, modelLabel),
@@ -66,7 +71,6 @@ export function renderStatusBar(s) {
66
71
  React.createElement(UsdMeter, {
67
72
  key: "usd",
68
73
  session_usd: s.session_usd,
69
- month_usd: s.month_usd,
70
74
  current_pct: s.current_pct,
71
75
  }),
72
76
  React.createElement("text", { key: "ee", fg: ee.color, "data-testid": "slot-ee" }, ee.symbol),
@@ -1,13 +1,14 @@
1
1
  /**
2
2
  * src/ui/status-bar/usd-meter.tsx
3
3
  *
4
- * USD meter sub-component: session + month with threshold color escalation.
5
- * white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%.
4
+ * USD meter sub-component: session spend with threshold color escalation.
5
+ * white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%. The month total is
6
+ * intentionally NOT shown here (redundant on the status bar); it remains in the
7
+ * store and is surfaced on demand via `/cost`.
6
8
  */
7
9
  import * as React from "react";
8
10
  export interface UsdMeterProps {
9
11
  session_usd: number;
10
- month_usd: number;
11
12
  current_pct: number;
12
13
  }
13
- export declare function UsdMeter({ session_usd, month_usd, current_pct }: UsdMeterProps): React.ReactElement;
14
+ export declare function UsdMeter({ session_usd, current_pct }: UsdMeterProps): React.ReactElement;
@@ -1,13 +1,15 @@
1
1
  /**
2
2
  * src/ui/status-bar/usd-meter.tsx
3
3
  *
4
- * USD meter sub-component: session + month with threshold color escalation.
5
- * white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%.
4
+ * USD meter sub-component: session spend with threshold color escalation.
5
+ * white < 50%, cyan >= 50%, yellow >= 80%, red >= 100%. The month total is
6
+ * intentionally NOT shown here (redundant on the status bar); it remains in the
7
+ * store and is surfaced on demand via `/cost`.
6
8
  */
7
9
  import * as React from "react";
8
- export function UsdMeter({ session_usd, month_usd, current_pct }) {
10
+ export function UsdMeter({ session_usd, current_pct }) {
9
11
  const color = current_pct >= 100 ? "red" : current_pct >= 80 ? "yellow" : current_pct >= 50 ? "cyan" : "white";
10
- const text = `session: $${session_usd.toFixed(2)} | month: $${month_usd.toFixed(2)}`;
12
+ const text = `session: $${session_usd.toFixed(2)}`;
11
13
  return React.createElement("text", { fg: color, "data-testid": "usd-meter", "data-pct": current_pct }, text);
12
14
  }
13
15
  //# sourceMappingURL=usd-meter.js.map
@@ -65,6 +65,7 @@ export declare const dark: {
65
65
  readonly syntaxRegex: "#d16969";
66
66
  readonly syntaxTag: "#569cd6";
67
67
  readonly syntaxAttr: "#9cdcfe";
68
+ readonly overlay: "#000000cc";
68
69
  readonly councilLeaderBorder: "#666666";
69
70
  readonly councilSynthesisBorder: "#5c9cf5";
70
71
  readonly councilInfoCardBorder: "#4a4a4a";
@@ -65,6 +65,8 @@ export const dark = {
65
65
  syntaxRegex: "#d16969",
66
66
  syntaxTag: "#569cd6",
67
67
  syntaxAttr: "#9cdcfe",
68
+ // ── Overlay / modal backdrop ─────────────────────────────────────────────
69
+ overlay: "#000000cc",
68
70
  // ── Council bubble tokens ────────────────────────────────────────────────
69
71
  councilLeaderBorder: "#666666",
70
72
  councilSynthesisBorder: "#5c9cf5",
@@ -63,6 +63,13 @@ export interface AppStartupConfig {
63
63
  * Never set this in production — only passed via --inject-halt CLI flag.
64
64
  */
65
65
  injectHalt?: boolean;
66
+ /**
67
+ * TEST SEAM (A): when true, dispatch a synthetic `sprint_failed` halt chunk
68
+ * (Resume / Retry / Skip verify / Abort) after first idle. Lets harness E2E
69
+ * specs verify the sprint-break recovery card without a real mid-run failure.
70
+ * Never set this in production — only passed via --inject-halt-sprint.
71
+ */
72
+ injectHaltSprint?: boolean;
66
73
  }
67
74
  export interface AppProps {
68
75
  agent: Agent;
Binary file
@@ -0,0 +1,39 @@
1
+ /**
2
+ * src/ui/utils/agent-activities.ts
3
+ *
4
+ * Collect every sub-agent / background job the main agent has spawned this
5
+ * session, for the rail's Agents block.
6
+ *
7
+ * Derived entirely from state the UI already holds — the transcript entries and
8
+ * the in-flight tool calls. Spawning goes through tools (`task`, `delegate`,
9
+ * `bash background:true`), so the tool stream IS the record; there is no need
10
+ * for a parallel registry in core, and nothing here can drift out of sync with
11
+ * what the transcript shows.
12
+ *
13
+ * Running entries come from activeToolCalls (no result yet), finished ones from
14
+ * tool_result / tool_group items. A call that is both (still streaming while an
15
+ * earlier identical call finished) is keyed by tool-call id, so it appears once.
16
+ */
17
+ import type { ChatEntry, ToolCall } from "../../types/index.js";
18
+ export type ActivityKind = "subagent" | "delegate" | "background";
19
+ export type ActivityStatus = "running" | "done" | "failed";
20
+ export interface AgentActivity {
21
+ /** Tool-call id — stable across the running → finished transition. */
22
+ id: string;
23
+ kind: ActivityKind;
24
+ /** Short line for the rail row, e.g. an explore agent's description. */
25
+ label: string;
26
+ /** Sub-agent type ("explore", "general", …). Empty for background shells. */
27
+ agent: string;
28
+ status: ActivityStatus;
29
+ /** Full text shown when the row is opened: the prompt/command, then output. */
30
+ detail: string;
31
+ }
32
+ /** The activity kind a tool call represents, or null if it spawns nothing. */
33
+ export declare function activityKindFor(tc: ToolCall): ActivityKind | null;
34
+ /**
35
+ * Every activity in the session, oldest first. Later state for the same
36
+ * tool-call id wins, so a call that finishes replaces its own running row
37
+ * instead of adding a second one.
38
+ */
39
+ export declare function collectAgentActivities(messages: ChatEntry[], activeToolCalls?: ToolCall[]): AgentActivity[];
@@ -0,0 +1,96 @@
1
+ /**
2
+ * src/ui/utils/agent-activities.ts
3
+ *
4
+ * Collect every sub-agent / background job the main agent has spawned this
5
+ * session, for the rail's Agents block.
6
+ *
7
+ * Derived entirely from state the UI already holds — the transcript entries and
8
+ * the in-flight tool calls. Spawning goes through tools (`task`, `delegate`,
9
+ * `bash background:true`), so the tool stream IS the record; there is no need
10
+ * for a parallel registry in core, and nothing here can drift out of sync with
11
+ * what the transcript shows.
12
+ *
13
+ * Running entries come from activeToolCalls (no result yet), finished ones from
14
+ * tool_result / tool_group items. A call that is both (still streaming while an
15
+ * earlier identical call finished) is keyed by tool-call id, so it appears once.
16
+ */
17
+ const KIND_BY_TOOL = {
18
+ task: "subagent",
19
+ delegate: "delegate",
20
+ };
21
+ function parseArgs(tc) {
22
+ try {
23
+ const parsed = JSON.parse(tc.function.arguments || "{}");
24
+ return parsed && typeof parsed === "object" ? parsed : {};
25
+ }
26
+ catch (err) {
27
+ // Arguments stream in as partial JSON while a call assembles — an
28
+ // unparseable value here is expected mid-flight, not an error.
29
+ return {};
30
+ }
31
+ }
32
+ function str(value) {
33
+ return typeof value === "string" ? value : "";
34
+ }
35
+ /** The activity kind a tool call represents, or null if it spawns nothing. */
36
+ export function activityKindFor(tc) {
37
+ const name = tc.function.name;
38
+ const known = KIND_BY_TOOL[name];
39
+ if (known)
40
+ return known;
41
+ // A backgrounded shell is a spawned job too — but only when it actually
42
+ // backgrounds. A normal bash call is just a tool, not an activity.
43
+ if (name === "bash" && parseArgs(tc).background === true)
44
+ return "background";
45
+ return null;
46
+ }
47
+ function toActivity(tc, result) {
48
+ const kind = activityKindFor(tc);
49
+ if (!kind)
50
+ return null;
51
+ const args = parseArgs(tc);
52
+ const agent = kind === "background" ? "" : str(args.agent);
53
+ const command = str(args.command);
54
+ const label = (kind === "background" ? command : str(args.description) || str(args.prompt)) || tc.function.name;
55
+ const request = kind === "background" ? command : str(args.prompt);
56
+ let status = "running";
57
+ if (result)
58
+ status = result.success ? "done" : "failed";
59
+ const output = result ? (result.success ? result.output || "" : result.error || "") : "";
60
+ const detail = [request, output].filter((s) => s.trim().length > 0).join("\n\n");
61
+ return { id: tc.id, kind, label: label.replace(/\s+/g, " ").trim(), agent, status, detail };
62
+ }
63
+ /**
64
+ * Every activity in the session, oldest first. Later state for the same
65
+ * tool-call id wins, so a call that finishes replaces its own running row
66
+ * instead of adding a second one.
67
+ */
68
+ export function collectAgentActivities(messages, activeToolCalls = []) {
69
+ const byId = new Map();
70
+ const add = (tc, result) => {
71
+ if (!tc)
72
+ return;
73
+ const activity = toActivity(tc, result);
74
+ if (activity)
75
+ byId.set(activity.id, activity);
76
+ };
77
+ for (const entry of messages) {
78
+ if (entry.type === "tool_result") {
79
+ add(entry.toolCall, entry.toolResult);
80
+ continue;
81
+ }
82
+ if (entry.type === "tool_group") {
83
+ for (const item of entry.toolGroup?.items ?? [])
84
+ add(item.toolCall, item.result);
85
+ }
86
+ }
87
+ // In-flight calls fill in only what the transcript does not already have.
88
+ // activeToolCalls is not always cleared the instant a result lands, so adding
89
+ // one unconditionally would flip a finished row back to "running".
90
+ for (const tc of activeToolCalls) {
91
+ if (!byId.has(tc.id))
92
+ add(tc, undefined);
93
+ }
94
+ return [...byId.values()];
95
+ }
96
+ //# sourceMappingURL=agent-activities.js.map
@@ -35,4 +35,18 @@ export declare function buildPreflightQuestion(pf: {
35
35
  model: string;
36
36
  }>;
37
37
  }): CouncilQuestionData;
38
+ /**
39
+ * F5 — the council entrypoint (council/index.ts) emits `leader`+`panel`+`topic`
40
+ * together exactly once, at the START of each debate; every later `council_meta`
41
+ * patch is partial (a lone roundBudget / researchMode / successCriteria /
42
+ * criteriaMet). That combination is the strongest new-council signal — stronger
43
+ * than a topic change, which misses a re-run on the SAME topic (auto-council
44
+ * re-firing on a phase, or a fresh /council after an Esc that skipped
45
+ * clearLiveTurnUi) and leaks the prior council's pinned criteria into the rail as
46
+ * stale ○ rows. The rail resets its meta+rounds on this.
47
+ */
48
+ export declare function isCouncilStartPatch(patch: {
49
+ leader?: string;
50
+ panel?: string[];
51
+ }): boolean;
38
52
  export declare function mapCouncilCardKey(key: KeyEvent): CouncilCardKey | null;
@@ -41,6 +41,13 @@ export function formatAnswerForLog(ans, ctx) {
41
41
  return verb;
42
42
  // Single line — labels carry value + rationale tail; keep echo to the value.
43
43
  const valueOnly = label.split("—")[0].trim().replace(/\s+/g, " ");
44
+ // Internal snake_case action ids (continue_session, save_exit, generate_plan,
45
+ // ask_followup…) are routing tokens the user should NEVER see. When the value
46
+ // is such an id, echo the human label alone instead of "continue_session · …".
47
+ // Short human verbs (accept, skip, override) have no underscore and keep the
48
+ // value-prefixed forensics form below.
49
+ if (/_/.test(verb))
50
+ return valueOnly || verb;
44
51
  if (ctx?.questionId) {
45
52
  return `${verb} · ${ctx.questionId}=${valueOnly}`;
46
53
  }
@@ -89,15 +96,28 @@ export function buildPreflightQuestion(pf) {
89
96
  questionId: pf.preflightId,
90
97
  phase: "preflight",
91
98
  question: `Approve discussion plan for: ${pf.problemStatement}`,
92
- context: pf.participants.length > 0 ? `Participants: ${pf.participants.map((p) => p.role).join(", ")}` : undefined,
99
+ context: pf.participants.length > 0 ? `Panel: ${pf.participants.map((p) => p.model).join(", ")}` : undefined,
93
100
  options: [
94
- { label: "Approve", value: "approve", kind: "choice", description: "Start the debate now" },
95
- { label: "Reject", value: "reject", kind: "choice", description: "Cancel and rewrite the topic" },
101
+ { label: "Approve", value: "approve", kind: "choice", description: "Looks good — start the debate" },
102
+ { label: "Reject", value: "reject", kind: "choice", description: "Hold off — go back and rephrase the topic" },
96
103
  ],
97
104
  isRequired: true,
98
105
  defaultIndex: 0,
99
106
  };
100
107
  }
108
+ /**
109
+ * F5 — the council entrypoint (council/index.ts) emits `leader`+`panel`+`topic`
110
+ * together exactly once, at the START of each debate; every later `council_meta`
111
+ * patch is partial (a lone roundBudget / researchMode / successCriteria /
112
+ * criteriaMet). That combination is the strongest new-council signal — stronger
113
+ * than a topic change, which misses a re-run on the SAME topic (auto-council
114
+ * re-firing on a phase, or a fresh /council after an Esc that skipped
115
+ * clearLiveTurnUi) and leaks the prior council's pinned criteria into the rail as
116
+ * stale ○ rows. The rail resets its meta+rounds on this.
117
+ */
118
+ export function isCouncilStartPatch(patch) {
119
+ return !!patch.leader && !!patch.panel;
120
+ }
101
121
  export function mapCouncilCardKey(key) {
102
122
  if (key.name === "up")
103
123
  return { kind: "up" };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * src/ui/utils/group-tool-entries.ts
3
+ *
4
+ * Rebuild the tool_group panels when a flat transcript is (re)loaded.
5
+ *
6
+ * WHY: the live turn renders tool calls inside a `tool_group` ChatEntry, but the
7
+ * persisted transcript stores one `tool_result` entry per call. Anything that
8
+ * replaces the message list with `agent.getChatEntries()` — the end-of-turn
9
+ * resync in finalizeActiveTurn, session load, resume — therefore DESTROYED the
10
+ * group and dropped the transcript back to one flat "→ <tool>" line per call.
11
+ * That is what a user sees after the answer lands, so the nice
12
+ * "Read 2 files, ran 1 shell command" recap only ever existed mid-turn.
13
+ *
14
+ * This folds consecutive tool_result entries back into a done/failed group.
15
+ */
16
+ import type { ChatEntry } from "../../types/index.js";
17
+ /**
18
+ * Fold runs of consecutive groupable tool_result entries into one tool_group
19
+ * entry each. Non-tool entries and rich results pass through untouched, so the
20
+ * transcript keeps its order. A run of one is still grouped: the recap line
21
+ * ("Read 1 file") is what stays visible once collapsed.
22
+ *
23
+ * `tool_call` entries are dropped inside a run — they are the pending twin of a
24
+ * result that is already represented by the item.
25
+ */
26
+ export declare function groupToolEntries(entries: ChatEntry[]): ChatEntry[];
@@ -0,0 +1,111 @@
1
+ /**
2
+ * src/ui/utils/group-tool-entries.ts
3
+ *
4
+ * Rebuild the tool_group panels when a flat transcript is (re)loaded.
5
+ *
6
+ * WHY: the live turn renders tool calls inside a `tool_group` ChatEntry, but the
7
+ * persisted transcript stores one `tool_result` entry per call. Anything that
8
+ * replaces the message list with `agent.getChatEntries()` — the end-of-turn
9
+ * resync in finalizeActiveTurn, session load, resume — therefore DESTROYED the
10
+ * group and dropped the transcript back to one flat "→ <tool>" line per call.
11
+ * That is what a user sees after the answer lands, so the nice
12
+ * "Read 2 files, ran 1 shell command" recap only ever existed mid-turn.
13
+ *
14
+ * This folds consecutive tool_result entries back into a done/failed group.
15
+ */
16
+ /**
17
+ * Tool results whose own renderer shows something a tool-group item line cannot
18
+ * (a plan, a sub-agent run, an image, streaming process logs). These stay as
19
+ * standalone entries and also break a run, so ordering is preserved.
20
+ */
21
+ function rendersRichResult(entry) {
22
+ const name = entry.toolCall?.function.name ?? "";
23
+ const r = entry.toolResult;
24
+ if (!r)
25
+ return true;
26
+ if (r.plan || r.task || r.delegation || r.backgroundProcess || (r.media?.length ?? 0) > 0)
27
+ return true;
28
+ return (name === "generate_plan" ||
29
+ name === "task" ||
30
+ name === "delegate" ||
31
+ name === "delegation_list" ||
32
+ name === "delegation_read" ||
33
+ name === "lsp" ||
34
+ name === "process_logs" ||
35
+ name === "process_stop" ||
36
+ name === "process_list");
37
+ }
38
+ function groupable(entry) {
39
+ return entry.type === "tool_result" && !!entry.toolCall && !rendersRichResult(entry);
40
+ }
41
+ function toItem(entry) {
42
+ const at = entry.timestamp instanceof Date ? entry.timestamp.getTime() : Date.now();
43
+ const failed = entry.toolResult?.success === false;
44
+ return {
45
+ toolCall: entry.toolCall,
46
+ result: entry.toolResult,
47
+ startedAt: at,
48
+ finishedAt: at,
49
+ ...(failed ? { failed: true } : {}),
50
+ };
51
+ }
52
+ /**
53
+ * Fold runs of consecutive groupable tool_result entries into one tool_group
54
+ * entry each. Non-tool entries and rich results pass through untouched, so the
55
+ * transcript keeps its order. A run of one is still grouped: the recap line
56
+ * ("Read 1 file") is what stays visible once collapsed.
57
+ *
58
+ * `tool_call` entries are dropped inside a run — they are the pending twin of a
59
+ * result that is already represented by the item.
60
+ */
61
+ export function groupToolEntries(entries) {
62
+ const out = [];
63
+ let run = [];
64
+ const flush = () => {
65
+ if (run.length === 0)
66
+ return;
67
+ const items = run.map(toItem);
68
+ const first = run[0];
69
+ const last = run[run.length - 1];
70
+ const startedAt = items[0].startedAt;
71
+ const finishedAt = items[items.length - 1].finishedAt ?? startedAt;
72
+ out.push({
73
+ type: "tool_group",
74
+ content: "",
75
+ timestamp: first.timestamp,
76
+ ...(first.modeColor ? { modeColor: first.modeColor } : {}),
77
+ ...(first.remoteKey ? { remoteKey: first.remoteKey } : {}),
78
+ ...(first.sourceLabel ? { sourceLabel: first.sourceLabel } : {}),
79
+ toolGroup: {
80
+ // Deterministic id: the same transcript must rebuild to the same ids, or
81
+ // React remounts every group on each resync and expansion state is lost.
82
+ id: `tg-restored-${startedAt}-${items.length}-${last.toolCall?.id ?? "x"}`,
83
+ state: items.some((i) => i.failed) ? "failed" : "done",
84
+ items,
85
+ startedAt,
86
+ finishedAt,
87
+ // The persisted entries carry a write-time timestamp, not the tool's real
88
+ // wall-clock span, so any duration derived here is fiction (a 10s turn
89
+ // rebuilt as "23ms"). Flag it and let the header omit the number rather
90
+ // than print a confident lie.
91
+ restored: true,
92
+ },
93
+ });
94
+ run = [];
95
+ };
96
+ for (const entry of entries) {
97
+ if (groupable(entry)) {
98
+ run.push(entry);
99
+ continue;
100
+ }
101
+ // A pending tool_call adjacent to a run is already covered by the run's
102
+ // items; dropping it prevents a duplicate line above the group.
103
+ if (entry.type === "tool_call" && run.length > 0)
104
+ continue;
105
+ flush();
106
+ out.push(entry);
107
+ }
108
+ flush();
109
+ return out;
110
+ }
111
+ //# sourceMappingURL=group-tool-entries.js.map
@@ -0,0 +1,21 @@
1
+ /**
2
+ * src/ui/utils/tool-summary.ts
3
+ *
4
+ * Phrasing for the tool-group panel. Pure string helpers, no React, so the
5
+ * wording is unit-testable and the component stays presentational.
6
+ *
7
+ * Active: "Reading 2 files…" (header, present participle)
8
+ * Done: "Read 2 files, ran 1 shell command" (past-tense recap)
9
+ *
10
+ * Counting is per CATEGORY, not per tool name: read_file and
11
+ * mcp__filesystem__read_text_file are both "files" to a reader.
12
+ */
13
+ export declare function categoryForTool(name: string): string;
14
+ /**
15
+ * Header while the group runs: "Reading 2 files…".
16
+ * With a mixed batch the dominant category wins and the rest are summed into a
17
+ * trailing "+N more" so the header never claims work it isn't doing.
18
+ */
19
+ export declare function activeToolGroupHeader(toolNames: readonly string[]): string;
20
+ /** Past-tense recap once the group closes: "Read 2 files, ran 1 shell command". */
21
+ export declare function doneToolGroupSummary(toolNames: readonly string[]): string;