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
@@ -28,6 +28,12 @@ export function createOpenAICompatibleAdapter(config) {
28
28
  // placeholder because the SDK always emits an Authorization header from it.
29
29
  apiKey: config.apiKey ?? (config.oauthHeaders ? "oauth" : undefined),
30
30
  ...(config.oauthHeaders ? { headers: config.oauthHeaders } : {}),
31
+ transformRequestBody: (body) => {
32
+ const next = { ...body };
33
+ delete next.reasoning_effort;
34
+ delete next.verbosity;
35
+ return next;
36
+ },
31
37
  });
32
38
  return {
33
39
  id: config.id,
@@ -44,8 +50,9 @@ export function createOpenAICompatibleAdapter(config) {
44
50
  : undefined,
45
51
  });
46
52
  }
53
+ const cleanModel = config.model.startsWith("opencode/") ? config.model.slice(9) : config.model;
47
54
  const result = streamText({
48
- model: provider(config.model),
55
+ model: provider(cleanModel),
49
56
  messages: req.messages,
50
57
  tools: req.tools,
51
58
  toolChoice: req.toolChoice,
@@ -2,7 +2,7 @@
2
2
  * src/providers/pricing.ts
3
3
  *
4
4
  * Pricing lookup: catalog-first, then static fallback for providers not in catalog
5
- * (anthropic, openai, google — they're not in catalog.json).
5
+ * (anthropic, openai — they're not in catalog.json).
6
6
  * Phase 1 ships static; Phase 4 (WEB-02) adds remote fetch.
7
7
  * PROV-06 requirement.
8
8
  *
@@ -31,7 +31,7 @@ export declare const STATIC_PRICING_FALLBACK: Record<string, Record<string, Pric
31
31
  /**
32
32
  * Look up pricing for a (provider, model) pair.
33
33
  * Checks catalog first (preferred — single source of truth).
34
- * Falls back to static table for models not in catalog (anthropic, openai, google, legacy providers).
34
+ * Falls back to static table for models not in catalog (anthropic, openai, legacy providers).
35
35
  * Returns undefined if provider or model is not found in either source.
36
36
  * Ollama uses a '*' wildcard in the static table that matches any model.
37
37
  */
@@ -2,7 +2,7 @@
2
2
  * src/providers/pricing.ts
3
3
  *
4
4
  * Pricing lookup: catalog-first, then static fallback for providers not in catalog
5
- * (anthropic, openai, google — they're not in catalog.json).
5
+ * (anthropic, openai — they're not in catalog.json).
6
6
  * Phase 1 ships static; Phase 4 (WEB-02) adds remote fetch.
7
7
  * PROV-06 requirement.
8
8
  *
@@ -10,7 +10,7 @@
10
10
  * Freshness policy: re-verify every 60 days.
11
11
  */
12
12
  import { MODELS } from "../models/registry.js";
13
- // Static fallback for providers not in catalog (anthropic, openai, google).
13
+ // Static fallback for providers not in catalog (anthropic, openai).
14
14
  // verified 2026-04-29 from official provider pricing pages; cache prices
15
15
  // re-verified 2026-05-08 against deepseek-platform / openai / anthropic docs
16
16
  export const STATIC_PRICING_FALLBACK = {
@@ -51,10 +51,6 @@ export const STATIC_PRICING_FALLBACK = {
51
51
  cached_input_per_million_usd: 7.5,
52
52
  },
53
53
  },
54
- google: {
55
- "gemini-2.5-flash": { input_per_million_usd: 0.3, output_per_million_usd: 2.5 }, // ai.google.dev/pricing
56
- "gemini-pro-latest": { input_per_million_usd: 1.25, output_per_million_usd: 10.0 }, // ai.google.dev/pricing
57
- },
58
54
  deepseek: {
59
55
  // DeepSeek V4 chat: $0.27/M input miss, $0.027/M input hit, $1.10/M output
60
56
  // (api-docs.deepseek.com/quick_start/pricing). Flash/Pro split below mirrors
@@ -70,12 +66,6 @@ export const STATIC_PRICING_FALLBACK = {
70
66
  output_per_million_usd: 2.19,
71
67
  },
72
68
  },
73
- siliconflow: {
74
- "Qwen/Qwen2.5-Coder-32B-Instruct": { input_per_million_usd: 0.18, output_per_million_usd: 0.18 }, // siliconflow.com/pricing
75
- // DeepSeek models served via SiliconFlow — keep in sync with catalog.json.
76
- "deepseek-ai/DeepSeek-V4-Flash": { input_per_million_usd: 0.1, output_per_million_usd: 0.4 },
77
- "deepseek-ai/DeepSeek-V4-Pro": { input_per_million_usd: 2.0, output_per_million_usd: 8.0 },
78
- },
79
69
  ollama: {
80
70
  // local-only — zero variable cost
81
71
  "*": { input_per_million_usd: 0, output_per_million_usd: 0 },
@@ -84,7 +74,7 @@ export const STATIC_PRICING_FALLBACK = {
84
74
  /**
85
75
  * Look up pricing for a (provider, model) pair.
86
76
  * Checks catalog first (preferred — single source of truth).
87
- * Falls back to static table for models not in catalog (anthropic, openai, google, legacy providers).
77
+ * Falls back to static table for models not in catalog (anthropic, openai, legacy providers).
88
78
  * Returns undefined if provider or model is not found in either source.
89
79
  * Ollama uses a '*' wildcard in the static table that matches any model.
90
80
  */
@@ -6,6 +6,8 @@ export type ProviderFactory = ((modelId: string) => any) & {
6
6
  defaultProviderOptions?: Record<string, unknown>;
7
7
  /** AI SDK top-level call params to strip (backend doesn't accept them). */
8
8
  unsupportedParams?: ReadonlyArray<"maxOutputTokens" | "temperature" | "topP">;
9
+ /** The provider this factory talks to. Stamped by createProviderFactory. */
10
+ providerId?: ProviderId;
9
11
  };
10
12
  export interface ProviderFactoryResult {
11
13
  id: ProviderId;
@@ -19,6 +21,17 @@ export interface ResolvedModelRuntime {
19
21
  /** Top-level streamText params to omit (backend doesn't accept them). */
20
22
  unsupportedParams?: ReadonlyArray<"maxOutputTokens" | "temperature" | "topP">;
21
23
  }
24
+ /** Test seam: clear the registry between cases so entries never leak across specs. */
25
+ export declare function __resetProviderFactoryRegistry(): void;
26
+ /**
27
+ * Whether a factory for `id` was already built this session.
28
+ *
29
+ * Used by the boot warm-up to avoid CLOBBERING a factory that was built with
30
+ * session-specific options (custom baseURL, OAuth headers) with a plainer one.
31
+ */
32
+ export declare function hasProviderFactory(id: ProviderId): boolean;
33
+ /** The providers that have a factory this session. */
34
+ export declare function registeredProviderIds(): ProviderId[];
22
35
  /**
23
36
  * Phase 12.2-G4: thin dispatcher delegating to the provider strategy registry.
24
37
  * Each provider's SDK wiring + `factory.responses` + `defaultProviderOptions`
@@ -34,8 +47,6 @@ export declare function createProviderFactory(id: ProviderId, opts: {
34
47
  * For OpenAI: loads stored OAuth tokens (auto-refreshing if expiring) and injects
35
48
  * them as Authorization / ChatGPT-Account-ID headers so subscription-backed
36
49
  * ChatGPT Plus/Pro accounts work without an API key.
37
- * For Google: loads stored Agy OAuth tokens and injects Authorization header
38
- * so users can authenticate via their Google account without a GOOGLE_API_KEY.
39
50
  * Falls back to API-key path when no tokens are stored.
40
51
  * All other providers: identical to createProviderFactory.
41
52
  */
@@ -43,7 +54,20 @@ export declare function createProviderFactoryAsync(id: ProviderId, opts: {
43
54
  apiKey?: string;
44
55
  baseURL?: string;
45
56
  }): Promise<ProviderFactoryResult>;
46
- export declare function resolveModelRuntime(factory: ProviderFactory, modelId: string): ResolvedModelRuntime;
57
+ /**
58
+ * The factory for `modelId`'s OWN provider.
59
+ *
60
+ * Deriving the factory from the model is what makes a cross-wire structurally
61
+ * impossible: callers pass only a model id, so there is no second, independent
62
+ * value that can disagree with it. Previously the factory and the model id
63
+ * travelled separately and every sub-task path (compaction, classify,
64
+ * sub-agents) silently borrowed whatever factory its parent held — measured
65
+ * live 2026-07-16 (session 0c6728ba1a25): model `gpt-5.4` (openai) went out
66
+ * through an `xai` factory, and api.x.ai answered "The model gpt-5.4 does not
67
+ * exist", sending the user hunting a model-name problem that did not exist.
68
+ */
69
+ export declare function factoryForModel(modelId: string): ProviderFactory;
70
+ export declare function resolveModelRuntime(modelId: string): ResolvedModelRuntime;
47
71
  /**
48
72
  * F1: derive a stable OpenAI prompt-cache key from the session id.
49
73
  *
@@ -87,5 +111,21 @@ export declare function buildTurnProviderOptions(runtime: ResolvedModelRuntime,
87
111
  * top-level path, and cost-leak specs cannot drift apart.
88
112
  */
89
113
  export declare function shouldDropParam(runtime: ResolvedModelRuntime, param: "maxOutputTokens" | "temperature" | "topP"): boolean;
114
+ /**
115
+ * Resolve the `temperature` spread for a streamText/generateText call.
116
+ *
117
+ * Returns `{}` (omit the param) when the model does not accept temperature
118
+ * (reasoning models, OAuth `unsupportedParams`), `{ temperature: <fixed> }`
119
+ * when the catalog pins a `fixed_temperature` (e.g. Moonshot/Kimi via
120
+ * opencode-go reject any value but `1` with "invalid temperature: only 1 is
121
+ * allowed for this model"), otherwise `{ temperature: <desired> }`.
122
+ *
123
+ * Every orchestrator call site that sets a temperature MUST go through this
124
+ * helper — inlining `temperature: 0.7` is what made every Kimi tool-loop turn
125
+ * fail wholesale (mirrors `resolveTemperature` used in src/council/llm.ts).
126
+ */
127
+ export declare function resolveTemperatureParam(runtime: ResolvedModelRuntime, desired: number): {
128
+ temperature?: number;
129
+ };
90
130
  export declare function detectProviderForModel(modelId: string): ProviderId;
91
131
  export declare function requireRuntimeProvider(runtime: ResolvedModelRuntime): ProviderId;
@@ -3,6 +3,34 @@ import { getModelInfo } from "../models/registry.js";
3
3
  import { getReasoningEffortForModel } from "../utils/settings.js";
4
4
  import { getProviderCapabilities } from "./capabilities.js";
5
5
  import { getProviderStrategy } from "./strategies/registry.js";
6
+ /**
7
+ * Session-scoped registry of the most-recently-built factory per provider.
8
+ * It is the ONLY way a model reaches a factory: `factoryForModel` derives the
9
+ * factory from the model's own provider, so provider A's factory can never be
10
+ * paired with provider B's model (a real hazard in sub-task paths like
11
+ * compaction that used to inherit the parent session's factory). Boot warms an
12
+ * entry for every credentialed provider (see ./warm.ts). Single-orchestrator
13
+ * invariant (v1, see CQ-16a) makes a module-level map safe. Last-built wins, so
14
+ * a /model key change that rebuilds a provider's factory refreshes the entry.
15
+ */
16
+ const providerFactoryRegistry = new Map();
17
+ /** Test seam: clear the registry between cases so entries never leak across specs. */
18
+ export function __resetProviderFactoryRegistry() {
19
+ providerFactoryRegistry.clear();
20
+ }
21
+ /**
22
+ * Whether a factory for `id` was already built this session.
23
+ *
24
+ * Used by the boot warm-up to avoid CLOBBERING a factory that was built with
25
+ * session-specific options (custom baseURL, OAuth headers) with a plainer one.
26
+ */
27
+ export function hasProviderFactory(id) {
28
+ return providerFactoryRegistry.has(id);
29
+ }
30
+ /** The providers that have a factory this session. */
31
+ export function registeredProviderIds() {
32
+ return [...providerFactoryRegistry.keys()];
33
+ }
6
34
  /**
7
35
  * Phase 12.2-G4: thin dispatcher delegating to the provider strategy registry.
8
36
  * Each provider's SDK wiring + `factory.responses` + `defaultProviderOptions`
@@ -10,15 +38,16 @@ import { getProviderStrategy } from "./strategies/registry.js";
10
38
  */
11
39
  export function createProviderFactory(id, opts) {
12
40
  const strategy = getProviderStrategy(id);
13
- return { id, factory: strategy.createFactory(opts) };
41
+ const factory = strategy.createFactory(opts);
42
+ factory.providerId = id;
43
+ providerFactoryRegistry.set(id, factory);
44
+ return { id, factory };
14
45
  }
15
46
  /**
16
47
  * Async variant of createProviderFactory.
17
48
  * For OpenAI: loads stored OAuth tokens (auto-refreshing if expiring) and injects
18
49
  * them as Authorization / ChatGPT-Account-ID headers so subscription-backed
19
50
  * ChatGPT Plus/Pro accounts work without an API key.
20
- * For Google: loads stored Agy OAuth tokens and injects Authorization header
21
- * so users can authenticate via their Google account without a GOOGLE_API_KEY.
22
51
  * Falls back to API-key path when no tokens are stored.
23
52
  * All other providers: identical to createProviderFactory.
24
53
  */
@@ -38,13 +67,12 @@ export async function createProviderFactoryAsync(id, opts) {
38
67
  // override the OAuth backend and produce a 401 "Missing scopes:
39
68
  // api.responses.write" when the subscription token hits the platform
40
69
  // API. Fall back to opts.baseURL only when the OAuth provider declares
41
- // no dedicated backend (cfg.baseURL undefined, e.g. some Gemini flows).
70
+ // no dedicated backend (cfg.baseURL undefined).
42
71
  //
43
72
  // However, a user-specified baseURL in settings (e.g. switching to a
44
73
  // different backend after an OAuth provider is killed) MUST override
45
- // the hardcoded OAuth default. This lets users migrate from the old
46
- // cloudcode-pa.googleapis.com endpoint to a new proxy/backend without
47
- // modifying source.
74
+ // the hardcoded OAuth default. This lets users migrate to a new
75
+ // proxy/backend without modifying source.
48
76
  const { loadUserSettings } = await import("../utils/settings.js");
49
77
  const userSettings = loadUserSettings();
50
78
  const userBaseURL = userSettings?.providers?.[id]?.baseURL;
@@ -66,10 +94,34 @@ export async function createProviderFactoryAsync(id, opts) {
66
94
  }
67
95
  return createProviderFactory(id, opts);
68
96
  }
69
- export function resolveModelRuntime(factory, modelId) {
97
+ /**
98
+ * The factory for `modelId`'s OWN provider.
99
+ *
100
+ * Deriving the factory from the model is what makes a cross-wire structurally
101
+ * impossible: callers pass only a model id, so there is no second, independent
102
+ * value that can disagree with it. Previously the factory and the model id
103
+ * travelled separately and every sub-task path (compaction, classify,
104
+ * sub-agents) silently borrowed whatever factory its parent held — measured
105
+ * live 2026-07-16 (session 0c6728ba1a25): model `gpt-5.4` (openai) went out
106
+ * through an `xai` factory, and api.x.ai answered "The model gpt-5.4 does not
107
+ * exist", sending the user hunting a model-name problem that did not exist.
108
+ */
109
+ export function factoryForModel(modelId) {
110
+ const providerId = getModelInfo(modelId)?.provider;
111
+ if (!providerId) {
112
+ throw new Error(`Model "${modelId}" not found in catalog — cannot determine provider.`);
113
+ }
114
+ const factory = providerFactoryRegistry.get(providerId);
115
+ if (!factory) {
116
+ throw new Error(`No provider factory for "${providerId}" (model "${modelId}") — that provider is not authenticated this session. ` +
117
+ `Run /login for it, or pick a model from an authenticated provider.`);
118
+ }
119
+ return factory;
120
+ }
121
+ export function resolveModelRuntime(modelId) {
70
122
  // Resolve aliases (e.g. "deepseek-v4-flash") to the provider-native id
71
- // (e.g. "deepseek-ai/DeepSeek-V4-Flash") BEFORE invoking the factory.
72
- // Without this, SiliconFlow / DeepSeek / xAI reject the request because
123
+ // (e.g. "deepseek-v4-flash") BEFORE invoking the factory.
124
+ // Without this, DeepSeek / xAI reject the request because
73
125
  // the alias is not a valid model id on their API.
74
126
  const mockGlobals = globalThis;
75
127
  const modelInfo = getModelInfo(modelId);
@@ -105,6 +157,7 @@ export function resolveModelRuntime(factory, modelId) {
105
157
  providerLevelDefaults = mockGlobals.__muonroiMockDefaultProviderOptions;
106
158
  }
107
159
  else {
160
+ const factory = factoryForModel(canonicalId);
108
161
  const strategy = getProviderStrategy(providerId);
109
162
  resolved = strategy.resolve({
110
163
  factory,
@@ -229,6 +282,27 @@ export function shouldDropParam(runtime, param) {
229
282
  }
230
283
  return runtime.unsupportedParams?.includes(param) ?? false;
231
284
  }
285
+ /**
286
+ * Resolve the `temperature` spread for a streamText/generateText call.
287
+ *
288
+ * Returns `{}` (omit the param) when the model does not accept temperature
289
+ * (reasoning models, OAuth `unsupportedParams`), `{ temperature: <fixed> }`
290
+ * when the catalog pins a `fixed_temperature` (e.g. Moonshot/Kimi via
291
+ * opencode-go reject any value but `1` with "invalid temperature: only 1 is
292
+ * allowed for this model"), otherwise `{ temperature: <desired> }`.
293
+ *
294
+ * Every orchestrator call site that sets a temperature MUST go through this
295
+ * helper — inlining `temperature: 0.7` is what made every Kimi tool-loop turn
296
+ * fail wholesale (mirrors `resolveTemperature` used in src/council/llm.ts).
297
+ */
298
+ export function resolveTemperatureParam(runtime, desired) {
299
+ if (shouldDropParam(runtime, "temperature"))
300
+ return {};
301
+ const fixed = runtime.modelInfo?.fixedTemperature;
302
+ if (typeof fixed === "number")
303
+ return { temperature: fixed };
304
+ return { temperature: desired };
305
+ }
232
306
  export function detectProviderForModel(modelId) {
233
307
  const info = getModelInfo(modelId);
234
308
  if (info?.provider) {
@@ -240,12 +314,12 @@ export function detectProviderForModel(modelId) {
240
314
  return "deepseek";
241
315
  if (id.startsWith("gpt-") || id.startsWith("o1") || id.startsWith("o3") || id.startsWith("o4"))
242
316
  return "openai";
243
- if (id.startsWith("gemini") || id.startsWith("models/gemini"))
244
- return "google";
245
317
  if (id.startsWith("grok"))
246
318
  return "xai";
247
- if (id.includes("qwen") || id.includes("glm") || id.includes("internlm"))
248
- return "siliconflow";
319
+ if (id.includes("glm") || id.startsWith("z-ai") || id.startsWith("zai"))
320
+ return "zai";
321
+ if (id.startsWith("opencode"))
322
+ return "opencode-go";
249
323
  if (id.startsWith("llama") || id.startsWith("mistral") || id.startsWith("phi-"))
250
324
  return "ollama";
251
325
  if (id.startsWith("claude"))
@@ -17,6 +17,22 @@ import type { ModelInfo } from "../../types/index.js";
17
17
  import type { ProviderCapabilities } from "../capabilities.js";
18
18
  import type { ProviderFactory, ResolvedModelRuntime } from "../runtime.js";
19
19
  import type { ProviderId } from "../types.js";
20
+ /**
21
+ * Catalog ids for models reached through the OpenCode Go (Console Go) gateway
22
+ * carry an `opencode/` routing prefix (e.g. `opencode/deepseek-v4-flash`). That
23
+ * prefix is a *routing* marker, not part of the wire model name any upstream
24
+ * accepts — the gateway itself strips it before forwarding (see
25
+ * OpenCodeGoStrategy.createFactory). When a task sub-model resolved from that
26
+ * catalog id is run through a DIFFERENT provider's factory (e.g. the compaction
27
+ * proposer reusing the parent's native DeepSeek factory), the raw prefixed id
28
+ * would otherwise be POSTed to api.deepseek.com and rejected with HTTP 400
29
+ * "The supported API model names are deepseek-v4-pro or deepseek-v4-flash, but
30
+ * you passed opencode/deepseek-v4-flash". Stripping here — the single chokepoint
31
+ * every provider's resolve() flows through — makes the wire name always native.
32
+ * The returned `modelId` keeps the catalog id so usage/pricing attribution is
33
+ * unchanged; only the id handed to factory() is normalized.
34
+ */
35
+ export declare function toWireModelId(modelId: string): string;
20
36
  export interface CreateFactoryOpts {
21
37
  apiKey?: string;
22
38
  baseURL?: string;
@@ -13,6 +13,24 @@
13
13
  * 3. Register the singleton in `strategies/registry.ts`.
14
14
  * 4. Add the ProviderId to `src/providers/types.ts` if not already present.
15
15
  */
16
+ /**
17
+ * Catalog ids for models reached through the OpenCode Go (Console Go) gateway
18
+ * carry an `opencode/` routing prefix (e.g. `opencode/deepseek-v4-flash`). That
19
+ * prefix is a *routing* marker, not part of the wire model name any upstream
20
+ * accepts — the gateway itself strips it before forwarding (see
21
+ * OpenCodeGoStrategy.createFactory). When a task sub-model resolved from that
22
+ * catalog id is run through a DIFFERENT provider's factory (e.g. the compaction
23
+ * proposer reusing the parent's native DeepSeek factory), the raw prefixed id
24
+ * would otherwise be POSTed to api.deepseek.com and rejected with HTTP 400
25
+ * "The supported API model names are deepseek-v4-pro or deepseek-v4-flash, but
26
+ * you passed opencode/deepseek-v4-flash". Stripping here — the single chokepoint
27
+ * every provider's resolve() flows through — makes the wire name always native.
28
+ * The returned `modelId` keeps the catalog id so usage/pricing attribution is
29
+ * unchanged; only the id handed to factory() is normalized.
30
+ */
31
+ export function toWireModelId(modelId) {
32
+ return modelId.startsWith("opencode/") ? modelId.slice("opencode/".length) : modelId;
33
+ }
16
34
  /**
17
35
  * Shared base — most providers want the same `resolve` body. Subclasses
18
36
  * override only when truly different.
@@ -21,7 +39,12 @@ export class BaseProviderStrategy {
21
39
  resolve(opts) {
22
40
  const { factory, modelId, modelInfo, reasoningEffort } = opts;
23
41
  const useResponsesApi = this.capabilities.usesResponsesAPI(modelInfo);
24
- const model = useResponsesApi && factory.responses ? factory.responses(modelId) : factory(modelId);
42
+ // Normalize the wire model name (strip the `opencode/` routing prefix) so a
43
+ // native provider factory never receives a gateway-routed id. See
44
+ // toWireModelId above. `modelId` (catalog id) is still returned below for
45
+ // attribution — only the id passed to factory() is normalized.
46
+ const wireModelId = toWireModelId(modelId);
47
+ const model = useResponsesApi && factory.responses ? factory.responses(wireModelId) : factory(wireModelId);
25
48
  const providerOptions = this.capabilities.buildProviderOptions({
26
49
  model: modelInfo,
27
50
  reasoningEffort,
@@ -1,13 +1,13 @@
1
1
  /**
2
- * src/providers/strategies/siliconflow.strategy.ts
2
+ * src/providers/strategies/opencode-go.strategy.ts
3
3
  *
4
- * Phase 12.2-G4 — SiliconFlow strategy via `@ai-sdk/openai-compatible`.
4
+ * OpenCode Go strategy via `@ai-sdk/openai-compatible`.
5
5
  */
6
6
  import { type ProviderCapabilities } from "../capabilities.js";
7
7
  import type { ProviderFactory } from "../runtime.js";
8
8
  import type { ProviderId } from "../types.js";
9
9
  import { BaseProviderStrategy, type CreateFactoryOpts } from "./base.strategy.js";
10
- export declare class SiliconflowStrategy extends BaseProviderStrategy {
10
+ export declare class OpenCodeGoStrategy extends BaseProviderStrategy {
11
11
  readonly id: ProviderId;
12
12
  readonly capabilities: ProviderCapabilities;
13
13
  createFactory(opts: CreateFactoryOpts): ProviderFactory;
@@ -0,0 +1,83 @@
1
+ /**
2
+ * src/providers/strategies/opencode-go.strategy.ts
3
+ *
4
+ * OpenCode Go strategy via `@ai-sdk/openai-compatible`.
5
+ */
6
+ import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
7
+ import { getProviderCapabilities } from "../capabilities.js";
8
+ import { OPENAI_COMPATIBLE_BASE_URLS } from "../endpoints.js";
9
+ import { BaseProviderStrategy } from "./base.strategy.js";
10
+ import { backfillReasoningContent, sanitizeToolCallArguments, splitParallelToolCalls, transformThinkingModeBody, transformZaiThinkingBody, } from "./thinking-mode.js";
11
+ export class OpenCodeGoStrategy extends BaseProviderStrategy {
12
+ id = "opencode-go";
13
+ capabilities = getProviderCapabilities("opencode-go");
14
+ createFactory(opts) {
15
+ const p = createOpenAICompatible({
16
+ name: this.id,
17
+ baseURL: opts.baseURL ?? OPENAI_COMPATIBLE_BASE_URLS["opencode-go"],
18
+ apiKey: opts.apiKey ?? (opts.headers ? "oauth" : undefined),
19
+ ...(opts.headers ? { headers: opts.headers } : {}),
20
+ // DeepSeek models (common via opencode-go) do not support full json_schema,
21
+ // only json_object. Prevent AI SDK from sending unsupported schema.
22
+ supportsStructuredOutputs: false,
23
+ // Apply thinking-mode transform for deepseek models routed via opencode-go (e.g. deepseek-v4-flash).
24
+ // The opencode Console Go backend forwards to DeepSeek, which requires reasoning_content
25
+ // roundtrips (like direct DeepSeek). Without it, histories with tool calls produce
26
+ // "Upstream request failed" / invalid_request_error (observed in session 53f3c3ea4ae8).
27
+ // Inspect body.model (after possible prefix) to apply only when appropriate.
28
+ transformRequestBody: (body) => {
29
+ const modelInBody = body?.model || "";
30
+ const isDeepseekModel = modelInBody.includes("deepseek") || modelInBody.includes("v4-flash");
31
+ const isGlmModel = modelInBody.includes("glm");
32
+ let out = body;
33
+ if (isDeepseekModel) {
34
+ out = transformThinkingModeBody(body);
35
+ }
36
+ else if (isGlmModel) {
37
+ // For GLM models via opencode-go, use zai-style sanitization (reasoning backfill + tool shape).
38
+ out = transformZaiThinkingBody(body);
39
+ }
40
+ else {
41
+ // Other reasoning-capable models via Console Go (e.g. kimi-k2.7-code).
42
+ // Verified 2026-07-02 (session 53f3c3ea4ae8): kimi histories arrive
43
+ // MIXED — some assistant turns carry reasoning_content, some do not —
44
+ // and Console Go rejects the request (400 "Upstream request failed").
45
+ // Apply the same mixed-history reasoning backfill Z.ai uses.
46
+ out = { ...body };
47
+ if (Array.isArray(out.messages)) {
48
+ out.messages = backfillReasoningContent(out.messages, { onlyIfMixed: true });
49
+ }
50
+ }
51
+ // H3 REAL FIX — Console Go's upstream (kimi / deepseek / glm) rejects a
52
+ // follow-up whose history has an assistant turn with a batch of parallel
53
+ // tool_calls (observed 5/6 for kimi, up to 17 for glm). parallel_tool_calls
54
+ // below is ignored by the model, so split any multi-tool-call assistant
55
+ // turn into sequential single-call turns. No-op unless the failing
56
+ // pattern is present, so successful requests are untouched.
57
+ if (Array.isArray(out.messages)) {
58
+ out.messages = splitParallelToolCalls(out.messages);
59
+ // Repair empty/truncated tool_call arguments ("unexpected end of JSON
60
+ // input" 1210 sub-cause) before they reach the Console Go upstream.
61
+ out.messages = sanitizeToolCallArguments(out.messages);
62
+ }
63
+ // Additional sanitization for opencode-go (proxy can be sensitive):
64
+ // Force no parallel to avoid large tool result batches causing upstream failures.
65
+ // Drop null response_format.
66
+ out.parallel_tool_calls = false;
67
+ if ("response_format" in out) {
68
+ const rf = out.response_format;
69
+ if (rf == null || (typeof rf === "object" && Object.keys(rf).length === 0)) {
70
+ delete out.response_format;
71
+ }
72
+ }
73
+ return out;
74
+ },
75
+ });
76
+ return (modelId) => {
77
+ // Strip 'opencode/' prefix if present
78
+ const cleanId = modelId.startsWith("opencode/") ? modelId.slice(9) : modelId;
79
+ return p(cleanId);
80
+ };
81
+ }
82
+ }
83
+ //# sourceMappingURL=opencode-go.strategy.js.map
@@ -6,19 +6,19 @@
6
6
  */
7
7
  import { AnthropicStrategy } from "./anthropic.strategy.js";
8
8
  import { DeepSeekStrategy } from "./deepseek.strategy.js";
9
- import { GoogleStrategy } from "./google.strategy.js";
10
9
  import { OllamaStrategy } from "./ollama.strategy.js";
11
10
  import { OpenAIStrategy } from "./openai.strategy.js";
12
- import { SiliconflowStrategy } from "./siliconflow.strategy.js";
11
+ import { OpenCodeGoStrategy } from "./opencode-go.strategy.js";
13
12
  import { XAIStrategy } from "./xai.strategy.js";
13
+ import { ZaiStrategy } from "./zai.strategy.js";
14
14
  const STRATEGIES = {
15
15
  anthropic: new AnthropicStrategy(),
16
16
  openai: new OpenAIStrategy(),
17
- google: new GoogleStrategy(),
18
17
  deepseek: new DeepSeekStrategy(),
19
- siliconflow: new SiliconflowStrategy(),
20
18
  xai: new XAIStrategy(),
21
19
  ollama: new OllamaStrategy(),
20
+ zai: new ZaiStrategy(),
21
+ "opencode-go": new OpenCodeGoStrategy(),
22
22
  };
23
23
  /**
24
24
  * Returns the strategy singleton for a given provider id. Throws on unknown
@@ -28,8 +28,117 @@
28
28
  * https://api-docs.deepseek.com/guides/thinking_mode
29
29
  */
30
30
  export declare function shouldDisableThinking(): boolean;
31
+ interface WireMessage {
32
+ role?: unknown;
33
+ content?: unknown;
34
+ reasoning_content?: unknown;
35
+ tool_calls?: unknown;
36
+ [k: string]: unknown;
37
+ }
38
+ /**
39
+ * Backfill `reasoning_content: ""` onto any assistant message that lacks a
40
+ * (non-empty/present) one, so SiliconFlow's thinking-mode validator never
41
+ * sees a reasoning-less assistant turn. Assistant turns that already carry a
42
+ * real `reasoning_content` are left untouched.
43
+ *
44
+ * `opts.onlyIfMixed` (used by Z.ai): skip the backfill entirely when NO
45
+ * assistant message in the history carries a `reasoning_content` field. This
46
+ * guards non-thinking models (glm-4.5-air, glm-4.6v-flash) from having an
47
+ * unknown `reasoning_content` field injected — which would itself trigger
48
+ * Z.ai's 1210. Once any one assistant turn carries reasoning (i.e. the
49
+ * conversation is in thinking mode — confirmed by the model's own emission),
50
+ * the backfill brings every other assistant turn up to the same shape.
51
+ */
52
+ export declare function backfillReasoningContent(messages: WireMessage[], opts?: {
53
+ onlyIfMixed?: boolean;
54
+ }): WireMessage[];
55
+ /**
56
+ * Split assistant messages that carry MORE THAN ONE `tool_calls` entry into a
57
+ * sequence of single-tool-call assistant turns, each immediately followed by
58
+ * its matching `role:"tool"` result. Identity (returns the same array by
59
+ * reference) when no assistant message has >1 tool_calls.
60
+ *
61
+ * WHY (verified from live sessions c0dcf9153803 / c1f5ca294496 and the
62
+ * llm-wire.log forensics on 2026-07-02): both the Z.ai GLM coding endpoint
63
+ * (HTTP 400 / code 1210 "Invalid API parameter") and the opencode Console Go
64
+ * proxy (HTTP 400 invalid_request_error "Upstream request failed") REJECT a
65
+ * follow-up request whose history contains an assistant turn that emitted a
66
+ * large batch of parallel tool_calls (observed 5, 6, 8, 12, and 17 in a single
67
+ * assistant message). Forcing `parallel_tool_calls:false` does NOT prevent
68
+ * this — the model ignores the flag and still emits batches, and the flag has
69
+ * no effect on assistant turns already in the history. The only reliable fix
70
+ * is to reshape the echoed-back history so no single assistant turn presents
71
+ * more than one tool_call.
72
+ *
73
+ * Safety: because this is a no-op unless an assistant turn has >1 tool_calls,
74
+ * it can only ever alter requests that match the known-failing pattern —
75
+ * requests that already succeed (≤1 tool_call per turn) are returned
76
+ * untouched.
77
+ *
78
+ * `reasoning_content` (when present) is kept on the FIRST split turn only and
79
+ * blanked to "" on the rest, so a single reasoning segment is not duplicated
80
+ * across the synthesized turns. Assistant `content` is likewise kept on the
81
+ * first and blanked on the rest.
82
+ */
83
+ export declare function splitParallelToolCalls(messages: WireMessage[]): WireMessage[];
31
84
  /**
32
85
  * The shared `transformRequestBody` for deepseek + siliconflow. Runs on the
33
86
  * fully-serialized wire body right before fetch.
34
87
  */
35
88
  export declare function transformThinkingModeBody<T extends Record<string, unknown>>(body: T): T;
89
+ /**
90
+ * Should the Z.ai thinking-disable escape hatch fire? Off by default — Z.ai
91
+ * GLM coding-plan endpoints (`api.z.ai/api/coding/paas/v4`) auto-enable
92
+ * thinking for reasoning-capable models (glm-4.7, glm-5.x), and we want the
93
+ * reasoning_content round-trip to succeed. Set `MUONROI_ZAI_DISABLE_THINKING=1`
94
+ * to mirror DeepSeek's fallback B (disable thinking entirely).
95
+ */
96
+ export declare function shouldDisableZaiThinking(): boolean;
97
+ /** True once a provider param-reject has flipped the session into degraded mode. */
98
+ export declare function isProviderThinkingDegraded(): boolean;
99
+ /** Latch degraded mode on (idempotent). Called by the retry classifier. */
100
+ export declare function markProviderThinkingDegrade(): void;
101
+ /** Test-only reset so the module latch doesn't leak across cases. */
102
+ export declare function _resetProviderThinkingDegrade(): void;
103
+ /**
104
+ * Ensure every assistant `tool_calls[].function.arguments` is a valid JSON
105
+ * STRING. GLM's coding endpoint returns a generic 1210 with the underlying
106
+ * detail "error parsing parameters: unexpected end of JSON input" when an
107
+ * assistant turn echoes back a tool call whose `arguments` is empty, missing,
108
+ * or truncated (verified failure mode reported by crush #1237 and opencode
109
+ * users — a big parallel-tool-call batch clamped by max_tokens truncates the
110
+ * last call's arguments mid-string). Repairs are conservative: a value that
111
+ * already parses as JSON is left untouched; only empty/missing/unparseable
112
+ * arguments are replaced with `"{}"`, and a stray object is re-stringified.
113
+ * No-op (returns input by reference) when nothing needs repair.
114
+ */
115
+ export declare function sanitizeToolCallArguments(messages: WireMessage[]): WireMessage[];
116
+ /**
117
+ * Z.ai's `transformRequestBody`. Mirrors `transformThinkingModeBody` but with
118
+ * one critical difference: the reasoning_content backfill is GATED on
119
+ * `onlyIfMixed` — it only fires once at least one assistant message in the
120
+ * history already carries reasoning_content. This protects non-thinking Z.ai
121
+ * models (glm-4.5-air, glm-4.6v-flash) which would otherwise reject the
122
+ * injected field with HTTP 400 / code 1210.
123
+ *
124
+ * Verified failure: session c0dcf9153803 — GLM-4.7 on the Z.ai coding
125
+ * endpoint. First 4 assistant turns succeeded; on the 5th streamText call
126
+ * (after 6 tool rounds, where intermediate assistant steps carried tool_calls
127
+ * WITHOUT reasoning), Z.ai rejected the whole request with code 1210
128
+ * "Invalid API parameter". Same class of bug as SiliconFlow 20015 (see
129
+ * `transformThinkingModeBody` above), but Z.ai also hosts non-thinking models
130
+ * on the same strategy, so the backfill must stay conditional.
131
+ *
132
+ * H3 mitigation (added after c7c4a6487847 + 94827f75a69e + c94360bac00f + c1f5ca294496):
133
+ * GLM coding endpoint rejects the request (often as generic 1210) when the
134
+ * history contains assistant turns with multiple tool_calls (even after forcing
135
+ * parallel_tool_calls:false — model still emitted batches of 2-5). The reject
136
+ * frequently manifests as stall timeout because the provider stops emitting
137
+ * chunks. We do extra sanitization here:
138
+ * - force parallel_tool_calls:false
139
+ * - drop response_format when null/empty (combo with tools is fragile)
140
+ * - clamp max_tokens > 4096 down to 4096 (higher values seen in 1210s)
141
+ * Trade-off: more sequential tool use + slightly lower token budget.
142
+ */
143
+ export declare function transformZaiThinkingBody<T extends Record<string, unknown>>(body: T): T;
144
+ export {};