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
@@ -19,6 +19,35 @@ import { spawn } from "node:child_process";
19
19
  import { randomUUID } from "node:crypto";
20
20
  import { createServer } from "node:net";
21
21
  // ---------------------------------------------------------------------------
22
+ // Internal: teardown-safe stream error guards
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Attach `'error'` listeners to both transport streams so a broken-pipe write
26
+ * (EPIPE / UV_EPIPE -4047 on Windows) or a peer reset (ECONNRESET) during
27
+ * process teardown is logged and swallowed instead of surfacing as an
28
+ * *uncaught* stream error that crashes the whole vitest worker.
29
+ *
30
+ * Root cause of the flake: when the child is killed in `afterAll`, an in-flight
31
+ * `inWrite.write()` (driver sendKey/sendType) or a half-open `outRead` races the
32
+ * child's death. A WritableStream with no `'error'` listener rethrows EPIPE as
33
+ * an unhandled exception — under full-suite load this reliably reproduces on
34
+ * `events.spec.ts` and fails the file even though every assertion passed.
35
+ *
36
+ * Logging (not silent swallow) satisfies the No-Silent-Catch rule — teardown
37
+ * broken-pipe is expected, but a mid-test error still gets a diagnostic line.
38
+ */
39
+ function attachStreamErrorGuards(inWrite, outRead) {
40
+ const guard = (label) => (err) => {
41
+ // EPIPE / ECONNRESET / ERR_STREAM_DESTROYED are all normal teardown races.
42
+ const code = err?.code ?? "unknown";
43
+ if (code !== "EPIPE" && code !== "ECONNRESET" && code !== "ERR_STREAM_DESTROYED") {
44
+ console.error(`[test-spawn] ${label} stream error (${code}): ${err?.message}`);
45
+ }
46
+ };
47
+ inWrite.on("error", guard("inWrite"));
48
+ outRead.on("error", guard("outRead"));
49
+ }
50
+ // ---------------------------------------------------------------------------
22
51
  // Internal: Windows named-pipe transport
23
52
  // ---------------------------------------------------------------------------
