@jsonstudio/llms 0.6.2172 → 0.6.3214

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 (524) hide show
  1. package/README.md +2 -0
  2. package/dist/conversion/args-mapping.js +8 -0
  3. package/dist/conversion/bridge-actions.js +367 -0
  4. package/dist/conversion/bridge-id-utils.js +13 -0
  5. package/dist/conversion/{shared/bridge-instructions.js → bridge-instructions.js} +2 -1
  6. package/dist/conversion/{shared/bridge-message-utils.d.ts → bridge-message-utils.d.ts} +1 -1
  7. package/dist/conversion/{shared/bridge-message-utils.js → bridge-message-utils.js} +5 -150
  8. package/dist/conversion/{shared/bridge-metadata.d.ts → bridge-metadata.d.ts} +1 -0
  9. package/dist/conversion/bridge-metadata.js +5 -0
  10. package/dist/conversion/bridge-policies.js +11 -0
  11. package/dist/conversion/codecs/gemini-openai-codec.js +27 -8
  12. package/dist/conversion/codecs/responses-openai-codec.js +1 -1
  13. package/dist/conversion/{shared/compaction-detect.d.ts → compaction-detect.d.ts} +1 -1
  14. package/dist/conversion/compaction-detect.js +4 -0
  15. package/dist/conversion/compat/actions/apply-patch-fixer.js +2 -2
  16. package/dist/conversion/compat/actions/deepseek-web-response.d.ts +0 -1
  17. package/dist/conversion/compat/actions/deepseek-web-response.js +15 -405
  18. package/dist/conversion/compat/actions/harvest-tool-calls-from-text.js +1 -1
  19. package/dist/conversion/compat/actions/lmstudio-responses-fc-ids.js +1 -1
  20. package/dist/conversion/compat/actions/qwen-transform.js +74 -2
  21. package/dist/conversion/compat/actions/snapshot.js +1 -1
  22. package/dist/conversion/compat/antigravity-session-signature.js +71 -1
  23. package/dist/conversion/compat/profiles/chat-deepseek-web.json +0 -22
  24. package/dist/conversion/compat/profiles/chat-gemini-cli.json +0 -7
  25. package/dist/conversion/compat/profiles/chat-gemini.json +0 -6
  26. package/dist/conversion/compat/profiles/chat-glm.json +251 -72
  27. package/dist/conversion/compat/profiles/chat-iflow.json +174 -39
  28. package/dist/conversion/compat/profiles/chat-lmstudio.json +43 -14
  29. package/dist/conversion/hub/core/detour-registry.d.ts +2 -0
  30. package/dist/conversion/hub/core/hub-context.d.ts +3 -1
  31. package/dist/conversion/hub/core/index.d.ts +1 -0
  32. package/dist/conversion/hub/core/stage-driver.js +2 -0
  33. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.js +15 -4
  34. package/dist/conversion/hub/format-adapters/chat-format-adapter.js +15 -4
  35. package/dist/conversion/hub/format-adapters/gemini-format-adapter.js +15 -4
  36. package/dist/conversion/hub/format-adapters/responses-format-adapter.js +15 -4
  37. package/dist/conversion/hub/hub-feature.js +3 -2
  38. package/dist/conversion/hub/node-support.js +9 -4
  39. package/dist/conversion/hub/operation-table/operation-table-runner.js +12 -8
  40. package/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper.js +3 -3
  41. package/dist/conversion/hub/operation-table/semantic-mappers/chat-mapper.js +16 -13
  42. package/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapper.js +6 -10
  43. package/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper.js +21 -73
  44. package/dist/conversion/hub/ops/operations.js +2 -121
  45. package/dist/conversion/hub/pipeline/compat/compat-engine.js +6 -0
  46. package/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.d.ts +1 -1
  47. package/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.js +33 -1042
  48. package/dist/conversion/hub/pipeline/compat/compat-profile-resolver.js +2 -0
  49. package/dist/conversion/hub/pipeline/compat/compat-profile-store.js +2 -0
  50. package/dist/conversion/hub/pipeline/compat/compat-types.d.ts +14 -17
  51. package/dist/conversion/hub/pipeline/compat/native-adapter-context.d.ts +3 -0
  52. package/dist/conversion/hub/pipeline/compat/native-adapter-context.js +39 -0
  53. package/dist/conversion/hub/pipeline/hub-pipeline.d.ts +1 -0
  54. package/dist/conversion/hub/pipeline/hub-pipeline.js +165 -265
  55. package/dist/conversion/hub/pipeline/session-identifiers.js +6 -196
  56. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage1_format_parse/index.d.ts +1 -2
  57. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage1_format_parse/index.js +37 -1
  58. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/index.d.ts +1 -1
  59. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/index.js +69 -81
  60. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/semantic-lift.d.ts +14 -0
  61. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/semantic-lift.js +24 -0
  62. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/archive/shell-like-tool-call-normalization-fallback.d.ts +2 -0
  63. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/archive/shell-like-tool-call-normalization-fallback.js +157 -0
  64. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/context-capture-orchestration.d.ts +16 -0
  65. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/context-capture-orchestration.js +29 -0
  66. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/context-factories.js +3 -1
  67. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/index.d.ts +2 -15
  68. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/index.js +8 -595
  69. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/responses-context-snapshot.d.ts +8 -0
  70. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/responses-context-snapshot.js +28 -0
  71. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/tool-output-diagnostics.d.ts +2 -0
  72. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/tool-output-diagnostics.js +4 -0
  73. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/tool-output-snapshot.d.ts +10 -0
  74. package/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/tool-output-snapshot.js +12 -0
  75. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage1_semantic_map/context-merge.d.ts +3 -0
  76. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage1_semantic_map/context-merge.js +30 -0
  77. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage1_semantic_map/index.js +9 -129
  78. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage2_format_build/index.d.ts +1 -4
  79. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage2_format_build/index.js +9 -26
  80. package/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage3_compat/index.js +32 -14
  81. package/dist/conversion/hub/pipeline/stages/req_process/req_process_stage1_tool_governance/index.d.ts +2 -2
  82. package/dist/conversion/hub/pipeline/stages/req_process/req_process_stage1_tool_governance/index.js +48 -8
  83. package/dist/conversion/hub/pipeline/stages/req_process/req_process_stage2_route_select/index.js +20 -3
  84. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage1_sse_decode/index.js +11 -199
  85. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage1_sse_decode/stream-json-sniffer.d.ts +3 -0
  86. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage1_sse_decode/stream-json-sniffer.js +81 -0
  87. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage2_format_parse/index.d.ts +1 -2
  88. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage2_format_parse/index.js +36 -1
  89. package/dist/conversion/hub/pipeline/stages/resp_inbound/resp_inbound_stage3_semantic_map/index.js +3 -1
  90. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/chat-process-semantics-bridge.d.ts +6 -0
  91. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/chat-process-semantics-bridge.js +17 -0
  92. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/client-remap-protocol-switch.d.ts +9 -0
  93. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/client-remap-protocol-switch.js +28 -0
  94. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/index.d.ts +1 -2
  95. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/index.js +14 -102
  96. package/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage2_sse_stream/index.js +3 -1
  97. package/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.js +54 -39
  98. package/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage2_finalize/index.js +18 -5
  99. package/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage3_servertool_orchestration/index.d.ts +11 -1
  100. package/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage3_servertool_orchestration/index.js +10 -32
  101. package/dist/conversion/hub/pipeline/stages/utils.js +17 -1
  102. package/dist/conversion/hub/pipeline/target-utils.js +14 -91
  103. package/dist/conversion/hub/pipelines/inbound.js +3 -1
  104. package/dist/conversion/hub/pipelines/outbound.js +2 -0
  105. package/dist/conversion/hub/policy/policy-engine.js +9 -3
  106. package/dist/conversion/hub/policy/protocol-spec.js +21 -149
  107. package/dist/conversion/hub/process/chat-process-anthropic-alias.d.ts +2 -0
  108. package/dist/conversion/hub/process/chat-process-anthropic-alias.js +36 -0
  109. package/dist/conversion/hub/process/chat-process-clock-directive-parser.d.ts +5 -0
  110. package/dist/conversion/hub/process/chat-process-clock-directive-parser.js +48 -0
  111. package/dist/conversion/hub/process/chat-process-clock-directives.d.ts +24 -0
  112. package/dist/conversion/hub/process/chat-process-clock-directives.js +98 -0
  113. package/dist/conversion/hub/process/chat-process-clock-reminder-directives.d.ts +8 -0
  114. package/dist/conversion/hub/process/chat-process-clock-reminder-directives.js +42 -0
  115. package/dist/conversion/hub/process/chat-process-clock-reminder-finalize.d.ts +14 -0
  116. package/dist/conversion/hub/process/chat-process-clock-reminder-finalize.js +10 -0
  117. package/dist/conversion/hub/process/chat-process-clock-reminder-messages.d.ts +5 -0
  118. package/dist/conversion/hub/process/chat-process-clock-reminder-messages.js +10 -0
  119. package/dist/conversion/hub/process/chat-process-clock-reminder-orchestration.d.ts +30 -0
  120. package/dist/conversion/hub/process/chat-process-clock-reminder-orchestration.js +68 -0
  121. package/dist/conversion/hub/process/chat-process-clock-reminder-time-tag.d.ts +9 -0
  122. package/dist/conversion/hub/process/chat-process-clock-reminder-time-tag.js +18 -0
  123. package/dist/conversion/hub/process/chat-process-clock-reminders.d.ts +2 -0
  124. package/dist/conversion/hub/process/chat-process-clock-reminders.js +104 -0
  125. package/dist/conversion/hub/process/chat-process-clock-tool-schemas.d.ts +3 -0
  126. package/dist/conversion/hub/process/chat-process-clock-tool-schemas.js +233 -0
  127. package/dist/conversion/hub/process/chat-process-clock-tools.d.ts +6 -0
  128. package/dist/conversion/hub/process/chat-process-clock-tools.js +41 -0
  129. package/dist/conversion/hub/process/chat-process-continue-execution.d.ts +11 -0
  130. package/dist/conversion/hub/process/chat-process-continue-execution.js +82 -0
  131. package/dist/conversion/hub/process/chat-process-governance-context.d.ts +15 -0
  132. package/dist/conversion/hub/process/chat-process-governance-context.js +7 -0
  133. package/dist/conversion/hub/process/chat-process-governance-finalize.d.ts +16 -0
  134. package/dist/conversion/hub/process/chat-process-governance-finalize.js +11 -0
  135. package/dist/conversion/hub/process/chat-process-governance-orchestration.d.ts +9 -0
  136. package/dist/conversion/hub/process/chat-process-governance-orchestration.js +47 -0
  137. package/dist/conversion/hub/process/chat-process-governed-control-ops.d.ts +8 -0
  138. package/dist/conversion/hub/process/chat-process-governed-control-ops.js +5 -0
  139. package/dist/conversion/hub/process/chat-process-governed-filter-call.d.ts +12 -0
  140. package/dist/conversion/hub/process/chat-process-governed-filter-call.js +18 -0
  141. package/dist/conversion/hub/process/chat-process-governed-merge.d.ts +8 -0
  142. package/dist/conversion/hub/process/chat-process-governed-merge.js +11 -0
  143. package/dist/conversion/hub/process/chat-process-media.d.ts +3 -0
  144. package/dist/conversion/hub/process/chat-process-media.js +18 -0
  145. package/dist/conversion/hub/process/chat-process-node-result.d.ts +23 -0
  146. package/dist/conversion/hub/process/chat-process-node-result.js +24 -0
  147. package/dist/conversion/hub/process/chat-process-pending-tool-sync.d.ts +14 -0
  148. package/dist/conversion/hub/process/chat-process-pending-tool-sync.js +52 -0
  149. package/dist/conversion/hub/process/chat-process-post-governed-normalization.d.ts +8 -0
  150. package/dist/conversion/hub/process/chat-process-post-governed-normalization.js +16 -0
  151. package/dist/conversion/hub/process/chat-process-review.d.ts +2 -0
  152. package/dist/conversion/hub/process/chat-process-review.js +8 -0
  153. package/dist/conversion/hub/process/chat-process-servertool-orchestration.d.ts +8 -0
  154. package/dist/conversion/hub/process/chat-process-servertool-orchestration.js +22 -0
  155. package/dist/conversion/hub/process/chat-process-tool-normalization.d.ts +2 -0
  156. package/dist/conversion/hub/process/chat-process-tool-normalization.js +4 -0
  157. package/dist/conversion/hub/process/chat-process-web-search-intent.d.ts +12 -0
  158. package/dist/conversion/hub/process/chat-process-web-search-intent.js +13 -0
  159. package/dist/conversion/hub/process/chat-process-web-search-tool-schema.d.ts +3 -0
  160. package/dist/conversion/hub/process/chat-process-web-search-tool-schema.js +4 -0
  161. package/dist/conversion/hub/process/chat-process-web-search.d.ts +8 -0
  162. package/dist/conversion/hub/process/chat-process-web-search.js +26 -0
  163. package/dist/conversion/hub/process/chat-process.d.ts +2 -19
  164. package/dist/conversion/hub/process/chat-process.js +12 -1701
  165. package/dist/conversion/hub/process/client-inject-readiness.d.ts +1 -0
  166. package/dist/conversion/hub/process/client-inject-readiness.js +4 -0
  167. package/dist/conversion/hub/registry.js +5 -2
  168. package/dist/conversion/hub/response/chat-response-utils.js +5 -86
  169. package/dist/conversion/hub/response/provider-response.d.ts +9 -0
  170. package/dist/conversion/hub/response/provider-response.js +20 -26
  171. package/dist/conversion/hub/response/response-mappers.js +25 -27
  172. package/dist/conversion/hub/response/response-runtime.js +30 -98
  173. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.d.ts +1 -0
  174. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.js +1 -0
  175. package/dist/conversion/hub/semantic-mappers/chat-mapper.d.ts +1 -0
  176. package/dist/conversion/hub/semantic-mappers/chat-mapper.js +1 -0
  177. package/dist/conversion/hub/semantic-mappers/gemini-mapper.d.ts +1 -0
  178. package/dist/conversion/hub/semantic-mappers/gemini-mapper.js +1 -0
  179. package/dist/conversion/hub/semantic-mappers/responses-mapper.d.ts +1 -0
  180. package/dist/conversion/hub/semantic-mappers/responses-mapper.js +1 -0
  181. package/dist/conversion/hub/snapshot-recorder.js +11 -4
  182. package/dist/conversion/hub/standardized-bridge.js +11 -288
  183. package/dist/conversion/hub/tool-governance/engine.d.ts +8 -0
  184. package/dist/conversion/hub/tool-governance/engine.js +25 -63
  185. package/dist/conversion/hub/tool-governance/rules.js +73 -69
  186. package/dist/conversion/hub/tool-session-compat.d.ts +2 -2
  187. package/dist/conversion/hub/tool-session-compat.js +17 -231
  188. package/dist/conversion/hub/tool-surface/tool-surface-engine.js +6 -4
  189. package/dist/conversion/index.d.ts +1 -2
  190. package/dist/conversion/index.js +1 -2
  191. package/dist/conversion/jsonish.js +20 -0
  192. package/dist/conversion/mcp-injection.js +7 -0
  193. package/dist/conversion/media.js +4 -0
  194. package/dist/conversion/{shared/metadata-passthrough.d.ts → metadata-passthrough.d.ts} +1 -1
  195. package/dist/conversion/metadata-passthrough.js +20 -0
  196. package/dist/conversion/payload-budget.js +47 -0
  197. package/dist/conversion/protocol-field-allowlists.d.ts +7 -0
  198. package/dist/conversion/protocol-field-allowlists.js +9 -0
  199. package/dist/conversion/{shared/protocol-state.d.ts → protocol-state.d.ts} +2 -2
  200. package/dist/conversion/protocol-state.js +27 -0
  201. package/dist/conversion/{shared/errors.d.ts → provider-protocol-error.d.ts} +0 -3
  202. package/dist/conversion/provider-protocol-error.js +25 -0
  203. package/dist/conversion/responses/responses-host-policy.js +2 -12
  204. package/dist/conversion/responses/responses-openai-bridge/response-payload.js +14 -87
  205. package/dist/conversion/responses/responses-openai-bridge/types.d.ts +2 -1
  206. package/dist/conversion/responses/responses-openai-bridge.d.ts +1 -1
  207. package/dist/conversion/responses/responses-openai-bridge.js +62 -62
  208. package/dist/conversion/{shared/runtime-metadata.d.ts → runtime-metadata.d.ts} +1 -1
  209. package/dist/conversion/runtime-metadata.js +31 -0
  210. package/dist/conversion/shared/anthropic-message-utils.js +170 -21
  211. package/dist/conversion/shared/chat-envelope-validator.js +2 -126
  212. package/dist/conversion/shared/chat-output-normalizer.js +2 -54
  213. package/dist/conversion/shared/chat-request-filters.d.ts +3 -4
  214. package/dist/conversion/shared/chat-request-filters.js +22 -78
  215. package/dist/conversion/shared/gemini-tool-utils.d.ts +1 -1
  216. package/dist/conversion/shared/gemini-tool-utils.js +9 -524
  217. package/dist/conversion/shared/openai-finalizer.js +3 -1
  218. package/dist/conversion/shared/openai-message-normalize.js +13 -285
  219. package/dist/conversion/shared/output-content-normalizer.js +9 -112
  220. package/dist/conversion/shared/reasoning-mapping.js +2 -6
  221. package/dist/conversion/shared/reasoning-normalizer.js +10 -1
  222. package/dist/conversion/shared/reasoning-tool-normalizer.js +14 -126
  223. package/dist/conversion/shared/reasoning-tool-parser.js +4 -87
  224. package/dist/conversion/shared/reasoning-utils.js +7 -8
  225. package/dist/conversion/shared/responses-conversation-store.js +5 -83
  226. package/dist/conversion/shared/responses-output-builder.js +63 -55
  227. package/dist/conversion/shared/responses-reasoning-registry.d.ts +14 -2
  228. package/dist/conversion/shared/responses-reasoning-registry.js +41 -7
  229. package/dist/conversion/shared/responses-request-adapter.d.ts +7 -1
  230. package/dist/conversion/shared/responses-request-adapter.js +14 -1
  231. package/dist/conversion/shared/responses-response-utils.js +103 -14
  232. package/dist/conversion/shared/responses-tool-utils.d.ts +1 -0
  233. package/dist/conversion/shared/responses-tool-utils.js +91 -15
  234. package/dist/conversion/shared/streaming-text-extractor.js +2 -7
  235. package/dist/conversion/shared/text-markup-normalizer/normalize.d.ts +2 -2
  236. package/dist/conversion/shared/text-markup-normalizer/normalize.js +43 -17
  237. package/dist/conversion/shared/text-markup-normalizer.d.ts +3 -2
  238. package/dist/conversion/shared/text-markup-normalizer.js +2 -1
  239. package/dist/conversion/shared/thought-signature-validator.js +3 -2
  240. package/dist/conversion/shared/tool-argument-repairer.js +2 -2
  241. package/dist/conversion/shared/tool-call-id-manager.js +5 -7
  242. package/dist/conversion/shared/tool-call-utils.js +3 -45
  243. package/dist/conversion/shared/tool-filter-pipeline.js +5 -100
  244. package/dist/conversion/shared/tool-governor.d.ts +6 -0
  245. package/dist/conversion/shared/tool-governor.js +45 -127
  246. package/dist/conversion/shared/tool-harvester.js +2 -8
  247. package/dist/conversion/shared/tool-mapping.d.ts +1 -1
  248. package/dist/conversion/shared/tool-mapping.js +2 -5
  249. package/dist/conversion/shared/tooling.d.ts +0 -4
  250. package/dist/conversion/shared/tooling.js +18 -0
  251. package/dist/conversion/{shared/snapshot-utils.d.ts → snapshot-utils.d.ts} +11 -0
  252. package/dist/conversion/{shared/snapshot-utils.js → snapshot-utils.js} +14 -23
  253. package/dist/conversion/{shared → types}/bridge-message-types.d.ts +2 -0
  254. package/dist/conversion/types/text-markup-normalizer.d.ts +13 -0
  255. package/dist/filters/special/request-tools-normalize.js +1 -1
  256. package/dist/filters/special/response-tool-text-canonicalize.js +2 -2
  257. package/dist/native/router_hotpath_napi.node +0 -0
  258. package/dist/quota/quota-manager.js +31 -59
  259. package/dist/quota/quota-state.js +14 -7
  260. package/dist/router/virtual-router/bootstrap/profile-builder.d.ts +1 -0
  261. package/dist/router/virtual-router/bootstrap/profile-builder.js +13 -0
  262. package/dist/router/virtual-router/bootstrap/provider-normalization.d.ts +2 -0
  263. package/dist/router/virtual-router/bootstrap/provider-normalization.js +4 -1
  264. package/dist/router/virtual-router/bootstrap/streaming-helpers.d.ts +7 -0
  265. package/dist/router/virtual-router/bootstrap/streaming-helpers.js +44 -0
  266. package/dist/router/virtual-router/bootstrap.js +2 -0
  267. package/dist/router/virtual-router/engine/provider-key/parse.d.ts +1 -6
  268. package/dist/router/virtual-router/engine/provider-key/parse.js +1 -43
  269. package/dist/router/virtual-router/engine/routing-state/store.d.ts +1 -2
  270. package/dist/router/virtual-router/engine/routing-state/store.js +50 -14
  271. package/dist/router/virtual-router/engine-legacy/config.d.ts +11 -0
  272. package/dist/router/virtual-router/engine-legacy/config.js +108 -0
  273. package/dist/router/virtual-router/engine-legacy/direct-model.d.ts +10 -0
  274. package/dist/router/virtual-router/engine-legacy/direct-model.js +38 -0
  275. package/dist/router/virtual-router/engine-legacy/health.d.ts +13 -0
  276. package/dist/router/virtual-router/engine-legacy/health.js +104 -0
  277. package/dist/router/virtual-router/engine-legacy/helpers.d.ts +16 -0
  278. package/dist/router/virtual-router/engine-legacy/helpers.js +226 -0
  279. package/dist/router/virtual-router/engine-legacy/route-finalize.d.ts +9 -0
  280. package/dist/router/virtual-router/engine-legacy/route-finalize.js +84 -0
  281. package/dist/router/virtual-router/engine-legacy/route-selection.d.ts +17 -0
  282. package/dist/router/virtual-router/engine-legacy/route-selection.js +205 -0
  283. package/dist/router/virtual-router/engine-legacy/route-state-allowlist.d.ts +3 -0
  284. package/dist/router/virtual-router/engine-legacy/route-state-allowlist.js +36 -0
  285. package/dist/router/virtual-router/engine-legacy/route-state.d.ts +12 -0
  286. package/dist/router/virtual-router/engine-legacy/route-state.js +386 -0
  287. package/dist/router/virtual-router/engine-legacy/route-utils.d.ts +19 -0
  288. package/dist/router/virtual-router/engine-legacy/route-utils.js +212 -0
  289. package/dist/router/virtual-router/engine-legacy/routing.d.ts +8 -0
  290. package/dist/router/virtual-router/engine-legacy/routing.js +8 -0
  291. package/dist/router/virtual-router/engine-legacy/selection-core.d.ts +28 -0
  292. package/dist/router/virtual-router/engine-legacy/selection-core.js +112 -0
  293. package/dist/router/virtual-router/engine-legacy/selection-state.d.ts +16 -0
  294. package/dist/router/virtual-router/engine-legacy/selection-state.js +187 -0
  295. package/dist/router/virtual-router/engine-legacy/state-accessors.d.ts +21 -0
  296. package/dist/router/virtual-router/engine-legacy/state-accessors.js +118 -0
  297. package/dist/router/virtual-router/engine-legacy.d.ts +123 -0
  298. package/dist/router/virtual-router/engine-legacy.js +194 -0
  299. package/dist/router/virtual-router/engine-logging.d.ts +2 -0
  300. package/dist/router/virtual-router/engine-logging.js +11 -5
  301. package/dist/router/virtual-router/engine-selection/alias-selection.js +45 -83
  302. package/dist/router/virtual-router/engine-selection/key-parsing.js +9 -26
  303. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-directive-parser.d.ts +20 -0
  304. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-directive-parser.js +163 -0
  305. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-directives.d.ts +7 -0
  306. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-directives.js +103 -0
  307. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-orchestration-semantics.d.ts +10 -0
  308. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-orchestration-semantics.js +110 -0
  309. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-semantics.d.ts +8 -0
  310. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-semantics.js +281 -0
  311. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-time-tag-semantics.d.ts +1 -0
  312. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-time-tag-semantics.js +25 -0
  313. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminders-semantics.d.ts +4 -0
  314. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminders-semantics.js +44 -0
  315. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-tool-schema-semantics.d.ts +2 -0
  316. package/dist/router/virtual-router/engine-selection/native-chat-process-clock-tool-schema-semantics.js +62 -0
  317. package/dist/router/virtual-router/engine-selection/native-chat-process-governance-semantics.d.ts +40 -0
  318. package/dist/router/virtual-router/engine-selection/native-chat-process-governance-semantics.js +484 -0
  319. package/dist/router/virtual-router/engine-selection/native-chat-process-governed-filter-semantics.d.ts +9 -0
  320. package/dist/router/virtual-router/engine-selection/native-chat-process-governed-filter-semantics.js +64 -0
  321. package/dist/router/virtual-router/engine-selection/native-chat-process-node-result-semantics.d.ts +5 -0
  322. package/dist/router/virtual-router/engine-selection/native-chat-process-node-result-semantics.js +163 -0
  323. package/dist/router/virtual-router/engine-selection/native-chat-process-post-governed-normalization-semantics.d.ts +1 -0
  324. package/dist/router/virtual-router/engine-selection/native-chat-process-post-governed-normalization-semantics.js +49 -0
  325. package/dist/router/virtual-router/engine-selection/native-chat-process-servertool-orchestration-semantics.d.ts +30 -0
  326. package/dist/router/virtual-router/engine-selection/native-chat-process-servertool-orchestration-semantics.js +446 -0
  327. package/dist/router/virtual-router/engine-selection/native-chat-process-web-search-intent-semantics.d.ts +1 -0
  328. package/dist/router/virtual-router/engine-selection/native-chat-process-web-search-intent-semantics.js +49 -0
  329. package/dist/router/virtual-router/engine-selection/native-chat-request-filter-semantics.d.ts +1 -0
  330. package/dist/router/virtual-router/engine-selection/native-chat-request-filter-semantics.js +54 -0
  331. package/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics.d.ts +134 -0
  332. package/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics.js +729 -0
  333. package/dist/router/virtual-router/engine-selection/native-hub-bridge-policy-semantics.d.ts +72 -0
  334. package/dist/router/virtual-router/engine-selection/native-hub-bridge-policy-semantics.js +405 -0
  335. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-edge-stage-semantics.d.ts +18 -0
  336. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-edge-stage-semantics.js +317 -0
  337. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-governance-semantics.d.ts +22 -0
  338. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-governance-semantics.js +154 -0
  339. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-inbound-outbound-semantics.d.ts +22 -0
  340. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-inbound-outbound-semantics.js +426 -0
  341. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics.d.ts +57 -0
  342. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics.js +705 -0
  343. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-inbound-semantics.d.ts +46 -0
  344. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-inbound-semantics.js +503 -0
  345. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-outbound-semantics.d.ts +146 -0
  346. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-outbound-semantics.js +570 -0
  347. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-process-semantics.d.ts +25 -0
  348. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-process-semantics.js +148 -0
  349. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics.d.ts +25 -0
  350. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics.js +637 -0
  351. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-session-identifiers-semantics.d.ts +11 -0
  352. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-session-identifiers-semantics.js +207 -0
  353. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-target-semantics.d.ts +3 -0
  354. package/dist/router/virtual-router/engine-selection/native-hub-pipeline-target-semantics.js +128 -0
  355. package/dist/router/virtual-router/engine-selection/native-router-hotpath-analysis.d.ts +57 -0
  356. package/dist/router/virtual-router/engine-selection/native-router-hotpath-analysis.js +217 -0
  357. package/dist/router/virtual-router/engine-selection/native-router-hotpath-loader.d.ts +5 -0
  358. package/dist/router/virtual-router/engine-selection/native-router-hotpath-loader.js +320 -0
  359. package/dist/router/virtual-router/engine-selection/native-router-hotpath-policy.d.ts +5 -0
  360. package/dist/router/virtual-router/engine-selection/native-router-hotpath-policy.js +18 -0
  361. package/dist/router/virtual-router/engine-selection/native-router-hotpath-quota-buckets.d.ts +25 -0
  362. package/dist/router/virtual-router/engine-selection/native-router-hotpath-quota-buckets.js +85 -0
  363. package/dist/router/virtual-router/engine-selection/native-router-hotpath.d.ts +59 -0
  364. package/dist/router/virtual-router/engine-selection/native-router-hotpath.js +117 -0
  365. package/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.d.ts +151 -0
  366. package/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.js +1371 -0
  367. package/dist/router/virtual-router/engine-selection/native-snapshot-hooks.d.ts +2 -0
  368. package/dist/router/virtual-router/engine-selection/native-snapshot-hooks.js +69 -0
  369. package/dist/router/virtual-router/engine-selection/native-virtual-router-alias-selection-semantics.d.ts +16 -0
  370. package/dist/router/virtual-router/engine-selection/native-virtual-router-alias-selection-semantics.js +96 -0
  371. package/dist/router/virtual-router/engine-selection/native-virtual-router-engine-proxy.d.ts +16 -0
  372. package/dist/router/virtual-router/engine-selection/native-virtual-router-engine-proxy.js +14 -0
  373. package/dist/router/virtual-router/engine-selection/native-virtual-router-routing-instructions-semantics.d.ts +2 -0
  374. package/dist/router/virtual-router/engine-selection/native-virtual-router-routing-instructions-semantics.js +86 -0
  375. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-actions-semantics.d.ts +6 -0
  376. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-actions-semantics.js +85 -0
  377. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-semantics.d.ts +9 -0
  378. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-semantics.js +70 -0
  379. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-state-semantics.d.ts +2 -0
  380. package/dist/router/virtual-router/engine-selection/native-virtual-router-stop-message-state-semantics.js +76 -0
  381. package/dist/router/virtual-router/engine-selection/route-utils.js +1 -1
  382. package/dist/router/virtual-router/engine-selection/tier-selection-antigravity-session-lease.d.ts +10 -0
  383. package/dist/router/virtual-router/engine-selection/tier-selection-antigravity-session-lease.js +231 -0
  384. package/dist/router/virtual-router/engine-selection/tier-selection-antigravity-target-split.d.ts +4 -0
  385. package/dist/router/virtual-router/engine-selection/tier-selection-antigravity-target-split.js +43 -0
  386. package/dist/router/virtual-router/engine-selection/tier-selection-quota-integration.d.ts +27 -0
  387. package/dist/router/virtual-router/engine-selection/tier-selection-quota-integration.js +216 -0
  388. package/dist/router/virtual-router/engine-selection/tier-selection-select.d.ts +1 -1
  389. package/dist/router/virtual-router/engine-selection/tier-selection-select.js +128 -129
  390. package/dist/router/virtual-router/engine-selection/tier-selection.js +2 -265
  391. package/dist/router/virtual-router/engine.d.ts +22 -105
  392. package/dist/router/virtual-router/engine.js +274 -1632
  393. package/dist/router/virtual-router/features.js +2 -2
  394. package/dist/router/virtual-router/load-balancer.d.ts +8 -0
  395. package/dist/router/virtual-router/load-balancer.js +65 -2
  396. package/dist/router/virtual-router/provider-registry.js +2 -0
  397. package/dist/router/virtual-router/routing-instructions/clean.d.ts +3 -0
  398. package/dist/router/virtual-router/routing-instructions/clean.js +34 -0
  399. package/dist/router/virtual-router/routing-instructions/parse.d.ts +18 -0
  400. package/dist/router/virtual-router/routing-instructions/parse.js +377 -0
  401. package/dist/router/virtual-router/routing-instructions/state.d.ts +4 -0
  402. package/dist/router/virtual-router/routing-instructions/state.js +245 -0
  403. package/dist/router/virtual-router/routing-instructions/types.d.ts +70 -0
  404. package/dist/router/virtual-router/routing-instructions/types.js +2 -0
  405. package/dist/router/virtual-router/routing-instructions.d.ts +5 -91
  406. package/dist/router/virtual-router/routing-instructions.js +4 -628
  407. package/dist/router/virtual-router/routing-stop-message-actions.js +91 -112
  408. package/dist/router/virtual-router/routing-stop-message-parser.js +9 -132
  409. package/dist/router/virtual-router/routing-stop-message-state-codec.d.ts +1 -0
  410. package/dist/router/virtual-router/routing-stop-message-state-codec.js +58 -71
  411. package/dist/router/virtual-router/sticky-session-store.d.ts +4 -0
  412. package/dist/router/virtual-router/sticky-session-store.js +23 -83
  413. package/dist/router/virtual-router/stop-message-file-resolver.d.ts +1 -0
  414. package/dist/router/virtual-router/stop-message-file-resolver.js +10 -0
  415. package/dist/router/virtual-router/stop-message-state-sync.d.ts +1 -1
  416. package/dist/router/virtual-router/stop-message-state-sync.js +3 -7
  417. package/dist/router/virtual-router/token-counter.js +0 -9
  418. package/dist/router/virtual-router/tool-signals.js +21 -3
  419. package/dist/router/virtual-router/types.d.ts +13 -7
  420. package/dist/servertool/clock/config.js +23 -51
  421. package/dist/servertool/clock/io.js +1 -0
  422. package/dist/servertool/clock/session-scope.d.ts +2 -2
  423. package/dist/servertool/clock/session-scope.js +29 -40
  424. package/dist/servertool/engine.d.ts +9 -0
  425. package/dist/servertool/engine.js +267 -79
  426. package/dist/servertool/handlers/antigravity-thought-signature-bootstrap.js +3 -3
  427. package/dist/servertool/handlers/clock-auto.js +1 -1
  428. package/dist/servertool/handlers/clock.js +2 -2
  429. package/dist/servertool/handlers/compaction-detect.d.ts +1 -1
  430. package/dist/servertool/handlers/compaction-detect.js +1 -1
  431. package/dist/servertool/handlers/continue-execution.js +8 -4
  432. package/dist/servertool/handlers/followup-request-builder.js +18 -1
  433. package/dist/servertool/handlers/gemini-empty-reply-continue.js +8 -2
  434. package/dist/servertool/handlers/iflow-model-error-retry.js +1 -1
  435. package/dist/servertool/handlers/recursive-detection-guard.js +1 -1
  436. package/dist/servertool/handlers/review.d.ts +1 -0
  437. package/dist/servertool/handlers/review.js +180 -0
  438. package/dist/servertool/handlers/stop-message-auto/blocked-report.js +59 -1
  439. package/dist/servertool/handlers/stop-message-auto/iflow-followup.d.ts +23 -2
  440. package/dist/servertool/handlers/stop-message-auto/iflow-followup.js +398 -90
  441. package/dist/servertool/handlers/stop-message-auto/routing-state.d.ts +5 -15
  442. package/dist/servertool/handlers/stop-message-auto/routing-state.js +29 -55
  443. package/dist/servertool/handlers/stop-message-auto/runtime-utils.d.ts +6 -0
  444. package/dist/servertool/handlers/stop-message-auto/runtime-utils.js +36 -62
  445. package/dist/servertool/handlers/stop-message-auto.js +393 -77
  446. package/dist/servertool/handlers/vision.js +1 -1
  447. package/dist/servertool/handlers/web-search.js +1 -1
  448. package/dist/servertool/reenter-backend.js +1 -1
  449. package/dist/servertool/server-side-tools.d.ts +1 -0
  450. package/dist/servertool/server-side-tools.js +92 -54
  451. package/dist/servertool/stop-gateway-context.js +1 -1
  452. package/dist/servertool/stop-message-compare-context.js +1 -1
  453. package/dist/servertool/types.d.ts +17 -0
  454. package/dist/sse/json-to-sse/event-generators/responses.d.ts +4 -0
  455. package/dist/sse/json-to-sse/event-generators/responses.js +95 -1
  456. package/dist/sse/json-to-sse/sequencers/responses-sequencer.js +6 -4
  457. package/dist/sse/sse-to-json/builders/response-builder.d.ts +8 -0
  458. package/dist/sse/sse-to-json/builders/response-builder.js +162 -4
  459. package/dist/sse/sse-to-json/responses-sse-to-json-converter.js +2 -0
  460. package/dist/sse/types/responses-types.d.ts +6 -2
  461. package/dist/tools/apply-patch/patch-text/normalize.js +11 -0
  462. package/dist/tools/apply-patch/structured/coercion.js +5 -0
  463. package/dist/tools/args-json.js +29 -0
  464. package/dist/tools/exec-command/validator.d.ts +4 -1
  465. package/dist/tools/exec-command/validator.js +87 -3
  466. package/dist/tools/tool-registry.d.ts +7 -1
  467. package/dist/tools/tool-registry.js +3 -2
  468. package/package.json +121 -10
  469. package/dist/conversion/shared/args-mapping.js +0 -221
  470. package/dist/conversion/shared/bridge-actions.js +0 -881
  471. package/dist/conversion/shared/bridge-id-utils.js +0 -79
  472. package/dist/conversion/shared/bridge-metadata.js +0 -1
  473. package/dist/conversion/shared/bridge-policies.js +0 -195
  474. package/dist/conversion/shared/compaction-detect.js +0 -59
  475. package/dist/conversion/shared/errors.js +0 -31
  476. package/dist/conversion/shared/jsonish.js +0 -177
  477. package/dist/conversion/shared/mcp-injection.js +0 -173
  478. package/dist/conversion/shared/media.js +0 -9
  479. package/dist/conversion/shared/metadata-passthrough.js +0 -57
  480. package/dist/conversion/shared/payload-budget.js +0 -248
  481. package/dist/conversion/shared/protocol-field-allowlists.d.ts +0 -7
  482. package/dist/conversion/shared/protocol-field-allowlists.js +0 -149
  483. package/dist/conversion/shared/protocol-state.js +0 -23
  484. package/dist/conversion/shared/runtime-metadata.js +0 -23
  485. package/dist/conversion/shared/snapshot-hooks.d.ts +0 -11
  486. package/dist/conversion/shared/snapshot-hooks.js +0 -503
  487. package/dist/conversion/shared/text-markup-normalizer/extractors-apply-patch.d.ts +0 -2
  488. package/dist/conversion/shared/text-markup-normalizer/extractors-apply-patch.js +0 -129
  489. package/dist/conversion/shared/text-markup-normalizer/extractors-json.d.ts +0 -4
  490. package/dist/conversion/shared/text-markup-normalizer/extractors-json.js +0 -637
  491. package/dist/conversion/shared/text-markup-normalizer/extractors-shared.d.ts +0 -21
  492. package/dist/conversion/shared/text-markup-normalizer/extractors-shared.js +0 -177
  493. package/dist/conversion/shared/text-markup-normalizer/extractors-transcript.d.ts +0 -5
  494. package/dist/conversion/shared/text-markup-normalizer/extractors-transcript.js +0 -385
  495. package/dist/conversion/shared/text-markup-normalizer/extractors-xml.d.ts +0 -10
  496. package/dist/conversion/shared/text-markup-normalizer/extractors-xml.js +0 -602
  497. package/dist/conversion/shared/text-markup-normalizer/extractors.d.ts +0 -5
  498. package/dist/conversion/shared/text-markup-normalizer/extractors.js +0 -4
  499. package/dist/conversion/shared/tool-canonicalizer.d.ts +0 -2
  500. package/dist/conversion/shared/tool-canonicalizer.js +0 -42
  501. package/dist/servertool/handlers/stop-message-stage-policy/bd-runtime.d.ts +0 -18
  502. package/dist/servertool/handlers/stop-message-stage-policy/bd-runtime.js +0 -398
  503. package/dist/servertool/handlers/stop-message-stage-policy/decision.d.ts +0 -9
  504. package/dist/servertool/handlers/stop-message-stage-policy/decision.js +0 -127
  505. package/dist/servertool/handlers/stop-message-stage-policy/observation.d.ts +0 -2
  506. package/dist/servertool/handlers/stop-message-stage-policy/observation.js +0 -179
  507. package/dist/servertool/handlers/stop-message-stage-policy/templates.d.ts +0 -4
  508. package/dist/servertool/handlers/stop-message-stage-policy/templates.js +0 -96
  509. package/dist/servertool/handlers/stop-message-stage-policy/text-utils.d.ts +0 -9
  510. package/dist/servertool/handlers/stop-message-stage-policy/text-utils.js +0 -89
  511. package/dist/servertool/handlers/stop-message-stage-policy/types.d.ts +0 -59
  512. package/dist/servertool/handlers/stop-message-stage-policy.d.ts +0 -3
  513. package/dist/servertool/handlers/stop-message-stage-policy.js +0 -2
  514. /package/dist/conversion/{shared/args-mapping.d.ts → args-mapping.d.ts} +0 -0
  515. /package/dist/conversion/{shared/bridge-actions.d.ts → bridge-actions.d.ts} +0 -0
  516. /package/dist/conversion/{shared/bridge-id-utils.d.ts → bridge-id-utils.d.ts} +0 -0
  517. /package/dist/conversion/{shared/bridge-instructions.d.ts → bridge-instructions.d.ts} +0 -0
  518. /package/dist/conversion/{shared/bridge-policies.d.ts → bridge-policies.d.ts} +0 -0
  519. /package/dist/conversion/{shared/jsonish.d.ts → jsonish.d.ts} +0 -0
  520. /package/dist/conversion/{shared/mcp-injection.d.ts → mcp-injection.d.ts} +0 -0
  521. /package/dist/conversion/{shared/media.d.ts → media.d.ts} +0 -0
  522. /package/dist/conversion/{shared/payload-budget.d.ts → payload-budget.d.ts} +0 -0
  523. /package/dist/conversion/{shared → types}/bridge-message-types.js +0 -0
  524. /package/dist/{servertool/handlers/stop-message-stage-policy/types.js → conversion/types/text-markup-normalizer.js} +0 -0
