muonroi-cli 1.8.3 → 1.8.5

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 (477) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +133 -122
  3. package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
  4. package/dist/packages/agent-harness-core/src/driver.js +46 -0
  5. package/dist/packages/agent-harness-core/src/event-tee.d.ts +48 -0
  6. package/dist/packages/agent-harness-core/src/event-tee.js +77 -0
  7. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +11 -0
  8. package/dist/packages/agent-harness-core/src/mcp-server.js +87 -15
  9. package/dist/packages/agent-harness-core/src/protocol.d.ts +66 -2
  10. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  11. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  12. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  13. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  14. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  15. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  16. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  17. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  18. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  19. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  20. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  21. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  22. package/dist/src/agent-harness/mock-model.d.ts +28 -0
  23. package/dist/src/agent-harness/mock-model.js +63 -1
  24. package/dist/src/agent-harness/test-spawn.js +31 -0
  25. package/dist/src/cli/config/screen-providers.js +1 -1
  26. package/dist/src/cli/cost-forensics.d.ts +10 -0
  27. package/dist/src/cli/cost-forensics.js +30 -15
  28. package/dist/src/cli/keys-bundle.d.ts +1 -1
  29. package/dist/src/cli/keys-bundle.js +1 -1
  30. package/dist/src/cli/keys.d.ts +2 -2
  31. package/dist/src/cli/keys.js +19 -81
  32. package/dist/src/council/clarifier.d.ts +28 -2
  33. package/dist/src/council/clarifier.js +81 -15
  34. package/dist/src/council/context.js +49 -15
  35. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  36. package/dist/src/council/debate-checkpoint.js +176 -0
  37. package/dist/src/council/debate-planner.js +51 -3
  38. package/dist/src/council/debate-summary.d.ts +25 -0
  39. package/dist/src/council/debate-summary.js +85 -0
  40. package/dist/src/council/debate.d.ts +169 -2
  41. package/dist/src/council/debate.js +1210 -134
  42. package/dist/src/council/index.d.ts +85 -1
  43. package/dist/src/council/index.js +634 -196
  44. package/dist/src/council/leader.d.ts +26 -0
  45. package/dist/src/council/leader.js +150 -9
  46. package/dist/src/council/llm.d.ts +32 -0
  47. package/dist/src/council/llm.js +231 -38
  48. package/dist/src/council/panel-select.d.ts +30 -0
  49. package/dist/src/council/panel-select.js +72 -0
  50. package/dist/src/council/planner.js +23 -0
  51. package/dist/src/council/preflight.d.ts +7 -0
  52. package/dist/src/council/preflight.js +14 -2
  53. package/dist/src/council/prompts.d.ts +30 -3
  54. package/dist/src/council/prompts.js +254 -84
  55. package/dist/src/council/stance-recall.d.ts +42 -0
  56. package/dist/src/council/stance-recall.js +57 -0
  57. package/dist/src/council/strip-think.d.ts +17 -0
  58. package/dist/src/council/strip-think.js +33 -0
  59. package/dist/src/council/types.d.ts +128 -0
  60. package/dist/src/ee/artifact-cache.d.ts +16 -0
  61. package/dist/src/ee/artifact-cache.js +32 -0
  62. package/dist/src/ee/auth.d.ts +1 -0
  63. package/dist/src/ee/auth.js +15 -2
  64. package/dist/src/ee/bridge.d.ts +10 -0
  65. package/dist/src/ee/bridge.js +58 -0
  66. package/dist/src/ee/client.js +81 -18
  67. package/dist/src/ee/export-transcripts.d.ts +1 -0
  68. package/dist/src/ee/export-transcripts.js +8 -10
  69. package/dist/src/ee/extract-session.js +29 -0
  70. package/dist/src/ee/extract-style.d.ts +58 -0
  71. package/dist/src/ee/extract-style.js +270 -0
  72. package/dist/src/ee/recall-ledger.d.ts +9 -0
  73. package/dist/src/ee/recall-ledger.js +3 -0
  74. package/dist/src/ee/scope.d.ts +1 -0
  75. package/dist/src/ee/scope.js +26 -1
  76. package/dist/src/ee/search.d.ts +7 -0
  77. package/dist/src/ee/search.js +24 -0
  78. package/dist/src/ee/transcript-emit.js +2 -0
  79. package/dist/src/ee/types.d.ts +22 -0
  80. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  81. package/dist/src/ee/who-am-i-brain.js +220 -0
  82. package/dist/src/ee/who-am-i.d.ts +10 -3
  83. package/dist/src/ee/who-am-i.js +12 -0
  84. package/dist/src/ee/workflow-event.d.ts +48 -0
  85. package/dist/src/ee/workflow-event.js +81 -0
  86. package/dist/src/flow/compaction/compress.d.ts +3 -3
  87. package/dist/src/flow/compaction/compress.js +45 -8
  88. package/dist/src/flow/compaction/extract.d.ts +4 -7
  89. package/dist/src/flow/compaction/extract.js +50 -10
  90. package/dist/src/flow/compaction/index.d.ts +13 -1
  91. package/dist/src/flow/compaction/index.js +70 -3
  92. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  93. package/dist/src/flow/compaction/input-guard.js +43 -0
  94. package/dist/src/flow/fold-planning.d.ts +36 -0
  95. package/dist/src/flow/fold-planning.js +83 -0
  96. package/dist/src/flow/hierarchy.d.ts +146 -0
  97. package/dist/src/flow/hierarchy.js +427 -0
  98. package/dist/src/flow/index.d.ts +1 -0
  99. package/dist/src/flow/index.js +2 -0
  100. package/dist/src/flow/run-artifacts.d.ts +102 -0
  101. package/dist/src/flow/run-artifacts.js +208 -0
  102. package/dist/src/generated/version.d.ts +1 -1
  103. package/dist/src/generated/version.js +1 -1
  104. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  105. package/dist/src/gsd/assessment-schema.js +134 -0
  106. package/dist/src/gsd/capability-registry.d.ts +45 -0
  107. package/dist/src/gsd/capability-registry.js +337 -0
  108. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  109. package/dist/src/gsd/complexity-assessor.js +152 -0
  110. package/dist/src/gsd/config-bridge.d.ts +7 -0
  111. package/dist/src/gsd/config-bridge.js +114 -0
  112. package/dist/src/gsd/config-loader.d.ts +27 -0
  113. package/dist/src/gsd/config-loader.js +50 -0
  114. package/dist/src/gsd/council-context.d.ts +44 -0
  115. package/dist/src/gsd/council-context.js +114 -0
  116. package/dist/src/gsd/ee-closure.d.ts +28 -0
  117. package/dist/src/gsd/ee-closure.js +49 -0
  118. package/dist/src/gsd/flags.d.ts +55 -0
  119. package/dist/src/gsd/flags.js +83 -0
  120. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  121. package/dist/src/gsd/gsd-dispatch.js +131 -0
  122. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  123. package/dist/src/gsd/gsd-runtime.js +37 -0
  124. package/dist/src/gsd/host-adapter.d.ts +11 -0
  125. package/dist/src/gsd/host-adapter.js +29 -0
  126. package/dist/src/gsd/index.d.ts +24 -1
  127. package/dist/src/gsd/index.js +27 -0
  128. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  129. package/dist/src/gsd/loop-host-contract.js +39 -0
  130. package/dist/src/gsd/loop-host.d.ts +69 -0
  131. package/dist/src/gsd/loop-host.js +245 -0
  132. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  133. package/dist/src/gsd/loop-resolver.js +79 -0
  134. package/dist/src/gsd/model-tier.d.ts +13 -0
  135. package/dist/src/gsd/model-tier.js +45 -0
  136. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  137. package/dist/src/gsd/mutation-gate.js +41 -0
  138. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  139. package/dist/src/gsd/native-roadmap.js +343 -0
  140. package/dist/src/gsd/native-state.d.ts +47 -0
  141. package/dist/src/gsd/native-state.js +220 -0
  142. package/dist/src/gsd/paths.d.ts +23 -0
  143. package/dist/src/gsd/paths.js +66 -0
  144. package/dist/src/gsd/phase-dag.d.ts +12 -0
  145. package/dist/src/gsd/phase-dag.js +94 -0
  146. package/dist/src/gsd/phase-sync.d.ts +42 -0
  147. package/dist/src/gsd/phase-sync.js +321 -0
  148. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  149. package/dist/src/gsd/pil-gate-context.js +64 -0
  150. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  151. package/dist/src/gsd/pil-gate-critic.js +74 -0
  152. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  153. package/dist/src/gsd/plan-council-prompts.js +79 -0
  154. package/dist/src/gsd/plan-council.d.ts +44 -0
  155. package/dist/src/gsd/plan-council.js +251 -0
  156. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  157. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  158. package/dist/src/gsd/product-workspace.d.ts +13 -0
  159. package/dist/src/gsd/product-workspace.js +124 -0
  160. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  161. package/dist/src/gsd/ship-bridge.js +65 -0
  162. package/dist/src/gsd/state-document.d.ts +40 -0
  163. package/dist/src/gsd/state-document.js +163 -0
  164. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  165. package/dist/src/gsd/verdict-schema.js +144 -0
  166. package/dist/src/gsd/verify-context.d.ts +22 -0
  167. package/dist/src/gsd/verify-context.js +27 -0
  168. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  169. package/dist/src/gsd/verify-council-prompts.js +85 -0
  170. package/dist/src/gsd/verify-council.d.ts +25 -0
  171. package/dist/src/gsd/verify-council.js +119 -0
  172. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  173. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  174. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  175. package/dist/src/gsd/workflow-engine.js +207 -0
  176. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  177. package/dist/src/gsd/workflow-tools.js +277 -0
  178. package/dist/src/hooks/index.js +1 -1
  179. package/dist/src/index.js +44 -11
  180. package/dist/src/maintain/pr-builder.js +23 -13
  181. package/dist/src/mcp/auto-setup.js +57 -32
  182. package/dist/src/mcp/client-pool.js +1 -1
  183. package/dist/src/mcp/ee-tools.js +1 -0
  184. package/dist/src/mcp/oauth-callback.js +2 -2
  185. package/dist/src/mcp/research-onboarding.js +8 -7
  186. package/dist/src/mcp/runtime.js +34 -2
  187. package/dist/src/mcp/setup-guide-text.d.ts +1 -1
  188. package/dist/src/mcp/setup-guide-text.js +77 -76
  189. package/dist/src/models/catalog-client.d.ts +87 -0
  190. package/dist/src/models/catalog-client.js +105 -38
  191. package/dist/src/models/catalog.json +528 -265
  192. package/dist/src/models/registry.d.ts +22 -7
  193. package/dist/src/models/registry.js +73 -10
  194. package/dist/src/ops/doctor.js +8 -8
  195. package/dist/src/orchestrator/auto-commit.js +1 -1
  196. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  197. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  198. package/dist/src/orchestrator/cache-prefix.js +83 -0
  199. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  200. package/dist/src/orchestrator/compact-request.js +41 -0
  201. package/dist/src/orchestrator/compaction.d.ts +10 -0
  202. package/dist/src/orchestrator/compaction.js +27 -7
  203. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  204. package/dist/src/orchestrator/council-manager.js +65 -24
  205. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  206. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  207. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  208. package/dist/src/orchestrator/error-utils.js +132 -24
  209. package/dist/src/orchestrator/grounding-check.js +39 -1
  210. package/dist/src/orchestrator/message-processor.js +242 -33
  211. package/dist/src/orchestrator/orchestrator.d.ts +39 -3
  212. package/dist/src/orchestrator/orchestrator.js +651 -102
  213. package/dist/src/orchestrator/preprocessor.js +1 -1
  214. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  215. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  216. package/dist/src/orchestrator/prompts.js +159 -159
  217. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  218. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  219. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  220. package/dist/src/orchestrator/retry-classifier.js +46 -2
  221. package/dist/src/orchestrator/safety-intercept.d.ts +45 -0
  222. package/dist/src/orchestrator/safety-intercept.js +55 -0
  223. package/dist/src/orchestrator/scope-reminder.js +1 -1
  224. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  225. package/dist/src/orchestrator/session-experience.js +2 -1
  226. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  227. package/dist/src/orchestrator/should-run-gate.js +18 -0
  228. package/dist/src/orchestrator/stall-watchdog.d.ts +24 -3
  229. package/dist/src/orchestrator/stall-watchdog.js +47 -13
  230. package/dist/src/orchestrator/stream-runner.js +62 -29
  231. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  232. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  233. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  234. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  235. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  236. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  237. package/dist/src/orchestrator/tool-engine.d.ts +26 -0
  238. package/dist/src/orchestrator/tool-engine.js +669 -56
  239. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  240. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  241. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  242. package/dist/src/orchestrator/turn-watchdog.d.ts +37 -0
  243. package/dist/src/orchestrator/turn-watchdog.js +55 -0
  244. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  245. package/dist/src/pil/agent-operating-contract.js +1 -1
  246. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  247. package/dist/src/pil/cheap-model-playbook.js +5 -1
  248. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  249. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  250. package/dist/src/pil/discovery-types.d.ts +1 -0
  251. package/dist/src/pil/discovery.js +16 -11
  252. package/dist/src/pil/layer1-intent.d.ts +18 -6
  253. package/dist/src/pil/layer1-intent.js +66 -757
  254. package/dist/src/pil/layer15-context-scan.js +15 -1
  255. package/dist/src/pil/layer2_5-ponytail.js +8 -8
  256. package/dist/src/pil/layer3-ee-injection.js +23 -8
  257. package/dist/src/pil/layer4-gsd.js +69 -16
  258. package/dist/src/pil/layer5-context.js +7 -3
  259. package/dist/src/pil/layer6-output.d.ts +23 -0
  260. package/dist/src/pil/layer6-output.js +5 -1
  261. package/dist/src/pil/llm-classify.d.ts +33 -2
  262. package/dist/src/pil/llm-classify.js +123 -131
  263. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  264. package/dist/src/pil/native-capabilities-workbook.js +1 -0
  265. package/dist/src/pil/pipeline.js +34 -2
  266. package/dist/src/pil/response-tools.js +5 -3
  267. package/dist/src/pil/schema.d.ts +1 -0
  268. package/dist/src/pil/schema.js +2 -0
  269. package/dist/src/pil/types.d.ts +18 -0
  270. package/dist/src/playbook/directives.d.ts +4 -0
  271. package/dist/src/playbook/directives.js +17 -5
  272. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  273. package/dist/src/product-loop/backlog-builder.js +30 -6
  274. package/dist/src/product-loop/discovery-context-format.js +3 -1
  275. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  276. package/dist/src/product-loop/discovery-interview.js +32 -3
  277. package/dist/src/product-loop/discovery-schema.js +5 -1
  278. package/dist/src/product-loop/done-gate.js +3 -3
  279. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  280. package/dist/src/product-loop/ideal-trace.js +64 -0
  281. package/dist/src/product-loop/index.d.ts +13 -1
  282. package/dist/src/product-loop/index.js +333 -52
  283. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  284. package/dist/src/product-loop/loop-driver.js +327 -116
  285. package/dist/src/product-loop/phase-plan.d.ts +5 -0
  286. package/dist/src/product-loop/phase-plan.js +39 -2
  287. package/dist/src/product-loop/phase-runner.js +9 -1
  288. package/dist/src/product-loop/progress-snapshot.js +4 -4
  289. package/dist/src/product-loop/sprint-runner.d.ts +111 -0
  290. package/dist/src/product-loop/sprint-runner.js +559 -16
  291. package/dist/src/product-loop/types.d.ts +36 -5
  292. package/dist/src/providers/adapter.d.ts +1 -1
  293. package/dist/src/providers/adapter.js +3 -4
  294. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  295. package/dist/src/providers/auth/browser-flow.js +1 -1
  296. package/dist/src/providers/auth/openai-oauth.js +1 -1
  297. package/dist/src/providers/auth/registry.js +0 -34
  298. package/dist/src/providers/auth/token-store.js +4 -1
  299. package/dist/src/providers/auth/types.d.ts +1 -1
  300. package/dist/src/providers/auth/types.js +1 -1
  301. package/dist/src/providers/capabilities.d.ts +24 -5
  302. package/dist/src/providers/capabilities.js +42 -24
  303. package/dist/src/providers/endpoints.d.ts +2 -2
  304. package/dist/src/providers/endpoints.js +11 -10
  305. package/dist/src/providers/keychain.d.ts +1 -1
  306. package/dist/src/providers/keychain.js +7 -9
  307. package/dist/src/providers/mcp-vision-bridge.js +82 -172
  308. package/dist/src/providers/openai-compatible.js +8 -1
  309. package/dist/src/providers/pricing.d.ts +2 -2
  310. package/dist/src/providers/pricing.js +3 -13
  311. package/dist/src/providers/runtime.d.ts +27 -2
  312. package/dist/src/providers/runtime.js +78 -15
  313. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  314. package/dist/src/providers/strategies/base.strategy.js +24 -1
  315. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  316. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  317. package/dist/src/providers/strategies/registry.js +4 -4
  318. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  319. package/dist/src/providers/strategies/thinking-mode.js +280 -1
  320. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  321. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  322. package/dist/src/providers/types.d.ts +5 -6
  323. package/dist/src/providers/types.js +2 -2
  324. package/dist/src/providers/vision-backend.d.ts +47 -0
  325. package/dist/src/providers/vision-backend.js +258 -0
  326. package/dist/src/providers/vision-proxy.d.ts +22 -9
  327. package/dist/src/providers/vision-proxy.js +63 -132
  328. package/dist/src/providers/wire-debug.js +95 -0
  329. package/dist/src/reporter/index.js +1 -1
  330. package/dist/src/router/decide.d.ts +13 -0
  331. package/dist/src/router/decide.js +138 -36
  332. package/dist/src/router/peak-hour.d.ts +38 -0
  333. package/dist/src/router/peak-hour.js +107 -0
  334. package/dist/src/router/step-router.js +3 -2
  335. package/dist/src/router/warm.js +4 -5
  336. package/dist/src/scaffold/bb-ecosystem-apply.js +47 -47
  337. package/dist/src/scaffold/bb-quality-gate.js +5 -5
  338. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  339. package/dist/src/scaffold/continuation-prompt.js +86 -60
  340. package/dist/src/scaffold/init-new.js +453 -453
  341. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  342. package/dist/src/scaffold/point-to-existing.js +25 -0
  343. package/dist/src/self-qa/agentic-loop.js +22 -22
  344. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  345. package/dist/src/{ui/state → state}/active-run.js +21 -0
  346. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  347. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  348. package/dist/src/state/turn-trace.d.ts +43 -0
  349. package/dist/src/state/turn-trace.js +32 -0
  350. package/dist/src/storage/db.js +2 -1
  351. package/dist/src/storage/index.d.ts +1 -1
  352. package/dist/src/storage/index.js +1 -1
  353. package/dist/src/storage/interaction-log.d.ts +1 -1
  354. package/dist/src/storage/interaction-log.js +5 -5
  355. package/dist/src/storage/migrations.js +196 -126
  356. package/dist/src/storage/session-experience-store.js +4 -4
  357. package/dist/src/storage/sessions.d.ts +28 -10
  358. package/dist/src/storage/sessions.js +112 -55
  359. package/dist/src/storage/transcript-view.js +1 -1
  360. package/dist/src/storage/transcript.d.ts +51 -0
  361. package/dist/src/storage/transcript.js +383 -112
  362. package/dist/src/storage/usage.js +14 -14
  363. package/dist/src/storage/workspaces.js +12 -12
  364. package/dist/src/tools/file.d.ts +15 -0
  365. package/dist/src/tools/file.js +32 -0
  366. package/dist/src/tools/native-tools.js +5 -0
  367. package/dist/src/tools/registry.d.ts +3 -0
  368. package/dist/src/tools/registry.js +460 -22
  369. package/dist/src/tools/research.d.ts +29 -0
  370. package/dist/src/tools/research.js +233 -0
  371. package/dist/src/types/index.d.ts +118 -3
  372. package/dist/src/ui/app.js +0 -0
  373. package/dist/src/ui/cards/product-status-card.js +1 -1
  374. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  375. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  376. package/dist/src/ui/components/context-rail.d.ts +26 -0
  377. package/dist/src/ui/components/context-rail.js +33 -0
  378. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  379. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  380. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  381. package/dist/src/ui/components/council-debate-pill.js +34 -0
  382. package/dist/src/ui/components/council-info-card.js +2 -2
  383. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  384. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  385. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  386. package/dist/src/ui/components/council-message-bubble.js +16 -15
  387. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  388. package/dist/src/ui/components/council-phase-timeline.js +49 -15
  389. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  390. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  391. package/dist/src/ui/components/council-question-card.js +12 -12
  392. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  393. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  394. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  395. package/dist/src/ui/components/council-round-group.js +88 -0
  396. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  397. package/dist/src/ui/components/council-status-list.js +36 -24
  398. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  399. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  400. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  401. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  402. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  403. package/dist/src/ui/components/prompt-box.js +18 -16
  404. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  405. package/dist/src/ui/components/session-tree-card.js +46 -0
  406. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  407. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  408. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  409. package/dist/src/ui/components/task-list-panel.js +22 -2
  410. package/dist/src/ui/containers/modals-layer.d.ts +2 -1
  411. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  412. package/dist/src/ui/mcp-modal.js +2 -4
  413. package/dist/src/ui/modals/api-key-modal.js +1 -1
  414. package/dist/src/ui/modals/connect-modal.js +4 -3
  415. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  416. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  417. package/dist/src/ui/picker-providers.d.ts +1 -1
  418. package/dist/src/ui/picker-providers.js +1 -1
  419. package/dist/src/ui/primitives/index.d.ts +1 -0
  420. package/dist/src/ui/primitives/index.js +2 -0
  421. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  422. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  423. package/dist/src/ui/slash/compact.js +5 -7
  424. package/dist/src/ui/slash/cost.js +1 -1
  425. package/dist/src/ui/slash/council-inspect.js +4 -4
  426. package/dist/src/ui/slash/council.js +19 -1
  427. package/dist/src/ui/slash/debug.d.ts +3 -31
  428. package/dist/src/ui/slash/debug.js +9 -20
  429. package/dist/src/ui/slash/ideal.d.ts +6 -2
  430. package/dist/src/ui/slash/ideal.js +97 -7
  431. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  432. package/dist/src/ui/slash/menu-items.js +12 -18
  433. package/dist/src/ui/slash/registry.d.ts +2 -0
  434. package/dist/src/ui/slash/registry.js +4 -0
  435. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  436. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  437. package/dist/src/ui/status-bar/index.d.ts +1 -1
  438. package/dist/src/ui/status-bar/index.js +7 -3
  439. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  440. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  441. package/dist/src/ui/theme.d.ts +1 -0
  442. package/dist/src/ui/theme.js +2 -0
  443. package/dist/src/ui/types.d.ts +7 -0
  444. package/dist/src/ui/use-app-logic.js +0 -0
  445. package/dist/src/ui/utils/format.d.ts +14 -0
  446. package/dist/src/ui/utils/format.js +23 -3
  447. package/dist/src/usage/downgrade.js +2 -2
  448. package/dist/src/usage/product-ledger.js +2 -2
  449. package/dist/src/utils/clipboard-image.js +23 -23
  450. package/dist/src/utils/install-manager.js +14 -11
  451. package/dist/src/utils/logger.js +2 -2
  452. package/dist/src/utils/permission-mode.js +5 -3
  453. package/dist/src/utils/redactor.js +1 -1
  454. package/dist/src/utils/settings.d.ts +153 -5
  455. package/dist/src/utils/settings.js +233 -29
  456. package/dist/src/utils/side-question.js +2 -2
  457. package/dist/src/utils/skills.js +3 -3
  458. package/dist/src/utils/visible-retry.d.ts +11 -0
  459. package/dist/src/utils/visible-retry.js +10 -1
  460. package/dist/src/verify/entrypoint.d.ts +1 -1
  461. package/dist/src/verify/entrypoint.js +1 -1
  462. package/dist/src/verify/recipes.d.ts +13 -0
  463. package/dist/src/verify/recipes.js +15 -0
  464. package/package.json +135 -132
  465. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  466. package/dist/src/providers/auth/gcloud.js +0 -102
  467. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  468. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  469. package/dist/src/providers/gemini.d.ts +0 -11
  470. package/dist/src/providers/gemini.js +0 -45
  471. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  472. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  473. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  474. package/dist/src/providers/strategies/google.strategy.js +0 -174
  475. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  476. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  477. 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[];
