muonroi-cli 1.8.4 → 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 (458) 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-tee.d.ts +48 -0
  5. package/dist/packages/agent-harness-core/src/event-tee.js +77 -0
  6. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +11 -0
  7. package/dist/packages/agent-harness-core/src/mcp-server.js +87 -15
  8. package/dist/packages/agent-harness-core/src/protocol.d.ts +66 -2
  9. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  10. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  11. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  12. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  13. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  14. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  15. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  16. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  17. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  18. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  19. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  20. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  21. package/dist/src/agent-harness/mock-model.d.ts +28 -0
  22. package/dist/src/agent-harness/mock-model.js +63 -1
  23. package/dist/src/agent-harness/test-spawn.js +31 -0
  24. package/dist/src/cli/config/screen-providers.js +1 -1
  25. package/dist/src/cli/cost-forensics.d.ts +10 -0
  26. package/dist/src/cli/cost-forensics.js +18 -3
  27. package/dist/src/cli/keys-bundle.d.ts +1 -1
  28. package/dist/src/cli/keys-bundle.js +1 -1
  29. package/dist/src/cli/keys.d.ts +2 -2
  30. package/dist/src/cli/keys.js +19 -81
  31. package/dist/src/council/clarifier.d.ts +28 -2
  32. package/dist/src/council/clarifier.js +81 -15
  33. package/dist/src/council/context.js +49 -15
  34. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  35. package/dist/src/council/debate-checkpoint.js +176 -0
  36. package/dist/src/council/debate-planner.js +51 -3
  37. package/dist/src/council/debate-summary.d.ts +25 -0
  38. package/dist/src/council/debate-summary.js +85 -0
  39. package/dist/src/council/debate.d.ts +169 -2
  40. package/dist/src/council/debate.js +1210 -134
  41. package/dist/src/council/index.d.ts +85 -1
  42. package/dist/src/council/index.js +634 -196
  43. package/dist/src/council/leader.d.ts +26 -0
  44. package/dist/src/council/leader.js +150 -9
  45. package/dist/src/council/llm.d.ts +32 -0
  46. package/dist/src/council/llm.js +231 -38
  47. package/dist/src/council/panel-select.d.ts +30 -0
  48. package/dist/src/council/panel-select.js +72 -0
  49. package/dist/src/council/planner.js +23 -0
  50. package/dist/src/council/preflight.d.ts +7 -0
  51. package/dist/src/council/preflight.js +14 -2
  52. package/dist/src/council/prompts.d.ts +30 -3
  53. package/dist/src/council/prompts.js +234 -64
  54. package/dist/src/council/stance-recall.d.ts +42 -0
  55. package/dist/src/council/stance-recall.js +57 -0
  56. package/dist/src/council/strip-think.d.ts +17 -0
  57. package/dist/src/council/strip-think.js +33 -0
  58. package/dist/src/council/types.d.ts +128 -0
  59. package/dist/src/ee/artifact-cache.d.ts +16 -0
  60. package/dist/src/ee/artifact-cache.js +32 -0
  61. package/dist/src/ee/auth.d.ts +1 -0
  62. package/dist/src/ee/auth.js +15 -2
  63. package/dist/src/ee/bridge.d.ts +10 -0
  64. package/dist/src/ee/bridge.js +58 -0
  65. package/dist/src/ee/client.js +81 -18
  66. package/dist/src/ee/export-transcripts.d.ts +1 -0
  67. package/dist/src/ee/export-transcripts.js +8 -10
  68. package/dist/src/ee/extract-session.js +29 -0
  69. package/dist/src/ee/extract-style.d.ts +58 -0
  70. package/dist/src/ee/extract-style.js +270 -0
  71. package/dist/src/ee/recall-ledger.d.ts +9 -0
  72. package/dist/src/ee/recall-ledger.js +3 -0
  73. package/dist/src/ee/scope.d.ts +1 -0
  74. package/dist/src/ee/scope.js +26 -1
  75. package/dist/src/ee/search.d.ts +7 -0
  76. package/dist/src/ee/search.js +24 -0
  77. package/dist/src/ee/transcript-emit.js +2 -0
  78. package/dist/src/ee/types.d.ts +22 -0
  79. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  80. package/dist/src/ee/who-am-i-brain.js +220 -0
  81. package/dist/src/ee/who-am-i.d.ts +10 -3
  82. package/dist/src/ee/who-am-i.js +12 -0
  83. package/dist/src/ee/workflow-event.d.ts +48 -0
  84. package/dist/src/ee/workflow-event.js +81 -0
  85. package/dist/src/flow/compaction/compress.d.ts +3 -3
  86. package/dist/src/flow/compaction/compress.js +45 -8
  87. package/dist/src/flow/compaction/extract.d.ts +4 -7
  88. package/dist/src/flow/compaction/extract.js +50 -10
  89. package/dist/src/flow/compaction/index.d.ts +13 -1
  90. package/dist/src/flow/compaction/index.js +70 -3
  91. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  92. package/dist/src/flow/compaction/input-guard.js +43 -0
  93. package/dist/src/flow/fold-planning.d.ts +36 -0
  94. package/dist/src/flow/fold-planning.js +83 -0
  95. package/dist/src/flow/hierarchy.d.ts +146 -0
  96. package/dist/src/flow/hierarchy.js +427 -0
  97. package/dist/src/flow/index.d.ts +1 -0
  98. package/dist/src/flow/index.js +2 -0
  99. package/dist/src/flow/run-artifacts.d.ts +102 -0
  100. package/dist/src/flow/run-artifacts.js +208 -0
  101. package/dist/src/generated/version.d.ts +1 -1
  102. package/dist/src/generated/version.js +1 -1
  103. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  104. package/dist/src/gsd/assessment-schema.js +134 -0
  105. package/dist/src/gsd/capability-registry.d.ts +45 -0
  106. package/dist/src/gsd/capability-registry.js +337 -0
  107. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  108. package/dist/src/gsd/complexity-assessor.js +152 -0
  109. package/dist/src/gsd/config-bridge.d.ts +7 -0
  110. package/dist/src/gsd/config-bridge.js +114 -0
  111. package/dist/src/gsd/config-loader.d.ts +27 -0
  112. package/dist/src/gsd/config-loader.js +50 -0
  113. package/dist/src/gsd/council-context.d.ts +44 -0
  114. package/dist/src/gsd/council-context.js +114 -0
  115. package/dist/src/gsd/ee-closure.d.ts +28 -0
  116. package/dist/src/gsd/ee-closure.js +49 -0
  117. package/dist/src/gsd/flags.d.ts +55 -0
  118. package/dist/src/gsd/flags.js +83 -0
  119. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  120. package/dist/src/gsd/gsd-dispatch.js +131 -0
  121. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  122. package/dist/src/gsd/gsd-runtime.js +37 -0
  123. package/dist/src/gsd/host-adapter.d.ts +11 -0
  124. package/dist/src/gsd/host-adapter.js +29 -0
  125. package/dist/src/gsd/index.d.ts +24 -1
  126. package/dist/src/gsd/index.js +27 -0
  127. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  128. package/dist/src/gsd/loop-host-contract.js +39 -0
  129. package/dist/src/gsd/loop-host.d.ts +69 -0
  130. package/dist/src/gsd/loop-host.js +245 -0
  131. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  132. package/dist/src/gsd/loop-resolver.js +79 -0
  133. package/dist/src/gsd/model-tier.d.ts +13 -0
  134. package/dist/src/gsd/model-tier.js +45 -0
  135. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  136. package/dist/src/gsd/mutation-gate.js +41 -0
  137. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  138. package/dist/src/gsd/native-roadmap.js +343 -0
  139. package/dist/src/gsd/native-state.d.ts +47 -0
  140. package/dist/src/gsd/native-state.js +220 -0
  141. package/dist/src/gsd/paths.d.ts +23 -0
  142. package/dist/src/gsd/paths.js +66 -0
  143. package/dist/src/gsd/phase-dag.d.ts +12 -0
  144. package/dist/src/gsd/phase-dag.js +94 -0
  145. package/dist/src/gsd/phase-sync.d.ts +42 -0
  146. package/dist/src/gsd/phase-sync.js +321 -0
  147. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  148. package/dist/src/gsd/pil-gate-context.js +64 -0
  149. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  150. package/dist/src/gsd/pil-gate-critic.js +74 -0
  151. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  152. package/dist/src/gsd/plan-council-prompts.js +79 -0
  153. package/dist/src/gsd/plan-council.d.ts +44 -0
  154. package/dist/src/gsd/plan-council.js +251 -0
  155. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  156. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  157. package/dist/src/gsd/product-workspace.d.ts +13 -0
  158. package/dist/src/gsd/product-workspace.js +124 -0
  159. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  160. package/dist/src/gsd/ship-bridge.js +65 -0
  161. package/dist/src/gsd/state-document.d.ts +40 -0
  162. package/dist/src/gsd/state-document.js +163 -0
  163. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  164. package/dist/src/gsd/verdict-schema.js +144 -0
  165. package/dist/src/gsd/verify-context.d.ts +22 -0
  166. package/dist/src/gsd/verify-context.js +27 -0
  167. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  168. package/dist/src/gsd/verify-council-prompts.js +85 -0
  169. package/dist/src/gsd/verify-council.d.ts +25 -0
  170. package/dist/src/gsd/verify-council.js +119 -0
  171. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  172. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  173. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  174. package/dist/src/gsd/workflow-engine.js +207 -0
  175. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  176. package/dist/src/gsd/workflow-tools.js +277 -0
  177. package/dist/src/hooks/index.js +1 -1
  178. package/dist/src/index.js +44 -11
  179. package/dist/src/maintain/pr-builder.js +23 -13
  180. package/dist/src/mcp/auto-setup.js +57 -32
  181. package/dist/src/mcp/client-pool.js +1 -1
  182. package/dist/src/mcp/ee-tools.js +1 -0
  183. package/dist/src/mcp/research-onboarding.js +8 -7
  184. package/dist/src/mcp/runtime.js +34 -2
  185. package/dist/src/models/catalog-client.d.ts +87 -0
  186. package/dist/src/models/catalog-client.js +105 -38
  187. package/dist/src/models/catalog.json +528 -265
  188. package/dist/src/models/registry.d.ts +22 -7
  189. package/dist/src/models/registry.js +73 -10
  190. package/dist/src/ops/doctor.js +1 -1
  191. package/dist/src/orchestrator/auto-commit.js +1 -1
  192. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  193. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  194. package/dist/src/orchestrator/cache-prefix.js +83 -0
  195. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  196. package/dist/src/orchestrator/compact-request.js +41 -0
  197. package/dist/src/orchestrator/compaction.d.ts +10 -0
  198. package/dist/src/orchestrator/compaction.js +27 -7
  199. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  200. package/dist/src/orchestrator/council-manager.js +65 -24
  201. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  202. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  203. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  204. package/dist/src/orchestrator/error-utils.js +132 -24
  205. package/dist/src/orchestrator/grounding-check.js +39 -1
  206. package/dist/src/orchestrator/message-processor.js +242 -33
  207. package/dist/src/orchestrator/orchestrator.d.ts +39 -3
  208. package/dist/src/orchestrator/orchestrator.js +651 -102
  209. package/dist/src/orchestrator/preprocessor.js +1 -1
  210. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  211. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  212. package/dist/src/orchestrator/prompts.js +17 -17
  213. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  214. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  215. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  216. package/dist/src/orchestrator/retry-classifier.js +46 -2
  217. package/dist/src/orchestrator/safety-intercept.d.ts +45 -0
  218. package/dist/src/orchestrator/safety-intercept.js +55 -0
  219. package/dist/src/orchestrator/scope-reminder.js +1 -1
  220. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  221. package/dist/src/orchestrator/session-experience.js +2 -1
  222. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  223. package/dist/src/orchestrator/should-run-gate.js +18 -0
  224. package/dist/src/orchestrator/stall-watchdog.d.ts +24 -3
  225. package/dist/src/orchestrator/stall-watchdog.js +47 -13
  226. package/dist/src/orchestrator/stream-runner.js +62 -29
  227. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  228. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  229. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  230. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  231. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  232. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  233. package/dist/src/orchestrator/tool-engine.d.ts +22 -0
  234. package/dist/src/orchestrator/tool-engine.js +620 -56
  235. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  236. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  237. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  238. package/dist/src/orchestrator/turn-watchdog.d.ts +37 -0
  239. package/dist/src/orchestrator/turn-watchdog.js +55 -0
  240. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  241. package/dist/src/pil/agent-operating-contract.js +1 -1
  242. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  243. package/dist/src/pil/cheap-model-playbook.js +5 -1
  244. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  245. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  246. package/dist/src/pil/discovery-types.d.ts +1 -0
  247. package/dist/src/pil/discovery.js +16 -11
  248. package/dist/src/pil/layer1-intent.d.ts +18 -6
  249. package/dist/src/pil/layer1-intent.js +66 -757
  250. package/dist/src/pil/layer15-context-scan.js +15 -1
  251. package/dist/src/pil/layer3-ee-injection.js +23 -8
  252. package/dist/src/pil/layer4-gsd.js +69 -16
  253. package/dist/src/pil/layer5-context.js +7 -3
  254. package/dist/src/pil/layer6-output.d.ts +23 -0
  255. package/dist/src/pil/layer6-output.js +5 -1
  256. package/dist/src/pil/llm-classify.d.ts +33 -2
  257. package/dist/src/pil/llm-classify.js +123 -131
  258. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  259. package/dist/src/pil/native-capabilities-workbook.js +1 -0
  260. package/dist/src/pil/pipeline.js +34 -2
  261. package/dist/src/pil/response-tools.js +5 -3
  262. package/dist/src/pil/schema.d.ts +1 -0
  263. package/dist/src/pil/schema.js +2 -0
  264. package/dist/src/pil/types.d.ts +18 -0
  265. package/dist/src/playbook/directives.d.ts +4 -0
  266. package/dist/src/playbook/directives.js +17 -5
  267. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  268. package/dist/src/product-loop/backlog-builder.js +30 -6
  269. package/dist/src/product-loop/discovery-context-format.js +3 -1
  270. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  271. package/dist/src/product-loop/discovery-interview.js +32 -3
  272. package/dist/src/product-loop/discovery-schema.js +5 -1
  273. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  274. package/dist/src/product-loop/ideal-trace.js +64 -0
  275. package/dist/src/product-loop/index.d.ts +13 -1
  276. package/dist/src/product-loop/index.js +333 -52
  277. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  278. package/dist/src/product-loop/loop-driver.js +310 -99
  279. package/dist/src/product-loop/phase-plan.d.ts +5 -0
  280. package/dist/src/product-loop/phase-plan.js +39 -2
  281. package/dist/src/product-loop/phase-runner.js +9 -1
  282. package/dist/src/product-loop/sprint-runner.d.ts +111 -0
  283. package/dist/src/product-loop/sprint-runner.js +559 -16
  284. package/dist/src/product-loop/types.d.ts +36 -5
  285. package/dist/src/providers/adapter.d.ts +1 -1
  286. package/dist/src/providers/adapter.js +3 -4
  287. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  288. package/dist/src/providers/auth/browser-flow.js +1 -1
  289. package/dist/src/providers/auth/openai-oauth.js +1 -1
  290. package/dist/src/providers/auth/registry.js +0 -34
  291. package/dist/src/providers/auth/token-store.js +4 -1
  292. package/dist/src/providers/auth/types.d.ts +1 -1
  293. package/dist/src/providers/auth/types.js +1 -1
  294. package/dist/src/providers/capabilities.d.ts +24 -5
  295. package/dist/src/providers/capabilities.js +42 -24
  296. package/dist/src/providers/endpoints.d.ts +2 -2
  297. package/dist/src/providers/endpoints.js +11 -10
  298. package/dist/src/providers/keychain.d.ts +1 -1
  299. package/dist/src/providers/keychain.js +7 -9
  300. package/dist/src/providers/mcp-vision-bridge.js +56 -146
  301. package/dist/src/providers/openai-compatible.js +8 -1
  302. package/dist/src/providers/pricing.d.ts +2 -2
  303. package/dist/src/providers/pricing.js +3 -13
  304. package/dist/src/providers/runtime.d.ts +27 -2
  305. package/dist/src/providers/runtime.js +78 -15
  306. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  307. package/dist/src/providers/strategies/base.strategy.js +24 -1
  308. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  309. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  310. package/dist/src/providers/strategies/registry.js +4 -4
  311. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  312. package/dist/src/providers/strategies/thinking-mode.js +280 -1
  313. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  314. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  315. package/dist/src/providers/types.d.ts +5 -6
  316. package/dist/src/providers/types.js +2 -2
  317. package/dist/src/providers/vision-backend.d.ts +47 -0
  318. package/dist/src/providers/vision-backend.js +258 -0
  319. package/dist/src/providers/vision-proxy.d.ts +22 -9
  320. package/dist/src/providers/vision-proxy.js +63 -132
  321. package/dist/src/providers/wire-debug.js +95 -0
  322. package/dist/src/router/decide.d.ts +13 -0
  323. package/dist/src/router/decide.js +138 -36
  324. package/dist/src/router/peak-hour.d.ts +38 -0
  325. package/dist/src/router/peak-hour.js +107 -0
  326. package/dist/src/router/step-router.js +3 -2
  327. package/dist/src/router/warm.js +4 -5
  328. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  329. package/dist/src/scaffold/continuation-prompt.js +26 -0
  330. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  331. package/dist/src/scaffold/point-to-existing.js +25 -0
  332. package/dist/src/self-qa/agentic-loop.js +3 -3
  333. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  334. package/dist/src/{ui/state → state}/active-run.js +21 -0
  335. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  336. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  337. package/dist/src/state/turn-trace.d.ts +43 -0
  338. package/dist/src/state/turn-trace.js +32 -0
  339. package/dist/src/storage/db.js +2 -1
  340. package/dist/src/storage/index.d.ts +1 -1
  341. package/dist/src/storage/index.js +1 -1
  342. package/dist/src/storage/interaction-log.d.ts +1 -1
  343. package/dist/src/storage/migrations.js +71 -1
  344. package/dist/src/storage/sessions.d.ts +28 -10
  345. package/dist/src/storage/sessions.js +78 -21
  346. package/dist/src/storage/transcript-view.js +1 -1
  347. package/dist/src/storage/transcript.d.ts +51 -0
  348. package/dist/src/storage/transcript.js +284 -13
  349. package/dist/src/tools/file.d.ts +15 -0
  350. package/dist/src/tools/file.js +32 -0
  351. package/dist/src/tools/native-tools.js +5 -0
  352. package/dist/src/tools/registry.d.ts +3 -0
  353. package/dist/src/tools/registry.js +460 -22
  354. package/dist/src/tools/research.d.ts +29 -0
  355. package/dist/src/tools/research.js +233 -0
  356. package/dist/src/types/index.d.ts +118 -3
  357. package/dist/src/ui/app.js +0 -0
  358. package/dist/src/ui/cards/product-status-card.js +1 -1
  359. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  360. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  361. package/dist/src/ui/components/context-rail.d.ts +26 -0
  362. package/dist/src/ui/components/context-rail.js +33 -0
  363. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  364. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  365. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  366. package/dist/src/ui/components/council-debate-pill.js +34 -0
  367. package/dist/src/ui/components/council-info-card.js +2 -2
  368. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  369. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  370. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  371. package/dist/src/ui/components/council-message-bubble.js +16 -15
  372. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  373. package/dist/src/ui/components/council-phase-timeline.js +49 -15
  374. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  375. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  376. package/dist/src/ui/components/council-question-card.js +12 -12
  377. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  378. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  379. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  380. package/dist/src/ui/components/council-round-group.js +88 -0
  381. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  382. package/dist/src/ui/components/council-status-list.js +36 -24
  383. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  384. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  385. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  386. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  387. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  388. package/dist/src/ui/components/prompt-box.js +18 -16
  389. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  390. package/dist/src/ui/components/session-tree-card.js +46 -0
  391. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  392. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  393. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  394. package/dist/src/ui/components/task-list-panel.js +22 -2
  395. package/dist/src/ui/containers/modals-layer.d.ts +2 -1
  396. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  397. package/dist/src/ui/mcp-modal.js +2 -4
  398. package/dist/src/ui/modals/api-key-modal.js +1 -1
  399. package/dist/src/ui/modals/connect-modal.js +4 -3
  400. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  401. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  402. package/dist/src/ui/picker-providers.d.ts +1 -1
  403. package/dist/src/ui/picker-providers.js +1 -1
  404. package/dist/src/ui/primitives/index.d.ts +1 -0
  405. package/dist/src/ui/primitives/index.js +2 -0
  406. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  407. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  408. package/dist/src/ui/slash/compact.js +5 -7
  409. package/dist/src/ui/slash/cost.js +1 -1
  410. package/dist/src/ui/slash/council.js +19 -1
  411. package/dist/src/ui/slash/debug.d.ts +3 -31
  412. package/dist/src/ui/slash/debug.js +9 -20
  413. package/dist/src/ui/slash/ideal.d.ts +6 -2
  414. package/dist/src/ui/slash/ideal.js +97 -7
  415. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  416. package/dist/src/ui/slash/menu-items.js +12 -18
  417. package/dist/src/ui/slash/registry.d.ts +2 -0
  418. package/dist/src/ui/slash/registry.js +4 -0
  419. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  420. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  421. package/dist/src/ui/status-bar/index.d.ts +1 -1
  422. package/dist/src/ui/status-bar/index.js +7 -3
  423. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  424. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  425. package/dist/src/ui/theme.d.ts +1 -0
  426. package/dist/src/ui/theme.js +2 -0
  427. package/dist/src/ui/types.d.ts +7 -0
  428. package/dist/src/ui/use-app-logic.js +0 -0
  429. package/dist/src/ui/utils/format.d.ts +14 -0
  430. package/dist/src/ui/utils/format.js +23 -3
  431. package/dist/src/usage/downgrade.js +2 -2
  432. package/dist/src/usage/product-ledger.js +2 -2
  433. package/dist/src/utils/install-manager.js +2 -1
  434. package/dist/src/utils/logger.js +2 -2
  435. package/dist/src/utils/permission-mode.js +5 -3
  436. package/dist/src/utils/redactor.js +1 -1
  437. package/dist/src/utils/settings.d.ts +153 -5
  438. package/dist/src/utils/settings.js +233 -29
  439. package/dist/src/utils/visible-retry.d.ts +11 -0
  440. package/dist/src/utils/visible-retry.js +10 -1
  441. package/dist/src/verify/entrypoint.d.ts +1 -1
  442. package/dist/src/verify/entrypoint.js +1 -1
  443. package/dist/src/verify/recipes.d.ts +13 -0
  444. package/dist/src/verify/recipes.js +15 -0
  445. package/package.json +135 -132
  446. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  447. package/dist/src/providers/auth/gcloud.js +0 -102
  448. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  449. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  450. package/dist/src/providers/gemini.d.ts +0 -11
  451. package/dist/src/providers/gemini.js +0 -45
  452. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  453. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  454. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  455. package/dist/src/providers/strategies/google.strategy.js +0 -174
  456. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  457. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  458. package/dist/src/ui/containers/chat-feed.js +0 -66
