muonroi-cli 1.8.3 → 1.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +133 -122
  3. package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
  4. package/dist/packages/agent-harness-core/src/driver.js +46 -0
  5. package/dist/packages/agent-harness-core/src/event-tee.d.ts +48 -0
  6. package/dist/packages/agent-harness-core/src/event-tee.js +77 -0
  7. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +11 -0
  8. package/dist/packages/agent-harness-core/src/mcp-server.js +87 -15
  9. package/dist/packages/agent-harness-core/src/protocol.d.ts +66 -2
  10. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  11. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  12. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  13. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  14. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  15. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  16. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  17. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  18. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  19. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  20. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  21. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  22. package/dist/src/agent-harness/mock-model.d.ts +28 -0
  23. package/dist/src/agent-harness/mock-model.js +63 -1
  24. package/dist/src/agent-harness/test-spawn.js +31 -0
  25. package/dist/src/cli/config/screen-providers.js +1 -1
  26. package/dist/src/cli/cost-forensics.d.ts +10 -0
  27. package/dist/src/cli/cost-forensics.js +30 -15
  28. package/dist/src/cli/keys-bundle.d.ts +1 -1
  29. package/dist/src/cli/keys-bundle.js +1 -1
  30. package/dist/src/cli/keys.d.ts +2 -2
  31. package/dist/src/cli/keys.js +19 -81
  32. package/dist/src/council/clarifier.d.ts +28 -2
  33. package/dist/src/council/clarifier.js +81 -15
  34. package/dist/src/council/context.js +49 -15
  35. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  36. package/dist/src/council/debate-checkpoint.js +176 -0
  37. package/dist/src/council/debate-planner.js +51 -3
  38. package/dist/src/council/debate-summary.d.ts +25 -0
  39. package/dist/src/council/debate-summary.js +85 -0
  40. package/dist/src/council/debate.d.ts +169 -2
  41. package/dist/src/council/debate.js +1210 -134
  42. package/dist/src/council/index.d.ts +85 -1
  43. package/dist/src/council/index.js +634 -196
  44. package/dist/src/council/leader.d.ts +26 -0
  45. package/dist/src/council/leader.js +150 -9
  46. package/dist/src/council/llm.d.ts +32 -0
  47. package/dist/src/council/llm.js +231 -38
  48. package/dist/src/council/panel-select.d.ts +30 -0
  49. package/dist/src/council/panel-select.js +72 -0
  50. package/dist/src/council/planner.js +23 -0
  51. package/dist/src/council/preflight.d.ts +7 -0
  52. package/dist/src/council/preflight.js +14 -2
  53. package/dist/src/council/prompts.d.ts +30 -3
  54. package/dist/src/council/prompts.js +254 -84
  55. package/dist/src/council/stance-recall.d.ts +42 -0
  56. package/dist/src/council/stance-recall.js +57 -0
  57. package/dist/src/council/strip-think.d.ts +17 -0
  58. package/dist/src/council/strip-think.js +33 -0
  59. package/dist/src/council/types.d.ts +128 -0
  60. package/dist/src/ee/artifact-cache.d.ts +16 -0
  61. package/dist/src/ee/artifact-cache.js +32 -0
  62. package/dist/src/ee/auth.d.ts +1 -0
  63. package/dist/src/ee/auth.js +15 -2
  64. package/dist/src/ee/bridge.d.ts +10 -0
  65. package/dist/src/ee/bridge.js +58 -0
  66. package/dist/src/ee/client.js +81 -18
  67. package/dist/src/ee/export-transcripts.d.ts +1 -0
  68. package/dist/src/ee/export-transcripts.js +8 -10
  69. package/dist/src/ee/extract-session.js +29 -0
  70. package/dist/src/ee/extract-style.d.ts +58 -0
  71. package/dist/src/ee/extract-style.js +270 -0
  72. package/dist/src/ee/recall-ledger.d.ts +9 -0
  73. package/dist/src/ee/recall-ledger.js +3 -0
  74. package/dist/src/ee/scope.d.ts +1 -0
  75. package/dist/src/ee/scope.js +26 -1
  76. package/dist/src/ee/search.d.ts +7 -0
  77. package/dist/src/ee/search.js +24 -0
  78. package/dist/src/ee/transcript-emit.js +2 -0
  79. package/dist/src/ee/types.d.ts +22 -0
  80. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  81. package/dist/src/ee/who-am-i-brain.js +220 -0
  82. package/dist/src/ee/who-am-i.d.ts +10 -3
  83. package/dist/src/ee/who-am-i.js +12 -0
  84. package/dist/src/ee/workflow-event.d.ts +48 -0
  85. package/dist/src/ee/workflow-event.js +81 -0
  86. package/dist/src/flow/compaction/compress.d.ts +3 -3
  87. package/dist/src/flow/compaction/compress.js +45 -8
  88. package/dist/src/flow/compaction/extract.d.ts +4 -7
  89. package/dist/src/flow/compaction/extract.js +50 -10
  90. package/dist/src/flow/compaction/index.d.ts +13 -1
  91. package/dist/src/flow/compaction/index.js +70 -3
  92. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  93. package/dist/src/flow/compaction/input-guard.js +43 -0
  94. package/dist/src/flow/fold-planning.d.ts +36 -0
  95. package/dist/src/flow/fold-planning.js +83 -0
  96. package/dist/src/flow/hierarchy.d.ts +146 -0
  97. package/dist/src/flow/hierarchy.js +427 -0
  98. package/dist/src/flow/index.d.ts +1 -0
  99. package/dist/src/flow/index.js +2 -0
  100. package/dist/src/flow/run-artifacts.d.ts +102 -0
  101. package/dist/src/flow/run-artifacts.js +208 -0
  102. package/dist/src/generated/version.d.ts +1 -1
  103. package/dist/src/generated/version.js +1 -1
  104. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  105. package/dist/src/gsd/assessment-schema.js +134 -0
  106. package/dist/src/gsd/capability-registry.d.ts +45 -0
  107. package/dist/src/gsd/capability-registry.js +337 -0
  108. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  109. package/dist/src/gsd/complexity-assessor.js +152 -0
  110. package/dist/src/gsd/config-bridge.d.ts +7 -0
  111. package/dist/src/gsd/config-bridge.js +114 -0
  112. package/dist/src/gsd/config-loader.d.ts +27 -0
  113. package/dist/src/gsd/config-loader.js +50 -0
  114. package/dist/src/gsd/council-context.d.ts +44 -0
  115. package/dist/src/gsd/council-context.js +114 -0
  116. package/dist/src/gsd/ee-closure.d.ts +28 -0
  117. package/dist/src/gsd/ee-closure.js +49 -0
  118. package/dist/src/gsd/flags.d.ts +55 -0
  119. package/dist/src/gsd/flags.js +83 -0
  120. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  121. package/dist/src/gsd/gsd-dispatch.js +131 -0
  122. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  123. package/dist/src/gsd/gsd-runtime.js +37 -0
  124. package/dist/src/gsd/host-adapter.d.ts +11 -0
  125. package/dist/src/gsd/host-adapter.js +29 -0
  126. package/dist/src/gsd/index.d.ts +24 -1
  127. package/dist/src/gsd/index.js +27 -0
  128. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  129. package/dist/src/gsd/loop-host-contract.js +39 -0
  130. package/dist/src/gsd/loop-host.d.ts +69 -0
  131. package/dist/src/gsd/loop-host.js +245 -0
  132. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  133. package/dist/src/gsd/loop-resolver.js +79 -0
  134. package/dist/src/gsd/model-tier.d.ts +13 -0
  135. package/dist/src/gsd/model-tier.js +45 -0
  136. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  137. package/dist/src/gsd/mutation-gate.js +41 -0
  138. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  139. package/dist/src/gsd/native-roadmap.js +343 -0
  140. package/dist/src/gsd/native-state.d.ts +47 -0
  141. package/dist/src/gsd/native-state.js +220 -0
  142. package/dist/src/gsd/paths.d.ts +23 -0
  143. package/dist/src/gsd/paths.js +66 -0
  144. package/dist/src/gsd/phase-dag.d.ts +12 -0
  145. package/dist/src/gsd/phase-dag.js +94 -0
  146. package/dist/src/gsd/phase-sync.d.ts +42 -0
  147. package/dist/src/gsd/phase-sync.js +321 -0
  148. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  149. package/dist/src/gsd/pil-gate-context.js +64 -0
  150. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  151. package/dist/src/gsd/pil-gate-critic.js +74 -0
  152. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  153. package/dist/src/gsd/plan-council-prompts.js +79 -0
  154. package/dist/src/gsd/plan-council.d.ts +44 -0
  155. package/dist/src/gsd/plan-council.js +251 -0
  156. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  157. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  158. package/dist/src/gsd/product-workspace.d.ts +13 -0
  159. package/dist/src/gsd/product-workspace.js +124 -0
  160. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  161. package/dist/src/gsd/ship-bridge.js +65 -0
  162. package/dist/src/gsd/state-document.d.ts +40 -0
  163. package/dist/src/gsd/state-document.js +163 -0
  164. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  165. package/dist/src/gsd/verdict-schema.js +144 -0
  166. package/dist/src/gsd/verify-context.d.ts +22 -0
  167. package/dist/src/gsd/verify-context.js +27 -0
  168. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  169. package/dist/src/gsd/verify-council-prompts.js +85 -0
  170. package/dist/src/gsd/verify-council.d.ts +25 -0
  171. package/dist/src/gsd/verify-council.js +119 -0
  172. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  173. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  174. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  175. package/dist/src/gsd/workflow-engine.js +207 -0
  176. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  177. package/dist/src/gsd/workflow-tools.js +277 -0
  178. package/dist/src/hooks/index.js +1 -1
  179. package/dist/src/index.js +44 -11
  180. package/dist/src/maintain/pr-builder.js +23 -13
  181. package/dist/src/mcp/auto-setup.js +57 -32
  182. package/dist/src/mcp/client-pool.js +1 -1
  183. package/dist/src/mcp/ee-tools.js +1 -0
  184. package/dist/src/mcp/oauth-callback.js +2 -2
  185. package/dist/src/mcp/research-onboarding.js +8 -7
  186. package/dist/src/mcp/runtime.js +34 -2
  187. package/dist/src/mcp/setup-guide-text.d.ts +1 -1
  188. package/dist/src/mcp/setup-guide-text.js +77 -76
  189. package/dist/src/models/catalog-client.d.ts +87 -0
  190. package/dist/src/models/catalog-client.js +105 -38
  191. package/dist/src/models/catalog.json +528 -265
  192. package/dist/src/models/registry.d.ts +22 -7
  193. package/dist/src/models/registry.js +73 -10
  194. package/dist/src/ops/doctor.js +8 -8
  195. package/dist/src/orchestrator/auto-commit.js +1 -1
  196. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  197. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  198. package/dist/src/orchestrator/cache-prefix.js +83 -0
  199. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  200. package/dist/src/orchestrator/compact-request.js +41 -0
  201. package/dist/src/orchestrator/compaction.d.ts +10 -0
  202. package/dist/src/orchestrator/compaction.js +27 -7
  203. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  204. package/dist/src/orchestrator/council-manager.js +65 -24
  205. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  206. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  207. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  208. package/dist/src/orchestrator/error-utils.js +132 -24
  209. package/dist/src/orchestrator/grounding-check.js +39 -1
  210. package/dist/src/orchestrator/message-processor.js +242 -33
  211. package/dist/src/orchestrator/orchestrator.d.ts +39 -3
  212. package/dist/src/orchestrator/orchestrator.js +651 -102
  213. package/dist/src/orchestrator/preprocessor.js +1 -1
  214. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  215. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  216. package/dist/src/orchestrator/prompts.js +159 -159
  217. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  218. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  219. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  220. package/dist/src/orchestrator/retry-classifier.js +46 -2
  221. package/dist/src/orchestrator/safety-intercept.d.ts +45 -0
  222. package/dist/src/orchestrator/safety-intercept.js +55 -0
  223. package/dist/src/orchestrator/scope-reminder.js +1 -1
  224. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  225. package/dist/src/orchestrator/session-experience.js +2 -1
  226. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  227. package/dist/src/orchestrator/should-run-gate.js +18 -0
  228. package/dist/src/orchestrator/stall-watchdog.d.ts +24 -3
  229. package/dist/src/orchestrator/stall-watchdog.js +47 -13
  230. package/dist/src/orchestrator/stream-runner.js +62 -29
  231. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  232. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  233. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  234. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  235. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  236. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  237. package/dist/src/orchestrator/tool-engine.d.ts +26 -0
  238. package/dist/src/orchestrator/tool-engine.js +669 -56
  239. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  240. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  241. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  242. package/dist/src/orchestrator/turn-watchdog.d.ts +37 -0
  243. package/dist/src/orchestrator/turn-watchdog.js +55 -0
  244. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  245. package/dist/src/pil/agent-operating-contract.js +1 -1
  246. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  247. package/dist/src/pil/cheap-model-playbook.js +5 -1
  248. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  249. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  250. package/dist/src/pil/discovery-types.d.ts +1 -0
  251. package/dist/src/pil/discovery.js +16 -11
  252. package/dist/src/pil/layer1-intent.d.ts +18 -6
  253. package/dist/src/pil/layer1-intent.js +66 -757
  254. package/dist/src/pil/layer15-context-scan.js +15 -1
  255. package/dist/src/pil/layer2_5-ponytail.js +8 -8
  256. package/dist/src/pil/layer3-ee-injection.js +23 -8
  257. package/dist/src/pil/layer4-gsd.js +69 -16
  258. package/dist/src/pil/layer5-context.js +7 -3
  259. package/dist/src/pil/layer6-output.d.ts +23 -0
  260. package/dist/src/pil/layer6-output.js +5 -1
  261. package/dist/src/pil/llm-classify.d.ts +33 -2
  262. package/dist/src/pil/llm-classify.js +123 -131
  263. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  264. package/dist/src/pil/native-capabilities-workbook.js +1 -0
  265. package/dist/src/pil/pipeline.js +34 -2
  266. package/dist/src/pil/response-tools.js +5 -3
  267. package/dist/src/pil/schema.d.ts +1 -0
  268. package/dist/src/pil/schema.js +2 -0
  269. package/dist/src/pil/types.d.ts +18 -0
  270. package/dist/src/playbook/directives.d.ts +4 -0
  271. package/dist/src/playbook/directives.js +17 -5
  272. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  273. package/dist/src/product-loop/backlog-builder.js +30 -6
  274. package/dist/src/product-loop/discovery-context-format.js +3 -1
  275. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  276. package/dist/src/product-loop/discovery-interview.js +32 -3
  277. package/dist/src/product-loop/discovery-schema.js +5 -1
  278. package/dist/src/product-loop/done-gate.js +3 -3
  279. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  280. package/dist/src/product-loop/ideal-trace.js +64 -0
  281. package/dist/src/product-loop/index.d.ts +13 -1
  282. package/dist/src/product-loop/index.js +333 -52
  283. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  284. package/dist/src/product-loop/loop-driver.js +327 -116
  285. package/dist/src/product-loop/phase-plan.d.ts +5 -0
  286. package/dist/src/product-loop/phase-plan.js +39 -2
  287. package/dist/src/product-loop/phase-runner.js +9 -1
  288. package/dist/src/product-loop/progress-snapshot.js +4 -4
  289. package/dist/src/product-loop/sprint-runner.d.ts +111 -0
  290. package/dist/src/product-loop/sprint-runner.js +559 -16
  291. package/dist/src/product-loop/types.d.ts +36 -5
  292. package/dist/src/providers/adapter.d.ts +1 -1
  293. package/dist/src/providers/adapter.js +3 -4
  294. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  295. package/dist/src/providers/auth/browser-flow.js +1 -1
  296. package/dist/src/providers/auth/openai-oauth.js +1 -1
  297. package/dist/src/providers/auth/registry.js +0 -34
  298. package/dist/src/providers/auth/token-store.js +4 -1
  299. package/dist/src/providers/auth/types.d.ts +1 -1
  300. package/dist/src/providers/auth/types.js +1 -1
  301. package/dist/src/providers/capabilities.d.ts +24 -5
  302. package/dist/src/providers/capabilities.js +42 -24
  303. package/dist/src/providers/endpoints.d.ts +2 -2
  304. package/dist/src/providers/endpoints.js +11 -10
  305. package/dist/src/providers/keychain.d.ts +1 -1
  306. package/dist/src/providers/keychain.js +7 -9
  307. package/dist/src/providers/mcp-vision-bridge.js +82 -172
  308. package/dist/src/providers/openai-compatible.js +8 -1
  309. package/dist/src/providers/pricing.d.ts +2 -2
  310. package/dist/src/providers/pricing.js +3 -13
  311. package/dist/src/providers/runtime.d.ts +27 -2
  312. package/dist/src/providers/runtime.js +78 -15
  313. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  314. package/dist/src/providers/strategies/base.strategy.js +24 -1
  315. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  316. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  317. package/dist/src/providers/strategies/registry.js +4 -4
  318. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  319. package/dist/src/providers/strategies/thinking-mode.js +280 -1
  320. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  321. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  322. package/dist/src/providers/types.d.ts +5 -6
  323. package/dist/src/providers/types.js +2 -2
  324. package/dist/src/providers/vision-backend.d.ts +47 -0
  325. package/dist/src/providers/vision-backend.js +258 -0
  326. package/dist/src/providers/vision-proxy.d.ts +22 -9
  327. package/dist/src/providers/vision-proxy.js +63 -132
  328. package/dist/src/providers/wire-debug.js +95 -0
  329. package/dist/src/reporter/index.js +1 -1
  330. package/dist/src/router/decide.d.ts +13 -0
  331. package/dist/src/router/decide.js +138 -36
  332. package/dist/src/router/peak-hour.d.ts +38 -0
  333. package/dist/src/router/peak-hour.js +107 -0
  334. package/dist/src/router/step-router.js +3 -2
  335. package/dist/src/router/warm.js +4 -5
  336. package/dist/src/scaffold/bb-ecosystem-apply.js +47 -47
  337. package/dist/src/scaffold/bb-quality-gate.js +5 -5
  338. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  339. package/dist/src/scaffold/continuation-prompt.js +86 -60
  340. package/dist/src/scaffold/init-new.js +453 -453
  341. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  342. package/dist/src/scaffold/point-to-existing.js +25 -0
  343. package/dist/src/self-qa/agentic-loop.js +22 -22
  344. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  345. package/dist/src/{ui/state → state}/active-run.js +21 -0
  346. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  347. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  348. package/dist/src/state/turn-trace.d.ts +43 -0
  349. package/dist/src/state/turn-trace.js +32 -0
  350. package/dist/src/storage/db.js +2 -1
  351. package/dist/src/storage/index.d.ts +1 -1
  352. package/dist/src/storage/index.js +1 -1
  353. package/dist/src/storage/interaction-log.d.ts +1 -1
  354. package/dist/src/storage/interaction-log.js +5 -5
  355. package/dist/src/storage/migrations.js +196 -126
  356. package/dist/src/storage/session-experience-store.js +4 -4
  357. package/dist/src/storage/sessions.d.ts +28 -10
  358. package/dist/src/storage/sessions.js +112 -55
  359. package/dist/src/storage/transcript-view.js +1 -1
  360. package/dist/src/storage/transcript.d.ts +51 -0
  361. package/dist/src/storage/transcript.js +383 -112
  362. package/dist/src/storage/usage.js +14 -14
  363. package/dist/src/storage/workspaces.js +12 -12
  364. package/dist/src/tools/file.d.ts +15 -0
  365. package/dist/src/tools/file.js +32 -0
  366. package/dist/src/tools/native-tools.js +5 -0
  367. package/dist/src/tools/registry.d.ts +3 -0
  368. package/dist/src/tools/registry.js +460 -22
  369. package/dist/src/tools/research.d.ts +29 -0
  370. package/dist/src/tools/research.js +233 -0
  371. package/dist/src/types/index.d.ts +118 -3
  372. package/dist/src/ui/app.js +0 -0
  373. package/dist/src/ui/cards/product-status-card.js +1 -1
  374. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  375. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  376. package/dist/src/ui/components/context-rail.d.ts +26 -0
  377. package/dist/src/ui/components/context-rail.js +33 -0
  378. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  379. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  380. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  381. package/dist/src/ui/components/council-debate-pill.js +34 -0
  382. package/dist/src/ui/components/council-info-card.js +2 -2
  383. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  384. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  385. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  386. package/dist/src/ui/components/council-message-bubble.js +16 -15
  387. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  388. package/dist/src/ui/components/council-phase-timeline.js +49 -15
  389. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  390. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  391. package/dist/src/ui/components/council-question-card.js +12 -12
  392. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  393. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  394. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  395. package/dist/src/ui/components/council-round-group.js +88 -0
  396. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  397. package/dist/src/ui/components/council-status-list.js +36 -24
  398. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  399. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  400. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  401. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  402. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  403. package/dist/src/ui/components/prompt-box.js +18 -16
  404. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  405. package/dist/src/ui/components/session-tree-card.js +46 -0
  406. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  407. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  408. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  409. package/dist/src/ui/components/task-list-panel.js +22 -2
  410. package/dist/src/ui/containers/modals-layer.d.ts +2 -1
  411. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  412. package/dist/src/ui/mcp-modal.js +2 -4
  413. package/dist/src/ui/modals/api-key-modal.js +1 -1
  414. package/dist/src/ui/modals/connect-modal.js +4 -3
  415. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  416. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  417. package/dist/src/ui/picker-providers.d.ts +1 -1
  418. package/dist/src/ui/picker-providers.js +1 -1
  419. package/dist/src/ui/primitives/index.d.ts +1 -0
  420. package/dist/src/ui/primitives/index.js +2 -0
  421. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  422. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  423. package/dist/src/ui/slash/compact.js +5 -7
  424. package/dist/src/ui/slash/cost.js +1 -1
  425. package/dist/src/ui/slash/council-inspect.js +4 -4
  426. package/dist/src/ui/slash/council.js +19 -1
  427. package/dist/src/ui/slash/debug.d.ts +3 -31
  428. package/dist/src/ui/slash/debug.js +9 -20
  429. package/dist/src/ui/slash/ideal.d.ts +6 -2
  430. package/dist/src/ui/slash/ideal.js +97 -7
  431. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  432. package/dist/src/ui/slash/menu-items.js +12 -18
  433. package/dist/src/ui/slash/registry.d.ts +2 -0
  434. package/dist/src/ui/slash/registry.js +4 -0
  435. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  436. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  437. package/dist/src/ui/status-bar/index.d.ts +1 -1
  438. package/dist/src/ui/status-bar/index.js +7 -3
  439. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  440. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  441. package/dist/src/ui/theme.d.ts +1 -0
  442. package/dist/src/ui/theme.js +2 -0
  443. package/dist/src/ui/types.d.ts +7 -0
  444. package/dist/src/ui/use-app-logic.js +0 -0
  445. package/dist/src/ui/utils/format.d.ts +14 -0
  446. package/dist/src/ui/utils/format.js +23 -3
  447. package/dist/src/usage/downgrade.js +2 -2
  448. package/dist/src/usage/product-ledger.js +2 -2
  449. package/dist/src/utils/clipboard-image.js +23 -23
  450. package/dist/src/utils/install-manager.js +14 -11
  451. package/dist/src/utils/logger.js +2 -2
  452. package/dist/src/utils/permission-mode.js +5 -3
  453. package/dist/src/utils/redactor.js +1 -1
  454. package/dist/src/utils/settings.d.ts +153 -5
  455. package/dist/src/utils/settings.js +233 -29
  456. package/dist/src/utils/side-question.js +2 -2
  457. package/dist/src/utils/skills.js +3 -3
  458. package/dist/src/utils/visible-retry.d.ts +11 -0
  459. package/dist/src/utils/visible-retry.js +10 -1
  460. package/dist/src/verify/entrypoint.d.ts +1 -1
  461. package/dist/src/verify/entrypoint.js +1 -1
  462. package/dist/src/verify/recipes.d.ts +13 -0
  463. package/dist/src/verify/recipes.js +15 -0
  464. package/package.json +135 -132
  465. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  466. package/dist/src/providers/auth/gcloud.js +0 -102
  467. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  468. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  469. package/dist/src/providers/gemini.d.ts +0 -11
  470. package/dist/src/providers/gemini.js +0 -45
  471. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  472. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  473. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  474. package/dist/src/providers/strategies/google.strategy.js +0 -174
  475. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  476. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  477. package/dist/src/ui/containers/chat-feed.js +0 -66
