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
@@ -2,7 +2,7 @@
2
2
  * src/providers/auth/types.ts
3
3
  *
4
4
  * Provider OAuth interfaces and token shapes.
5
- * Designed to be extensible for Anthropic / Google OAuth in the future.
5
+ * Designed to be extensible for additional provider OAuth in the future.
6
6
  */
7
7
  import type { ProviderId } from "../types.js";
8
8
  export interface OAuthTokens {
@@ -26,8 +26,16 @@ export interface ProviderOAuth {
26
26
  * Calls onUserCode with the human-readable code + verification URL so the
27
27
  * caller can display them to the user before polling.
28
28
  */
29
+ /**
30
+ * `signal` aborts an in-flight sign-in. Browser flows bind a loopback
31
+ * callback server on a fixed, tiny port set; without an abort the server
32
+ * outlives a cancelled sign-in for the full callback timeout and the next
33
+ * attempt cannot bind — which reads to the user as "OAuth is broken until I
34
+ * restart the CLI".
35
+ */
29
36
  login(opts: {
30
37
  onUserCode?: (code: string, url: string) => void;
38
+ signal?: AbortSignal;
31
39
  }): Promise<OAuthTokens>;
32
40
  /**
33
41
  * Exchange a refresh token for new tokens.
@@ -2,7 +2,7 @@
2
2
  * src/providers/auth/types.ts
3
3
  *
4
4
  * Provider OAuth interfaces and token shapes.
5
- * Designed to be extensible for Anthropic / Google OAuth in the future.
5
+ * Designed to be extensible for additional provider OAuth in the future.
6
6
  */
7
7
  // ---------------------------------------------------------------------------
8
8
  // Errors
@@ -2,9 +2,9 @@
2
2
  * src/providers/capabilities.ts
3
3
  *
4
4
  * Per-provider capability flags. Each provider quirks differently:
5
- * - DeepSeek / SiliconFlow models leak `<|DSML|>` control tokens into
5
+ * - DeepSeek models leak `<|DSML|>` control tokens into
6
6
  * JSON tool inputs, breaking Zod validation for plain-text schemas.
7
- * - OpenAI / Anthropic / Google handle structured tool calls reliably.
7
+ * - OpenAI / Anthropic handle structured tool calls reliably.
8
8
  * - Local Ollama models vary wildly per checkpoint — treat conservatively.
9
9
  *
10
10
  * The PIL Layer 6 output module queries these flags before offering a
@@ -81,10 +81,10 @@ export interface ProviderCapabilities {
81
81
  /**
82
82
  * Transform conversation history before sending to the provider. Default is
83
83
  * identity (returns input by reference). Providers override when they
84
- * reject specific message parts — e.g. SiliconFlow's DeepSeek thinking-mode
85
- * endpoint returns HTTP 400 code 20015 when assistant `reasoning` parts are
84
+ * reject specific message parts — e.g. a DeepSeek thinking-mode endpoint
85
+ * that returns HTTP 400 code 20015 when assistant `reasoning` parts are
86
86
  * present, because @ai-sdk/openai-compatible does not serialize them as the
87
- * `reasoning_content` field SiliconFlow expects.
87
+ * `reasoning_content` field the endpoint expects.
88
88
  */
89
89
  sanitizeHistory<T>(messages: readonly T[]): readonly T[];
90
90
  /**
@@ -133,3 +133,22 @@ export interface ProviderCapabilities {
133
133
  * unknown so new providers don't accidentally inherit a quirk override.
134
134
  */
135
135
  export declare function getProviderCapabilities(providerId: ProviderId | string): ProviderCapabilities;
136
+ /**
137
+ * Resolve the temperature to send for a given (provider, model), or `undefined`
138
+ * to omit the field entirely.
139
+ *
140
+ * Two provider quirks are handled here so no call site has to hardcode a
141
+ * temperature and silently break on a picky upstream:
142
+ * 1. Reasoning models — `acceptsParam("temperature")` returns false; they
143
+ * ignore (OpenAI Responses) or reject temperature. We omit it.
144
+ * 2. Fixed-temperature models — some upstreams (e.g. Moonshot/Kimi via
145
+ * opencode-go) reject any value other than a single allowed one with
146
+ * "invalid temperature: only 1 is allowed for this model". `catalog.json`
147
+ * pins `fixed_temperature` for those; we send exactly that value instead
148
+ * of the caller's desired temperature.
149
+ *
150
+ * Every request that sets a temperature MUST go through this helper — inlining
151
+ * `temperature: 0.7` is what caused the council clarification/spec calls to
152
+ * fail wholesale on a Kimi session (see src/council/llm.ts).
153
+ */
154
+ export declare function resolveTemperature(providerId: ProviderId | string, model: ModelInfo | undefined, desired: number): number | undefined;
@@ -2,9 +2,9 @@
2
2
  * src/providers/capabilities.ts
3
3
  *
4
4
  * Per-provider capability flags. Each provider quirks differently:
5
- * - DeepSeek / SiliconFlow models leak `<|DSML|>` control tokens into
5
+ * - DeepSeek models leak `<|DSML|>` control tokens into
6
6
  * JSON tool inputs, breaking Zod validation for plain-text schemas.
7
- * - OpenAI / Anthropic / Google handle structured tool calls reliably.
7
+ * - OpenAI / Anthropic handle structured tool calls reliably.
8
8
  * - Local Ollama models vary wildly per checkpoint — treat conservatively.
9
9
  *
10
10
  * The PIL Layer 6 output module queries these flags before offering a
@@ -150,7 +150,7 @@ class XAIProviderCapabilities extends ReliableProviderCapabilities {
150
150
  }
151
151
  }
152
152
  /**
153
- * DeepSeek / SiliconFlow quirk: special tokens like `<|DSML|>` leak into
153
+ * DeepSeek quirk: special tokens like `<|DSML|>` leak into
154
154
  * tool-call JSON bodies, failing Zod validation. Plain-text schemas
155
155
  * (`respond_general`) are hit hardest because the model can't recover
156
156
  * from a malformed string field. Structured schemas (`respond_plan`,
@@ -162,10 +162,6 @@ class XAIProviderCapabilities extends ReliableProviderCapabilities {
162
162
  * malformed bodies before the model fell back to free-form text.
163
163
  */
164
164
  class DeepSeekProviderCapabilities extends ReliableProviderCapabilities {
165
- /** Namespace used for openai-compatible providerOptions merge. Overridden by SiliconFlow. */
166
- providerNamespace() {
167
- return "deepseek";
168
- }
169
165
  supportsResponseTool(taskType) {
170
166
  if (taskType === "general")
171
167
  return false;
@@ -180,18 +176,6 @@ class DeepSeekProviderCapabilities extends ReliableProviderCapabilities {
180
176
  return { readField: "promptCacheHitTokens", creationSupported: false };
181
177
  }
182
178
  }
183
- /**
184
- * SiliconFlow shares DeepSeek's `<|DSML|>` tool-call quirk; everything else
185
- * (cache metric layout, signup URL pointer) differs only by namespace.
186
- */
187
- class SiliconflowProviderCapabilities extends DeepSeekProviderCapabilities {
188
- providerNamespace() {
189
- return "siliconflow";
190
- }
191
- consoleSignupURL() {
192
- return consoleUrlFor("siliconflow");
193
- }
194
- }
195
179
  /**
196
180
  * Local Ollama models are heterogeneous; some emit clean tool JSON, some
197
181
  * don't. Treat conservatively until per-checkpoint capability detection
@@ -208,21 +192,29 @@ class OllamaProviderCapabilities extends ReliableProviderCapabilities {
208
192
  }
209
193
  }
210
194
  /**
211
- * Google Gemini — defaults are reliable; only the console URL differs.
195
+ * Z.ai — defaults are reliable; only the console URL differs.
196
+ */
197
+ class ZaiProviderCapabilities extends ReliableProviderCapabilities {
198
+ consoleSignupURL() {
199
+ return consoleUrlFor("zai");
200
+ }
201
+ }
202
+ /**
203
+ * OpenCode Go — defaults are reliable; only the console URL differs.
212
204
  */
213
- class GoogleProviderCapabilities extends ReliableProviderCapabilities {
205
+ class OpenCodeGoProviderCapabilities extends ReliableProviderCapabilities {
214
206
  consoleSignupURL() {
215
- return consoleUrlFor("google");
207
+ return consoleUrlFor("opencode-go");
216
208
  }
217
209
  }
218
210
  const CAPABILITIES = {
219
211
  anthropic: new AnthropicProviderCapabilities(),
220
212
  openai: new OpenAIProviderCapabilities(),
221
- google: new GoogleProviderCapabilities(),
222
213
  xai: new XAIProviderCapabilities(),
223
214
  deepseek: new DeepSeekProviderCapabilities(),
224
- siliconflow: new SiliconflowProviderCapabilities(),
225
215
  ollama: new OllamaProviderCapabilities(),
216
+ zai: new ZaiProviderCapabilities(),
217
+ "opencode-go": new OpenCodeGoProviderCapabilities(),
226
218
  };
227
219
  /**
228
220
  * Singleton resolver — returns the capability instance for a given
@@ -232,4 +224,30 @@ const CAPABILITIES = {
232
224
  export function getProviderCapabilities(providerId) {
233
225
  return CAPABILITIES[providerId] ?? new ReliableProviderCapabilities();
234
226
  }
227
+ /**
228
+ * Resolve the temperature to send for a given (provider, model), or `undefined`
229
+ * to omit the field entirely.
230
+ *
231
+ * Two provider quirks are handled here so no call site has to hardcode a
232
+ * temperature and silently break on a picky upstream:
233
+ * 1. Reasoning models — `acceptsParam("temperature")` returns false; they
234
+ * ignore (OpenAI Responses) or reject temperature. We omit it.
235
+ * 2. Fixed-temperature models — some upstreams (e.g. Moonshot/Kimi via
236
+ * opencode-go) reject any value other than a single allowed one with
237
+ * "invalid temperature: only 1 is allowed for this model". `catalog.json`
238
+ * pins `fixed_temperature` for those; we send exactly that value instead
239
+ * of the caller's desired temperature.
240
+ *
241
+ * Every request that sets a temperature MUST go through this helper — inlining
242
+ * `temperature: 0.7` is what caused the council clarification/spec calls to
243
+ * fail wholesale on a Kimi session (see src/council/llm.ts).
244
+ */
245
+ export function resolveTemperature(providerId, model, desired) {
246
+ const caps = getProviderCapabilities(providerId);
247
+ if (!caps.acceptsParam("temperature", model))
248
+ return undefined;
249
+ if (typeof model?.fixedTemperature === "number")
250
+ return model.fixedTemperature;
251
+ return desired;
252
+ }
235
253
  //# sourceMappingURL=capabilities.js.map
@@ -20,6 +20,6 @@ export declare function apiBaseFor(provider: ProviderId): string;
20
20
  export declare function consoleUrlFor(provider: ProviderId): string;
21
21
  /**
22
22
  * Default base URLs for OpenAI-compatible providers only. Used by adapters
23
- * that share the OpenAI SDK shape (deepseek, siliconflow, xai).
23
+ * that share the OpenAI SDK shape (deepseek, xai).
24
24
  */
25
- export declare const OPENAI_COMPATIBLE_BASE_URLS: Record<"deepseek" | "siliconflow" | "xai", string>;
25
+ export declare const OPENAI_COMPATIBLE_BASE_URLS: Record<"deepseek" | "xai" | "zai" | "opencode-go", string>;
@@ -17,18 +17,10 @@ export const PROVIDER_ENDPOINTS = {
17
17
  apiBase: "https://api.openai.com/v1",
18
18
  consoleUrl: "https://platform.openai.com/api-keys",
19
19
  },
20
- google: {
21
- apiBase: "https://generativelanguage.googleapis.com/v1beta",
22
- consoleUrl: "https://aistudio.google.com/app/apikey",
23
- },
24
20
  deepseek: {
25
21
  apiBase: "https://api.deepseek.com",
26
22
  consoleUrl: "https://platform.deepseek.com/api_keys",
27
23
  },
28
- siliconflow: {
29
- apiBase: "https://api.siliconflow.com/v1",
30
- consoleUrl: "https://cloud.siliconflow.com/account/ak",
31
- },
32
24
  xai: {
33
25
  apiBase: "https://api.x.ai/v1",
34
26
  consoleUrl: "https://console.x.ai/",
@@ -37,6 +29,14 @@ export const PROVIDER_ENDPOINTS = {
37
29
  apiBase: "http://localhost:11434",
38
30
  consoleUrl: "(no key needed for Ollama)",
39
31
  },
32
+ zai: {
33
+ apiBase: "https://api.z.ai/api/coding/paas/v4",
34
+ consoleUrl: "https://z.ai/coding-plan",
35
+ },
36
+ "opencode-go": {
37
+ apiBase: "https://opencode.ai/zen/go/v1",
38
+ consoleUrl: "https://opencode.ai",
39
+ },
40
40
  };
41
41
  /** Fast lookup: provider id → API base URL. */
42
42
  export function apiBaseFor(provider) {
@@ -48,11 +48,12 @@ export function consoleUrlFor(provider) {
48
48
  }
49
49
  /**
50
50
  * Default base URLs for OpenAI-compatible providers only. Used by adapters
51
- * that share the OpenAI SDK shape (deepseek, siliconflow, xai).
51
+ * that share the OpenAI SDK shape (deepseek, xai).
52
52
  */
53
53
  export const OPENAI_COMPATIBLE_BASE_URLS = {
54
54
  deepseek: PROVIDER_ENDPOINTS.deepseek.apiBase,
55
- siliconflow: PROVIDER_ENDPOINTS.siliconflow.apiBase,
56
55
  xai: PROVIDER_ENDPOINTS.xai.apiBase,
56
+ zai: PROVIDER_ENDPOINTS.zai.apiBase,
57
+ "opencode-go": PROVIDER_ENDPOINTS["opencode-go"].apiBase,
57
58
  };
58
59
  //# sourceMappingURL=endpoints.js.map
@@ -0,0 +1,17 @@
1
+ export declare function envFilePath(): string;
2
+ /**
3
+ * Upsert `name=value` in the `.env` store, set `process.env[name]` for the
4
+ * current process, and (on Windows) mirror to the User registry env.
5
+ */
6
+ export declare function persistEnvVar(name: string, value: string): void;
7
+ /** Remove `name` from the `.env` store, `process.env`, and Windows registry. */
8
+ export declare function clearEnvVar(name: string): void;
9
+ /**
10
+ * Load the `.env` store into `process.env` at startup.
11
+ *
12
+ * For ordinary variables the ambient OS environment stays authoritative and
13
+ * `.env` only fills gaps. For `*_API_KEY` credentials the CLI writes itself,
14
+ * `.env` wins and the conflict is logged — see {@link ambientWinsForSecrets}
15
+ * for why, and `MUONROI_ENV_PRECEDENCE=ambient` to opt out.
16
+ */
17
+ export declare function loadEnvFileIntoProcess(): void;
@@ -0,0 +1,228 @@
1
+ /**
2
+ * src/providers/env-store.ts
3
+ *
4
+ * Canonical CLI key store: a `~/.muonroi-cli/.env` file (mode 0600) that is
5
+ * loaded into process.env at startup and written when the user sets a key.
6
+ * On Windows we ALSO mirror to the User-scope registry env so other OS
7
+ * processes see the key. Replaces the OS keychain (keytar).
8
+ */
9
+ import { execFileSync } from "node:child_process";
10
+ import { chmodSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
11
+ import { homedir } from "node:os";
12
+ import { dirname, join } from "node:path";
13
+ import { redactor } from "../utils/redactor.js";
14
+ export function envFilePath() {
15
+ return process.env.MUONROI_ENV_FILE ?? join(homedir(), ".muonroi-cli", ".env");
16
+ }
17
+ function readLines() {
18
+ try {
19
+ return readFileSync(envFilePath(), "utf8").split(/\r?\n/);
20
+ }
21
+ catch (err) {
22
+ // Missing file is the normal first-run case — no key store yet.
23
+ if (err?.code === "ENOENT")
24
+ return [];
25
+ // Anything else (locked, permissions, corrupt) must NOT read as "no keys":
26
+ // persistEnvVar rebuilds the file from these lines, so returning [] here
27
+ // silently rewrites the store WITHOUT the keys it failed to read — the user
28
+ // sets one key and the others are gone. Fail loudly instead.
29
+ throw new Error(`[env-store] cannot read ${envFilePath()}: ${err instanceof Error ? err.message : String(err)}. ` +
30
+ `Refusing to continue — writing now would drop the keys already in it.`);
31
+ }
32
+ }
33
+ function writeLines(lines) {
34
+ const p = envFilePath();
35
+ mkdirSync(dirname(p), { recursive: true });
36
+ const body = lines.filter((l, i) => !(l === "" && i === lines.length - 1)).join("\n");
37
+ writeFileSync(p, body === "" ? "" : `${body}\n`, { encoding: "utf8", mode: 0o600 });
38
+ try {
39
+ chmodSync(p, 0o600);
40
+ }
41
+ catch (err) {
42
+ // Non-fatal on filesystems without POSIX perms (e.g. some Windows FS).
43
+ if (process.env.MUONROI_DEBUG_ENVSTORE) {
44
+ console.error(`[env-store] chmod failed for ${p}: ${err instanceof Error ? err.message : String(err)}`);
45
+ }
46
+ }
47
+ }
48
+ /** Parse "KEY=value" — value may contain "="; comments/blank lines ignored. */
49
+ function parseLine(line) {
50
+ if (!line || line.trimStart().startsWith("#"))
51
+ return null;
52
+ const eq = line.indexOf("=");
53
+ if (eq <= 0)
54
+ return null;
55
+ return { key: line.slice(0, eq).trim(), value: line.slice(eq + 1) };
56
+ }
57
+ /** Env-var names we will ever mirror are plain identifiers; reject anything else. */
58
+ function isValidEnvName(name) {
59
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(name);
60
+ }
61
+ /**
62
+ * Credentials this CLI owns: it writes them itself (`/login`, `keys set` →
63
+ * persistEnvVar) so its own store is the user's latest intent. Matched by the
64
+ * `*_API_KEY` naming convention shared by ENV_BY_PROVIDER / ENV_BY_CHAT /
65
+ * ENV_BY_MCP — a structural test, not a provider-id list, and importing
66
+ * keychain.ts here would be circular (keychain imports this module).
67
+ */
68
+ function isCliOwnedSecret(name) {
69
+ return /_API_KEY$/.test(name);
70
+ }
71
+ /** Last 4 chars + length — enough to tell two keys apart, never enough to use one. */
72
+ function maskSecret(value) {
73
+ return `len=${value.length} …${value.slice(-4)}`;
74
+ }
75
+ /**
76
+ * Which side wins when `.env` and the ambient OS environment disagree.
77
+ *
78
+ * Default `store`: for `*_API_KEY` only, `.env` wins. A stale Windows User-scope
79
+ * var silently beating the key the user just set through the CLI cost a full
80
+ * session of debugging — two council panelists died on a forgotten placeholder
81
+ * key while `.env` held the working one, and nothing said so.
82
+ *
83
+ * `MUONROI_ENV_PRECEDENCE=ambient` restores the old behaviour for CI and
84
+ * scripts that intentionally inject a key for one run.
85
+ */
86
+ function ambientWinsForSecrets() {
87
+ return process.env.MUONROI_ENV_PRECEDENCE === "ambient";
88
+ }
89
+ /**
90
+ * True while a test runner is driving. Vitest sets both `VITEST` and
91
+ * `NODE_ENV=test`; either is enough.
92
+ */
93
+ function isTestRunner() {
94
+ return process.env.VITEST !== undefined || process.env.NODE_ENV === "test";
95
+ }
96
+ function mirrorToWindowsRegistry(name, value) {
97
+ if (process.platform !== "win32")
98
+ return;
99
+ // A unit test must never write the developer's OS-global environment. It did:
100
+ // `bunx vitest run` on Windows left the fixture values from env-store.test.ts,
101
+ // migrate-legacy-keys.test.ts and auth-exclusivity.test.ts sitting in
102
+ // HKCU:\Environment. Those tests point MUONROI_ENV_FILE at a temp dir and
103
+ // clean it up, so they look hermetic — but persistEnvVar also mirrors here,
104
+ // none of them mocks child_process, and nothing cleaned the registry.
105
+ //
106
+ // The credential fixtures then outlived the suite and shadowed the real
107
+ // provider credentials for every NEW process: sub-agents 401'd, the AI SDK
108
+ // reported the resulting empty stream as AI_NoOutputGeneratedError, and
109
+ // /ideal's implementation stage died in 0.6s across three runs — bug "G1",
110
+ // whose own comment blames "gpt-5.4 reasoning models". The model was never
111
+ // involved. Guarding here rather than mocking per-test: the next test to call
112
+ // persistEnvVar would reintroduce the leak, and this is invisible on POSIX.
113
+ if (isTestRunner())
114
+ return;
115
+ if (!isValidEnvName(name)) {
116
+ // Defense-in-depth: never let a non-identifier name reach the shell.
117
+ if (process.env.MUONROI_DEBUG_ENVSTORE) {
118
+ console.error(`[env-store] refusing to mirror invalid env name: ${name}`);
119
+ }
120
+ return;
121
+ }
122
+ try {
123
+ // Neither name nor value is interpolated into the script — both are read
124
+ // from the child's environment as literal strings, so no PowerShell
125
+ // metacharacters in either can be interpreted as commands (injection-safe).
126
+ const script = value === null
127
+ ? "[Environment]::SetEnvironmentVariable($env:MUONROI_ENVSTORE_NAME, $null, 'User')"
128
+ : "[Environment]::SetEnvironmentVariable($env:MUONROI_ENVSTORE_NAME, $env:MUONROI_ENVSTORE_VALUE, 'User')";
129
+ execFileSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", script], {
130
+ env: value === null
131
+ ? { ...process.env, MUONROI_ENVSTORE_NAME: name }
132
+ : { ...process.env, MUONROI_ENVSTORE_NAME: name, MUONROI_ENVSTORE_VALUE: value },
133
+ stdio: "ignore",
134
+ });
135
+ }
136
+ catch (err) {
137
+ // .env + in-memory write already succeeded; OS-wide mirror is best-effort.
138
+ if (process.env.MUONROI_DEBUG_ENVSTORE) {
139
+ console.error(`[env-store] registry mirror failed for ${name}: ${err instanceof Error ? err.message : String(err)}`);
140
+ }
141
+ }
142
+ }
143
+ /**
144
+ * Upsert `name=value` in the `.env` store, set `process.env[name]` for the
145
+ * current process, and (on Windows) mirror to the User registry env.
146
+ */
147
+ export function persistEnvVar(name, value) {
148
+ redactor.enrollSecret(value);
149
+ const lines = readLines();
150
+ const out = [];
151
+ let replaced = false;
152
+ for (const line of lines) {
153
+ const parsed = parseLine(line);
154
+ if (parsed?.key === name) {
155
+ if (!replaced) {
156
+ out.push(`${name}=${value}`);
157
+ replaced = true;
158
+ }
159
+ }
160
+ else if (line !== "") {
161
+ out.push(line);
162
+ }
163
+ }
164
+ if (!replaced)
165
+ out.push(`${name}=${value}`);
166
+ writeLines(out);
167
+ process.env[name] = value;
168
+ mirrorToWindowsRegistry(name, value);
169
+ }
170
+ /** Remove `name` from the `.env` store, `process.env`, and Windows registry. */
171
+ export function clearEnvVar(name) {
172
+ const lines = readLines();
173
+ const out = lines.filter((line) => parseLine(line)?.key !== name && line !== "");
174
+ writeLines(out);
175
+ delete process.env[name];
176
+ mirrorToWindowsRegistry(name, null);
177
+ }
178
+ /**
179
+ * Load the `.env` store into `process.env` at startup.
180
+ *
181
+ * For ordinary variables the ambient OS environment stays authoritative and
182
+ * `.env` only fills gaps. For `*_API_KEY` credentials the CLI writes itself,
183
+ * `.env` wins and the conflict is logged — see {@link ambientWinsForSecrets}
184
+ * for why, and `MUONROI_ENV_PRECEDENCE=ambient` to opt out.
185
+ */
186
+ export function loadEnvFileIntoProcess() {
187
+ let lines;
188
+ try {
189
+ lines = readLines();
190
+ }
191
+ catch (err) {
192
+ // Boot must survive an unreadable store, but never in silence: every
193
+ // provider would 401 and the CLI would look like it lost the keys.
194
+ console.error(`${err instanceof Error ? err.message : String(err)} — continuing without the stored keys.`);
195
+ return;
196
+ }
197
+ for (const line of lines) {
198
+ const parsed = parseLine(line);
199
+ if (!parsed)
200
+ continue;
201
+ const ambient = process.env[parsed.key];
202
+ if (ambient === undefined) {
203
+ process.env[parsed.key] = parsed.value;
204
+ redactor.enrollSecret(parsed.value);
205
+ continue;
206
+ }
207
+ if (ambient === parsed.value)
208
+ continue;
209
+ // The two disagree. For non-secrets the ambient stays authoritative, as
210
+ // before. For a CLI-owned credential a silent divergence is exactly the
211
+ // failure that must never happen again, so it is always reported.
212
+ if (!isCliOwnedSecret(parsed.key))
213
+ continue;
214
+ redactor.enrollSecret(ambient);
215
+ if (ambientWinsForSecrets()) {
216
+ console.error(`[env-store] ${parsed.key}: OS environment (${maskSecret(ambient)}) overrides the CLI store ` +
217
+ `(${maskSecret(parsed.value)}) — MUONROI_ENV_PRECEDENCE=ambient is set. If auth fails, the ` +
218
+ `OS variable is the one being used.`);
219
+ continue;
220
+ }
221
+ console.error(`[env-store] ${parsed.key}: the CLI store (${maskSecret(parsed.value)}) takes precedence over a ` +
222
+ `conflicting OS environment variable (${maskSecret(ambient)}). Remove the OS variable to silence ` +
223
+ `this, or set MUONROI_ENV_PRECEDENCE=ambient to let it win.`);
224
+ process.env[parsed.key] = parsed.value;
225
+ redactor.enrollSecret(parsed.value);
226
+ }
227
+ }
228
+ //# sourceMappingURL=env-store.js.map
@@ -1,14 +1,15 @@
1
1
  /**
2
2
  * src/providers/keychain.ts
3
3
  *
4
- * Per-provider keychain loader with env-var fallback.
5
- * Extends the Phase 0 loadAnthropicKey pattern to all 6 providers.
6
- * PROV-02 / PROV-03 requirements.
4
+ * Per-provider key store. Backed by the env-store (`.env` file + process.env +
5
+ * Windows registry mirror) the OS keychain (keytar) has been removed.
7
6
  *
8
- * Priority: OS keychain (keytar) > environment variable > settings.json > ProviderKeyMissingError.
7
+ * Source of truth: `process.env[ENV_BY_PROVIDER[provider]]`. Writes go through
8
+ * the env-store; reads come straight from process.env.
9
9
  * Exception: ollama is keyless by default.
10
10
  */
11
11
  import type { ProviderId } from "./types.js";
12
+ export declare const ENV_BY_PROVIDER: Record<ProviderId, string>;
12
13
  /**
13
14
  * Thrown when no API key can be found for a provider.
14
15
  */
@@ -17,37 +18,33 @@ export declare class ProviderKeyMissingError extends Error {
17
18
  constructor(provider: ProviderId);
18
19
  }
19
20
  /**
20
- * Providers that store an API key in the OS keychain.
21
- * Phase 12.2-G5: derived from `ALL_PROVIDER_IDS` by excluding ollama
22
- * (keyless local server). Preserves the original ordering.
21
+ * Providers that store an API key (all except keyless ollama). Derived from
22
+ * `ALL_PROVIDER_IDS`; preserves the original ordering.
23
23
  */
24
24
  export declare const KEYCHAIN_PROVIDER_IDS: readonly ProviderId[];
25
25
  /**
26
- * Store a provider API key in the OS keychain. Returns true on success.
27
- * Falls back to false (silent) if keytar is unavailable on this platform.
26
+ * Store a provider API key in the OS environment (via the env-store: `.env`
27
+ * file + process.env + Windows registry mirror). Returns true on success.
28
28
  */
29
29
  export declare function setKeyForProvider(provider: string | ProviderId, key: string): Promise<boolean>;
30
30
  /**
31
- * Delete a stored key. Returns true if a key was deleted, false if none was
32
- * present or keytar is unavailable.
31
+ * Delete a stored key from the env-store. Returns true if a key was present.
33
32
  */
34
33
  export declare function deleteKeyForProvider(provider: string | ProviderId): Promise<boolean>;
35
34
  /**
36
- * List provider IDs that currently have a key stored in the keychain.
37
- * Empty array if keytar is unavailable.
35
+ * List provider IDs that currently have a key set in the environment.
38
36
  */
39
37
  export declare function listStoredProviders(): Promise<ProviderId[]>;
40
38
  /**
41
- * Load the API key for a given provider.
42
- * Priority: OS keychain (keytar) > environment variable.
39
+ * Load the API key for a given provider from the environment.
43
40
  * Ollama returns '' when no key is found (keyless).
44
41
  *
45
42
  * @throws {ProviderKeyMissingError} when no key found for non-ollama providers.
46
43
  */
47
44
  export declare function loadKeyForProvider(provider: ProviderId): Promise<string>;
48
45
  /**
49
- * Return the list of providers that currently have credentials available — checked across
50
- * OS keychain, environment variables, and user-settings.json. `ollama` is always included
46
+ * Return the list of providers that currently have credentials available —
47
+ * either an env API key or a stored OAuth token. `ollama` is always included
51
48
  * because it is keyless. Order is stable for UI rendering.
52
49
  */
53
50
  export declare function getConfiguredProviders(): Promise<ProviderId[]>;
@@ -60,7 +57,14 @@ export declare function getConfiguredProviders(): Promise<ProviderId[]>;
60
57
  export declare function getOAuthTokens(provider: ProviderId): Promise<import("./auth/types.js").OAuthTokens | null>;
61
58
  /**
62
59
  * Find the first provider with an available API key.
63
- * Checks in priority order: anthropic, openai, google, deepseek, siliconflow, ollama.
60
+ * Checks in priority order: anthropic, openai, deepseek, ollama.
64
61
  * Returns null if no provider has a key (unlikely — ollama is keyless fallback).
65
62
  */
66
63
  export declare function firstAvailableProvider(): Promise<ProviderId | null>;
64
+ /**
65
+ * One-time migration: move any legacy API keys — OS keychain (keytar) or
66
+ * `settings.json` (`providers.<p>.apiKey`) — into the env-store, then remove
67
+ * the legacy copies. Best-effort, idempotent, and never throws. Guarded by
68
+ * `settings.keysMigratedToEnv`. Runs once at startup before key resolution.
69
+ */
70
+ export declare function migrateLegacyKeysToEnv(): Promise<void>;