@@ -31,26 +31,21 @@ export const SLASH_MENU_ITEMS = [
31
31
  { id: "providers", label: "providers", description: "Manage providers + API keys (enable/disable, set default)" },
32
32
  { id: "compact", label: "compact", description: "Compact conversation context" },
33
33
  { 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" },
34
+ { id: "ideal", label: "ideal", description: "Product Ideal Loop — from idea to shipped product, autonomously" },
35
35
  { id: "council", label: "council", description: "Multi-model adversarial debate" },
36
36
  // ── Hidden (still functional when typed in full) ───────────────────────
37
37
  { id: "help", label: "help", description: "Show available commands", hidden: true },
38
- { id: "config", label: "config", description: "Open provider and council configuration", hidden: true },
39
38
  { 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
39
  { id: "mcp", label: "mcp", description: "Manage MCP servers", hidden: true },
43
40
  { id: "sandbox", label: "sandbox", description: "Select shell sandbox mode", hidden: true },
44
41
  { id: "wallet", label: "wallet", description: "Wallet and payment settings", hidden: true },
45
42
  { id: "models", label: "models", description: "Alias of /providers", hidden: true },
46
43
  { 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 },
44
+ { id: "resume", label: "resume", description: "List recent sessions to resume" },
48
45
  { id: "commit-push", label: "commit & push", description: "Commit and push", hidden: true },
49
46
  { id: "commit-pr", label: "commit & pr", description: "Commit and open PR", hidden: true },
50
47
  { id: "review", label: "review", description: "Review recent changes", hidden: true },
51
48
  { 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
49
  { id: "update", label: "update", description: "Update muonroi-cli to the latest version", hidden: true },
55
50
  { id: "cost", label: "cost", description: "Show session cost breakdown", hidden: true },
56
51
  { id: "ee", label: "ee", description: "Experience Engine status and controls", hidden: true },
@@ -74,21 +69,20 @@ export const SLASH_MENU_ITEMS = [
74
69
  { id: "pin", label: "pin", description: "Pin a user message so it survives compaction", hidden: true },
75
70
  { id: "unpin", label: "unpin", description: "Remove a pinned message by sequence number", hidden: true },
76
71
  { 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
72
  { id: "export", label: "export", description: "Export entire conversation to a .txt file", hidden: true },
89
73
  { id: "status", label: "status", description: "Show Agile sprint progress dashboard", hidden: true },
90
74
  { id: "ponytail", label: "ponytail", description: "Toggle Lazy Senior AI Mode (on/off/status)", hidden: false },
91
75
  ];
92
76
  /** Items shown in the splash autocomplete + /help listing. */
93
77
  export const VISIBLE_SLASH_MENU_ITEMS = SLASH_MENU_ITEMS.filter((m) => !m.hidden);
78
+ /**
79
+ * Arrow-navigation order for the empty-query ("just /") dropdown: primary
80
+ * surface first, then the hidden commands. The dropdown renders a scrolling
81
+ * viewport, so listing the full set here makes every command reachable by
82
+ * arrow keys without cluttering the top of the list (primary stays on top).
83
+ */
84
+ export const SLASH_MENU_ITEMS_ARROW_ORDER = [
85
+ ...VISIBLE_SLASH_MENU_ITEMS,
86
+ ...SLASH_MENU_ITEMS.filter((m) => m.hidden),
87
+ ];
94
88
  //# 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
@@ -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" };
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * Plan 06 (status bar) subscribes to DowngradeEvent for UI updates.
9
9
  */
10
- import { getModelByTier } from "../models/registry.js";
10
+ import { getRoutedModelByTier } from "../router/peak-hour.js";
11
11
  import { getDefaultProvider } from "../utils/settings.js";
12
12
  function buildDowngradeChain() {
13
13
  const provider = getDefaultProvider() ?? undefined;
@@ -15,7 +15,7 @@ function buildDowngradeChain() {
15
15
  const seen = new Set();
16
16
  const chain = [];
17
17
  for (const tier of tiers) {
18
- const m = getModelByTier(tier, provider);
18
+ const m = getRoutedModelByTier(tier, provider);
19
19
  if (m && !seen.has(m.id)) {
20
20
  chain.push(m.id);
21
21
  seen.add(m.id);
@@ -24,12 +24,12 @@ async function ensureDirectory(filePath) {
24
24
  export async function appendProductLedger(productRunId, entry, homeOverride) {
25
25
  const filePath = getProductLedgerPath(productRunId, homeOverride);
26
26
  await ensureDirectory(filePath);
27
- // Ensure file exists for lockfile to target
27
+ // Ensure file exists for lockfile to target without truncating it concurrently
28
28
  try {
29
29
  await fs.access(filePath);
30
30
  }
31
31
  catch {
32
- await fs.writeFile(filePath, "");
32
+ await fs.appendFile(filePath, "");
33
33
  }
34
34
  const releaseLock = await lockfile.lock(filePath, {
35
35
  retries: { retries: 10, minTimeout: 10, maxTimeout: 100 },
@@ -25,24 +25,24 @@ function readWin32() {
25
25
  try {
26
26
  const escaped = tmpFile.replace(/\\/g, "\\\\");
27
27
  // Run in STA thread with retry — clipboard can be locked by other processes
28
- const ps = `
29
- Add-Type -AssemblyName System.Windows.Forms
30
- Add-Type -AssemblyName System.Drawing
31
- $maxRetries = 3
32
- $img = $null
33
- for ($i = 0; $i -lt $maxRetries; $i++) {
34
- try {
35
- $img = [System.Windows.Forms.Clipboard]::GetImage()
36
- if ($img -ne $null) { break }
37
- } catch {
38
- # clipboard locked — wait and retry
39
- }
40
- Start-Sleep -Milliseconds 100
41
- }
42
- if ($img -ne $null) {
43
- $img.Save('${escaped}', [System.Drawing.Imaging.ImageFormat]::Png)
44
- $img.Dispose()
45
- }
28
+ const ps = `
29
+ Add-Type -AssemblyName System.Windows.Forms
30
+ Add-Type -AssemblyName System.Drawing
31
+ $maxRetries = 3
32
+ $img = $null
33
+ for ($i = 0; $i -lt $maxRetries; $i++) {
34
+ try {
35
+ $img = [System.Windows.Forms.Clipboard]::GetImage()
36
+ if ($img -ne $null) { break }
37
+ } catch {
38
+ # clipboard locked — wait and retry
39
+ }
40
+ Start-Sleep -Milliseconds 100
41
+ }
42
+ if ($img -ne $null) {
43
+ $img.Save('${escaped}', [System.Drawing.Imaging.ImageFormat]::Png)
44
+ $img.Dispose()
45
+ }
46
46
  `;
47
47
  const result = spawnSync("powershell", ["-NoProfile", "-STA", "-Command", ps], { timeout: 8000 });
48
48
  if (result.error || result.status !== 0)
@@ -81,11 +81,11 @@ function readDarwin() {
81
81
  const pngpaste = spawnSync("pngpaste", [tmpFile], { timeout: 5000 });
82
82
  if (pngpaste.status !== 0) {
83
83
  spawnSync("screencapture", ["-c", "-x"]);
84
- const osascript = `
85
- set imgData to the clipboard as «class PNGf»
86
- set f to open for access POSIX file "${tmpFile}" with write permission
87
- write imgData to f
88
- close access f
84
+ const osascript = `
85
+ set imgData to the clipboard as «class PNGf»
86
+ set f to open for access POSIX file "${tmpFile}" with write permission
87
+ write imgData to f
88
+ close access f
89
89
  `;
90
90
  spawnSync("osascript", ["-e", osascript], { timeout: 5000 });
91
91
  }
@@ -194,7 +194,8 @@ export function detectInstallMethod(homeDir = os.homedir()) {
194
194
  }
195
195
  // Not under node_modules and not launched by node/bun → standalone binary.
196
196
  const exeBase = ((process.execPath || "").replace(/\\/g, "/").split("/").pop() ?? "").toLowerCase();
197
- if (!modPath.includes("/node_modules/") && !/^(node|bun)(\.exe)?$/.test(exeBase)) {
197
+ const isNodeOrBunRunner = /^(node|bun)(\.exe|-[\d.]+)?$/i.test(exeBase);
198
+ if (!modPath.includes("/node_modules/") && !isNodeOrBunRunner) {
198
199
  return "compiled";
199
200
  }
200
201
  // Linked/source build run from a git checkout (e.g. `bun link`, a symlinked
@@ -248,21 +249,23 @@ export async function runManagedUpdate(currentVersion) {
248
249
  if (latestVersion && normalizedCurrent) {
249
250
  hasUpdate = semverGt(latestVersion, normalizedCurrent);
250
251
  if (hasUpdate) {
251
- statusHeader = `A new version of muonroi-cli is available!\n Current version: v${normalizedCurrent}\n Latest version: v${latestVersion}\n\n`;
252
+ statusHeader = `### 🔄 Update Available\n* **Current Version:** \`v${normalizedCurrent}\`\n* **Latest Version:** \`v${latestVersion}\`\n* **Status:** A new version of \`muonroi-cli\` is available!\n\n`;
253
+ }
254
+ else if (semverGt(normalizedCurrent, latestVersion)) {
255
+ statusHeader = `### 🚀 Ahead of Latest Release\n* **Current Version:** \`v${normalizedCurrent}\`\n* **Latest Version:** \`v${latestVersion}\`\n* **Status:** Your local installation is newer than the remote release tag.\n\n`;
252
256
  }
253
257
  else {
254
- statusHeader = `You are already up to date!\n Current version: v${normalizedCurrent}\n Latest version: v${latestVersion}\n\n`;
258
+ statusHeader = `### Up to Date\n* **Current Version:** \`v${normalizedCurrent}\`\n* **Latest Version:** \`v${latestVersion}\`\n* **Status:** You are already up to date!\n\n`;
255
259
  }
256
260
  }
257
261
  else if (normalizedCurrent) {
258
- statusHeader = `Current version: v${normalizedCurrent}\nUnable to check the latest version from GitHub.\n\n`;
262
+ statusHeader = `### ⚠️ Update Status\n* **Current Version:** \`v${normalizedCurrent}\`\n* **Status:** Unable to check the latest version from GitHub or NPM.\n\n`;
259
263
  }
260
264
  const cmd = getUpdateCommandForMethod(method);
261
265
  if (cmd) {
262
- const pm = method === "bun-global" ? "bun" : "npm";
263
266
  const instruction = hasUpdate
264
- ? `To update, run this in a fresh terminal:\n\n ${cmd}\n\nThen restart muonroi-cli.`
265
- : `If you want to reinstall, run this in a fresh terminal:\n\n ${cmd}`;
267
+ ? `To update, run this in a fresh terminal:\n\`\`\`bash\n${cmd}\n\`\`\`\nThen restart \`muonroi-cli\`.`
268
+ : `If you want to reinstall, run this in a fresh terminal:\n\`\`\`bash\n${cmd}\n\`\`\``;
266
269
  return {
267
270
  success: true,
268
271
  output: `${statusHeader}${instruction}`,
@@ -272,8 +275,8 @@ export async function runManagedUpdate(currentVersion) {
272
275
  const target = getReleaseTargetForPlatform();
273
276
  const asset = target?.assetName ?? "the release asset for your platform";
274
277
  const instruction = hasUpdate
275
- ? `Download the latest ${asset} from https://github.com/${GITHUB_REPO}/releases/latest and replace the current binary, or rebuild from source.`
276
- : `If you want to reinstall, download the latest ${asset} from https://github.com/${GITHUB_REPO}/releases/latest and replace the current binary.`;
278
+ ? `Download the latest \`${asset}\` from [GitHub Releases](https://github.com/${GITHUB_REPO}/releases/latest) and replace the current binary, or rebuild from source.`
279
+ : `If you want to reinstall, download the latest \`${asset}\` from [GitHub Releases](https://github.com/${GITHUB_REPO}/releases/latest) and replace the current binary.`;
277
280
  return {
278
281
  success: true,
279
282
  output: `${statusHeader}${instruction}`,
@@ -282,8 +285,8 @@ export async function runManagedUpdate(currentVersion) {
282
285
  if (method === "dev-link") {
283
286
  const target = root ?? "the muonroi-cli checkout";
284
287
  const instruction = hasUpdate
285
- ? `To update, pull the latest changes and rebuild:\n\n git -C "${target}" pull && bun install && bun run build\n\nThen restart muonroi-cli. (If you also use the compiled muonroi-cli-dev binary, rebuild that separately.)`
286
- : `To rebuild your local installation:\n\n git -C "${target}" pull && bun install && bun run build\n\nThen restart muonroi-cli.`;
288
+ ? `To update, pull the latest changes and rebuild:\n\`\`\`bash\ngit -C "${target}" pull && bun install && bun run build\n\`\`\`\nThen restart \`muonroi-cli\`. (If you also use the compiled muonroi-cli-dev binary, rebuild that separately.)`
289
+ : `To rebuild your local installation:\n\`\`\`bash\ngit -C "${target}" pull && bun install && bun run build\n\`\`\`\nThen restart \`muonroi-cli\`.`;
287
290
  return {
288
291
  success: true,
289
292
  output: `${statusHeader}${instruction}`,
@@ -1,6 +1,6 @@
1
- import * as fs from "fs";
2
- import * as path from "path";
1
+ import fs from "fs";
3
2
  import * as os from "os";
3
+ import * as path from "path";
4
4
  const LEVEL_WEIGHTS = {
5
5
  debug: 0,
6
6
  info: 1,
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * safe - Every tool call prompts the user for approval.
5
5
  * auto-edit - File operation tools (read/write/edit/grep/list) auto-approve;
6
- * shell execution and computer tools still require confirmation.
6
+ * shell execution auto-approves for non-dangerous commands;
7
+ * computer tools still require confirmation.
7
8
  * yolo - All tool calls auto-approve without any prompting.
8
9
  */
9
10
  import { appendDecisionLog } from "../usage/decision-log.js";
@@ -217,8 +218,9 @@ export function toolNeedsApproval(toolName, mode, context) {
217
218
  return false;
218
219
  }
219
220
  if (mode === "auto-edit") {
220
- if (toolName === "bash" && dangerous(context?.command))
221
- return true;
221
+ // bash auto-approves when non-dangerous; only dangerous bash needs approval
222
+ if (toolName === "bash")
223
+ return dangerous(context?.command);
222
224
  return !AUTO_EDIT_ALLOWED.has(toolName);
223
225
  }
224
226
  // "safe" — always confirm; dangerous patterns explicitly require (no bypass)
@@ -34,7 +34,7 @@ const STATIC_PATTERNS = [
34
34
  },
35
35
  // Environment variable assignments for common API keys
36
36
  {
37
- pattern: /(ANTHROPIC_API_KEY|OPENAI_API_KEY|GOOGLE_API_KEY|DEEPSEEK_API_KEY)\s*=\s*\S+/g,
37
+ pattern: /(ANTHROPIC_API_KEY|OPENAI_API_KEY|DEEPSEEK_API_KEY)\s*=\s*\S+/g,
38
38
  replacement: "$1=***REDACTED***",
39
39
  },
40
40
  // Authorization Bearer header