@@ -128,6 +128,18 @@ export interface DriverContext {
128
128
  * without it; sprint-runner enforces presence at call time.
129
129
  */
130
130
  processMessageFn?: (message: string) => AsyncGenerator<import("../types/index.js").StreamChunk, void, unknown>;
131
+ /**
132
+ * Bridge into the orchestrator's ISOLATED task-runner (Agent.runTaskRequest →
133
+ * StreamRunner). Unlike processMessageFn — which appends to the shared
134
+ * top-level context and therefore inherits the (large) council-debate history —
135
+ * each call here runs in a FRESH, budget-capped (getSubAgentBudgetChars) child
136
+ * context with independent in-loop compaction, and returns a compact ToolResult
137
+ * summary instead of streaming into the parent. Sprint-runner uses this for the
138
+ * implement stage so the impl never inherits the debate context (which caused a
139
+ * live ctx-overflow wedge). Optional: legacy/test drivers omit it → sprint-runner
140
+ * falls back to processMessageFn.
141
+ */
142
+ runIsolatedTask?: (request: import("../types/index.js").TaskRequest) => Promise<import("../types/index.js").ToolResult>;
131
143
  /**
132
144
  * Optional bridge for verify-recipe detection. Mirrors `Orchestrator.detectVerifyRecipe`.
133
145
  * If absent, sprint-runner uses a deterministic fallback based on the inferVerifyProjectProfile
@@ -185,7 +197,7 @@ export type ProductTypeT = "saas" | "internal-tool" | "consumer-app" | "b2b-plat
185
197
  export type PlatformT = "web" | "mobile-ios" | "mobile-android" | "desktop-win" | "desktop-mac" | "desktop-linux" | "cli";
186
198
  export type ScaleT = "1-100" | "100-1k" | "1k-100k" | "100k-1M" | "1M+";
187
199
  export type BackendArchT = "monolith" | "modular-monolith" | "microservices" | "serverless" | "none";
188
- export type DbModeT = "greenfield" | "existing-schema" | "migrate-from";
200
+ export type DbModeT = "none" | "greenfield" | "existing-schema" | "migrate-from";
189
201
  export type FeLibraryT = "shadcn" | "radix" | "headlessui" | "none";
190
202
  export interface AudienceCtx {
191
203
  persona: string;
@@ -353,8 +365,12 @@ export interface PhaseDigestEntry {
353
365
  * The UI (Task 5.2) wires each id to a concrete handler.
354
366
  */
355
367
  export interface RecoveryOption {
356
- /** Stable key. Used by the UI to wire actions. */
357
- id: "init_new" | "point_to_existing" | "continue_as_council";
368
+ /**
369
+ * Stable key. Used by the UI to wire actions.
370
+ * - CB-3 halt (no recipe): init_new | point_to_existing | continue_as_council
371
+ * - Sprint break (A): resume | retry | skip_verify | abort
372
+ */
373
+ id: "init_new" | "point_to_existing" | "continue_as_council" | "resume" | "retry" | "skip_verify" | "abort";
358
374
  /** Label shown in the recovery card. */
359
375
  label: string;
360
376
  /** One-line user-facing description of what choosing this does. */
@@ -367,10 +383,22 @@ export interface RecoveryOption {
367
383
  */
368
384
  export interface HaltChunk {
369
385
  type: "halt";
370
- /** CB-3 emits "no_recipe" / "zero_coverage"; product-loop emits "budget_exhausted" when --budget-tokens trips. */
371
- reason: "no_recipe" | "zero_coverage" | "budget_exhausted";
386
+ /**
387
+ * CB-3 emits "no_recipe" / "zero_coverage"; product-loop emits
388
+ * "budget_exhausted" when --budget-tokens trips; "sprint_failed" (A) when a
389
+ * sprint breaks mid-run (thrown implement/verify error, cap breach, etc.).
390
+ */
391
+ reason: "no_recipe" | "zero_coverage" | "budget_exhausted" | "sprint_failed";
372
392
  /** Optional human-readable detail rendered alongside the recovery card. */
373
393
  detail?: string;
394
+ /**
395
+ * A — the run this halt belongs to. Lets the recovery card auto-wire
396
+ * Resume/Retry/Abort to `/ideal <action> <runId>` without the user knowing
397
+ * (or typing) the runId. Set on "sprint_failed" halts.
398
+ */
399
+ runId?: string;
400
+ /** A — the sprint number that broke, for the "Sprint N failed" card title. */
401
+ sprintN?: number;
374
402
  /** Actionable choices. UI renders these as buttons / list items. */
375
403
  recovery_options: RecoveryOption[];
376
404
  }
@@ -393,6 +421,9 @@ export interface RunPhasesOptions {
393
421
  }) => Promise<Omit<CustomerDecision, "seq" | "timestampUtc" | "phaseId" | "sprintN">>;
394
422
  suppressPush?: boolean;
395
423
  backoffDelays?: number[];
424
+ /** Project repo cwd — hosts `.planning/` when MUONROI_GSD_NATIVE=1 */
425
+ projectCwd?: string;
426
+ idea?: string;
396
427
  }
397
428
  export type BacklogItemStatus = "backlog" | "in_sprint" | "in_progress" | "done" | "blocked";
398
429
  export type MvpPriority = "v1" | "v2" | "later";
@@ -45,7 +45,7 @@ export declare function createAdapter(id: ProviderId, config: ProviderConfig): A
45
45
  * Dispatch is registry-driven — no `if (id === "openai")` branching. To add
46
46
  * OAuth for a new provider (Anthropic, etc.):
47
47
  * 1. Register the provider in `providers/auth/registry.ts`.
48
- * 2. Ensure its adapter honors `config.oauthHeaders` (see openai.ts/anthropic.ts/gemini.ts).
48
+ * 2. Ensure its adapter honors `config.oauthHeaders` (see openai.ts/anthropic.ts).
49
49
  *
50
50
  * Behavior per provider:
51
51
  * - OAuth tokens present (auto-refreshed) → adapter built with Bearer headers,
@@ -32,7 +32,6 @@
32
32
  import { createAnthropicAdapter } from "./anthropic.js";
33
33
  import { getOAuthProviderConfig } from "./auth/registry.js";
34
34
  import { apiBaseFor } from "./endpoints.js";
35
- import { createGeminiAdapter } from "./gemini.js";
36
35
  import { createOllamaAdapter } from "./ollama.js";
37
36
  import { createOpenAIAdapter } from "./openai.js";
38
37
  import { createOpenAICompatibleAdapter } from "./openai-compatible.js";
@@ -55,11 +54,11 @@ const ADAPTER_FACTORIES = {
55
54
  anthropic: (config) => createAnthropicAdapter(config),
56
55
  // Synchronous path: API-key only (no OAuth auto-load). Use createAdapterAsync for OAuth.
57
56
  openai: (config) => createOpenAIAdapter(config),
58
- google: (config) => createGeminiAdapter(config),
59
57
  deepseek: (config) => createOpenAICompatibleAdapter({ ...config, id: "deepseek" }),
60
- siliconflow: (config) => createOpenAICompatibleAdapter({ ...config, id: "siliconflow" }),
61
58
  xai: (config) => createOpenAICompatibleAdapter({ ...config, id: "xai", baseURL: config.baseURL ?? apiBaseFor("xai") }),
62
59
  ollama: (config) => createOllamaAdapter(config),
60
+ zai: (config) => createOpenAICompatibleAdapter({ ...config, id: "zai", baseURL: config.baseURL ?? apiBaseFor("zai") }),
61
+ "opencode-go": (config) => createOpenAICompatibleAdapter({ ...config, id: "opencode-go" }),
63
62
  };
64
63
  /**
65
64
  * Create an Adapter for the given provider.
@@ -86,7 +85,7 @@ export function createAdapter(id, config) {
86
85
  * Dispatch is registry-driven — no `if (id === "openai")` branching. To add
87
86
  * OAuth for a new provider (Anthropic, etc.):
88
87
  * 1. Register the provider in `providers/auth/registry.ts`.
89
- * 2. Ensure its adapter honors `config.oauthHeaders` (see openai.ts/anthropic.ts/gemini.ts).
88
+ * 2. Ensure its adapter honors `config.oauthHeaders` (see openai.ts/anthropic.ts).
90
89
  *
91
90
  * Behavior per provider:
92
91
  * - OAuth tokens present (auto-refreshed) → adapter built with Bearer headers,
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Generic helpers for Authorization Code + PKCE browser-redirect OAuth flows.
5
5
  * Usable for any provider that supports the standard OAuth 2.0 browser-redirect
6
- * grant (e.g. Google Gemini). Not for device-code flows (see device-flow.ts).
6
+ * grant. Not for device-code flows (see device-flow.ts).
7
7
  *
8
8
  * Re-exports generatePKCE from device-flow.ts so callers need only one import.
9
9
  */
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Generic helpers for Authorization Code + PKCE browser-redirect OAuth flows.
5
5
  * Usable for any provider that supports the standard OAuth 2.0 browser-redirect
6
- * grant (e.g. Google Gemini). Not for device-code flows (see device-flow.ts).
6
+ * grant. Not for device-code flows (see device-flow.ts).
7
7
  *
8
8
  * Re-exports generatePKCE from device-flow.ts so callers need only one import.
9
9
  */
@@ -321,7 +321,7 @@ function extractIdTokenClaim(idToken, key) {
321
321
  }
322
322
  function buildOpenAIAuthorizeUrl(opts) {
323
323
  // Build the query string by hand — generic helpers like buildAuthorizeUrl()
324
- // inject Google-specific params (access_type=offline, prompt=consent) that
324
+ // inject extra params (access_type=offline, prompt=consent) that
325
325
  // OpenAI's auth backend rejects with "Authentication Error".
326
326
  const params = new URLSearchParams({
327
327
  response_type: "code",
@@ -50,40 +50,6 @@ export async function loadOAuthRegistry() {
50
50
  catch {
51
51
  /* openai-oauth unavailable */
52
52
  }
53
- try {
54
- const { agyOAuth, loadAgyTokensWithRefresh, loadCustomOAuthTokens } = await import("./gemini-oauth.js");
55
- const { loadGcloudToken } = await import("./gcloud.js");
56
- r.google = {
57
- provider: agyOAuth,
58
- displayName: "Agy",
59
- // baseURL intentionally left undefined for the google provider.
60
- // When OAuth tokens are present, the custom fetch-based provider in
61
- // google.strategy.ts (Approach A) uses the user-specified baseURL from
62
- // settings, or falls back to generativelanguage.googleapis.com/v1beta.
63
- // The old hardcoded cloudcode-pa.googleapis.com endpoint is dead.
64
- //
65
- // Token loading chain (Approach B + C):
66
- // 1. Custom OAuth client from env vars MUONROI_GOOGLE_CLIENT_ID/SECRET
67
- // or settings providers.google.oauthClientId/oauthClientSecret
68
- // 2. gcloud ADC (~/.config/gcloud/application_default_credentials.json)
69
- // 3. Agy OAuth tokens from ~/.gemini/oauth_creds.json (legacy)
70
- loadTokensWithRefresh: async () => {
71
- // Approach C: try custom OAuth client first (user-registered GCP client)
72
- const custom = await loadCustomOAuthTokens().catch(() => null);
73
- if (custom)
74
- return custom;
75
- // Approach B: try gcloud ADC (works immediately after gcloud auth login)
76
- const gcloud = await loadGcloudToken().catch(() => null);
77
- if (gcloud)
78
- return gcloud;
79
- // Legacy fallback: Agy tokens from ~/.gemini/oauth_creds.json
80
- return loadAgyTokensWithRefresh();
81
- },
82
- };
83
- }
84
- catch {
85
- /* agy-oauth unavailable */
86
- }
87
53
  try {
88
54
  const { grokOAuth, loadGrokTokensWithRefresh } = await import("./grok-oauth.js");
89
55
  r.xai = {
@@ -71,7 +71,10 @@ export async function saveTokens(provider, tokens) {
71
71
  return;
72
72
  }
73
73
  catch {
74
- // fall through to file
74
+ // Keychain write failed (locked keyring, Credential Manager stub, etc.)
75
+ // — fall through to the 0600 file fallback below. Never console.* here:
76
+ // the TUI captures console output and OpenTUI's openConsoleOnError would
77
+ // pop an un-dismissable overlay.
75
78
  }
76
79
  }
77
80
  }
@@ -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 {
@@ -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
@@ -60,7 +60,7 @@ export declare function getConfiguredProviders(): Promise<ProviderId[]>;
60
60
  export declare function getOAuthTokens(provider: ProviderId): Promise<import("./auth/types.js").OAuthTokens | null>;
61
61
  /**
62
62
  * Find the first provider with an available API key.
63
- * Checks in priority order: anthropic, openai, google, deepseek, siliconflow, ollama.
63
+ * Checks in priority order: anthropic, openai, deepseek, ollama.
64
64
  * Returns null if no provider has a key (unlikely — ollama is keyless fallback).
65
65
  */
66
66
  export declare function firstAvailableProvider(): Promise<ProviderId | null>;
@@ -12,8 +12,6 @@ import { redactor } from "../utils/redactor.js";
12
12
  import { ALL_PROVIDER_IDS } from "./types.js";
13
13
  function normalizeKeychainProvider(p) {
14
14
  const lower = p.toLowerCase();
15
- if (lower === "agy")
16
- return "google"; // agy alias for google provider
17
15
  if (ALL_PROVIDER_IDS.includes(lower))
18
16
  return lower;
19
17
  return null;
@@ -21,29 +19,29 @@ function normalizeKeychainProvider(p) {
21
19
  const SETTINGS_KEY_MAP = {
22
20
  anthropic: "anthropic",
23
21
  openai: "openai",
24
- google: "google",
25
22
  deepseek: "deepseek",
26
- siliconflow: "siliconflow",
27
23
  xai: "xai",
24
+ zai: "zai",
25
+ "opencode-go": "opencode-go",
28
26
  };
29
27
  const KEYCHAIN_SERVICE = "muonroi-cli";
30
28
  const ACCOUNT_BY_PROVIDER = {
31
29
  anthropic: "anthropic",
32
30
  openai: "openai",
33
- google: "google",
34
31
  deepseek: "deepseek",
35
- siliconflow: "siliconflow",
36
32
  xai: "xai",
37
33
  ollama: "ollama",
34
+ zai: "zai",
35
+ "opencode-go": "opencode-go",
38
36
  };
39
37
  const ENV_BY_PROVIDER = {
40
38
  anthropic: "ANTHROPIC_API_KEY",
41
39
  openai: "OPENAI_API_KEY",
42
- google: "GOOGLE_API_KEY",
43
40
  deepseek: "DEEPSEEK_API_KEY",
44
- siliconflow: "SILICONFLOW_API_KEY",
45
41
  xai: "XAI_API_KEY",
46
42
  ollama: "OLLAMA_API_KEY",
43
+ zai: "ZAI_API_KEY",
44
+ "opencode-go": "OPENCODE_GO_API_KEY",
47
45
  };
48
46
  /**
49
47
  * Thrown when no API key can be found for a provider.
@@ -258,7 +256,7 @@ export async function getOAuthTokens(provider) {
258
256
  }
259
257
  /**
260
258
  * Find the first provider with an available API key.
261
- * Checks in priority order: anthropic, openai, google, deepseek, siliconflow, ollama.
259
+ * Checks in priority order: anthropic, openai, deepseek, ollama.
262
260
  * Returns null if no provider has a key (unlikely — ollama is keyless fallback).
263
261
  */
264
262
  export async function firstAvailableProvider() {