@@ -1,15 +1,13 @@
1
1
  /**
2
2
  * Vision proxy layer for text-only models (e.g. DeepSeek V4).
3
3
  *
4
- * When the active model does not support vision, image parts in the message
5
- * are extracted, sent to a cheap vision model on SiliconFlow
6
- * (Qwen/Qwen2.5-VL-32B-Instruct @ $0.27/M tokens), and replaced with
7
- * structured text descriptions before the message reaches the primary model.
4
+ * Image parts in messages are sent to the catalog-configured vision backend
5
+ * (default: Z.ai glm-4.6v-flash) and replaced with native-sight observations
6
+ * so the primary model reasons as if it saw the image directly.
8
7
  */
9
8
  import { getModelInfo } from "../models/registry.js";
10
- import { apiBaseFor } from "./endpoints.js";
11
- import { loadKeyForProvider } from "./keychain.js";
12
9
  import { UI_LAYOUT_SCHEMA_HINT } from "./mcp-vision-bridge.js";
10
+ import { callVisionBackend, collectVisionUnavailableReasons, findNativeVisionFallback, formatNativeVisionObservation, formatNativeVisionUnavailable, isVisionBackendAvailable, looksLikeOcrIntent, resolveAvailableVisionChain, wrapAnalyzerInstructions, } from "./vision-backend.js";
13
11
  const DESIGN_INTENT_PATTERNS = [
14
12
  /\bredesign\b/i,
15
13
  /\bdesign\s*(system|token|spec|review)?\b/i,
@@ -26,24 +24,40 @@ function looksLikeDesignIntent(text) {
26
24
  return false;
27
25
  return DESIGN_INTENT_PATTERNS.some((re) => re.test(text));
28
26
  }
29
- const VISION_MODELS = [
30
- "Qwen/Qwen3-VL-8B-Instruct",
31
- "Qwen/Qwen3-VL-30B-A3B-Instruct",
32
- "Qwen/Qwen3-VL-32B-Instruct",
33
- ];
34
- const SILICONFLOW_BASE = apiBaseFor("siliconflow");
35
- const REQUEST_TIMEOUT_MS = 90_000;
36
- /**
37
- * Returns true when the model cannot handle image content natively.
38
- */
39
27
  export function needsVisionProxy(modelId) {
40
28
  const info = getModelInfo(modelId);
41
29
  return info?.supportsVision === false;
42
30
  }
43
31
  /**
44
- * Process messages through the vision proxy.
45
- * Only messages with image parts are modified; text-only messages pass through.
32
+ * Decide how to handle images when the active model is text-only:
33
+ * proxy backend, switch to a native vision model, or surface unavailable.
46
34
  */
35
+ export async function planImageHandlingForTextOnlyModel(opts) {
36
+ if (!needsVisionProxy(opts.primaryModelId)) {
37
+ return { strategy: "proxy" };
38
+ }
39
+ const kind = opts.kind ?? "default";
40
+ if (await isVisionBackendAvailable(kind)) {
41
+ return { strategy: "proxy" };
42
+ }
43
+ const fallback = await findNativeVisionFallback({ excludeModelId: opts.primaryModelId });
44
+ if (fallback) {
45
+ return { strategy: "native_model", fallback };
46
+ }
47
+ const reasons = await collectVisionUnavailableReasons(kind);
48
+ return {
49
+ strategy: "unavailable",
50
+ notice: formatNativeVisionUnavailable(opts.imageCount, reasons),
51
+ };
52
+ }
53
+ /** True when proxy backend or a native vision model can handle images for this text-only model. */
54
+ export async function canHandleImagesForTextOnlyModel(modelId) {
55
+ if (!needsVisionProxy(modelId))
56
+ return true;
57
+ if (await isVisionBackendAvailable())
58
+ return true;
59
+ return (await findNativeVisionFallback({ excludeModelId: modelId })) !== null;
60
+ }
47
61
  export async function proxyVision(messages, modelId, signal) {
48
62
  if (!needsVisionProxy(modelId)) {
49
63
  return { messages, proxied: false, imageCount: 0 };
@@ -66,6 +80,7 @@ export async function proxyVision(messages, modelId, signal) {
66
80
  totalImages += imageParts.length;
67
81
  const userText = textParts.map((t) => t.text).join("\n");
68
82
  const designIntent = looksLikeDesignIntent(userText);
83
+ const ocrIntent = looksLikeOcrIntent(userText);
69
84
  const svgFast = trySvgFastPath(imageParts, designIntent);
70
85
  if (svgFast) {
71
86
  processed.push({
@@ -74,27 +89,22 @@ export async function proxyVision(messages, modelId, signal) {
74
89
  });
75
90
  continue;
76
91
  }
77
- const descriptions = await describeImages(imageParts, textParts, signal, designIntent);
92
+ const kind = designIntent ? "design" : ocrIntent ? "ocr" : "default";
93
+ const descriptions = await describeImages(imageParts, textParts, signal, kind);
78
94
  const newContent = [...textParts, { type: "text", text: descriptions }];
79
95
  processed.push({ ...msg, content: newContent });
80
96
  }
81
97
  return { messages: processed, proxied: totalImages > 0, imageCount: totalImages };
82
98
  }
83
- async function describeImages(images, contextTexts, signal, designIntent = false) {
84
- let apiKey;
85
- try {
86
- apiKey = await loadKeyForProvider("siliconflow");
87
- }
88
- catch {
89
- return buildFallbackDescription(images, ["SILICONFLOW_API_KEY not configured"]);
90
- }
99
+ async function describeImages(images, contextTexts, signal, kind = "default") {
91
100
  const userContext = contextTexts.map((t) => t.text).join("\n");
101
+ const designIntent = kind === "design";
92
102
  const visionContent = [];
93
103
  visionContent.push({
94
104
  type: "text",
95
- text: designIntent
105
+ text: wrapAnalyzerInstructions(designIntent
96
106
  ? buildDesignPrompt(userContext, images.length)
97
- : buildAnalysisPrompt(userContext, images.length),
107
+ : buildAnalysisPrompt(userContext, images.length, kind === "ocr"), kind),
98
108
  });
99
109
  for (const img of images) {
100
110
  visionContent.push({
@@ -106,24 +116,12 @@ async function describeImages(images, contextTexts, signal, designIntent = false
106
116
  });
107
117
  }
108
118
  const responseFormat = designIntent ? { type: "json_object" } : undefined;
109
- const failureReasons = [];
110
- for (const model of VISION_MODELS) {
111
- try {
112
- const result = await callVisionModel(model, visionContent, apiKey, signal, responseFormat);
113
- if (result.ok)
114
- return formatVisionResult(result.text, images.length, model, designIntent);
115
- failureReasons.push(`${model}: ${result.reason}`);
116
- console.warn(`[vision-proxy] ${model} failed (${result.reason}), trying next...`);
117
- }
118
- catch (err) {
119
- if (signal?.aborted)
120
- throw err;
121
- const msg = err instanceof Error ? err.message : String(err);
122
- failureReasons.push(`${model}: ${msg}`);
123
- console.warn(`[vision-proxy] ${model} threw (${msg}), trying next...`);
124
- }
119
+ const chain = await resolveAvailableVisionChain(kind);
120
+ const result = await callVisionBackend(chain, visionContent, signal, responseFormat);
121
+ if (result.ok) {
122
+ return formatNativeVisionObservation(result.text, { imageCount: images.length });
125
123
  }
126
- return buildFallbackDescription(images, failureReasons);
124
+ return formatNativeVisionUnavailable(images.length, [result.reason]);
127
125
  }
128
126
  function trySvgFastPath(images, designIntent) {
129
127
  if (images.length === 0)
@@ -142,64 +140,23 @@ function trySvgFastPath(images, designIntent) {
142
140
  return svg.length > 32_000 ? `${svg.slice(0, 32_000)}\n<!-- truncated -->` : svg;
143
141
  })
144
142
  .join("\n\n");
145
- const header = `[Vision Proxy — ${images.length} SVG source(s) passed through (fast-path, no vision call)]`;
146
- const guidance = designIntent
147
- ? `\nThe raw SVG below IS the layout contract. Map nodes to:\n${UI_LAYOUT_SCHEMA_HINT}\n`
148
- : "\nThe raw SVG below is vector text — read element attributes (x, y, width, fill, text content) directly.\n";
149
- return `\n${header}${guidance}\n\`\`\`svg\n${decoded}\n\`\`\`\n[/Vision Proxy]\n`;
143
+ const observation = designIntent
144
+ ? `I see ${images.length} SVG source(s). The vector markup below is exact — use element attributes (x, y, width, fill, text) directly.\n\nMap to layout schema:\n${UI_LAYOUT_SCHEMA_HINT}\n\n\`\`\`svg\n${decoded}\n\`\`\``
145
+ : `I see ${images.length} SVG source(s). Vector markup (read attributes directly):\n\n\`\`\`svg\n${decoded}\n\`\`\``;
146
+ return formatNativeVisionObservation(observation, { imageCount: images.length });
150
147
  }
151
- async function callVisionModel(model, content, apiKey, signal, responseFormat) {
152
- const controller = new AbortController();
153
- let timedOut = false;
154
- const timeout = setTimeout(() => {
155
- timedOut = true;
156
- controller.abort();
157
- }, REQUEST_TIMEOUT_MS);
158
- if (signal) {
159
- signal.addEventListener("abort", () => controller.abort(), { once: true });
160
- }
161
- let res;
162
- try {
163
- res = await fetch(`${SILICONFLOW_BASE}/chat/completions`, {
164
- method: "POST",
165
- headers: {
166
- "Content-Type": "application/json",
167
- Authorization: `Bearer ${apiKey}`,
168
- },
169
- body: JSON.stringify({
170
- model,
171
- messages: [{ role: "user", content }],
172
- max_tokens: 3072,
173
- temperature: 0.1,
174
- ...(responseFormat ? { response_format: responseFormat } : {}),
175
- }),
176
- signal: controller.signal,
177
- });
178
- }
179
- catch (err) {
180
- clearTimeout(timeout);
181
- if (timedOut)
182
- return { ok: false, reason: `timeout after ${REQUEST_TIMEOUT_MS}ms` };
183
- if (signal?.aborted)
184
- throw err;
185
- return { ok: false, reason: `network error: ${err instanceof Error ? err.message : String(err)}` };
186
- }
187
- clearTimeout(timeout);
188
- if (!res.ok) {
189
- const errText = await res.text().catch(() => "unknown error");
190
- return { ok: false, reason: `HTTP ${res.status} ${errText.slice(0, 200)}` };
191
- }
192
- const data = (await res.json().catch(() => null));
193
- const text = data?.choices?.[0]?.message?.content;
194
- if (!text)
195
- return { ok: false, reason: "empty response body" };
196
- return { ok: true, text };
197
- }
198
- function buildAnalysisPrompt(userContext, imageCount) {
148
+ function buildAnalysisPrompt(userContext, imageCount, ocrFocus) {
199
149
  const plural = imageCount > 1 ? `${imageCount} images` : "the image";
150
+ const ocrBlock = ocrFocus
151
+ ? [
152
+ "OCR focus: transcribe ALL visible text exactly (preserve line breaks, labels, error codes).",
153
+ "Note any text that is blurry or partially cut off.",
154
+ "",
155
+ ]
156
+ : [];
200
157
  return [
201
- `You are a vision model. Analyze ${plural} for a software developer working in a coding CLI tool.`,
202
- "Use your full vision capability — do NOT refuse on the basis of being text-only.",
158
+ `Analyze ${plural} for a software developer working in a coding CLI.`,
159
+ ...ocrBlock,
203
160
  "Focus on:",
204
161
  "- UI layout and component structure (if screenshot)",
205
162
  "- All visible text, labels, buttons, and form elements",
@@ -212,45 +169,19 @@ function buildAnalysisPrompt(userContext, imageCount) {
212
169
  userContext ? `\nDeveloper's context: "${userContext}"` : "",
213
170
  ].join("\n");
214
171
  }
215
- function formatVisionResult(description, imageCount, model, designIntent = false) {
216
- const usedModel = model ?? VISION_MODELS[0];
217
- const tag = designIntent ? "design contract via" : "analyzed via";
218
- const single = designIntent ? "design contract via" : "analyzed via";
219
- const header = imageCount > 1
220
- ? `[Vision Proxy — ${imageCount} images ${tag} ${usedModel}]`
221
- : `[Vision Proxy — image ${single} ${usedModel}]`;
222
- return `\n${header}\n${description}\n[/Vision Proxy]\n`;
223
- }
224
172
  function buildDesignPrompt(userContext, imageCount) {
225
173
  const plural = imageCount > 1 ? `${imageCount} images` : "the image";
226
174
  return [
227
- `Analyze ${plural} as a UI/UX design contract for a software developer who CANNOT see the image.`,
228
- "Output will be consumed by another AI agent to recreate or redesign this UI, so precision matters more than prose.",
229
- "",
230
- "Return ONLY a single JSON object matching this exact shape (no markdown, no commentary, no code fences):",
175
+ `Analyze ${plural} as a UI/UX design contract for a software developer.`,
176
+ "Return ONLY a single JSON object matching this exact shape (no markdown, no commentary):",
231
177
  UI_LAYOUT_SCHEMA_HINT,
232
178
  "",
233
179
  "Extraction rules:",
234
- "- bbox: pixel coordinates relative to the visible image (origin top-left). Estimate when unsure but never omit.",
235
- "- Colors: 6-digit lowercase hex (#rrggbb). Sample dominant pixel.",
236
- "- Typography sizePx: estimate from cap-height, round to nearest 2.",
237
- "- spacingScalePx / radiusScalePx: distinct observed values, sorted ascending.",
238
- "- components[]: every visible interactive or content element. Stable IDs like 'btn_signup'.",
239
- "- children[]: component IDs nested inside this component.",
240
- "- hierarchy[]: visual reading order of headings — level 1 hero, 2 section, 3 sub.",
180
+ "- bbox: pixel coordinates relative to the visible image (origin top-left).",
181
+ "- Colors: 6-digit lowercase hex (#rrggbb).",
182
+ "- components[]: every visible interactive or content element.",
241
183
  "- text: EXACT visible string. null only when no text (icon-only).",
242
- "- notes[]: things schema cannot capture — gradients, illustrations, motion.",
243
- "",
244
- "If a field is genuinely not determinable, use null. Never invent values.",
245
184
  userContext ? `\nDeveloper's context: "${userContext}"` : "",
246
185
  ].join("\n");
247
186
  }
248
- function buildFallbackDescription(images, reasons = []) {
249
- const count = images.length;
250
- const types = [...new Set(images.map((i) => i.mediaType))].join(", ");
251
- const detail = reasons.length > 0
252
- ? `Reason(s): ${reasons.join(" | ")}`
253
- : "Reason: unknown — check SILICONFLOW_API_KEY and model availability.";
254
- return `\n[Vision Proxy — unavailable, ${count} image(s) (${types}) could not be analyzed. ${detail}]\n`;
255
- }
256
187
  //# sourceMappingURL=vision-proxy.js.map
@@ -90,6 +90,95 @@ function summarizeMessage(m) {
90
90
  }
91
91
  return { role, contentKind: "string", textChars: 0 };
92
92
  }
93
+ /**
94
+ * Reduce a request body (from AI SDK's `error.requestBodyValues`) to a
95
+ * PII-safe shape: top-level param key list + each assistant message's field
96
+ * key list. Values are NEVER persisted — only key names. This is the
97
+ * diagnostic evidence needed when a provider rejects "an invalid parameter"
98
+ * (Z.ai 1210, SiliconFlow 20015) and we must see which field was present or
99
+ * missing on each assistant turn in a multi-step tool loop.
100
+ */
101
+ function summarizeRequestBodyShape(body) {
102
+ if (!body || typeof body !== "object")
103
+ return undefined;
104
+ const b = body;
105
+ const paramKeys = Object.keys(b).sort();
106
+ const configParamValues = extractConfigParamValues(b);
107
+ const messages = b.messages;
108
+ if (!Array.isArray(messages)) {
109
+ return {
110
+ paramKeys,
111
+ assistantFieldKeys: [],
112
+ assistantCount: 0,
113
+ assistantLens: [],
114
+ totalReasoningChars: 0,
115
+ responseFormat: b.response_format ?? undefined,
116
+ configParamValues,
117
+ };
118
+ }
119
+ const assistantMsgs = messages.filter((m) => m?.role === "assistant");
120
+ // De-duplicate the field-key signature across assistant messages so a long
121
+ // history doesn't bloat the log — we only care WHICH fields co-occur.
122
+ const signatures = new Set();
123
+ const assistantLens = [];
124
+ let totalReasoningChars = 0;
125
+ for (const m of assistantMsgs) {
126
+ const msg = m;
127
+ const keys = Object.keys(msg ?? {})
128
+ .sort()
129
+ .join(",");
130
+ signatures.add(keys);
131
+ const rc = msg?.reasoning_content;
132
+ const rcLen = typeof rc === "string" ? rc.length : null;
133
+ if (rcLen !== null)
134
+ totalReasoningChars += rcLen;
135
+ const contentLen = typeof msg?.content === "string"
136
+ ? msg.content.length
137
+ : Array.isArray(msg?.content)
138
+ ? msg.content.reduce((n, p) => n + (typeof p?.text === "string" ? p.text.length : 0), 0)
139
+ : 0;
140
+ const toolCallsLen = Array.isArray(msg?.tool_calls) ? msg.tool_calls.length : 0;
141
+ assistantLens.push({ rc: rcLen, content: contentLen, toolCalls: toolCallsLen });
142
+ }
143
+ return {
144
+ paramKeys,
145
+ assistantFieldKeys: [...signatures],
146
+ assistantCount: assistantMsgs.length,
147
+ assistantLens,
148
+ totalReasoningChars,
149
+ responseFormat: b.response_format ?? undefined,
150
+ configParamValues,
151
+ };
152
+ }
153
+ /**
154
+ * Scalar SDK-config params whose VALUES are PII-safe (generation config, not
155
+ * user prompt content) and which are the likely culprits when a provider
156
+ * rejects with a generic "Invalid API parameter" (Z.ai 1210, SiliconFlow
157
+ * 20015). `messages` and `tools` are deliberately excluded — their values may
158
+ * carry prompts/PII, and counts are already captured elsewhere.
159
+ */
160
+ const CONFIG_PARAM_KEYS = [
161
+ "reasoning_effort",
162
+ "verbosity",
163
+ "tool_choice",
164
+ "response_format",
165
+ "max_tokens",
166
+ "temperature",
167
+ "top_p",
168
+ "frequency_penalty",
169
+ "presence_penalty",
170
+ "seed",
171
+ "stop",
172
+ "parallel_tool_calls",
173
+ ];
174
+ function extractConfigParamValues(body) {
175
+ const out = {};
176
+ for (const k of CONFIG_PARAM_KEYS) {
177
+ if (k in body)
178
+ out[k] = body[k] ?? null;
179
+ }
180
+ return out;
181
+ }
93
182
  export const wireDebug = {
94
183
  enabled: ENABLED,
95
184
  /** Log an outgoing streamText/streamObject call. */
@@ -129,6 +218,12 @@ export const wireDebug = {
129
218
  statusCode: typeof e?.statusCode === "number" ? e.statusCode : undefined,
130
219
  url: typeof e?.url === "string" ? e.url : undefined,
131
220
  responseBody: typeof e?.responseBody === "string" ? e.responseBody.slice(0, 4000) : undefined,
221
+ // Evidence for "Invalid API parameter" (e.g. Z.ai code 1210,
222
+ // SiliconFlow 20015): capture the SHAPE (key names only — no values,
223
+ // PII-safe) of every assistant message in the request body so we can
224
+ // see which field the provider rejected and whether reasoning_content
225
+ // was present/missing across the multi-step tool-loop history.
226
+ requestBodyShape: summarizeRequestBodyShape(e?.requestBodyValues),
132
227
  cause: e?.cause && typeof e.cause === "object"
133
228
  ? {
134
229
  message: typeof e.cause.message === "string"
@@ -14,6 +14,14 @@ export interface DecideOpts {
14
14
  signal?: AbortSignal;
15
15
  defaultModel: string;
16
16
  defaultProvider: string;
17
+ /**
18
+ * Optional session id for audit logging. When provided, a `routing`
19
+ * interaction event is emitted whenever the turn's routed model differs from
20
+ * `defaultModel` (the stored session.model) — making per-turn overrides
21
+ * observable instead of silent. Fixes the "session.model lie": a user on
22
+ * flash could not see when the router silently promoted them to pro.
23
+ */
24
+ sessionId?: string;
17
25
  /** Override home directory for ledger (testing). */
18
26
  homeOverride?: string;
19
27
  /** PIL enrichment signals — forwarded to EE context. */
@@ -27,6 +35,11 @@ export interface DecideOpts {
27
35
  projectSize?: "small" | "medium" | "large" | null;
28
36
  filesTouched?: number;
29
37
  mode?: string | null;
38
+ turnIndex?: number;
39
+ messageCount?: number;
40
+ compactionCount?: number;
41
+ totalSavedTokens?: number;
42
+ compactionSummary?: string | null;
30
43
  };
31
44
  }
32
45
  export declare function clearRouteCache(): void;