24
53
  function makePipeName(role) {
@@ -143,6 +172,7 @@ async function spawnWindows(args, opts) {
143
172
  outServer.close();
144
173
  };
145
174
  proc.once("exit", cleanup);
175
+ attachStreamErrorGuards(inSocket, outSocket);
146
176
  return {
147
177
  proc,
148
178
  inWrite: inSocket, // host writes commands → child reads on MUONROI_HARNESS_IN_PIPE
@@ -161,6 +191,7 @@ function spawnPosix(args, opts) {
161
191
  const proc = spawn("bun", ["run", ...args], spawnOptions);
162
192
  const outRead = proc.stdio[3];
163
193
  const inWrite = proc.stdio[4];
194
+ attachStreamErrorGuards(inWrite, outRead);
164
195
  return { proc, inWrite, outRead, cleanup: () => { } };
165
196
  }
166
197
  // ---------------------------------------------------------------------------
@@ -1,26 +1,21 @@
1
1
  /**
2
2
  * src/chat/chat-keychain.ts
3
3
  *
4
- * Chat-service keychain loader with env-var fallback.
5
- * Parallel module to src/mcp/mcp-keychain.ts but keyed by ChatSecretId
6
- * (chat services like Discord, Slack) instead of MCP servers.
7
- *
8
- * Priority: OS keychain (keytar) > environment variable > null.
9
- * On CLI startup, hydrateChatEnvFromKeychain() populates process.env from
10
- * keychain for any chat secret not already set in env.
4
+ * Chat-service secret store, keyed by ChatSecretId (Discord, Slack). Backed by
5
+ * the env-store (`.env` file + process.env + Windows registry mirror) — the OS
6
+ * keychain (keytar) has been removed. Reads come straight from process.env.
11
7
  */
12
8
  export type ChatSecretId = "discord-token" | "discord-guild-id" | "slack-token" | "slack-team-id";
13
9
  export declare function setChatSecret(id: ChatSecretId, value: string): Promise<boolean>;
14
10
  export declare function getChatSecret(id: ChatSecretId): Promise<string | null>;
15
11
  export declare function deleteChatSecret(id: ChatSecretId): Promise<boolean>;
16
12
  /**
17
- * List all stored chat secret IDs.
18
- * Note: This only returns secrets stored in OS keychain, not those in env.
13
+ * List all stored chat secret IDs (those present in the environment).
19
14
  */
20
15
  export declare function listChatSecrets(): Promise<ChatSecretId[]>;
21
16
  /**
22
- * On CLI startup, populate process.env from keychain for any chat secret
23
- * not already set in env. Allows downstream code (chat/factory.ts) to
24
- * remain env-based without code changes.
17
+ * Retained for boot compatibility (index.ts). Chat secrets now live in the
18
+ * environment (loaded from the env-store at startup), so there is nothing to
19
+ * hydrate this is a no-op.
25
20
  */
26
21
  export declare function hydrateChatEnvFromKeychain(): Promise<void>;
@@ -1,22 +1,12 @@
1
1
  /**
2
2
  * src/chat/chat-keychain.ts
3
3
  *
4
- * Chat-service keychain loader with env-var fallback.
5
- * Parallel module to src/mcp/mcp-keychain.ts but keyed by ChatSecretId
6
- * (chat services like Discord, Slack) instead of MCP servers.
7
- *
8
- * Priority: OS keychain (keytar) > environment variable > null.
9
- * On CLI startup, hydrateChatEnvFromKeychain() populates process.env from
10
- * keychain for any chat secret not already set in env.
4
+ * Chat-service secret store, keyed by ChatSecretId (Discord, Slack). Backed by
5
+ * the env-store (`.env` file + process.env + Windows registry mirror) — the OS
6
+ * keychain (keytar) has been removed. Reads come straight from process.env.
11
7
  */
8
+ import { clearEnvVar, persistEnvVar } from "../providers/env-store.js";
12
9
  import { redactor } from "../utils/redactor.js";
13
- const KEYCHAIN_SERVICE = "muonroi-cli";
14
- const ACCOUNT_BY_CHAT = {
15
- "discord-token": "chat-discord-token",
16
- "discord-guild-id": "chat-discord-guild-id",
17
- "slack-token": "chat-slack-token",
18
- "slack-team-id": "chat-slack-team-id",
19
- };
20
10
  const ENV_BY_CHAT = {
21
11
  "discord-token": "MUONROI_DISCORD_TOKEN",
22
12
  "discord-guild-id": "MUONROI_DISCORD_GUILD_ID",
@@ -24,107 +14,50 @@ const ENV_BY_CHAT = {
24
14
  "slack-team-id": "MUONROI_SLACK_TEAM_ID",
25
15
  };
26
16
  const MIN_LEN = 8; // guild IDs are short (18-19 digits); tokens ~70 chars. Use 8 as floor.
27
- async function loadKeytar() {
28
- try {
29
- return (await import("keytar"));
30
- }
31
- catch {
32
- return null;
33
- }
17
+ function isTokenSecret(id) {
18
+ return id === "discord-token" || id === "slack-token";
34
19
  }
35
20
  export async function setChatSecret(id, value) {
36
21
  if (!value || value.length < MIN_LEN) {
37
22
  throw new Error(`Value for chat secret '${id}' is too short (< ${MIN_LEN} chars).`);
38
23
  }
39
- const kt = await loadKeytar();
40
- if (!kt?.setPassword)
41
- return false;
42
- // Enroll token values in redactor, but not IDs (they are not secrets)
43
- if (id === "discord-token" || id === "slack-token") {
24
+ if (isTokenSecret(id))
44
25
  redactor.enrollSecret(value);
45
- }
46
- try {
47
- await kt.setPassword(KEYCHAIN_SERVICE, ACCOUNT_BY_CHAT[id], value);
48
- return true;
49
- }
50
- catch (err) {
51
- // Runtime backend failure (e.g. Linux without libsecret or no active secret service).
52
- if (process.env.DEBUG || process.env.MUONROI_DEBUG_KEYCHAIN) {
53
- console.error(`[chat-keychain] setPassword backend error for ${id}:`, err?.message || err);
54
- }
55
- return false;
56
- }
26
+ persistEnvVar(ENV_BY_CHAT[id], value);
27
+ return true;
57
28
  }
58
29
  export async function getChatSecret(id) {
59
- const kt = await loadKeytar();
60
- if (kt) {
61
- try {
62
- const v = await kt.getPassword(KEYCHAIN_SERVICE, ACCOUNT_BY_CHAT[id]);
63
- if (v && v.length >= MIN_LEN) {
64
- // Enroll in redactor only for token values
65
- if (id === "discord-token" || id === "slack-token") {
66
- redactor.enrollSecret(v);
67
- }
68
- return v;
69
- }
70
- }
71
- catch {
72
- /* keytar backend failure → fall through to env */
73
- }
74
- }
75
30
  const envKey = process.env[ENV_BY_CHAT[id]];
76
31
  if (envKey && envKey.length >= MIN_LEN) {
77
- // Enroll in redactor only for token values
78
- if (id === "discord-token" || id === "slack-token") {
32
+ if (isTokenSecret(id))
79
33
  redactor.enrollSecret(envKey);
80
- }
81
34
  return envKey;
82
35
  }
83
36
  return null;
84
37
  }
85
38
  export async function deleteChatSecret(id) {
86
- const kt = await loadKeytar();
87
- if (!kt?.deletePassword)
88
- return false;
89
- try {
90
- return await kt.deletePassword(KEYCHAIN_SERVICE, ACCOUNT_BY_CHAT[id]);
91
- }
92
- catch (err) {
93
- if (process.env.DEBUG || process.env.MUONROI_DEBUG_KEYCHAIN) {
94
- console.error(`[chat-keychain] deletePassword backend error for ${id}:`, err?.message || err);
95
- }
96
- return false;
97
- }
39
+ const had = !!process.env[ENV_BY_CHAT[id]];
40
+ clearEnvVar(ENV_BY_CHAT[id]);
41
+ return had;
98
42
  }
99
43
  /**
100
- * List all stored chat secret IDs.
101
- * Note: This only returns secrets stored in OS keychain, not those in env.
44
+ * List all stored chat secret IDs (those present in the environment).
102
45
  */
103
46
  export async function listChatSecrets() {
104
47
  const ids = ["discord-token", "discord-guild-id", "slack-token", "slack-team-id"];
105
48
  const stored = [];
106
49
  for (const id of ids) {
107
- const v = await getChatSecret(id);
108
- if (v) {
50
+ if (await getChatSecret(id))
109
51
  stored.push(id);
110
- }
111
52
  }
112
53
  return stored;
113
54
  }
114
55
  /**
115
- * On CLI startup, populate process.env from keychain for any chat secret
116
- * not already set in env. Allows downstream code (chat/factory.ts) to
117
- * remain env-based without code changes.
56
+ * Retained for boot compatibility (index.ts). Chat secrets now live in the
57
+ * environment (loaded from the env-store at startup), so there is nothing to
58
+ * hydrate this is a no-op.
118
59
  */
119
60
  export async function hydrateChatEnvFromKeychain() {
120
- const ids = ["discord-token", "discord-guild-id", "slack-token", "slack-team-id"];
121
- for (const id of ids) {
122
- const envName = ENV_BY_CHAT[id];
123
- if (process.env[envName])
124
- continue; // env wins
125
- const v = await getChatSecret(id);
126
- if (v)
127
- process.env[envName] = v;
128
- }
61
+ // Intentional no-op: env-store already populated process.env at startup.
129
62
  }
130
63
  //# sourceMappingURL=chat-keychain.js.map
@@ -9,7 +9,7 @@ import { A, captureKey, divider, enterRawMode, hiddenPrompt, maskKey } from "./t
9
9
  * until their integration is hardened — the router can still target them
10
10
  * programmatically. To re-expose one, add its id here.
11
11
  */
12
- const VISIBLE_PROVIDERS = ["deepseek", "siliconflow"];
12
+ const VISIBLE_PROVIDERS = ["deepseek", "zai", "opencode-go", "xai"];
13
13
  const ALL_PROVIDERS = [...VISIBLE_PROVIDERS, "ollama"];
14
14
  void KEYCHAIN_PROVIDER_IDS;
15
15
  async function loadRows() {
@@ -35,6 +35,16 @@ export interface CostForensicsSummary {
35
35
  totalCostUsd: number;
36
36
  cacheHitRatio: number;
37
37
  peakSingleCallInput: number;
38
+ /**
39
+ * Peak FRESH (uncached) input on any single usage event — `max(input -
40
+ * cacheRead)`. This is the cap-escape discriminator: `task`/`council` rows
41
+ * store `totalUsage` AGGREGATED across a streamText call's internal steps, so
42
+ * a high `peakSingleCallInput` on those sources is usually cached-prefix reuse
43
+ * across steps (high cache hit), NOT a single call that breached the cap. A
44
+ * genuine cold cap-escape sends >cap FRESH tokens in one call, which shows up
45
+ * here regardless of source.
46
+ */
47
+ peakSingleCallFresh: number;
38
48
  events: CostForensicsRow[];
39
49
  /** Anti-mù counters for this session (null when none recorded). */
40
50
  experience: SessionExperienceCounts | null;
@@ -83,6 +83,7 @@ export function collectCostForensics(sessionId) {
83
83
  let totalCacheCreation = 0;
84
84
  let totalCostMicros = 0;
85
85
  let peakSingleCallInput = 0;
86
+ let peakSingleCallFresh = 0;
86
87
  for (const e of events) {
87
88
  totalInput += e.inputTokens;
88
89
  totalOutput += e.outputTokens;
@@ -91,6 +92,9 @@ export function collectCostForensics(sessionId) {
91
92
  totalCostMicros += e.costMicros;
92
93
  if (e.inputTokens > peakSingleCallInput)
93
94
  peakSingleCallInput = e.inputTokens;
95
+ const fresh = Math.max(0, e.inputTokens - e.cacheReadTokens);
96
+ if (fresh > peakSingleCallFresh)
97
+ peakSingleCallFresh = fresh;
94
98
  }
95
99
  const cacheable = totalInput;
96
100
  const cacheHitRatio = cacheable > 0 ? totalCacheRead / cacheable : 0;
@@ -106,6 +110,7 @@ export function collectCostForensics(sessionId) {
106
110
  totalCostUsd: totalCostMicros / 1_000_000,
107
111
  cacheHitRatio,
108
112
  peakSingleCallInput,
113
+ peakSingleCallFresh,
109
114
  events,
110
115
  experience: selectSessionExperience(sessionId),
111
116
  };
@@ -159,7 +164,8 @@ export function printCostForensics(summary, opts = {}) {
159
164
  w(`Total output tokens: ${formatNum(summary.totalOutput)}`);
160
165
  w(`Cache read tokens: ${formatNum(summary.totalCacheRead)} (${formatPct(summary.cacheHitRatio)} of input)`);
161
166
  w(`Cache create tokens: ${formatNum(summary.totalCacheCreation)}`);
162
- w(`Peak single call: ${formatNum(summary.peakSingleCallInput)} input`);
167
+ w(`Peak single call: ${formatNum(summary.peakSingleCallInput)} input ` +
168
+ `(${formatNum(summary.peakSingleCallFresh)} fresh)`);
163
169
  w(`Estimated cost: $${summary.totalCostUsd.toFixed(4)}`);
164
170
  // Cache-cadence diagnostic — surface fast-loop prompt-cache latency loss.
165
171
  const cadence = computeCacheCadence(summary.events);
@@ -199,8 +205,17 @@ export function printCostForensics(summary, opts = {}) {
199
205
  }
200
206
  // Acceptance hints — surface anomalies relative to Phase A/B/C targets.
201
207
  const anomalies = [];
202
- if (summary.peakSingleCallInput > 80_000) {
203
- anomalies.push(`peak single-call input ${formatNum(summary.peakSingleCallInput)} > 80,000 — sub-agent cap may not have kicked in (Phase B target breach)`);
208
+ // Phase B breach = a single call that sent >80K FRESH (uncached) tokens.
209
+ // Use FRESH, not raw input: `task`/`council` usage rows store `totalUsage`
210
+ // aggregated across a streamText call's internal steps, so a high raw input
211
+ // there is normally cached-prefix reuse across steps (high cache hit), NOT a
212
+ // cold cap breach. Evidence: session 6f17a13c1591 peaked at 378,613 raw input
213
+ // but only 54,389 fresh (324,224 cache-read) — aggregate reuse, no breach.
214
+ if (summary.peakSingleCallFresh > 80_000) {
215
+ anomalies.push(`peak single-call FRESH input ${formatNum(summary.peakSingleCallFresh)} > 80,000 — sub-agent cap may not have kicked in (Phase B target breach)`);
216
+ }
217
+ else if (summary.peakSingleCallInput > 80_000) {
218
+ anomalies.push(`peak single-call input ${formatNum(summary.peakSingleCallInput)} > 80,000 but only ${formatNum(summary.peakSingleCallFresh)} FRESH — aggregate multi-step reuse (task/council totalUsage), NOT a cap breach`);
204
219
  }
205
220
  if (summary.events.some((e) => e.messageSeq === null && e.source === "message")) {
206
221
  anomalies.push(`some 'message' events have NULL message_seq — Phase A5 message write-ahead bypassed (check persistMessageWriteAhead wiring)`);
@@ -7,7 +7,7 @@
7
7
  * Format (JSON):
8
8
  * { v:1, kdf:"scrypt", salt:hex, iv:hex, tag:hex, ct:base64 }
9
9
  *
10
- * Plaintext payload (JSON): { providers: { deepseek: "sk-...", siliconflow: "sf-..." } }
10
+ * Plaintext payload (JSON): { providers: { deepseek: "sk-...", xai: "xai-..." } }
11
11
  *
12
12
  * Crypto:
13
13
  * - scrypt(passphrase, salt, 32) → 256-bit key
@@ -7,7 +7,7 @@
7
7
  * Format (JSON):
8
8
  * { v:1, kdf:"scrypt", salt:hex, iv:hex, tag:hex, ct:base64 }
9
9
  *
10
- * Plaintext payload (JSON): { providers: { deepseek: "sk-...", siliconflow: "sf-..." } }
10
+ * Plaintext payload (JSON): { providers: { deepseek: "sk-...", xai: "xai-..." } }
11
11
  *
12
12
  * Crypto:
13
13
  * - scrypt(passphrase, salt, 32) → 256-bit key
@@ -1,62 +1,27 @@
1
1
  /**
2
2
  * `muonroi-cli keys` subcommand group.
3
3
  *
4
- * Manages provider API keys via the OS keychain (Windows Credential Manager,
5
- * macOS Keychain, libsecret on Linux via keytar). Keys are read by the CLI through the
6
- * keychain → env → settings.json priority chain in providers/keychain.ts.
7
- *
8
- * On Linux without libsecret + an active secret service (gnome-keyring etc.),
9
- * or in headless sessions, keychain writes return false and callers fall back
10
- * to advising environment variables (which are still honored at runtime).
4
+ * Manages provider API keys via the env-store. Keys are read by the CLI through
5
+ * the env-store env settings.json priority chain in providers/keychain.ts.
11
6
  *
12
7
  * Subcommands:
13
- * keys set <provider> — interactive prompt, stores in keychain
8
+ * keys set <provider> — interactive prompt, stores the key
14
9
  * keys list — show masked keys currently stored
15
10
  * keys delete <provider> — remove a stored key
16
- * keys import-bw [providers] pull from Bitwarden vault, store in keychain
17
- * keys cleanup-settings strip plaintext keys from user-settings.json
18
- * keys login <provider> — OAuth login (openai, google/agy)
19
- * keys logout <provider> — OAuth logout (openai, google/agy)
11
+ * keys export <file> export keys to an encrypted portable bundle
12
+ * keys import <file> import an encrypted bundle
13
+ * keys login <provider> — OAuth login (openai, xai)
14
+ * keys logout <provider> — OAuth logout (openai, xai)
20
15
  */
21
16
  import { type ChatSecretId } from "../chat/chat-keychain.js";
22
- export interface KeysSetOptions {
23
- bw?: boolean;
24
- itemPrefix?: string;
25
- }
26
- export declare function runKeysSet(provider: string, options?: KeysSetOptions): Promise<void>;
27
- export declare function runMcpKeysSet(id: string, options?: KeysSetOptions): Promise<void>;
17
+ export type KeysSetOptions = Record<string, never>;
18
+ export declare function runKeysSet(provider: string, _options?: KeysSetOptions): Promise<void>;
19
+ export declare function runMcpKeysSet(id: string, _options?: KeysSetOptions): Promise<void>;
28
20
  export declare function runKeysList(): Promise<void>;
29
21
  export declare function runKeysDelete(provider: string): Promise<void>;
30
22
  export declare function runKeysExport(filePath: string): Promise<void>;
31
23
  export declare function runKeysImport(filePath: string): Promise<void>;
32
- interface BwImportOptions {
33
- providers?: string[];
34
- itemPrefix?: string;
35
- }
36
- export declare function runKeysImportBw(opts?: BwImportOptions): Promise<void>;
37
- interface McpBwImportOptions {
38
- keys?: string[];
39
- itemPrefix?: string;
40
- }
41
- /**
42
- * Import MCP secrets (e.g. Tavily) from a Bitwarden vault into the OS
43
- * keychain via mcp-keychain. Vault items are expected at `<prefix><id>` —
44
- * default prefix `muonroi-cli/`. The key value is read from the item's
45
- * notes field, mirroring the provider import-bw flow.
46
- */
47
- export declare function runMcpImportBw(opts?: McpBwImportOptions): Promise<void>;
48
24
  export declare function runChatKeySet(id: ChatSecretId, value: string): Promise<void>;
49
- interface ChatBwImportOptions {
50
- ids?: ChatSecretId[];
51
- itemPrefix?: string;
52
- }
53
- /**
54
- * Import chat secrets (discord-token, discord-guild-id, slack-token, slack-team-id)
55
- * from a Bitwarden vault into the OS keychain. Vault items are expected at
56
- * `<prefix><id>` — default prefix `muonroi-cli/chat-`. The value is read from
57
- * the item's notes field, mirroring the provider/MCP import-bw flow.
58
- */
59
- export declare function runChatImportBw(opts?: ChatBwImportOptions): Promise<void>;
60
25
  /**
61
26
  * `muonroi-cli keys login <provider>`
62
27
  *
@@ -74,5 +39,3 @@ export declare function runKeysLogin(provider: string): Promise<void>;
74
39
  * through the OAuth registry — no provider branching.
75
40
  */
76
41
  export declare function runKeysLogout(provider: string): Promise<void>;
77
- export declare function runKeysCleanupSettings(): Promise<void>;
78
- export {};