@@ -115,16 +115,6 @@ function collectUpstreamErrorSources(ev) {
115
115
  function isAntigravityProviderKey(providerKey) {
116
116
  return providerKey.toLowerCase().startsWith('antigravity.');
117
117
  }
118
- function resolveAntigravityRuntimeKey(providerKey, ev) {
119
- const rtKey = safeTrim(ev?.runtime?.target?.runtimeKey);
120
- if (rtKey)
121
- return rtKey;
122
- const parts = providerKey.split('.').filter(Boolean);
123
- if (parts.length >= 2) {
124
- return `${parts[0]}.${parts[1]}`;
125
- }
126
- return null;
127
- }
128
118
  function isGoogleAccountVerificationRequired(ev, sources) {
129
119
  if (!sources.length) {
130
120
  sources = collectUpstreamErrorSources(ev);
@@ -277,64 +267,46 @@ export class QuotaManager {
277
267
  const code = safeTrim(ev.code) || safeTrim(ev?.runtime?.errorCode);
278
268
  const details = ev.details && typeof ev.details === 'object' ? ev.details : undefined;
279
269
  const state = this.ensureProvider(providerKey);
280
- // Antigravity account-scope auth verification required: blacklist the whole runtimeKey group.
270
+ // Antigravity account-scope auth verification required: isolate to current providerKey only.
281
271
  if (isAntigravityProviderKey(providerKey)) {
282
272
  const sources = collectUpstreamErrorSources(ev);
283
- const runtimeKey = resolveAntigravityRuntimeKey(providerKey, ev);
284
- if (runtimeKey && isGoogleAccountVerificationRequired(ev, sources)) {
273
+ if (isGoogleAccountVerificationRequired(ev, sources)) {
285
274
  const url = extractFirstUrl(sources);
286
275
  const banUntil = nowMs + ANTIGRAVITY_AUTH_VERIFY_BAN_MS;
287
- for (const key of this.states.keys()) {
288
- if (!key.startsWith(`${runtimeKey}.`))
289
- continue;
290
- const s = this.ensureProvider(key);
291
- const next = {
292
- ...s,
293
- inPool: false,
294
- reason: 'authVerify',
295
- authIssue: {
296
- kind: 'google_account_verification',
297
- ...(url ? { url } : {}),
298
- message: 'account verification required'
299
- },
300
- blacklistUntil: Math.max(s.blacklistUntil ?? 0, banUntil) || banUntil,
301
- cooldownUntil: null,
302
- lastErrorAtMs: nowMs,
303
- lastErrorCode: code || 'AUTH_VERIFY',
304
- lastErrorSeries: 'EFATAL',
305
- consecutiveErrorCount: 0
306
- };
307
- this.states.set(key, tickQuotaStateTime(next, nowMs));
308
- }
276
+ const next = {
277
+ ...state,
278
+ inPool: false,
279
+ reason: 'authVerify',
280
+ authIssue: {
281
+ kind: 'google_account_verification',
282
+ ...(url ? { url } : {}),
283
+ message: 'account verification required'
284
+ },
285
+ blacklistUntil: Math.max(state.blacklistUntil ?? 0, banUntil) || banUntil,
286
+ cooldownUntil: null,
287
+ lastErrorAtMs: nowMs,
288
+ lastErrorCode: code || 'AUTH_VERIFY',
289
+ lastErrorSeries: 'EFATAL',
290
+ consecutiveErrorCount: 0
291
+ };
292
+ this.states.set(providerKey, tickQuotaStateTime(next, nowMs));
309
293
  this.markDirty();
310
294
  return;
311
295
  }
312
- // Thought signature missing: freeze Gemini series under runtimeKey to avoid request storms.
296
+ // Thought signature missing: cooldown current providerKey only.
313
297
  if (isThoughtSignatureMissing(ev, sources)) {
314
298
  const freezeUntil = nowMs + ANTIGRAVITY_THOUGHT_SIGNATURE_MISSING_COOLDOWN_MS;
315
- const prefix = runtimeKey ? `${runtimeKey}.` : `${providerKey.split('.').slice(0, 2).join('.')}.`;
316
- for (const key of this.states.keys()) {
317
- if (!key.startsWith(prefix))
318
- continue;
319
- const parts = key.split('.');
320
- const modelId = parts.length >= 3 ? parts.slice(2).join('.') : '';
321
- const lowerModel = modelId.toLowerCase();
322
- const isGeminiSeries = lowerModel.includes('gemini') && (lowerModel.includes('pro') || lowerModel.includes('flash'));
323
- if (!isGeminiSeries)
324
- continue;
325
- const s = this.ensureProvider(key);
326
- const next = {
327
- ...s,
328
- inPool: false,
329
- reason: 'cooldown',
330
- cooldownUntil: Math.max(s.cooldownUntil ?? 0, freezeUntil) || freezeUntil,
331
- lastErrorAtMs: nowMs,
332
- lastErrorCode: code || 'SIGNATURE_MISSING',
333
- lastErrorSeries: 'EOTHER',
334
- consecutiveErrorCount: 0
335
- };
336
- this.states.set(key, tickQuotaStateTime(next, nowMs));
337
- }
299
+ const next = {
300
+ ...state,
301
+ inPool: false,
302
+ reason: 'cooldown',
303
+ cooldownUntil: Math.max(state.cooldownUntil ?? 0, freezeUntil) || freezeUntil,
304
+ lastErrorAtMs: nowMs,
305
+ lastErrorCode: code || 'SIGNATURE_MISSING',
306
+ lastErrorSeries: 'EOTHER',
307
+ consecutiveErrorCount: 0
308
+ };
309
+ this.states.set(providerKey, tickQuotaStateTime(next, nowMs));
338
310
  this.markDirty();
339
311
  return;
340
312
  }
@@ -1,6 +1,6 @@
1
- const COOLDOWN_SCHEDULE_429_MS = [5_000, 30_000, 60_000, 300_000, 1_800_000, 3_600_000, 10_000_000];
2
- const COOLDOWN_SCHEDULE_FATAL_MS = [5 * 60_000, 15 * 60_000, 30 * 60_000, 60 * 60_000, 3 * 60 * 60_000];
3
- const COOLDOWN_SCHEDULE_DEFAULT_MS = [5_000, 30_000, 60_000, 300_000, 1_800_000, 3_600_000, 10_000_000];
1
+ const COOLDOWN_SCHEDULE_429_MS = [3_000, 10_000, 31_000, 61_000];
2
+ const COOLDOWN_SCHEDULE_FATAL_MS = [3_000, 10_000, 31_000, 61_000];
3
+ const COOLDOWN_SCHEDULE_DEFAULT_MS = [3_000, 10_000, 31_000, 61_000];
4
4
  const ERROR_CHAIN_WINDOW_MS = 10 * 60_000;
5
5
  const NETWORK_ERROR_CODES = [
6
6
  'ECONNRESET',
@@ -56,14 +56,21 @@ export function normalizeErrorSeries(event) {
56
56
  }
57
57
  function normalizeErrorKey(event) {
58
58
  const rawCode = String(event.code || '').trim().toUpperCase();
59
- if (rawCode) {
59
+ const status = typeof event.httpStatus === 'number' ? event.httpStatus : null;
60
+ const isGenericCode = rawCode === '' ||
61
+ rawCode === 'ERR_PROVIDER_FAILURE' ||
62
+ rawCode === 'ERR_PIPELINE_FAILURE' ||
63
+ rawCode === 'ERR_COMPATIBILITY' ||
64
+ rawCode === 'EXTERNAL_ERROR' ||
65
+ rawCode === 'INTERNAL_ERROR' ||
66
+ rawCode === 'TOOL_ERROR';
67
+ if (!isGenericCode) {
60
68
  return rawCode;
61
69
  }
62
- const status = typeof event.httpStatus === 'number' ? event.httpStatus : null;
63
70
  if (status && Number.isFinite(status)) {
64
71
  return `HTTP_${Math.floor(status)}`;
65
72
  }
66
- return 'ERR_UNKNOWN';
73
+ return rawCode || 'ERR_UNKNOWN';
67
74
  }
68
75
  function computeCooldownMsBySeries(series, consecutive) {
69
76
  if (consecutive <= 0) {
@@ -125,12 +132,12 @@ export function applyErrorEvent(state, event, nowMs = event.timestampMs ?? Date.
125
132
  nowMs - lastAt >= 0 &&
126
133
  nowMs - lastAt <= ERROR_CHAIN_WINDOW_MS;
127
134
  const sameErrorKey = withinChainWindow && state.lastErrorCode === errorKey;
128
- const rawNextCount = sameErrorKey ? state.consecutiveErrorCount + 1 : 1;
129
135
  const schedule = series === 'E429'
130
136
  ? COOLDOWN_SCHEDULE_429_MS
131
137
  : series === 'EFATAL'
132
138
  ? COOLDOWN_SCHEDULE_FATAL_MS
133
139
  : COOLDOWN_SCHEDULE_DEFAULT_MS;
140
+ const rawNextCount = sameErrorKey ? state.consecutiveErrorCount + 1 : 1;
134
141
  const nextCount = rawNextCount > schedule.length ? 1 : rawNextCount;
135
142
  const cooldownMs = computeCooldownMsBySeries(series, nextCount);
136
143
  const nextUntil = cooldownMs ? nowMs + cooldownMs : null;
@@ -4,4 +4,5 @@ export declare function buildProviderProfiles(targetKeys: Set<string>, runtimeEn
4
4
  targetRuntime: Record<string, ProviderRuntimeProfile>;
5
5
  };
6
6
  export declare function resolveContextTokens(runtime: ProviderRuntimeProfile, modelId: string): number;
7
+ export declare function resolveOutputTokens(runtime: ProviderRuntimeProfile, modelId: string): number | undefined;
7
8
  export declare function normalizeHealth(input: unknown): ProviderHealthConfig | undefined;
@@ -16,6 +16,7 @@ export function buildProviderProfiles(targetKeys, runtimeEntries) {
16
16
  ? runtime.modelStreaming?.[parsed.modelId]
17
17
  : runtime.streaming;
18
18
  const contextTokens = resolveContextTokens(runtime, parsed.modelId);
19
+ const outputTokens = resolveOutputTokens(runtime, parsed.modelId);
19
20
  profiles[targetKey] = {
20
21
  providerKey: targetKey,
21
22
  providerType: runtime.providerType,
@@ -28,6 +29,7 @@ export function buildProviderProfiles(targetKeys, runtimeEntries) {
28
29
  processMode: runtime.processMode || 'chat',
29
30
  responsesConfig: runtime.responsesConfig,
30
31
  streaming: streamingPref,
32
+ maxOutputTokens: outputTokens,
31
33
  maxContextTokens: contextTokens,
32
34
  ...(runtime.deepseek ? { deepseek: runtime.deepseek } : {}),
33
35
  ...(runtime.serverToolsDisabled ? { serverToolsDisabled: true } : {})
@@ -52,6 +54,17 @@ export function resolveContextTokens(runtime, modelId) {
52
54
  }
53
55
  return DEFAULT_MODEL_CONTEXT_TOKENS;
54
56
  }
57
+ export function resolveOutputTokens(runtime, modelId) {
58
+ const specific = runtime.modelOutputTokens?.[modelId];
59
+ if (typeof specific === 'number' && Number.isFinite(specific) && specific > 0) {
60
+ return Math.floor(specific);
61
+ }
62
+ const fallback = runtime.defaultOutputTokens;
63
+ if (typeof fallback === 'number' && Number.isFinite(fallback) && fallback > 0) {
64
+ return Math.floor(fallback);
65
+ }
66
+ return undefined;
67
+ }
55
68
  export function normalizeHealth(input) {
56
69
  if (!input || typeof input !== 'object')
57
70
  return undefined;
@@ -18,6 +18,8 @@ export interface NormalizedProvider {
18
18
  responsesConfig?: ResponsesProviderConfig;
19
19
  streaming?: 'always' | 'auto' | 'never';
20
20
  modelStreaming?: Record<string, 'always' | 'auto' | 'never'>;
21
+ modelOutputTokens?: Record<string, number>;
22
+ defaultOutputTokens?: number;
21
23
  modelContextTokens?: Record<string, number>;
22
24
  defaultContextTokens?: number;
23
25
  deepseek?: DeepSeekCompatRuntimeOptions;
@@ -5,7 +5,7 @@
5
5
  import { VirtualRouterError, VirtualRouterErrorCode } from '../types.js';
6
6
  import { CLAUDE_CODE_DEFAULT_USER_AGENT, CLAUDE_CODE_DEFAULT_X_APP, CLAUDE_CODE_DEFAULT_ANTHROPIC_BETA, parseClaudeCodeAppVersionFromUserAgent } from './claude-code-helpers.js';
7
7
  import { normalizeResponsesConfig, resolveProviderStreamingPreference } from './responses-helpers.js';
8
- import { normalizeModelStreaming, normalizeModelContextTokens } from './streaming-helpers.js';
8
+ import { normalizeModelStreaming, normalizeModelContextTokens, normalizeModelOutputTokens } from './streaming-helpers.js';
9
9
  /**
10
10
  * Normalize a raw provider configuration into a NormalizedProvider.
11
11
  */
@@ -33,6 +33,7 @@ export function normalizeProvider(providerId, raw) {
33
33
  const streaming = resolveProviderStreamingPreference(provider, responsesNode);
34
34
  const modelStreaming = normalizeModelStreaming(provider);
35
35
  const { modelContextTokens, defaultContextTokens } = normalizeModelContextTokens(provider);
36
+ const { modelOutputTokens, defaultOutputTokens } = normalizeModelOutputTokens(provider);
36
37
  const deepseek = normalizeDeepSeekOptions(provider);
37
38
  const serverToolsDisabled = provider.serverToolsDisabled === true ||
38
39
  (typeof provider.serverToolsDisabled === 'string' &&
@@ -51,6 +52,8 @@ export function normalizeProvider(providerId, raw) {
51
52
  responsesConfig,
52
53
  streaming,
53
54
  modelStreaming,
55
+ modelOutputTokens,
56
+ defaultOutputTokens,
54
57
  modelContextTokens,
55
58
  defaultContextTokens,
56
59
  ...(deepseek ? { deepseek } : {}),
@@ -10,3 +10,10 @@ export declare function normalizeModelContextTokens(provider: Record<string, unk
10
10
  modelContextTokens?: Record<string, number>;
11
11
  defaultContextTokens?: number;
12
12
  };
13
+ /**
14
+ * Normalize model-level output token limits (maxTokens / max_output_tokens).
15
+ */
16
+ export declare function normalizeModelOutputTokens(provider: Record<string, unknown>): {
17
+ modelOutputTokens?: Record<string, number>;
18
+ defaultOutputTokens?: number;
19
+ };
@@ -83,6 +83,29 @@ export function normalizeModelContextTokens(provider) {
83
83
  defaultContextTokens: defaultCandidate
84
84
  };
85
85
  }
86
+ /**
87
+ * Normalize model-level output token limits (maxTokens / max_output_tokens).
88
+ */
89
+ export function normalizeModelOutputTokens(provider) {
90
+ const modelsNode = asRecord(provider.models);
91
+ const normalized = {};
92
+ for (const [modelId, modelRaw] of Object.entries(modelsNode)) {
93
+ if (!modelRaw || typeof modelRaw !== 'object') {
94
+ continue;
95
+ }
96
+ const candidate = readOutputTokens(modelRaw);
97
+ if (candidate) {
98
+ normalized[modelId] = candidate;
99
+ }
100
+ }
101
+ const configNode = asRecord(provider.config);
102
+ const defaultsNode = asRecord(configNode?.userConfigDefaults);
103
+ const defaultCandidate = readOutputTokens(provider) ?? readOutputTokens(configNode) ?? readOutputTokens(defaultsNode);
104
+ return {
105
+ modelOutputTokens: Object.keys(normalized).length ? normalized : undefined,
106
+ defaultOutputTokens: defaultCandidate
107
+ };
108
+ }
86
109
  /**
87
110
  * Read context tokens from various field names.
88
111
  */
@@ -107,6 +130,27 @@ function readContextTokens(record) {
107
130
  }
108
131
  return undefined;
109
132
  }
133
+ function readOutputTokens(record) {
134
+ if (!record) {
135
+ return undefined;
136
+ }
137
+ const keys = [
138
+ 'maxOutputTokens',
139
+ 'max_output_tokens',
140
+ 'maxTokens',
141
+ 'max_tokens',
142
+ 'outputTokens',
143
+ 'output_tokens'
144
+ ];
145
+ for (const key of keys) {
146
+ const value = record[key];
147
+ const parsed = normalizePositiveInteger(value);
148
+ if (parsed) {
149
+ return parsed;
150
+ }
151
+ }
152
+ return undefined;
153
+ }
110
154
  /**
111
155
  * Normalize positive integer value.
112
156
  */
@@ -129,6 +129,8 @@ function buildProviderRuntimeEntries(providers) {
129
129
  responsesConfig: normalizedProvider.responsesConfig,
130
130
  streaming: normalizedProvider.streaming,
131
131
  modelStreaming: normalizedProvider.modelStreaming,
132
+ modelOutputTokens: normalizedProvider.modelOutputTokens,
133
+ defaultOutputTokens: normalizedProvider.defaultOutputTokens,
132
134
  modelContextTokens: normalizedProvider.modelContextTokens,
133
135
  defaultContextTokens: normalizedProvider.defaultContextTokens,
134
136
  ...(normalizedProvider.deepseek ? { deepseek: normalizedProvider.deepseek } : {}),
@@ -1,6 +1 @@
1
- import type { ProviderRegistry } from '../../provider-registry.js';
2
- export declare function extractProviderId(providerKey: string): string | null;
3
- export declare function normalizeAliasDescriptor(alias: string): string;
4
- export declare function extractKeyAlias(providerKey: string): string | null;
5
- export declare function extractKeyIndex(providerKey: string): number | undefined;
6
- export declare function getProviderModelId(providerKey: string, providerRegistry: ProviderRegistry): string | null;
1
+ export { extractProviderId, normalizeAliasDescriptor, extractKeyAlias, extractKeyIndex, getProviderModelId } from '../../engine-selection/key-parsing.js';
@@ -1,43 +1 @@
1
- export function extractProviderId(providerKey) {
2
- const firstDot = providerKey.indexOf('.');
3
- if (firstDot <= 0)
4
- return null;
5
- return providerKey.substring(0, firstDot);
6
- }
7
- export function normalizeAliasDescriptor(alias) {
8
- if (/^\d+-/.test(alias)) {
9
- return alias.replace(/^\d+-/, '');
10
- }
11
- return alias;
12
- }
13
- export function extractKeyAlias(providerKey) {
14
- const parts = providerKey.split('.');
15
- if (parts.length === 3) {
16
- return normalizeAliasDescriptor(parts[1]);
17
- }
18
- return null;
19
- }
20
- export function extractKeyIndex(providerKey) {
21
- const parts = providerKey.split('.');
22
- if (parts.length === 2) {
23
- const index = parseInt(parts[1], 10);
24
- if (!isNaN(index) && index > 0) {
25
- return index;
26
- }
27
- }
28
- return undefined;
29
- }
30
- export function getProviderModelId(providerKey, providerRegistry) {
31
- const profile = providerRegistry.get(providerKey);
32
- if (profile.modelId) {
33
- return profile.modelId;
34
- }
35
- const parts = providerKey.split('.');
36
- if (parts.length === 2) {
37
- return parts[1] || null;
38
- }
39
- if (parts.length === 3) {
40
- return parts[2] || null;
41
- }
42
- return null;
43
- }
1
+ export { extractProviderId, normalizeAliasDescriptor, extractKeyAlias, extractKeyIndex, getProviderModelId } from '../../engine-selection/key-parsing.js';
@@ -1,6 +1,6 @@
1
1
  import type { RouterMetadataInput } from '../../types.js';
2
2
  import type { RoutingInstructionState } from '../../routing-instructions.js';
3
- type RoutingInstructionStateStoreLike = {
3
+ export type RoutingInstructionStateStoreLike = {
4
4
  loadSync: (key: string) => RoutingInstructionState | null;
5
5
  saveAsync: (key: string, state: RoutingInstructionState | null) => void;
6
6
  saveSync?: (key: string, state: RoutingInstructionState | null) => void;
@@ -8,4 +8,3 @@ type RoutingInstructionStateStoreLike = {
8
8
  export declare function resolveStopMessageScope(metadata: RouterMetadataInput): string | undefined;
9
9
  export declare function getRoutingInstructionState(stickyKey: string | undefined, routingInstructionState: Map<string, RoutingInstructionState>, routingStateStore: RoutingInstructionStateStoreLike): RoutingInstructionState;
10
10
  export declare function persistRoutingInstructionState(key: string, state: RoutingInstructionState, routingStateStore: RoutingInstructionStateStoreLike): void;
11
- export {};
@@ -1,18 +1,41 @@
1
1
  import { mergeStopMessageFromPersisted } from '../../stop-message-state-sync.js';
2
+ function readToken(value) {
3
+ if (typeof value !== 'string') {
4
+ return '';
5
+ }
6
+ const trimmed = value.trim();
7
+ return trimmed || '';
8
+ }
9
+ function isPersistentScopeKey(key) {
10
+ if (!key) {
11
+ return false;
12
+ }
13
+ return key.startsWith('session:')
14
+ || key.startsWith('conversation:')
15
+ || key.startsWith('tmux:');
16
+ }
2
17
  export function resolveStopMessageScope(metadata) {
3
- const sessionId = typeof metadata?.sessionId === 'string' ? String(metadata.sessionId).trim() : '';
4
- if (sessionId) {
5
- return `session:${sessionId}`;
18
+ const explicitScope = readToken(metadata?.stopMessageClientInjectSessionScope)
19
+ || readToken(metadata?.stopMessageClientInjectScope);
20
+ if (explicitScope && explicitScope.startsWith('tmux:')) {
21
+ return explicitScope;
22
+ }
23
+ const tmuxSessionId = readToken(metadata?.clientTmuxSessionId)
24
+ || readToken(metadata?.client_tmux_session_id)
25
+ || readToken(metadata?.tmuxSessionId)
26
+ || readToken(metadata?.tmux_session_id);
27
+ if (tmuxSessionId) {
28
+ return `tmux:${tmuxSessionId}`;
6
29
  }
7
30
  return undefined;
8
31
  }
9
32
  export function getRoutingInstructionState(stickyKey, routingInstructionState, routingStateStore) {
10
33
  const key = stickyKey || 'default';
11
34
  const existing = routingInstructionState.get(key);
12
- // 对 session:/conversation: 作用域,在每次读取时尝试从磁盘刷新 stopMessage 相关字段,
35
+ // 对 session:/conversation:/tmux: 作用域,在每次读取时尝试从磁盘刷新 stopMessage 相关字段,
13
36
  // 确保 servertool(如 stop_message_auto)通过 sticky-session-store 更新的使用次数
14
37
  // 能在 VirtualRouter 日志中实时反映出来。
15
- if (existing && (key.startsWith('session:') || key.startsWith('conversation:'))) {
38
+ if (existing && isPersistentScopeKey(key)) {
16
39
  try {
17
40
  const persisted = routingStateStore.loadSync(key);
18
41
  const merged = mergeStopMessageFromPersisted(existing, persisted);
@@ -22,6 +45,10 @@ export function getRoutingInstructionState(stickyKey, routingInstructionState, r
22
45
  existing.stopMessageUsed = merged.stopMessageUsed;
23
46
  existing.stopMessageUpdatedAt = merged.stopMessageUpdatedAt;
24
47
  existing.stopMessageLastUsedAt = merged.stopMessageLastUsedAt;
48
+ existing.stopMessageStageMode = merged.stopMessageStageMode;
49
+ existing.stopMessageAiMode = merged.stopMessageAiMode;
50
+ existing.stopMessageAiSeedPrompt = merged.stopMessageAiSeedPrompt;
51
+ existing.stopMessageAiHistory = merged.stopMessageAiHistory;
25
52
  if (persisted) {
26
53
  existing.preCommandSource = persisted.preCommandSource;
27
54
  existing.preCommandScriptPath = persisted.preCommandScriptPath;
@@ -34,8 +61,8 @@ export function getRoutingInstructionState(stickyKey, routingInstructionState, r
34
61
  return existing;
35
62
  }
36
63
  let initial = null;
37
- // 仅对 session:/conversation: 作用域的 key 尝试从磁盘恢复持久化状态
38
- if (key.startsWith('session:') || key.startsWith('conversation:')) {
64
+ // 仅对 session:/conversation:/tmux: 作用域的 key 尝试从磁盘恢复持久化状态
65
+ if (isPersistentScopeKey(key)) {
39
66
  initial = routingStateStore.loadSync(key);
40
67
  }
41
68
  if (!initial) {
@@ -52,6 +79,10 @@ export function getRoutingInstructionState(stickyKey, routingInstructionState, r
52
79
  stopMessageUsed: undefined,
53
80
  stopMessageUpdatedAt: undefined,
54
81
  stopMessageLastUsedAt: undefined,
82
+ stopMessageStageMode: undefined,
83
+ stopMessageAiMode: undefined,
84
+ stopMessageAiSeedPrompt: undefined,
85
+ stopMessageAiHistory: undefined,
55
86
  preCommandSource: undefined,
56
87
  preCommandScriptPath: undefined,
57
88
  preCommandUpdatedAt: undefined
@@ -74,8 +105,8 @@ function isRoutingStateEmpty(state) {
74
105
  const noStopMessage = (!state.stopMessageText || !state.stopMessageText.trim()) &&
75
106
  (typeof state.stopMessageMaxRepeats !== 'number' || !Number.isFinite(state.stopMessageMaxRepeats)) &&
76
107
  (typeof state.stopMessageUsed !== 'number' || !Number.isFinite(state.stopMessageUsed)) &&
77
- (typeof state.stopMessageUpdatedAt !== 'number' || !Number.isFinite(state.stopMessageUpdatedAt)) &&
78
- (typeof state.stopMessageLastUsedAt !== 'number' || !Number.isFinite(state.stopMessageLastUsedAt));
108
+ (typeof state.stopMessageStageMode !== 'string' || !state.stopMessageStageMode.trim()) &&
109
+ (typeof state.stopMessageAiMode !== 'string' || !state.stopMessageAiMode.trim());
79
110
  const noPreCommand = (!state.preCommandScriptPath || !state.preCommandScriptPath.trim()) &&
80
111
  (typeof state.preCommandUpdatedAt !== 'number' || !Number.isFinite(state.preCommandUpdatedAt));
81
112
  return (noForced &&
@@ -89,21 +120,26 @@ function isRoutingStateEmpty(state) {
89
120
  noPreCommand);
90
121
  }
91
122
  export function persistRoutingInstructionState(key, state, routingStateStore) {
92
- if (!key || (!key.startsWith('session:') && !key.startsWith('conversation:'))) {
123
+ if (!isPersistentScopeKey(key)) {
93
124
  return;
94
125
  }
95
126
  const supportsSync = typeof routingStateStore.saveSync === 'function';
127
+ const shouldUseSyncForSession = supportsSync && (key.startsWith('session:')
128
+ || key.startsWith('tmux:'));
96
129
  const prefersSync = supportsSync &&
97
- key.startsWith('session:') &&
130
+ (key.startsWith('session:')
131
+ || key.startsWith('tmux:')) &&
98
132
  (Boolean(state.stopMessageText && state.stopMessageText.trim()) ||
99
133
  (typeof state.stopMessageMaxRepeats === 'number' && Number.isFinite(state.stopMessageMaxRepeats)) ||
100
134
  (typeof state.stopMessageUsed === 'number' && Number.isFinite(state.stopMessageUsed)) ||
101
- (typeof state.stopMessageUpdatedAt === 'number' && Number.isFinite(state.stopMessageUpdatedAt)) ||
102
- (typeof state.stopMessageLastUsedAt === 'number' && Number.isFinite(state.stopMessageLastUsedAt)) ||
135
+ Boolean(state.stopMessageStageMode && state.stopMessageStageMode.trim()) ||
136
+ Boolean(state.stopMessageAiMode && state.stopMessageAiMode.trim()) ||
103
137
  Boolean(state.preCommandScriptPath && state.preCommandScriptPath.trim()) ||
104
138
  (typeof state.preCommandUpdatedAt === 'number' && Number.isFinite(state.preCommandUpdatedAt)));
105
139
  if (isRoutingStateEmpty(state)) {
106
- if (prefersSync) {
140
+ // For session scope, clear must be sync to avoid stale persisted snapshots
141
+ // being reloaded immediately by same-request readers.
142
+ if (shouldUseSyncForSession) {
107
143
  routingStateStore.saveSync(key, null);
108
144
  }
109
145
  else {
@@ -0,0 +1,11 @@
1
+ import type { ProviderQuotaView } from '../types.js';
2
+ import type { VirtualRouterConfig, VirtualRouterHealthStore } from '../types.js';
3
+ import type { RoutingInstructionStateStoreLike } from '../engine/routing-state/store.js';
4
+ import type { VirtualRouterEngine } from '../engine-legacy.js';
5
+ export declare function updateDeps(engine: VirtualRouterEngine, deps: {
6
+ healthStore?: VirtualRouterHealthStore | null;
7
+ routingStateStore?: RoutingInstructionStateStoreLike | null;
8
+ quotaView?: ProviderQuotaView | null;
9
+ }): void;
10
+ export declare function initialize(engine: VirtualRouterEngine, config: VirtualRouterConfig): void;
11
+ export declare function validateConfig(engine: VirtualRouterEngine, config: VirtualRouterConfig): void;
@@ -0,0 +1,108 @@
1
+ import { RouteLoadBalancer } from '../load-balancer.js';
2
+ import { StickySessionManager } from '../engine/sticky-session-manager.js';
3
+ import { RoutingClassifier } from '../classifier.js';
4
+ import { loadRoutingInstructionStateSync, saveRoutingInstructionStateAsync, saveRoutingInstructionStateSync } from '../sticky-session-store.js';
5
+ import { resolveAntigravityAliasReuseCooldownMs, hydrateAntigravityAliasLeaseStoreIfNeeded } from '../engine/antigravity/alias-lease.js';
6
+ import { routeHasTargets, hasPrimaryPool } from './route-utils.js';
7
+ import { DEFAULT_ROUTE, VirtualRouterError, VirtualRouterErrorCode } from '../types.js';
8
+ export function updateDeps(engine, deps) {
9
+ if (!deps || typeof deps !== 'object') {
10
+ return;
11
+ }
12
+ if ('healthStore' in deps) {
13
+ engine.healthStore = deps.healthStore ?? undefined;
14
+ engine.cooldownManager.updateDeps({ healthStore: engine.healthStore });
15
+ }
16
+ if ('routingStateStore' in deps) {
17
+ engine.routingStateStore =
18
+ deps.routingStateStore ??
19
+ {
20
+ loadSync: loadRoutingInstructionStateSync,
21
+ saveAsync: saveRoutingInstructionStateAsync,
22
+ saveSync: saveRoutingInstructionStateSync
23
+ };
24
+ // Routing state store changes require clearing in-memory cache to avoid stale reads.
25
+ engine.routingInstructionState.clear();
26
+ }
27
+ if ('quotaView' in deps) {
28
+ const prevQuotaEnabled = Boolean(engine.quotaView);
29
+ engine.quotaView = deps.quotaView ?? undefined;
30
+ engine.cooldownManager.updateDeps({ quotaView: engine.quotaView });
31
+ const nextQuotaEnabled = Boolean(engine.quotaView);
32
+ // When quotaView is enabled, health/cooldown decisions must be driven by quotaView only.
33
+ // - Enabling quotaView: clear any legacy router-local cooldown TTLs immediately.
34
+ // - Disabling quotaView: reload legacy cooldown state from health snapshots.
35
+ if (!prevQuotaEnabled && nextQuotaEnabled) {
36
+ engine.cooldownManager.clearAllCooldowns();
37
+ }
38
+ else if (prevQuotaEnabled && !nextQuotaEnabled) {
39
+ engine.cooldownManager.clearAllCooldowns();
40
+ engine.restoreHealthFromStore();
41
+ }
42
+ }
43
+ }
44
+ export function initialize(engine, config) {
45
+ validateConfig(engine, config);
46
+ engine.routing = config.routing;
47
+ engine.providerRegistry.load(config.providers);
48
+ engine.healthManager.configure(config.health);
49
+ engine.healthConfig = config.health ?? null;
50
+ engine.healthManager.registerProviders(Object.keys(config.providers));
51
+ engine.cooldownManager.clearAllCooldowns();
52
+ engine.restoreHealthFromStore();
53
+ engine.loadBalancer = new RouteLoadBalancer(config.loadBalancing);
54
+ const aliasReuseCooldownMs = resolveAntigravityAliasReuseCooldownMs(config);
55
+ engine.stickySessionManager = new StickySessionManager(aliasReuseCooldownMs);
56
+ hydrateAntigravityAliasLeaseStoreIfNeeded({
57
+ force: true,
58
+ leaseStore: engine.stickySessionManager.getAllStores().aliasLeaseStore,
59
+ persistence: engine.antigravityLeasePersistence,
60
+ aliasReuseCooldownMs: engine.stickySessionManager.getAliasReuseCooldownMs()
61
+ });
62
+ engine.classifier = new RoutingClassifier(config.classifier);
63
+ engine.contextRouting = config.contextRouting ?? { warnRatio: 0.9, hardLimit: false };
64
+ engine.contextAdvisor.configure(engine.contextRouting);
65
+ engine.webSearchForce = config.webSearch?.force === true;
66
+ engine.routeAnalytics.getAllRouteStats().clear();
67
+ for (const routeName of Object.keys(engine.routing)) {
68
+ engine.routeAnalytics.getRouteStats(routeName) ||
69
+ engine.routeAnalytics.incrementRouteStat(routeName, '', {
70
+ timestampMs: Date.now(),
71
+ stopMessage: { active: false }
72
+ });
73
+ }
74
+ }
75
+ export function validateConfig(engine, config) {
76
+ if (!config.routing || typeof config.routing !== 'object') {
77
+ throw new VirtualRouterError('routing configuration is required', VirtualRouterErrorCode.CONFIG_ERROR);
78
+ }
79
+ if (!config.providers || Object.keys(config.providers).length === 0) {
80
+ throw new VirtualRouterError('providers configuration is required', VirtualRouterErrorCode.CONFIG_ERROR);
81
+ }
82
+ const defaultPools = config.routing[DEFAULT_ROUTE];
83
+ if (!routeHasTargets(engine, defaultPools)) {
84
+ throw new VirtualRouterError('default route must be configured with at least one provider', VirtualRouterErrorCode.CONFIG_ERROR);
85
+ }
86
+ if (!hasPrimaryPool(engine, defaultPools)) {
87
+ throw new VirtualRouterError('default route must define at least one non-backup pool', VirtualRouterErrorCode.CONFIG_ERROR);
88
+ }
89
+ const providerKeys = new Set(Object.keys(config.providers));
90
+ for (const [routeName, pools] of Object.entries(config.routing)) {
91
+ if (!routeHasTargets(engine, pools)) {
92
+ if (routeName === DEFAULT_ROUTE) {
93
+ throw new VirtualRouterError('default route cannot be empty', VirtualRouterErrorCode.CONFIG_ERROR);
94
+ }
95
+ continue;
96
+ }
97
+ for (const pool of pools) {
98
+ if (!Array.isArray(pool.targets) || !pool.targets.length) {
99
+ continue;
100
+ }
101
+ for (const providerKey of pool.targets) {
102
+ if (!providerKeys.has(providerKey)) {
103
+ throw new VirtualRouterError(`Route ${routeName} references unknown provider ${providerKey}`, VirtualRouterErrorCode.CONFIG_ERROR);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
@@ -0,0 +1,10 @@
1
+ import type { RoutingFeatures } from '../types.js';
2
+ import type { VirtualRouterEngine } from '../engine-legacy.js';
3
+ export declare function parseDirectProviderModel(engine: VirtualRouterEngine, model: string | undefined): {
4
+ providerId: string;
5
+ modelId: string;
6
+ } | null;
7
+ export declare function shouldFallbackDirectModelForMedia(engine: VirtualRouterEngine, direct: {
8
+ providerId: string;
9
+ modelId: string;
10
+ }, features: RoutingFeatures): boolean;