@jsonstudio/rcc 0.90.872 → 0.90.1270

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 (837) hide show
  1. package/README.md +5 -6
  2. package/configsamples/provider-default/ali-coding-plan/config.v2.json +6 -1
  3. package/configsamples/provider-default/antigravity/config.v2.json +6 -1
  4. package/configsamples/provider-default/ark-coding-plan/config.v2.json +7 -2
  5. package/configsamples/provider-default/crs/config.v2.json +6 -1
  6. package/configsamples/provider-default/deepseek-web/config.v2.json +6 -1
  7. package/configsamples/provider-default/gemini/config.v2.json +6 -1
  8. package/configsamples/provider-default/gemini-cli/config.v2.json +6 -1
  9. package/configsamples/provider-default/gemini-native/config.v2.json +6 -1
  10. package/configsamples/provider-default/glm/config.v2.json +7 -2
  11. package/configsamples/provider-default/glm-anthropic/config.v2.json +6 -1
  12. package/configsamples/provider-default/kimi/config.v2.json +7 -2
  13. package/configsamples/provider-default/lmstudio/config.v2.json +6 -1
  14. package/configsamples/provider-default/lmstudio-proxy/config.v2.json +6 -1
  15. package/configsamples/provider-default/manifest.json +0 -1
  16. package/configsamples/provider-default/meituan/config.v2.json +6 -1
  17. package/configsamples/provider-default/mimo/config.v2.json +7 -2
  18. package/configsamples/provider-default/modelscope/config.v2.json +7 -2
  19. package/configsamples/provider-default/my-openai/config.v2.json +6 -1
  20. package/configsamples/provider-default/nvidia/config.v2.json +7 -2
  21. package/configsamples/provider-default/opencode-zen-free/config.v2.json +6 -1
  22. package/configsamples/provider-default/openrouter/config.v2.json +6 -1
  23. package/configsamples/provider-default/qwen/config.v2.json +11 -1
  24. package/configsamples/provider-default/tab/config.v2.json +6 -1
  25. package/configsamples/provider-default/tabglm/config.v2.json +7 -2
  26. package/dist/build-info.js +2 -2
  27. package/dist/build-info.js.map +1 -1
  28. package/dist/cli/commands/camoufox.js +44 -3
  29. package/dist/cli/commands/camoufox.js.map +1 -1
  30. package/dist/cli/commands/config.js +2 -2
  31. package/dist/cli/commands/config.js.map +1 -1
  32. package/dist/cli/commands/heartbeat.js +82 -27
  33. package/dist/cli/commands/heartbeat.js.map +1 -1
  34. package/dist/cli/commands/init.js +1 -2
  35. package/dist/cli/commands/init.js.map +1 -1
  36. package/dist/cli/commands/launcher/utils.js +37 -24
  37. package/dist/cli/commands/launcher/utils.js.map +1 -1
  38. package/dist/cli/commands/launcher-kernel.js +6 -3
  39. package/dist/cli/commands/launcher-kernel.js.map +1 -1
  40. package/dist/cli/commands/restart.js +102 -31
  41. package/dist/cli/commands/restart.js.map +1 -1
  42. package/dist/cli/commands/start-types.d.ts +1 -0
  43. package/dist/cli/commands/start-utils.d.ts +1 -0
  44. package/dist/cli/commands/start-utils.js +3 -0
  45. package/dist/cli/commands/start-utils.js.map +1 -1
  46. package/dist/cli/commands/start.js +217 -51
  47. package/dist/cli/commands/start.js.map +1 -1
  48. package/dist/cli/commands/status.js +48 -9
  49. package/dist/cli/commands/status.js.map +1 -1
  50. package/dist/cli/config/bootstrap-provider-templates.js +1 -1
  51. package/dist/cli/config/bootstrap-provider-templates.js.map +1 -1
  52. package/dist/cli/config/init-provider-catalog.js +3 -50
  53. package/dist/cli/config/init-provider-catalog.js.map +1 -1
  54. package/dist/cli/config/init-v2-builder.js +0 -1
  55. package/dist/cli/config/init-v2-builder.js.map +1 -1
  56. package/dist/cli/guardian/client.js +40 -18
  57. package/dist/cli/guardian/client.js.map +1 -1
  58. package/dist/cli/server/port-utils.d.ts +5 -0
  59. package/dist/cli/server/port-utils.js +45 -31
  60. package/dist/cli/server/port-utils.js.map +1 -1
  61. package/dist/commands/camoufox-fp.js +1 -1
  62. package/dist/commands/camoufox-fp.js.map +1 -1
  63. package/dist/commands/oauth.js +48 -64
  64. package/dist/commands/oauth.js.map +1 -1
  65. package/dist/commands/provider-update-maintenance.js +4 -4
  66. package/dist/commands/provider-update-maintenance.js.map +1 -1
  67. package/dist/commands/token-daemon.js +38 -10
  68. package/dist/commands/token-daemon.js.map +1 -1
  69. package/dist/commands/validate.js +31 -3
  70. package/dist/commands/validate.js.map +1 -1
  71. package/dist/config/provider-v2-loader.d.ts +5 -2
  72. package/dist/config/provider-v2-loader.js +80 -26
  73. package/dist/config/provider-v2-loader.js.map +1 -1
  74. package/dist/config/routecodex-config-loader.d.ts +1 -0
  75. package/dist/config/routecodex-config-loader.js +18 -207
  76. package/dist/config/routecodex-config-loader.js.map +1 -1
  77. package/dist/config/virtual-router-builder.d.ts +3 -2
  78. package/dist/config/virtual-router-builder.js +4 -214
  79. package/dist/config/virtual-router-builder.js.map +1 -1
  80. package/dist/constants/index.d.ts +2 -3
  81. package/dist/constants/index.js +2 -4
  82. package/dist/constants/index.js.map +1 -1
  83. package/dist/error-handling/route-error-hub.js +1 -0
  84. package/dist/error-handling/route-error-hub.js.map +1 -1
  85. package/dist/index.js +98 -21
  86. package/dist/index.js.map +1 -1
  87. package/dist/manager/modules/quota/antigravity-quota-manager.d.ts +1 -1
  88. package/dist/manager/modules/quota/antigravity-quota-manager.js +21 -12
  89. package/dist/manager/modules/quota/antigravity-quota-manager.js.map +1 -1
  90. package/dist/manager/modules/quota/antigravity-quota-runtime.d.ts +1 -1
  91. package/dist/manager/modules/quota/antigravity-quota-runtime.js +32 -45
  92. package/dist/manager/modules/quota/antigravity-quota-runtime.js.map +1 -1
  93. package/dist/manager/modules/quota/provider-key-normalization.js +10 -1
  94. package/dist/manager/modules/quota/provider-key-normalization.js.map +1 -1
  95. package/dist/manager/modules/quota/provider-quota-daemon.d.ts +2 -1
  96. package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.d.ts +1 -1
  97. package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.js +22 -12
  98. package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.js.map +1 -1
  99. package/dist/manager/modules/quota/provider-quota-daemon.events.js +69 -33
  100. package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -1
  101. package/dist/manager/modules/quota/provider-quota-daemon.js +47 -35
  102. package/dist/manager/modules/quota/provider-quota-daemon.js.map +1 -1
  103. package/dist/manager/storage/file-store.js +3 -0
  104. package/dist/manager/storage/file-store.js.map +1 -1
  105. package/dist/modules/llmswitch/bridge/antigravity-signature.js +58 -20
  106. package/dist/modules/llmswitch/bridge/antigravity-signature.js.map +1 -1
  107. package/dist/modules/llmswitch/bridge/index.d.ts +1 -1
  108. package/dist/modules/llmswitch/bridge/index.js +1 -1
  109. package/dist/modules/llmswitch/bridge/index.js.map +1 -1
  110. package/dist/modules/llmswitch/bridge/runtime-integrations.d.ts +22 -16
  111. package/dist/modules/llmswitch/bridge/runtime-integrations.js +89 -30
  112. package/dist/modules/llmswitch/bridge/runtime-integrations.js.map +1 -1
  113. package/dist/modules/llmswitch/bridge/snapshot-recorder-runtime.js +10 -9
  114. package/dist/modules/llmswitch/bridge/snapshot-recorder-runtime.js.map +1 -1
  115. package/dist/modules/llmswitch/bridge/snapshot-recorder.js +3 -0
  116. package/dist/modules/llmswitch/bridge/snapshot-recorder.js.map +1 -1
  117. package/dist/modules/llmswitch/bridge/state-integrations.d.ts +1 -0
  118. package/dist/modules/llmswitch/bridge/state-integrations.js +263 -51
  119. package/dist/modules/llmswitch/bridge/state-integrations.js.map +1 -1
  120. package/dist/modules/llmswitch/bridge.d.ts +2 -2
  121. package/dist/modules/llmswitch/bridge.js +2 -2
  122. package/dist/modules/llmswitch/bridge.js.map +1 -1
  123. package/dist/provider-sdk/provider-add-template.d.ts +1 -1
  124. package/dist/provider-sdk/provider-add-template.js.map +1 -1
  125. package/dist/provider-sdk/provider-runtime-inference.js +48 -13
  126. package/dist/provider-sdk/provider-runtime-inference.js.map +1 -1
  127. package/dist/providers/auth/deepseek-account-token-acquirer.d.ts +24 -0
  128. package/dist/providers/auth/deepseek-account-token-acquirer.js +42 -13
  129. package/dist/providers/auth/deepseek-account-token-acquirer.js.map +1 -1
  130. package/dist/providers/auth/oauth-auth.js +12 -5
  131. package/dist/providers/auth/oauth-auth.js.map +1 -1
  132. package/dist/providers/auth/oauth-lifecycle/path-resolver.d.ts +0 -1
  133. package/dist/providers/auth/oauth-lifecycle/path-resolver.js +10 -9
  134. package/dist/providers/auth/oauth-lifecycle/path-resolver.js.map +1 -1
  135. package/dist/providers/auth/oauth-lifecycle/token-helpers.js +0 -1
  136. package/dist/providers/auth/oauth-lifecycle/token-helpers.js.map +1 -1
  137. package/dist/providers/auth/oauth-lifecycle/token-io.js +18 -8
  138. package/dist/providers/auth/oauth-lifecycle/token-io.js.map +1 -1
  139. package/dist/providers/auth/oauth-lifecycle.d.ts +5 -0
  140. package/dist/providers/auth/oauth-lifecycle.js +370 -353
  141. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  142. package/dist/providers/auth/oauth-repair-env.js +0 -26
  143. package/dist/providers/auth/oauth-repair-env.js.map +1 -1
  144. package/dist/providers/auth/qwen-userinfo-helper.d.ts +11 -0
  145. package/dist/providers/auth/qwen-userinfo-helper.js +85 -13
  146. package/dist/providers/auth/qwen-userinfo-helper.js.map +1 -1
  147. package/dist/providers/auth/token-refresh/token-state.js +1 -4
  148. package/dist/providers/auth/token-refresh/token-state.js.map +1 -1
  149. package/dist/providers/auth/token-scanner/index.d.ts +1 -1
  150. package/dist/providers/auth/token-scanner/index.js +2 -2
  151. package/dist/providers/auth/token-storage/token-file-resolver.js +0 -3
  152. package/dist/providers/auth/token-storage/token-file-resolver.js.map +1 -1
  153. package/dist/providers/auth/token-storage/token-persistence.js +10 -3
  154. package/dist/providers/auth/token-storage/token-persistence.js.map +1 -1
  155. package/dist/providers/auth/tokenfile-auth.d.ts +0 -1
  156. package/dist/providers/auth/tokenfile-auth.js +23 -30
  157. package/dist/providers/auth/tokenfile-auth.js.map +1 -1
  158. package/dist/providers/core/api/provider-config.d.ts +1 -1
  159. package/dist/providers/core/api/provider-types.d.ts +2 -1
  160. package/dist/providers/core/config/camoufox-actions.js +23 -15
  161. package/dist/providers/core/config/camoufox-actions.js.map +1 -1
  162. package/dist/providers/core/config/camoufox-launcher.js +235 -121
  163. package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
  164. package/dist/providers/core/config/oauth-flows.js +23 -1
  165. package/dist/providers/core/config/oauth-flows.js.map +1 -1
  166. package/dist/providers/core/config/provider-oauth-configs.js +2 -93
  167. package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
  168. package/dist/providers/core/config/service-profiles.d.ts +0 -1
  169. package/dist/providers/core/config/service-profiles.js +23 -66
  170. package/dist/providers/core/config/service-profiles.js.map +1 -1
  171. package/dist/providers/core/runtime/base-provider-runtime-helpers.js +4 -1
  172. package/dist/providers/core/runtime/base-provider-runtime-helpers.js.map +1 -1
  173. package/dist/providers/core/runtime/base-provider.js +21 -11
  174. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  175. package/dist/providers/core/runtime/deepseek-http-provider-helpers.d.ts +1 -0
  176. package/dist/providers/core/runtime/deepseek-http-provider-helpers.js +28 -0
  177. package/dist/providers/core/runtime/deepseek-http-provider-helpers.js.map +1 -1
  178. package/dist/providers/core/runtime/deepseek-http-provider.d.ts +0 -2
  179. package/dist/providers/core/runtime/deepseek-http-provider.js +3 -33
  180. package/dist/providers/core/runtime/deepseek-http-provider.js.map +1 -1
  181. package/dist/providers/core/runtime/http-request-executor.d.ts +1 -0
  182. package/dist/providers/core/runtime/http-request-executor.js +131 -47
  183. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  184. package/dist/providers/core/runtime/http-transport-provider.d.ts +5 -5
  185. package/dist/providers/core/runtime/http-transport-provider.js +97 -38
  186. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  187. package/dist/providers/core/runtime/openai-responses-sdk-transport.js +2 -1
  188. package/dist/providers/core/runtime/openai-responses-sdk-transport.js.map +1 -1
  189. package/dist/providers/core/runtime/provider-error-classifier.js +19 -126
  190. package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
  191. package/dist/providers/core/runtime/provider-factory-helpers.d.ts +1 -0
  192. package/dist/providers/core/runtime/provider-factory-helpers.js +8 -12
  193. package/dist/providers/core/runtime/provider-factory-helpers.js.map +1 -1
  194. package/dist/providers/core/runtime/provider-factory.js +2 -9
  195. package/dist/providers/core/runtime/provider-factory.js.map +1 -1
  196. package/dist/providers/core/runtime/provider-failure-policy.d.ts +135 -0
  197. package/dist/providers/core/runtime/provider-failure-policy.js +685 -0
  198. package/dist/providers/core/runtime/provider-failure-policy.js.map +1 -0
  199. package/dist/providers/core/runtime/provider-family-profile-utils.d.ts +0 -10
  200. package/dist/providers/core/runtime/provider-family-profile-utils.js +0 -28
  201. package/dist/providers/core/runtime/provider-family-profile-utils.js.map +1 -1
  202. package/dist/providers/core/runtime/provider-http-executor-utils.js +40 -1
  203. package/dist/providers/core/runtime/provider-http-executor-utils.js.map +1 -1
  204. package/dist/providers/core/runtime/provider-request-header-orchestrator.d.ts +0 -2
  205. package/dist/providers/core/runtime/provider-request-header-orchestrator.js +35 -8
  206. package/dist/providers/core/runtime/provider-request-header-orchestrator.js.map +1 -1
  207. package/dist/providers/core/runtime/provider-response-postprocessor.js +3 -23
  208. package/dist/providers/core/runtime/provider-response-postprocessor.js.map +1 -1
  209. package/dist/providers/core/runtime/provider-runtime-utils.js +4 -1
  210. package/dist/providers/core/runtime/provider-runtime-utils.js.map +1 -1
  211. package/dist/providers/core/runtime/provider-startup-tasks.js +18 -2
  212. package/dist/providers/core/runtime/provider-startup-tasks.js.map +1 -1
  213. package/dist/providers/core/runtime/responses-provider-helpers.d.ts +1 -0
  214. package/dist/providers/core/runtime/responses-provider-helpers.js +11 -12
  215. package/dist/providers/core/runtime/responses-provider-helpers.js.map +1 -1
  216. package/dist/providers/core/runtime/responses-provider.js +15 -10
  217. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  218. package/dist/providers/core/runtime/standard-tool-text-harvest.js +10 -2
  219. package/dist/providers/core/runtime/standard-tool-text-harvest.js.map +1 -1
  220. package/dist/providers/core/runtime/transport/auth-provider-factory.d.ts +0 -1
  221. package/dist/providers/core/runtime/transport/auth-provider-factory.js +1 -15
  222. package/dist/providers/core/runtime/transport/auth-provider-factory.js.map +1 -1
  223. package/dist/providers/core/runtime/transport/index.d.ts +0 -1
  224. package/dist/providers/core/runtime/transport/index.js +0 -1
  225. package/dist/providers/core/runtime/transport/index.js.map +1 -1
  226. package/dist/providers/core/runtime/transport/oauth-recovery-handler.d.ts +2 -0
  227. package/dist/providers/core/runtime/transport/oauth-recovery-handler.js +76 -5
  228. package/dist/providers/core/runtime/transport/oauth-recovery-handler.js.map +1 -1
  229. package/dist/providers/core/runtime/transport/request-header-builder.d.ts +0 -1
  230. package/dist/providers/core/runtime/transport/request-header-builder.js +1 -7
  231. package/dist/providers/core/runtime/transport/request-header-builder.js.map +1 -1
  232. package/dist/providers/core/runtime/transport/runtime-detector.d.ts +0 -2
  233. package/dist/providers/core/runtime/transport/runtime-detector.js +0 -20
  234. package/dist/providers/core/runtime/transport/runtime-detector.js.map +1 -1
  235. package/dist/providers/core/runtime/transport/session-header-utils.d.ts +6 -0
  236. package/dist/providers/core/runtime/transport/session-header-utils.js +61 -2
  237. package/dist/providers/core/runtime/transport/session-header-utils.js.map +1 -1
  238. package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-request-exec.js +2 -1
  239. package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-request-exec.js.map +1 -1
  240. package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js +2 -1
  241. package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js.map +1 -1
  242. package/dist/providers/core/strategies/oauth-auth-code-flow.d.ts +1 -4
  243. package/dist/providers/core/strategies/oauth-auth-code-flow.js +26 -84
  244. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  245. package/dist/providers/core/strategies/oauth-device-flow.d.ts +2 -0
  246. package/dist/providers/core/strategies/oauth-device-flow.js +43 -8
  247. package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
  248. package/dist/providers/core/utils/http-client.d.ts +7 -5
  249. package/dist/providers/core/utils/http-client.js +108 -33
  250. package/dist/providers/core/utils/http-client.js.map +1 -1
  251. package/dist/providers/core/utils/provider-error-reporter.d.ts +2 -2
  252. package/dist/providers/core/utils/provider-error-reporter.js +9 -85
  253. package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
  254. package/dist/providers/core/utils/provider-type-utils.js +1 -3
  255. package/dist/providers/core/utils/provider-type-utils.js.map +1 -1
  256. package/dist/providers/core/utils/qwen-client-fingerprint.d.ts +15 -0
  257. package/dist/providers/core/utils/qwen-client-fingerprint.js +47 -0
  258. package/dist/providers/core/utils/qwen-client-fingerprint.js.map +1 -0
  259. package/dist/providers/core/utils/snapshot-writer.d.ts +3 -0
  260. package/dist/providers/core/utils/snapshot-writer.js +385 -26
  261. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  262. package/dist/providers/profile/families/qwen-profile.js +285 -22
  263. package/dist/providers/profile/families/qwen-profile.js.map +1 -1
  264. package/dist/providers/profile/profile-registry.js +0 -2
  265. package/dist/providers/profile/profile-registry.js.map +1 -1
  266. package/dist/providers/profile/provider-directory.js +0 -1
  267. package/dist/providers/profile/provider-directory.js.map +1 -1
  268. package/dist/providers/profile/provider-profile-loader.js +1 -1
  269. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  270. package/dist/server/handlers/chat-handler.js +6 -5
  271. package/dist/server/handlers/chat-handler.js.map +1 -1
  272. package/dist/server/handlers/config-admin-handler.js +44 -69
  273. package/dist/server/handlers/config-admin-handler.js.map +1 -1
  274. package/dist/server/handlers/handler-response-utils.js +190 -27
  275. package/dist/server/handlers/handler-response-utils.js.map +1 -1
  276. package/dist/server/handlers/handler-utils.d.ts +3 -0
  277. package/dist/server/handlers/handler-utils.js +72 -0
  278. package/dist/server/handlers/handler-utils.js.map +1 -1
  279. package/dist/server/handlers/images-handler.js +7 -7
  280. package/dist/server/handlers/images-handler.js.map +1 -1
  281. package/dist/server/handlers/messages-handler.js +6 -5
  282. package/dist/server/handlers/messages-handler.js.map +1 -1
  283. package/dist/server/handlers/responses-handler.js +32 -14
  284. package/dist/server/handlers/responses-handler.js.map +1 -1
  285. package/dist/server/handlers/sse-dispatcher.js +55 -13
  286. package/dist/server/handlers/sse-dispatcher.js.map +1 -1
  287. package/dist/server/handlers/types.d.ts +12 -0
  288. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +5 -2
  289. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -1
  290. package/dist/server/runtime/http-server/daemon-admin/control-handler.js +62 -18
  291. package/dist/server/runtime/http-server/daemon-admin/control-handler.js.map +1 -1
  292. package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.js +1 -1
  293. package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.js.map +1 -1
  294. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +9 -9
  295. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
  296. package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js +36 -10
  297. package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js.map +1 -1
  298. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +11 -11
  299. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -1
  300. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +49 -8
  301. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -1
  302. package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +1 -0
  303. package/dist/server/runtime/http-server/daemon-admin-routes.js +46 -0
  304. package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -1
  305. package/dist/server/runtime/http-server/executor/client-injection-flow.js +2 -0
  306. package/dist/server/runtime/http-server/executor/client-injection-flow.js.map +1 -1
  307. package/dist/server/runtime/http-server/executor/log-rollup.d.ts +38 -0
  308. package/dist/server/runtime/http-server/executor/log-rollup.js +775 -0
  309. package/dist/server/runtime/http-server/executor/log-rollup.js.map +1 -0
  310. package/dist/server/runtime/http-server/executor/provider-response-converter.js +654 -281
  311. package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -1
  312. package/dist/server/runtime/http-server/executor/provider-response-utils.js +34 -3
  313. package/dist/server/runtime/http-server/executor/provider-response-utils.js.map +1 -1
  314. package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js +14 -68
  315. package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js.map +1 -1
  316. package/dist/server/runtime/http-server/executor/request-executor-core-utils.js +26 -2
  317. package/dist/server/runtime/http-server/executor/request-executor-core-utils.js.map +1 -1
  318. package/dist/server/runtime/http-server/executor/request-retry-helpers.js +20 -2
  319. package/dist/server/runtime/http-server/executor/request-retry-helpers.js.map +1 -1
  320. package/dist/server/runtime/http-server/executor/servertool-adapter-context.d.ts +10 -0
  321. package/dist/server/runtime/http-server/executor/servertool-adapter-context.js +120 -0
  322. package/dist/server/runtime/http-server/executor/servertool-adapter-context.js.map +1 -0
  323. package/dist/server/runtime/http-server/executor/servertool-followup-dispatch.d.ts +35 -0
  324. package/dist/server/runtime/http-server/executor/servertool-followup-dispatch.js +101 -0
  325. package/dist/server/runtime/http-server/executor/servertool-followup-dispatch.js.map +1 -0
  326. package/dist/server/runtime/http-server/executor/servertool-followup-error.d.ts +46 -0
  327. package/dist/server/runtime/http-server/executor/servertool-followup-error.js +127 -0
  328. package/dist/server/runtime/http-server/executor/servertool-followup-error.js.map +1 -0
  329. package/dist/server/runtime/http-server/executor/servertool-followup-metadata.d.ts +7 -0
  330. package/dist/server/runtime/http-server/executor/servertool-followup-metadata.js +186 -0
  331. package/dist/server/runtime/http-server/executor/servertool-followup-metadata.js.map +1 -0
  332. package/dist/server/runtime/http-server/executor/servertool-request-normalizer.d.ts +2 -0
  333. package/dist/server/runtime/http-server/executor/servertool-request-normalizer.js +56 -0
  334. package/dist/server/runtime/http-server/executor/servertool-request-normalizer.js.map +1 -0
  335. package/dist/server/runtime/http-server/executor/servertool-response-normalizer.d.ts +8 -0
  336. package/dist/server/runtime/http-server/executor/servertool-response-normalizer.js +31 -0
  337. package/dist/server/runtime/http-server/executor/servertool-response-normalizer.js.map +1 -0
  338. package/dist/server/runtime/http-server/executor/servertool-runtime-log.d.ts +8 -0
  339. package/dist/server/runtime/http-server/executor/servertool-runtime-log.js +33 -0
  340. package/dist/server/runtime/http-server/executor/servertool-runtime-log.js.map +1 -0
  341. package/dist/server/runtime/http-server/executor/sse-error-handler.js +37 -0
  342. package/dist/server/runtime/http-server/executor/sse-error-handler.js.map +1 -1
  343. package/dist/server/runtime/http-server/executor/usage-aggregator.js +32 -2
  344. package/dist/server/runtime/http-server/executor/usage-aggregator.js.map +1 -1
  345. package/dist/server/runtime/http-server/executor/usage-logger.d.ts +12 -0
  346. package/dist/server/runtime/http-server/executor/usage-logger.js +56 -1
  347. package/dist/server/runtime/http-server/executor/usage-logger.js.map +1 -1
  348. package/dist/server/runtime/http-server/executor-metadata.d.ts +15 -0
  349. package/dist/server/runtime/http-server/executor-metadata.js +60 -18
  350. package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
  351. package/dist/server/runtime/http-server/executor-provider.d.ts +2 -0
  352. package/dist/server/runtime/http-server/executor-provider.js +88 -205
  353. package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
  354. package/dist/server/runtime/http-server/executor-response.js +30 -149
  355. package/dist/server/runtime/http-server/executor-response.js.map +1 -1
  356. package/dist/server/runtime/http-server/http-server-bootstrap.js +53 -17
  357. package/dist/server/runtime/http-server/http-server-bootstrap.js.map +1 -1
  358. package/dist/server/runtime/http-server/http-server-legacy-pipeline.js +28 -1
  359. package/dist/server/runtime/http-server/http-server-legacy-pipeline.js.map +1 -1
  360. package/dist/server/runtime/http-server/http-server-lifecycle.js +17 -4
  361. package/dist/server/runtime/http-server/http-server-lifecycle.js.map +1 -1
  362. package/dist/server/runtime/http-server/http-server-runtime-providers.js +42 -13
  363. package/dist/server/runtime/http-server/http-server-runtime-providers.js.map +1 -1
  364. package/dist/server/runtime/http-server/http-server-runtime-setup.js +40 -2
  365. package/dist/server/runtime/http-server/http-server-runtime-setup.js.map +1 -1
  366. package/dist/server/runtime/http-server/hub-shadow-compare.js +8 -4
  367. package/dist/server/runtime/http-server/hub-shadow-compare.js.map +1 -1
  368. package/dist/server/runtime/http-server/managed-process-probe.js +30 -4
  369. package/dist/server/runtime/http-server/managed-process-probe.js.map +1 -1
  370. package/dist/server/runtime/http-server/middleware.js +32 -4
  371. package/dist/server/runtime/http-server/middleware.js.map +1 -1
  372. package/dist/server/runtime/http-server/provider-traffic-governor.d.ts +45 -1
  373. package/dist/server/runtime/http-server/provider-traffic-governor.js +697 -111
  374. package/dist/server/runtime/http-server/provider-traffic-governor.js.map +1 -1
  375. package/dist/server/runtime/http-server/provider-utils.js +2 -6
  376. package/dist/server/runtime/http-server/provider-utils.js.map +1 -1
  377. package/dist/server/runtime/http-server/request-activity-tracker.d.ts +4 -0
  378. package/dist/server/runtime/http-server/request-activity-tracker.js +54 -11
  379. package/dist/server/runtime/http-server/request-activity-tracker.js.map +1 -1
  380. package/dist/server/runtime/http-server/request-executor.d.ts +247 -0
  381. package/dist/server/runtime/http-server/request-executor.js +2444 -334
  382. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  383. package/dist/server/runtime/http-server/routes.js +59 -16
  384. package/dist/server/runtime/http-server/routes.js.map +1 -1
  385. package/dist/server/runtime/http-server/runtime-manager.js +0 -15
  386. package/dist/server/runtime/http-server/runtime-manager.js.map +1 -1
  387. package/dist/server/runtime/http-server/session-client-registry-utils.js +46 -10
  388. package/dist/server/runtime/http-server/session-client-registry-utils.js.map +1 -1
  389. package/dist/server/runtime/http-server/session-client-registry.js +22 -4
  390. package/dist/server/runtime/http-server/session-client-registry.js.map +1 -1
  391. package/dist/server/runtime/http-server/session-client-routes.js +40 -18
  392. package/dist/server/runtime/http-server/session-client-routes.js.map +1 -1
  393. package/dist/server/runtime/http-server/session-dir.js +35 -2
  394. package/dist/server/runtime/http-server/session-dir.js.map +1 -1
  395. package/dist/server/runtime/http-server/session-scope-resolution.js +38 -9
  396. package/dist/server/runtime/http-server/session-scope-resolution.js.map +1 -1
  397. package/dist/server/runtime/http-server/session-storage-cleanup.js +64 -27
  398. package/dist/server/runtime/http-server/session-storage-cleanup.js.map +1 -1
  399. package/dist/server/runtime/http-server/stats-manager.d.ts +5 -0
  400. package/dist/server/runtime/http-server/stats-manager.js +138 -6
  401. package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
  402. package/dist/server/runtime/http-server/tmux-injection-history.js +30 -4
  403. package/dist/server/runtime/http-server/tmux-injection-history.js.map +1 -1
  404. package/dist/server/runtime/http-server/tmux-session-probe.d.ts +3 -1
  405. package/dist/server/runtime/http-server/tmux-session-probe.js +198 -9
  406. package/dist/server/runtime/http-server/tmux-session-probe.js.map +1 -1
  407. package/dist/server/utils/client-connection-state.d.ts +1 -0
  408. package/dist/server/utils/client-connection-state.js +45 -5
  409. package/dist/server/utils/client-connection-state.js.map +1 -1
  410. package/dist/server/utils/finish-reason.js +61 -2
  411. package/dist/server/utils/finish-reason.js.map +1 -1
  412. package/dist/server/utils/http-error-mapper.d.ts +4 -0
  413. package/dist/server/utils/http-error-mapper.js +31 -6
  414. package/dist/server/utils/http-error-mapper.js.map +1 -1
  415. package/dist/server/utils/stage-logger.js +42 -13
  416. package/dist/server/utils/stage-logger.js.map +1 -1
  417. package/dist/server-lifecycle/port-utils.js +6 -2
  418. package/dist/server-lifecycle/port-utils.js.map +1 -1
  419. package/dist/token-daemon/index.js +44 -15
  420. package/dist/token-daemon/index.js.map +1 -1
  421. package/dist/token-daemon/leader-lock.js +65 -7
  422. package/dist/token-daemon/leader-lock.js.map +1 -1
  423. package/dist/token-daemon/provider-registry.js +1 -1
  424. package/dist/token-daemon/provider-registry.js.map +1 -1
  425. package/dist/token-daemon/server-utils.d.ts +11 -0
  426. package/dist/token-daemon/server-utils.js +71 -18
  427. package/dist/token-daemon/server-utils.js.map +1 -1
  428. package/dist/token-daemon/token-daemon.d.ts +0 -1
  429. package/dist/token-daemon/token-daemon.js +81 -63
  430. package/dist/token-daemon/token-daemon.js.map +1 -1
  431. package/dist/token-daemon/token-types.d.ts +1 -1
  432. package/dist/token-daemon/token-types.js +0 -1
  433. package/dist/token-daemon/token-types.js.map +1 -1
  434. package/dist/token-daemon/token-utils.js +4 -2
  435. package/dist/token-daemon/token-utils.js.map +1 -1
  436. package/dist/tools/provider-update/fetch-models.js +1 -5
  437. package/dist/tools/provider-update/fetch-models.js.map +1 -1
  438. package/dist/utils/error-handler-registry.js +50 -13
  439. package/dist/utils/error-handler-registry.js.map +1 -1
  440. package/dist/utils/errorsamples.d.ts +3 -1
  441. package/dist/utils/errorsamples.js +198 -14
  442. package/dist/utils/errorsamples.js.map +1 -1
  443. package/dist/utils/http-health-probe.d.ts +42 -0
  444. package/dist/utils/http-health-probe.js +231 -0
  445. package/dist/utils/http-health-probe.js.map +1 -0
  446. package/dist/utils/managed-server-pids.js +2 -2
  447. package/dist/utils/managed-server-pids.js.map +1 -1
  448. package/dist/utils/module-config-reader.js +11 -1
  449. package/dist/utils/module-config-reader.js.map +1 -1
  450. package/dist/utils/runtime-package-root.d.ts +2 -0
  451. package/dist/utils/runtime-package-root.js +47 -0
  452. package/dist/utils/runtime-package-root.js.map +1 -0
  453. package/dist/utils/snapshot-local-disk-gate.d.ts +3 -0
  454. package/dist/utils/snapshot-local-disk-gate.js +50 -0
  455. package/dist/utils/snapshot-local-disk-gate.js.map +1 -0
  456. package/dist/utils/snapshot-payload-guard.d.ts +1 -0
  457. package/dist/utils/snapshot-payload-guard.js +234 -0
  458. package/dist/utils/snapshot-payload-guard.js.map +1 -0
  459. package/dist/utils/snapshot-request-retention.d.ts +3 -0
  460. package/dist/utils/snapshot-request-retention.js +128 -0
  461. package/dist/utils/snapshot-request-retention.js.map +1 -0
  462. package/dist/utils/snapshot-stage-policy.d.ts +3 -0
  463. package/dist/utils/snapshot-stage-policy.js +111 -0
  464. package/dist/utils/snapshot-stage-policy.js.map +1 -0
  465. package/dist/utils/snapshot-writer.js +176 -19
  466. package/dist/utils/snapshot-writer.js.map +1 -1
  467. package/docs/CHAT_PROCESS_PROTOCOL_AND_PIPELINE.md +4 -0
  468. package/docs/CONFIG_ARCHITECTURE.md +2 -2
  469. package/docs/INSTALLATION_AND_QUICKSTART.md +5 -5
  470. package/docs/OAUTH.md +2 -5
  471. package/docs/PORTS.md +1 -1
  472. package/docs/PROVIDERS_BUILTIN.md +1 -5
  473. package/docs/PROVIDER_TYPES.md +1 -1
  474. package/docs/agent-routing/10-runtime-ssot-routing.md +4 -0
  475. package/docs/agent-routing/20-build-test-release-routing.md +2 -2
  476. package/docs/agent-routing/30-servertool-lifecycle-routing.md +2 -0
  477. package/docs/agent-routing/40-task-memory-routing.md +22 -2
  478. package/docs/audit/286.1-provider-failure-policy-audit.md +341 -0
  479. package/docs/audits/2026-04-26-fallback-silent-failure-audit.md +119 -0
  480. package/docs/audits/2026-04-27-provider-failure-policy-ssot-audit.md +153 -0
  481. package/docs/chat-process-continuation-state-contract.md +196 -0
  482. package/docs/chat-semantic-expansion-plan.md +2 -0
  483. package/docs/daemon-admin-api-design.md +9 -9
  484. package/docs/design/provider-failure-policy-ssot.md +215 -0
  485. package/docs/design/reasoning-stop-lifecycle.md +90 -0
  486. package/docs/design/servertool-unified-skeleton.md +202 -0
  487. package/docs/design/websearch-servertool-orchestration.md +190 -0
  488. package/docs/error-handling-v2.md +120 -11
  489. package/docs/protocol-compatibility-matrix.md +147 -0
  490. package/docs/providers/provider-composite-design.md +4 -5
  491. package/docs/providers/provider-composite-testing.md +1 -1
  492. package/docs/providers/provider-type-only-migration.md +2 -15
  493. package/docs/refactoring/compatibility-v2-architecture-design.md +1 -3
  494. package/docs/refactoring/host-164.3-responsibility-migration.md +0 -1
  495. package/docs/routing-instructions.md +42 -1
  496. package/docs/stop-message-auto.md +0 -1
  497. package/docs/token-refresh-daemon-plan.md +14 -14
  498. package/docs/v2-architecture/IMPLEMENTATION-ROADMAP.md +1 -1
  499. package/docs/v2-architecture/PROVIDER-V2-CHANGESET-RELEASE-CHECKLIST.md +1 -9
  500. package/docs/v2-architecture/PROVIDER-V2-LAYERING-ADR-DRAFT.md +3 -4
  501. package/docs/v2-architecture/PROVIDER-V2-MIGRATION-MATRIX-DRAFT.md +4 -15
  502. package/docs/v2-architecture/PROVIDER-V2-PHASED-MIGRATION-ROLLBACK-DRAFT.md +4 -5
  503. package/docs/v2-architecture/PROVIDER-V2-PROFILE-API-REGISTRY-DRAFT.md +4 -4
  504. package/docs/v2-architecture/PROVIDER-V2-REFACTOR-OVERVIEW-DRAFT.md +1 -2
  505. package/docs/v2-architecture/PROVIDER-V2-VERIFICATION-MATRIX-DRAFT.md +2 -2
  506. package/node_modules/@jsonstudio/llms/dist/config-unified/unified-config.js +36 -10
  507. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/deepseek-web-request.js +7 -0
  508. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/deepseek-web-response.js +2 -2
  509. package/node_modules/@jsonstudio/llms/dist/conversion/compat/antigravity-session-signature.js +33 -17
  510. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/header-policies.d.ts +20 -0
  511. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/header-policies.js +79 -0
  512. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/policy-overrides.d.ts +16 -0
  513. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/policy-overrides.js +27 -0
  514. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/provider-resolver.d.ts +26 -0
  515. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/provider-resolver.js +59 -0
  516. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/registry.d.ts +35 -0
  517. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/registry.js +154 -0
  518. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/types.d.ts +75 -0
  519. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/types.js +8 -0
  520. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/anthropic-claude-code.json +13 -7
  521. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-claude-code.json +13 -8
  522. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-deepseek-web.json +37 -8
  523. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwen.json +48 -11
  524. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/compat-passthrough.json +6 -0
  525. package/node_modules/@jsonstudio/llms/dist/conversion/compat/provider-resolution-config.json +24 -0
  526. package/node_modules/@jsonstudio/llms/dist/conversion/hub/node-support.js +5 -2
  527. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper-config.js +0 -1
  528. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper-from-chat.js +54 -7
  529. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper-to-chat.js +15 -2
  530. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-semantics-audit.d.ts +11 -0
  531. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-semantics-audit.js +16 -30
  532. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapper-config.js +0 -1
  533. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapper-from-chat.js +15 -1
  534. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapping-audit.d.ts +10 -0
  535. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapping-audit.js +9 -30
  536. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/protocol-mapping-audit.d.ts +43 -0
  537. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/protocol-mapping-audit.js +148 -0
  538. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-from-chat.js +16 -6
  539. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-helpers.d.ts +2 -1
  540. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-helpers.js +65 -3
  541. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-to-chat.js +1 -1
  542. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper.d.ts +1 -1
  543. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper.js +1 -1
  544. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-types.d.ts +14 -154
  545. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-chat-process-request-utils.d.ts +6 -1
  546. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-chat-process-request-utils.js +83 -3
  547. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-chat-process-entry.js +6 -5
  548. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage-inbound.d.ts +0 -1
  549. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage-inbound.js +9 -5
  550. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage-provider-payload.js +132 -1
  551. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage.js +0 -1
  552. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-heavy-input-fastpath.d.ts +4 -22
  553. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-heavy-input-fastpath.js +109 -139
  554. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-max-tokens-policy.js +40 -1
  555. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-route-and-outbound.d.ts +0 -1
  556. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-route-and-outbound.js +19 -2
  557. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.d.ts +0 -2
  558. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.js +45 -43
  559. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/route-aware-responses-continuation.d.ts +10 -0
  560. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/route-aware-responses-continuation.js +143 -0
  561. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/index.js +37 -0
  562. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/semantic-lift.js +14 -2
  563. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/responses-context-snapshot.d.ts +3 -0
  564. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/responses-context-snapshot.js +22 -11
  565. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/chat-process-semantics-bridge.js +59 -2
  566. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/client-remap-protocol-switch.d.ts +1 -0
  567. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/client-remap-protocol-switch.js +3 -1
  568. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/index.d.ts +1 -0
  569. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/index.js +2 -1
  570. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.d.ts +2 -0
  571. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.js +53 -1
  572. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage2_finalize/index.js +4 -1
  573. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage3_servertool_orchestration/index.d.ts +1 -0
  574. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage3_servertool_orchestration/index.js +16 -0
  575. package/node_modules/@jsonstudio/llms/dist/conversion/hub/policy/policy-engine.js +14 -4
  576. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-anthropic-alias.d.ts +1 -0
  577. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-anthropic-alias.js +29 -1
  578. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-pending-tool-sync.js +38 -2
  579. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-request-sanitizer.js +164 -1
  580. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.js +27 -2
  581. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-mappers.d.ts +9 -3
  582. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-mappers.js +8 -7
  583. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-runtime-anthropic.js +20 -5
  584. package/node_modules/@jsonstudio/llms/dist/conversion/hub/snapshot-recorder.js +1 -247
  585. package/node_modules/@jsonstudio/llms/dist/conversion/hub/types/chat-envelope.d.ts +84 -4
  586. package/node_modules/@jsonstudio/llms/dist/conversion/pipeline/codecs/v2/responses-openai-pipeline.js +26 -1
  587. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge/response-payload.js +10 -9
  588. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge/utils.js +20 -5
  589. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge.js +88 -4
  590. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils-core.js +5 -1
  591. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils-openai-request.js +55 -14
  592. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils-tool-schema.js +1 -2
  593. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils.js +38 -15
  594. package/node_modules/@jsonstudio/llms/dist/conversion/shared/openai-message-normalize.js +45 -6
  595. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-conversation-store.d.ts +15 -0
  596. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-conversation-store.js +157 -13
  597. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.d.ts +8 -2
  598. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.js +103 -9
  599. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-response-utils.js +10 -10
  600. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-filter-pipeline.js +59 -9
  601. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-governor-guards.d.ts +1 -1
  602. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-governor-guards.js +54 -43
  603. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-governor.js +62 -8
  604. package/node_modules/@jsonstudio/llms/dist/conversion/snapshot-utils.js +269 -12
  605. package/node_modules/@jsonstudio/llms/dist/filters/engine.js +64 -6
  606. package/node_modules/@jsonstudio/llms/dist/filters/special/request-tool-list-filter.js +32 -11
  607. package/node_modules/@jsonstudio/llms/dist/filters/special/request-toolcalls-stringify.js +26 -1
  608. package/node_modules/@jsonstudio/llms/dist/filters/special/request-tools-normalize.js +46 -7
  609. package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-blacklist.js +10 -1
  610. package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-schema-converge.js +10 -1
  611. package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-stringify.js +30 -5
  612. package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-whitelist.js +10 -1
  613. package/node_modules/@jsonstudio/llms/dist/filters/special/tool-filter-hooks.js +16 -14
  614. package/node_modules/@jsonstudio/llms/dist/filters/utils/snapshot-writer.js +47 -5
  615. package/node_modules/@jsonstudio/llms/dist/guidance/index.js +16 -2
  616. package/node_modules/@jsonstudio/llms/dist/http/sse-response.js +42 -6
  617. package/node_modules/@jsonstudio/llms/dist/native/router_hotpath_napi.node +0 -0
  618. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/auth-utils.js +33 -31
  619. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/provider-normalization.d.ts +6 -0
  620. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/provider-normalization.js +78 -98
  621. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/responses-helpers.js +22 -2
  622. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/routing-config.js +56 -3
  623. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/streaming-helpers.js +19 -1
  624. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap.js +62 -293
  625. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/classifier.js +11 -82
  626. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/antigravity/alias-lease.js +42 -15
  627. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/cooldown-manager.js +55 -3
  628. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/health/index.js +66 -15
  629. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-pools/index.js +44 -8
  630. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-state/keys.d.ts +7 -0
  631. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-state/keys.js +65 -21
  632. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-state/store.js +19 -2
  633. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/sticky-session-manager.d.ts +9 -0
  634. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/sticky-session-manager.js +139 -4
  635. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-logging.js +2 -1
  636. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-semantics.js +68 -59
  637. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-governance-semantics.js +156 -157
  638. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-node-result-semantics.d.ts +1 -0
  639. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-node-result-semantics.js +31 -0
  640. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-servertool-orchestration-semantics.js +94 -95
  641. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-compat-action-semantics.d.ts +0 -1
  642. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-compat-action-semantics.js +0 -7
  643. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-parsers.d.ts +1 -1
  644. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-parsers.js +203 -305
  645. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-tools-post.js +35 -0
  646. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-tools-request.js +2 -1
  647. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-types.d.ts +2 -0
  648. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-policy-semantics.js +173 -154
  649. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-edge-stage-semantics.d.ts +1 -0
  650. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-edge-stage-semantics.js +106 -57
  651. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-inbound-outbound-semantics.js +122 -114
  652. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-builders.d.ts +1 -0
  653. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-metadata-policy.js +100 -86
  654. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-passthrough.js +52 -33
  655. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-protocol.js +79 -62
  656. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics.d.ts +1 -0
  657. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-inbound-semantics-parsers.js +50 -33
  658. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-inbound-semantics-types.d.ts +2 -0
  659. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-outbound-semantics-parsers.d.ts +1 -1
  660. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-outbound-semantics-parsers.js +161 -177
  661. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-outbound-tools.d.ts +1 -0
  662. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-outbound-tools.js +1 -0
  663. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-parsers.d.ts +1 -1
  664. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-parsers.js +231 -286
  665. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-router-hotpath-analysis.js +143 -164
  666. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-router-hotpath-required-exports.d.ts +1 -1
  667. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-router-hotpath-required-exports.js +8 -1
  668. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics-reasoning.js +57 -28
  669. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics-responses.d.ts +8 -0
  670. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics-responses.js +76 -0
  671. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.d.ts +1 -1
  672. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.js +1 -1
  673. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-providers.d.ts +24 -0
  674. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-providers.js +78 -0
  675. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-routing.d.ts +17 -0
  676. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-routing.js +72 -0
  677. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/route-utils.js +9 -0
  678. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/tier-selection-select.js +11 -5
  679. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.js +4 -39
  680. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/features.js +199 -31
  681. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/health-manager.js +7 -2
  682. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/load-balancer.d.ts +3 -0
  683. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/load-balancer.js +47 -3
  684. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/native-error.d.ts +11 -0
  685. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/native-error.js +71 -0
  686. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-registry.js +81 -2
  687. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-runtime-ingress.d.ts +24 -0
  688. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-runtime-ingress.js +139 -0
  689. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-instructions/parse.js +21 -1
  690. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-instructions/state.js +46 -0
  691. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-instructions/types.d.ts +7 -0
  692. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-stop-message-state-codec.js +30 -1
  693. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/sticky-session-store.js +44 -15
  694. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/stop-message-state-sync.d.ts +1 -1
  695. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/stop-message-state-sync.js +10 -2
  696. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/success-center.js +39 -2
  697. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.d.ts +1 -0
  698. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.js +25 -24
  699. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.d.ts +3 -0
  700. package/node_modules/@jsonstudio/llms/dist/servertool/engine.js +255 -71
  701. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/clock.js +20 -2
  702. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/followup-request-builder.js +120 -85
  703. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/memory-appender.d.ts +6 -0
  704. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/memory-appender.js +42 -0
  705. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-only-continue.js +1 -1
  706. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop-guard.js +630 -0
  707. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop-state.d.ts +24 -0
  708. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop-state.js +606 -0
  709. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop.js +292 -0
  710. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/{iflow-followup.d.ts → ai-followup.d.ts} +3 -3
  711. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/{iflow-followup.js → ai-followup.js} +76 -81
  712. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/config.d.ts +1 -2
  713. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/config.js +2 -6
  714. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/runtime-utils.d.ts +1 -0
  715. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/runtime-utils.js +51 -11
  716. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto.js +5 -4
  717. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search-auto-trigger.d.ts +9 -0
  718. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search-auto-trigger.js +91 -0
  719. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.js +1 -131
  720. package/node_modules/@jsonstudio/llms/dist/servertool/heartbeat/session-store.js +49 -18
  721. package/node_modules/@jsonstudio/llms/dist/servertool/registry.js +3 -0
  722. package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.d.ts +2 -2
  723. package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.js +14 -10
  724. package/node_modules/@jsonstudio/llms/dist/servertool/strip-servertool-calls.js +2 -3
  725. package/node_modules/@jsonstudio/llms/dist/servertool/types.d.ts +11 -1
  726. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/chat-json-to-sse-converter.js +26 -1
  727. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/chat.d.ts +2 -2
  728. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/chat.js +38 -3
  729. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/sequencers/chat-sequencer.js +6 -3
  730. package/node_modules/@jsonstudio/llms/dist/sse/shared/chat-serializer.js +27 -3
  731. package/node_modules/@jsonstudio/llms/dist/sse/shared/constants.d.ts +6 -6
  732. package/node_modules/@jsonstudio/llms/dist/sse/shared/constants.js +3 -3
  733. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +1 -0
  734. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/anthropic-sse-to-json-converter.js +36 -1
  735. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/anthropic-response-builder.js +6 -20
  736. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.d.ts +3 -0
  737. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.js +125 -42
  738. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/chat-sse-to-json-converter.js +59 -10
  739. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/parsers/sse-parser.js +2 -0
  740. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/responses-sse-to-json-converter.d.ts +1 -0
  741. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/responses-sse-to-json-converter.js +71 -2
  742. package/node_modules/@jsonstudio/llms/dist/sse/types/chat-types.d.ts +1 -0
  743. package/node_modules/@jsonstudio/llms/dist/sse/types/chat-types.js +1 -1
  744. package/node_modules/@jsonstudio/llms/dist/sse/types/conversion-context.js +2 -2
  745. package/node_modules/@jsonstudio/llms/dist/sse/types/index.d.ts +1 -1
  746. package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.d.ts +1 -1
  747. package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.js +1 -1
  748. package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.js +34 -12
  749. package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/patch-text/fuzzy-match.d.ts +14 -0
  750. package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/patch-text/fuzzy-match.js +174 -0
  751. package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/patch-text/normalize.js +148 -0
  752. package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/structured.js +31 -2
  753. package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/validator.js +121 -4
  754. package/node_modules/@jsonstudio/llms/dist/tools/exec-command/normalize.d.ts +4 -1
  755. package/node_modules/@jsonstudio/llms/dist/tools/exec-command/normalize.js +31 -16
  756. package/node_modules/@jsonstudio/llms/dist/tools/exec-command/validator.d.ts +1 -0
  757. package/node_modules/@jsonstudio/llms/dist/tools/exec-command/validator.js +3 -1
  758. package/node_modules/@jsonstudio/llms/dist/tools/tool-registry.d.ts +1 -0
  759. package/node_modules/@jsonstudio/llms/dist/tools/tool-registry.js +5 -27
  760. package/node_modules/@jsonstudio/llms/package.json +1 -1
  761. package/package.json +6 -7
  762. package/scripts/ci/repo-sanity.mjs +1 -0
  763. package/scripts/ci/silent-failure-audit.mjs +112 -70
  764. package/scripts/cleanup-stale-server-pids.mjs +0 -6
  765. package/scripts/ensure-cli-command-shim.mjs +49 -15
  766. package/scripts/ensure-cli-executable.mjs +1 -1
  767. package/scripts/install-global.sh +7 -6
  768. package/scripts/install-release-snapshot.mjs +232 -0
  769. package/scripts/install-release.sh +30 -24
  770. package/scripts/link-global-llms-local.mjs +1 -2
  771. package/scripts/monitor/memory-guard.mjs +207 -0
  772. package/scripts/pack-mode.mjs +0 -4
  773. package/scripts/pack-rcc.mjs +17 -58
  774. package/scripts/run-bg.sh +0 -6
  775. package/scripts/run-fg-gtimeout.sh +0 -6
  776. package/scripts/tests/antigravity-codex-sample-pipeline-compare.mjs +1 -1
  777. package/scripts/tests/blackbox-rcc-vs-routecodex-antigravity.mjs +60 -39
  778. package/scripts/verify-install-e2e.mjs +64 -26
  779. package/configsamples/provider-default/qwenchat/config.v2.json +0 -53
  780. package/dist/providers/auth/iflow-cookie-auth.d.ts +0 -27
  781. package/dist/providers/auth/iflow-cookie-auth.js +0 -207
  782. package/dist/providers/auth/iflow-cookie-auth.js.map +0 -1
  783. package/dist/providers/auth/iflow-userinfo-helper.d.ts +0 -32
  784. package/dist/providers/auth/iflow-userinfo-helper.js +0 -81
  785. package/dist/providers/auth/iflow-userinfo-helper.js.map +0 -1
  786. package/dist/providers/core/runtime/iflow-http-provider.d.ts +0 -13
  787. package/dist/providers/core/runtime/iflow-http-provider.js +0 -22
  788. package/dist/providers/core/runtime/iflow-http-provider.js.map +0 -1
  789. package/dist/providers/core/runtime/provider-iflow-business-error-utils.d.ts +0 -15
  790. package/dist/providers/core/runtime/provider-iflow-business-error-utils.js +0 -49
  791. package/dist/providers/core/runtime/provider-iflow-business-error-utils.js.map +0 -1
  792. package/dist/providers/core/runtime/qwenchat-http-provider-helpers.d.ts +0 -89
  793. package/dist/providers/core/runtime/qwenchat-http-provider-helpers.js +0 -1698
  794. package/dist/providers/core/runtime/qwenchat-http-provider-helpers.js.map +0 -1
  795. package/dist/providers/core/runtime/qwenchat-http-provider.d.ts +0 -9
  796. package/dist/providers/core/runtime/qwenchat-http-provider.js +0 -78
  797. package/dist/providers/core/runtime/qwenchat-http-provider.js.map +0 -1
  798. package/dist/providers/core/runtime/standard-tool-text-request-transform.d.ts +0 -13
  799. package/dist/providers/core/runtime/standard-tool-text-request-transform.js +0 -130
  800. package/dist/providers/core/runtime/standard-tool-text-request-transform.js.map +0 -1
  801. package/dist/providers/core/runtime/transport/iflow-signer.d.ts +0 -12
  802. package/dist/providers/core/runtime/transport/iflow-signer.js +0 -63
  803. package/dist/providers/core/runtime/transport/iflow-signer.js.map +0 -1
  804. package/dist/providers/profile/families/iflow-profile.d.ts +0 -2
  805. package/dist/providers/profile/families/iflow-profile.js +0 -384
  806. package/dist/providers/profile/families/iflow-profile.js.map +0 -1
  807. package/docs/mapping-tables/iflow-to-openai.json +0 -215
  808. package/docs/mapping-tables/openai-to-iflow.json +0 -227
  809. package/docs/multi-token-auth-guide.md +0 -66
  810. package/docs/oauth-authentication-guide.md +0 -172
  811. package/docs/oauth-iflow-implementation.md +0 -157
  812. package/docs/release-iflow-400-gate.md +0 -58
  813. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-cli-defaults.d.ts +0 -10
  814. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-cli-defaults.js +0 -31
  815. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-history-media-placeholder.d.ts +0 -7
  816. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-history-media-placeholder.js +0 -25
  817. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-thinking-reasoning-fill.d.ts +0 -12
  818. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-thinking-reasoning-fill.js +0 -46
  819. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-native-compat.d.ts +0 -6
  820. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-native-compat.js +0 -36
  821. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-response-body-unwrap.d.ts +0 -9
  822. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-response-body-unwrap.js +0 -25
  823. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-tool-text-fallback.d.ts +0 -5
  824. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-tool-text-fallback.js +0 -29
  825. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-web-search.d.ts +0 -18
  826. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-web-search.js +0 -49
  827. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwenchat-web-request.d.ts +0 -3
  828. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwenchat-web-request.js +0 -62
  829. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-iflow.json +0 -353
  830. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwenchat-web.json +0 -47
  831. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-health.d.ts +0 -1
  832. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-health.js +0 -1
  833. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/iflow-model-error-retry.js +0 -92
  834. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/review.js +0 -202
  835. package/scripts/publish-rcc.mjs +0 -81
  836. /package/node_modules/@jsonstudio/llms/dist/servertool/handlers/{iflow-model-error-retry.d.ts → reasoning-stop-guard.d.ts} +0 -0
  837. /package/node_modules/@jsonstudio/llms/dist/servertool/handlers/{review.d.ts → reasoning-stop.d.ts} +0 -0
@@ -23,9 +23,19 @@ const ACQUIRE_WAIT_BASE_MS = 100;
23
23
  const ACQUIRE_WAIT_MAX_MS = 2_000;
24
24
  const ACQUIRE_JITTER_MS = 40;
25
25
  const LOCK_WAIT_MAX_MS = 250;
26
+ const PROVIDER_TRAFFIC_RUN_NAMESPACE = `run-${process.pid}-${Date.now().toString(36)}-${randomUUID().slice(0, 8)}`;
27
+ const ADAPTIVE_WINDOW_MINUTES = 15;
28
+ const ADAPTIVE_STREAK_THRESHOLD = 5;
29
+ const ADAPTIVE_BLOCK_BACKOFF_BASE_MS = 400;
30
+ const ADAPTIVE_BLOCK_BACKOFF_MAX_MS = 8_000;
31
+ const ADAPTIVE_DEFAULT_HARD_MAX = 64;
32
+ const ADAPTIVE_DEFAULT_HARD_MULTIPLIER = 2;
26
33
  function sleep(ms) {
27
34
  return new Promise((resolve) => setTimeout(resolve, ms));
28
35
  }
36
+ function toMinuteBucket(ms) {
37
+ return Math.floor(ms / 60_000);
38
+ }
29
39
  function clampPositiveInt(value) {
30
40
  if (typeof value === 'number' && Number.isFinite(value)) {
31
41
  const normalized = Math.floor(value);
@@ -39,6 +49,76 @@ function clampPositiveInt(value) {
39
49
  }
40
50
  return undefined;
41
51
  }
52
+ function clampNonNegativeInt(value) {
53
+ if (typeof value === 'number' && Number.isFinite(value)) {
54
+ const normalized = Math.floor(value);
55
+ return normalized >= 0 ? normalized : undefined;
56
+ }
57
+ if (typeof value === 'string' && value.trim()) {
58
+ const parsed = Number.parseInt(value.trim(), 10);
59
+ if (Number.isFinite(parsed) && parsed >= 0) {
60
+ return parsed;
61
+ }
62
+ }
63
+ return undefined;
64
+ }
65
+ function clampInt(value, min, max) {
66
+ if (!Number.isFinite(value)) {
67
+ return min;
68
+ }
69
+ return Math.max(min, Math.min(max, Math.floor(value)));
70
+ }
71
+ function normalizeCode(value) {
72
+ if (typeof value !== 'string') {
73
+ return '';
74
+ }
75
+ return value.trim().toUpperCase();
76
+ }
77
+ function readAdaptiveEnvInt(keys, fallback) {
78
+ for (const key of keys) {
79
+ const parsed = clampPositiveInt(process.env[key]);
80
+ if (parsed) {
81
+ return parsed;
82
+ }
83
+ }
84
+ return fallback;
85
+ }
86
+ function resolveAdaptiveBlockBackoffBaseMs() {
87
+ return readAdaptiveEnvInt(['ROUTECODEX_DYNAMIC_CONCURRENCY_BLOCK_BACKOFF_BASE_MS', 'RCC_DYNAMIC_CONCURRENCY_BLOCK_BACKOFF_BASE_MS'], ADAPTIVE_BLOCK_BACKOFF_BASE_MS);
88
+ }
89
+ function resolveAdaptiveBlockBackoffMaxMs() {
90
+ return readAdaptiveEnvInt(['ROUTECODEX_DYNAMIC_CONCURRENCY_BLOCK_BACKOFF_MAX_MS', 'RCC_DYNAMIC_CONCURRENCY_BLOCK_BACKOFF_MAX_MS'], ADAPTIVE_BLOCK_BACKOFF_MAX_MS);
91
+ }
92
+ function isRecoverable429Like(event) {
93
+ if (event.statusCode === 429) {
94
+ return true;
95
+ }
96
+ const errorCode = normalizeCode(event.errorCode);
97
+ const upstreamCode = normalizeCode(event.upstreamCode);
98
+ if (errorCode.includes('429')
99
+ || upstreamCode.includes('429')
100
+ || errorCode.includes('RATE_LIMIT')
101
+ || upstreamCode.includes('RATE_LIMIT')
102
+ || errorCode.includes('INSUFFICIENT_QUOTA')
103
+ || upstreamCode.includes('INSUFFICIENT_QUOTA')) {
104
+ return true;
105
+ }
106
+ const reason = typeof event.reason === 'string' ? event.reason.trim().toLowerCase() : '';
107
+ if (!reason) {
108
+ return false;
109
+ }
110
+ return (reason.includes('too many requests')
111
+ || reason.includes('rate limit')
112
+ || reason.includes('insufficient_quota')
113
+ || reason.includes('quota'));
114
+ }
115
+ function createAdaptivePersistedConfig() {
116
+ return {
117
+ version: 1,
118
+ updatedAt: Date.now(),
119
+ runtimes: {}
120
+ };
121
+ }
42
122
  function toStateKey(runtimeKey) {
43
123
  return encodeURIComponent(runtimeKey.trim());
44
124
  }
@@ -54,28 +134,8 @@ function isProcessAlive(pid) {
54
134
  return false;
55
135
  }
56
136
  }
57
- function resolveProviderTier(runtime, providerKey) {
58
- const candidates = [
59
- runtime.providerFamily,
60
- runtime.providerId,
61
- providerKey,
62
- runtime.providerKey,
63
- runtime.runtimeKey
64
- ]
65
- .filter((value) => typeof value === 'string' && value.trim().length > 0)
66
- .map((value) => value.trim().toLowerCase());
67
- const isMatch = (needle) => candidates.some((item) => item.includes(needle));
68
- if (isMatch('deepseek') || isMatch('qwenchat')) {
69
- return 'single';
70
- }
71
- if (isMatch('ali-coding-plan') || isMatch('tabglm') || isMatch('crs')) {
72
- return 'quad';
73
- }
74
- return 'double';
75
- }
76
- export function resolveProviderTrafficPolicy(runtime, providerKey) {
77
- const tier = resolveProviderTier(runtime, providerKey);
78
- const defaultMaxInFlight = tier === 'single' ? 1 : (tier === 'quad' ? 4 : 2);
137
+ export function resolveProviderTrafficPolicy(runtime, _providerKey) {
138
+ const defaultMaxInFlight = 2;
79
139
  const defaultRpm = defaultMaxInFlight * 60;
80
140
  const configuredConcurrency = runtime.concurrency;
81
141
  const configuredRpm = runtime.rpm;
@@ -171,22 +231,405 @@ async function tryReadLockMeta(lockFile) {
171
231
  return {};
172
232
  }
173
233
  }
234
+ function hasValidLockMeta(meta) {
235
+ return Number.isFinite(meta.pid) && meta.pid > 0
236
+ && Number.isFinite(meta.createdAt) && meta.createdAt > 0;
237
+ }
174
238
  export class ProviderTrafficGovernor {
175
239
  rootDir;
176
240
  lockDir;
177
241
  stateDir;
242
+ adaptiveEnabled;
243
+ adaptiveConfigPath;
244
+ adaptiveHardMax;
245
+ adaptiveHardMultiplier;
246
+ adaptiveStateByRuntime = new Map();
247
+ waiterStateByRuntime = new Map();
178
248
  ensureDirsPromise = null;
249
+ adaptiveLoadPromise = null;
250
+ adaptiveWritePromise = null;
251
+ adaptiveWriteTimer = null;
179
252
  constructor(rootDir) {
180
253
  const jestWorker = clampPositiveInt(process.env.JEST_WORKER_ID);
181
254
  const testScopedRoot = jestWorker
182
255
  ? path.join(resolveRccStateDir(), 'provider-traffic-test', `worker-${jestWorker}`, `pid-${process.pid}`)
183
256
  : undefined;
257
+ const sharedNamespaceEnabled = process.env.ROUTECODEX_PROVIDER_TRAFFIC_SHARED === '1'
258
+ || process.env.RCC_PROVIDER_TRAFFIC_SHARED === '1';
259
+ const defaultRoot = sharedNamespaceEnabled
260
+ ? path.join(resolveRccStateDir(), 'provider-traffic')
261
+ : path.join(resolveRccStateDir(), 'provider-traffic', PROVIDER_TRAFFIC_RUN_NAMESPACE);
184
262
  const base = rootDir
185
263
  ? path.resolve(rootDir)
186
- : (testScopedRoot ?? path.join(resolveRccStateDir(), 'provider-traffic'));
264
+ : (testScopedRoot ?? defaultRoot);
187
265
  this.rootDir = base;
188
266
  this.lockDir = path.join(base, 'locks');
189
267
  this.stateDir = path.join(base, 'state');
268
+ this.adaptiveEnabled = (() => {
269
+ const raw = String(process.env.ROUTECODEX_DYNAMIC_CONCURRENCY_ENABLED
270
+ ?? process.env.RCC_DYNAMIC_CONCURRENCY_ENABLED
271
+ ?? '1').trim().toLowerCase();
272
+ return !(raw === '0' || raw === 'false' || raw === 'off' || raw === 'no');
273
+ })();
274
+ this.adaptiveHardMax = readAdaptiveEnvInt(['ROUTECODEX_DYNAMIC_CONCURRENCY_HARD_MAX', 'RCC_DYNAMIC_CONCURRENCY_HARD_MAX'], ADAPTIVE_DEFAULT_HARD_MAX);
275
+ this.adaptiveHardMultiplier = readAdaptiveEnvInt(['ROUTECODEX_DYNAMIC_CONCURRENCY_HARD_MULTIPLIER', 'RCC_DYNAMIC_CONCURRENCY_HARD_MULTIPLIER'], ADAPTIVE_DEFAULT_HARD_MULTIPLIER);
276
+ this.adaptiveConfigPath = (() => {
277
+ const fromEnv = process.env.ROUTECODEX_DYNAMIC_CONCURRENCY_CONFIG_PATH
278
+ || process.env.RCC_DYNAMIC_CONCURRENCY_CONFIG_PATH;
279
+ if (typeof fromEnv === 'string' && fromEnv.trim()) {
280
+ return path.resolve(fromEnv.trim());
281
+ }
282
+ return path.join(base, 'dynamic-concurrency-overrides.json');
283
+ })();
284
+ }
285
+ resolveAdaptiveHardMax(baseCap) {
286
+ const fallbackHardMax = Math.max(baseCap, Math.min(this.adaptiveHardMax, baseCap * this.adaptiveHardMultiplier));
287
+ return clampInt(fallbackHardMax, 1, this.adaptiveHardMax);
288
+ }
289
+ resolveMaxAcquireWaiters() {
290
+ return readAdaptiveEnvInt(['ROUTECODEX_PROVIDER_TRAFFIC_MAX_WAITERS', 'RCC_PROVIDER_TRAFFIC_MAX_WAITERS'], 64);
291
+ }
292
+ acquireWaiterSlot(runtimeKey) {
293
+ const normalizedKey = runtimeKey.trim();
294
+ const now = Date.now();
295
+ for (const [existingKey, state] of this.waiterStateByRuntime.entries()) {
296
+ if (state.activeWaiters <= 0 || now - state.updatedAtMs >= DEFAULT_CONCURRENCY_STALE_MS) {
297
+ this.waiterStateByRuntime.delete(existingKey);
298
+ }
299
+ }
300
+ const current = this.waiterStateByRuntime.get(normalizedKey);
301
+ const nextActiveWaiters = (current?.activeWaiters ?? 0) + 1;
302
+ const maxWaiters = this.resolveMaxAcquireWaiters();
303
+ if (nextActiveWaiters > maxWaiters) {
304
+ throw new ProviderTrafficSaturatedError(`provider traffic waiter queue overloaded for runtime ${normalizedKey}`, {
305
+ reason: 'acquire_waiter_overload',
306
+ runtimeKey: normalizedKey,
307
+ activeWaiters: current?.activeWaiters ?? 0,
308
+ maxWaiters
309
+ });
310
+ }
311
+ this.waiterStateByRuntime.set(normalizedKey, {
312
+ activeWaiters: nextActiveWaiters,
313
+ updatedAtMs: now
314
+ });
315
+ return {
316
+ activeWaiters: nextActiveWaiters
317
+ };
318
+ }
319
+ releaseWaiterSlot(runtimeKey) {
320
+ const normalizedKey = runtimeKey.trim();
321
+ const current = this.waiterStateByRuntime.get(normalizedKey);
322
+ if (!current) {
323
+ return;
324
+ }
325
+ const nextActiveWaiters = Math.max(0, current.activeWaiters - 1);
326
+ if (nextActiveWaiters === 0) {
327
+ this.waiterStateByRuntime.delete(normalizedKey);
328
+ return;
329
+ }
330
+ this.waiterStateByRuntime.set(normalizedKey, {
331
+ activeWaiters: nextActiveWaiters,
332
+ updatedAtMs: Date.now()
333
+ });
334
+ }
335
+ async ensureAdaptiveLoaded() {
336
+ if (!this.adaptiveEnabled) {
337
+ return;
338
+ }
339
+ if (!this.adaptiveLoadPromise) {
340
+ this.adaptiveLoadPromise = (async () => {
341
+ try {
342
+ const raw = await fs.readFile(this.adaptiveConfigPath, 'utf8');
343
+ const parsed = raw.trim() ? JSON.parse(raw) : null;
344
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
345
+ return;
346
+ }
347
+ const runtimesRaw = parsed.runtimes;
348
+ if (!runtimesRaw || typeof runtimesRaw !== 'object' || Array.isArray(runtimesRaw)) {
349
+ return;
350
+ }
351
+ for (const [runtimeKey, value] of Object.entries(runtimesRaw)) {
352
+ if (typeof runtimeKey !== 'string' || !runtimeKey.trim()) {
353
+ continue;
354
+ }
355
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
356
+ continue;
357
+ }
358
+ const row = value;
359
+ const baseCap = clampPositiveInt(row.baseCap) ?? 2;
360
+ const minCap = clampPositiveInt(row.minCap) ?? 1;
361
+ const hardMaxCap = clampPositiveInt(row.hardMaxCap) ?? this.resolveAdaptiveHardMax(baseCap);
362
+ const currentCap = clampPositiveInt(row.currentCap) ?? baseCap;
363
+ const tentativeCap = clampPositiveInt(row.tentativeCap) ?? currentCap;
364
+ const safeCap = clampPositiveInt(row.safeCap) ?? baseCap;
365
+ const cooldownUntilMs = clampPositiveInt(row.cooldownUntilMs) ?? 0;
366
+ const saturatedNo429Streak = clampNonNegativeInt(row.saturatedNo429Streak) ?? 0;
367
+ const saturated429Streak = clampNonNegativeInt(row.saturated429Streak) ?? 0;
368
+ const blockedBackoffLevel = clampNonNegativeInt(row.blockedBackoffLevel) ?? 0;
369
+ const blockedBackoffUntilMs = clampNonNegativeInt(row.blockedBackoffUntilMs) ?? 0;
370
+ const triedIncreaseCaps = Array.isArray(row.triedIncreaseCaps)
371
+ ? row.triedIncreaseCaps
372
+ .map((entry) => clampPositiveInt(entry))
373
+ .filter((entry) => typeof entry === 'number')
374
+ : [];
375
+ const normalizedMin = clampInt(minCap, 1, hardMaxCap);
376
+ const normalizedState = {
377
+ runtimeKey: runtimeKey.trim(),
378
+ baseCap: clampInt(baseCap, normalizedMin, hardMaxCap),
379
+ minCap: normalizedMin,
380
+ hardMaxCap,
381
+ currentCap: clampInt(currentCap, normalizedMin, hardMaxCap),
382
+ tentativeCap: clampInt(tentativeCap, normalizedMin, hardMaxCap),
383
+ safeCap: clampInt(safeCap, normalizedMin, hardMaxCap),
384
+ cooldownUntilMs,
385
+ saturatedNo429Streak,
386
+ saturated429Streak,
387
+ blockedBackoffLevel,
388
+ blockedBackoffUntilMs,
389
+ lastDecisionMinute: -1,
390
+ triedIncreaseCaps: new Set(triedIncreaseCaps),
391
+ buckets: [],
392
+ updatedAtMs: clampPositiveInt(row.updatedAtMs) ?? Date.now()
393
+ };
394
+ this.adaptiveStateByRuntime.set(normalizedState.runtimeKey, normalizedState);
395
+ }
396
+ }
397
+ catch (error) {
398
+ if (error?.code !== 'ENOENT') {
399
+ // eslint-disable-next-line no-console
400
+ console.warn(`[adaptive-concurrency] load failed path=${this.adaptiveConfigPath} reason=${error instanceof Error ? error.message : String(error)}`);
401
+ }
402
+ }
403
+ })();
404
+ }
405
+ await this.adaptiveLoadPromise;
406
+ }
407
+ toAdaptivePersistedConfig() {
408
+ const payload = createAdaptivePersistedConfig();
409
+ for (const [runtimeKey, state] of this.adaptiveStateByRuntime.entries()) {
410
+ payload.runtimes[runtimeKey] = {
411
+ baseCap: state.baseCap,
412
+ minCap: state.minCap,
413
+ hardMaxCap: state.hardMaxCap,
414
+ currentCap: state.currentCap,
415
+ tentativeCap: state.tentativeCap,
416
+ safeCap: state.safeCap,
417
+ cooldownUntilMs: state.cooldownUntilMs,
418
+ saturatedNo429Streak: state.saturatedNo429Streak,
419
+ saturated429Streak: state.saturated429Streak,
420
+ blockedBackoffLevel: state.blockedBackoffLevel,
421
+ blockedBackoffUntilMs: state.blockedBackoffUntilMs,
422
+ triedIncreaseCaps: Array.from(state.triedIncreaseCaps.values()).sort((a, b) => a - b),
423
+ updatedAtMs: state.updatedAtMs
424
+ };
425
+ }
426
+ payload.updatedAt = Date.now();
427
+ return payload;
428
+ }
429
+ scheduleAdaptivePersist() {
430
+ if (!this.adaptiveEnabled) {
431
+ return;
432
+ }
433
+ if (this.adaptiveWriteTimer) {
434
+ return;
435
+ }
436
+ this.adaptiveWriteTimer = setTimeout(() => {
437
+ this.adaptiveWriteTimer = null;
438
+ this.adaptiveWritePromise = this.persistAdaptiveConfig().catch((error) => {
439
+ // eslint-disable-next-line no-console
440
+ console.warn(`[adaptive-concurrency] persist failed path=${this.adaptiveConfigPath} reason=${error instanceof Error ? error.message : String(error)}`);
441
+ });
442
+ }, 400);
443
+ this.adaptiveWriteTimer.unref?.();
444
+ }
445
+ async persistAdaptiveConfig() {
446
+ const payload = this.toAdaptivePersistedConfig();
447
+ await fs.mkdir(path.dirname(this.adaptiveConfigPath), { recursive: true });
448
+ const tempPath = `${this.adaptiveConfigPath}.${process.pid}.${randomUUID()}.tmp`;
449
+ await fs.writeFile(tempPath, JSON.stringify(payload), 'utf8');
450
+ await fs.rename(tempPath, this.adaptiveConfigPath);
451
+ }
452
+ getOrCreateAdaptiveState(runtimeKey, baseCapRaw) {
453
+ const runtimeId = runtimeKey.trim();
454
+ const baseCap = Math.max(1, baseCapRaw);
455
+ const existing = this.adaptiveStateByRuntime.get(runtimeId);
456
+ const hardMaxCap = this.resolveAdaptiveHardMax(baseCap);
457
+ if (existing) {
458
+ existing.baseCap = clampInt(baseCap, 1, Math.max(existing.hardMaxCap, hardMaxCap));
459
+ existing.hardMaxCap = Math.max(existing.hardMaxCap, hardMaxCap);
460
+ existing.minCap = clampInt(existing.minCap || 1, 1, existing.hardMaxCap);
461
+ existing.currentCap = clampInt(existing.currentCap || existing.baseCap, existing.minCap, existing.hardMaxCap);
462
+ existing.tentativeCap = clampInt(Math.max(existing.currentCap, existing.tentativeCap || existing.currentCap), existing.currentCap, existing.hardMaxCap);
463
+ existing.safeCap = clampInt(existing.safeCap || existing.baseCap, existing.minCap, existing.hardMaxCap);
464
+ existing.saturatedNo429Streak = clampNonNegativeInt(existing.saturatedNo429Streak) ?? 0;
465
+ existing.saturated429Streak = clampNonNegativeInt(existing.saturated429Streak) ?? 0;
466
+ existing.blockedBackoffLevel = clampNonNegativeInt(existing.blockedBackoffLevel) ?? 0;
467
+ existing.blockedBackoffUntilMs = clampNonNegativeInt(existing.blockedBackoffUntilMs) ?? 0;
468
+ return existing;
469
+ }
470
+ const state = {
471
+ runtimeKey: runtimeId,
472
+ baseCap,
473
+ minCap: 1,
474
+ hardMaxCap,
475
+ currentCap: clampInt(baseCap, 1, hardMaxCap),
476
+ tentativeCap: clampInt(baseCap, 1, hardMaxCap),
477
+ safeCap: clampInt(baseCap, 1, hardMaxCap),
478
+ cooldownUntilMs: 0,
479
+ saturatedNo429Streak: 0,
480
+ saturated429Streak: 0,
481
+ blockedBackoffLevel: 0,
482
+ blockedBackoffUntilMs: 0,
483
+ lastDecisionMinute: -1,
484
+ triedIncreaseCaps: new Set(),
485
+ buckets: [],
486
+ updatedAtMs: Date.now()
487
+ };
488
+ this.adaptiveStateByRuntime.set(runtimeId, state);
489
+ this.scheduleAdaptivePersist();
490
+ return state;
491
+ }
492
+ getOrCreateMinuteBucket(state, minute) {
493
+ const existing = state.buckets.find((entry) => entry.minute === minute);
494
+ if (existing) {
495
+ return existing;
496
+ }
497
+ const next = {
498
+ minute,
499
+ requests: 0,
500
+ http429: 0,
501
+ peakInFlight: 0
502
+ };
503
+ state.buckets.push(next);
504
+ state.buckets.sort((a, b) => a.minute - b.minute);
505
+ const minMinute = minute - Math.max(ADAPTIVE_WINDOW_MINUTES * 2, 30);
506
+ state.buckets = state.buckets.filter((entry) => entry.minute >= minMinute);
507
+ return next;
508
+ }
509
+ getWindowBuckets(state, nowMinute) {
510
+ const out = [];
511
+ const byMinute = new Map();
512
+ for (const entry of state.buckets) {
513
+ byMinute.set(entry.minute, entry);
514
+ }
515
+ for (let minute = nowMinute - (ADAPTIVE_WINDOW_MINUTES - 1); minute <= nowMinute; minute += 1) {
516
+ out.push(byMinute.get(minute) ?? {
517
+ minute,
518
+ requests: 0,
519
+ http429: 0,
520
+ peakInFlight: 0
521
+ });
522
+ }
523
+ return out;
524
+ }
525
+ resolveAdaptiveEffectiveCap(state) {
526
+ return clampInt(state.tentativeCap || state.currentCap, state.minCap, state.hardMaxCap);
527
+ }
528
+ maybeEvaluateAdaptiveState(runtimeKey, state, event, nowMs) {
529
+ const configuredCap = clampPositiveInt(event.configuredMaxInFlight)
530
+ ?? this.resolveAdaptiveEffectiveCap(state);
531
+ const observedInFlight = clampNonNegativeInt(event.activeInFlight) ?? 0;
532
+ const saturated = observedInFlight >= Math.max(1, configuredCap);
533
+ const got429 = !event.success && isRecoverable429Like(event);
534
+ const beforeCurrentCap = state.currentCap;
535
+ const beforeTentativeCap = state.tentativeCap;
536
+ let changed = false;
537
+ let reason = '';
538
+ if (observedInFlight > 0) {
539
+ const nextSafeCap = clampInt(Math.max(state.safeCap, observedInFlight), state.minCap, state.hardMaxCap);
540
+ if (nextSafeCap !== state.safeCap) {
541
+ state.safeCap = nextSafeCap;
542
+ changed = true;
543
+ }
544
+ }
545
+ if (!saturated) {
546
+ if (state.tentativeCap !== state.currentCap) {
547
+ state.tentativeCap = state.currentCap;
548
+ changed = true;
549
+ }
550
+ if (state.saturatedNo429Streak !== 0) {
551
+ state.saturatedNo429Streak = 0;
552
+ changed = true;
553
+ }
554
+ if (state.saturated429Streak !== 0) {
555
+ state.saturated429Streak = 0;
556
+ changed = true;
557
+ }
558
+ if (!got429 && state.blockedBackoffLevel > 0) {
559
+ state.blockedBackoffLevel = Math.max(0, state.blockedBackoffLevel - 1);
560
+ changed = true;
561
+ }
562
+ if (!got429 && state.blockedBackoffLevel === 0 && state.blockedBackoffUntilMs !== 0) {
563
+ state.blockedBackoffUntilMs = 0;
564
+ changed = true;
565
+ }
566
+ }
567
+ else if (got429) {
568
+ state.saturated429Streak += 1;
569
+ state.saturatedNo429Streak = 0;
570
+ const tentativeDown = clampInt(state.currentCap - 1, state.minCap, state.hardMaxCap);
571
+ if (tentativeDown !== state.tentativeCap) {
572
+ state.tentativeCap = tentativeDown;
573
+ changed = true;
574
+ }
575
+ state.blockedBackoffLevel = Math.min(16, state.blockedBackoffLevel + 1);
576
+ const backoffBaseMs = resolveAdaptiveBlockBackoffBaseMs();
577
+ const backoffMaxMs = Math.max(backoffBaseMs, resolveAdaptiveBlockBackoffMaxMs());
578
+ const backoffMs = Math.min(backoffMaxMs, backoffBaseMs * Math.pow(2, Math.max(0, state.blockedBackoffLevel - 1)));
579
+ const nextBackoffUntil = nowMs + backoffMs;
580
+ if (nextBackoffUntil > state.blockedBackoffUntilMs) {
581
+ state.blockedBackoffUntilMs = nextBackoffUntil;
582
+ changed = true;
583
+ }
584
+ if (state.saturated429Streak >= ADAPTIVE_STREAK_THRESHOLD && state.currentCap > state.minCap) {
585
+ state.currentCap = clampInt(state.currentCap - 1, state.minCap, state.hardMaxCap);
586
+ state.tentativeCap = state.currentCap;
587
+ state.saturated429Streak = 0;
588
+ state.saturatedNo429Streak = 0;
589
+ changed = true;
590
+ reason = 'saturated_429_commit_down';
591
+ }
592
+ else {
593
+ reason = 'saturated_429_probe_down';
594
+ }
595
+ }
596
+ else {
597
+ state.saturatedNo429Streak += 1;
598
+ state.saturated429Streak = 0;
599
+ if (state.blockedBackoffLevel > 0) {
600
+ state.blockedBackoffLevel = Math.max(0, state.blockedBackoffLevel - 1);
601
+ changed = true;
602
+ }
603
+ if (state.blockedBackoffLevel === 0 && state.blockedBackoffUntilMs !== 0) {
604
+ state.blockedBackoffUntilMs = 0;
605
+ changed = true;
606
+ }
607
+ const tentativeUp = clampInt(state.currentCap + 1, state.minCap, state.hardMaxCap);
608
+ if (tentativeUp > state.tentativeCap) {
609
+ state.tentativeCap = tentativeUp;
610
+ changed = true;
611
+ }
612
+ if (state.saturatedNo429Streak >= ADAPTIVE_STREAK_THRESHOLD && state.currentCap < state.hardMaxCap) {
613
+ state.currentCap = clampInt(state.currentCap + 1, state.minCap, state.hardMaxCap);
614
+ state.tentativeCap = state.currentCap;
615
+ state.saturatedNo429Streak = 0;
616
+ state.saturated429Streak = 0;
617
+ changed = true;
618
+ reason = 'saturated_no429_commit_up';
619
+ }
620
+ else {
621
+ reason = 'saturated_no429_probe_up';
622
+ }
623
+ }
624
+ state.lastDecisionMinute = toMinuteBucket(nowMs);
625
+ state.updatedAtMs = nowMs;
626
+ if (changed) {
627
+ this.scheduleAdaptivePersist();
628
+ // eslint-disable-next-line no-console
629
+ console.log(`[adaptive-concurrency] runtime=${runtimeKey} current=${beforeCurrentCap}->${state.currentCap} ` +
630
+ `tentative=${beforeTentativeCap}->${state.tentativeCap} streak429=${state.saturated429Streak} ` +
631
+ `streakNo429=${state.saturatedNo429Streak} backoffLevel=${state.blockedBackoffLevel} reason=${reason || 'state_update'}`);
632
+ }
190
633
  }
191
634
  async ensureDirs() {
192
635
  if (!this.ensureDirsPromise) {
@@ -204,6 +647,64 @@ export class ProviderTrafficGovernor {
204
647
  getStateFile(stateKey) {
205
648
  return path.join(this.stateDir, `${stateKey}.json`);
206
649
  }
650
+ async resetCurrentProcessState() {
651
+ await this.ensureDirs();
652
+ const result = {
653
+ stateFilesScanned: 0,
654
+ stateFilesUpdated: 0,
655
+ leasesRemoved: 0,
656
+ rpmEventsRemoved: 0
657
+ };
658
+ let files = [];
659
+ try {
660
+ files = await fs.readdir(this.stateDir);
661
+ }
662
+ catch (error) {
663
+ if (error?.code === 'ENOENT') {
664
+ return result;
665
+ }
666
+ throw error;
667
+ }
668
+ for (const file of files) {
669
+ if (!file.endsWith('.json')) {
670
+ continue;
671
+ }
672
+ const stateKey = file.slice(0, -'.json'.length);
673
+ if (!stateKey) {
674
+ continue;
675
+ }
676
+ result.stateFilesScanned += 1;
677
+ const stateFile = this.getStateFile(stateKey);
678
+ const lockFile = this.getLockFile(stateKey);
679
+ const lock = await this.acquireFileLock(lockFile, Date.now() + DEFAULT_CONCURRENCY_TIMEOUT_MS);
680
+ try {
681
+ const state = await readTrafficState(stateFile);
682
+ const removedRequestIds = new Set(state.leases
683
+ .filter((lease) => lease.pid === process.pid)
684
+ .map((lease) => lease.requestId));
685
+ const nextLeases = state.leases.filter((lease) => lease.pid !== process.pid);
686
+ const nextRpmEvents = state.rpmEvents.filter((event) => !removedRequestIds.has(event.requestId));
687
+ const leaseDelta = Math.max(0, state.leases.length - nextLeases.length);
688
+ const rpmDelta = Math.max(0, state.rpmEvents.length - nextRpmEvents.length);
689
+ if (leaseDelta <= 0 && rpmDelta <= 0) {
690
+ continue;
691
+ }
692
+ result.leasesRemoved += leaseDelta;
693
+ result.rpmEventsRemoved += rpmDelta;
694
+ result.stateFilesUpdated += 1;
695
+ await writeTrafficState(stateFile, {
696
+ version: 1,
697
+ updatedAt: Date.now(),
698
+ leases: nextLeases,
699
+ rpmEvents: nextRpmEvents
700
+ });
701
+ }
702
+ finally {
703
+ await lock.release();
704
+ }
705
+ }
706
+ return result;
707
+ }
207
708
  async acquireFileLock(lockFile, deadlineAt) {
208
709
  await this.ensureDirs();
209
710
  let waitAttempt = 0;
@@ -233,10 +734,25 @@ export class ProviderTrafficGovernor {
233
734
  }
234
735
  catch (error) {
235
736
  const errno = error?.code;
737
+ if (errno === 'ENOENT') {
738
+ await this.ensureDirs();
739
+ continue;
740
+ }
236
741
  if (errno !== 'EEXIST') {
237
742
  throw error;
238
743
  }
239
744
  const meta = await tryReadLockMeta(lockFile);
745
+ if (!hasValidLockMeta(meta)) {
746
+ try {
747
+ await fs.unlink(lockFile);
748
+ continue;
749
+ }
750
+ catch (unlinkError) {
751
+ if (unlinkError?.code !== 'ENOENT') {
752
+ // another process may race us; fallback to wait
753
+ }
754
+ }
755
+ }
240
756
  const createdAt = meta.createdAt ?? 0;
241
757
  const lockAgeMs = createdAt > 0 ? now - createdAt : 0;
242
758
  const stale = lockAgeMs > LOCK_STALE_MS || !isProcessAlive(meta.pid);
@@ -285,7 +801,20 @@ export class ProviderTrafficGovernor {
285
801
  if (!requestId) {
286
802
  throw new Error('[provider-traffic] acquire requires requestId');
287
803
  }
288
- const policy = resolveProviderTrafficPolicy(options.runtime, options.providerKey);
804
+ await this.ensureAdaptiveLoaded();
805
+ const policyBase = resolveProviderTrafficPolicy(options.runtime, options.providerKey);
806
+ const adaptiveState = this.adaptiveEnabled
807
+ ? this.getOrCreateAdaptiveState(runtimeKey, policyBase.concurrency.maxInFlight)
808
+ : null;
809
+ const policy = adaptiveState
810
+ ? {
811
+ ...policyBase,
812
+ concurrency: {
813
+ ...policyBase.concurrency,
814
+ maxInFlight: clampInt(this.resolveAdaptiveEffectiveCap(adaptiveState), adaptiveState.minCap, adaptiveState.hardMaxCap)
815
+ }
816
+ }
817
+ : policyBase;
289
818
  const waitTimeoutMs = Math.min(policy.concurrency.acquireTimeoutMs, policy.rpm.acquireTimeoutMs);
290
819
  const startedAt = Date.now();
291
820
  const deadlineAt = startedAt + waitTimeoutMs;
@@ -295,99 +824,127 @@ export class ProviderTrafficGovernor {
295
824
  const lockFile = this.getLockFile(stateKey);
296
825
  let waitAttempt = 0;
297
826
  let lastReason = 'mixed';
298
- while (true) {
299
- let delayAfterReleaseMs = 0;
300
- const lock = await this.acquireFileLock(lockFile, deadlineAt);
301
- try {
302
- const now = Date.now();
303
- let state = await readTrafficState(stateFile);
304
- state = this.pruneState(state, now, policy);
305
- const activeInFlight = state.leases.length;
306
- const rpmInWindow = state.rpmEvents.length;
307
- const concurrencyBlocked = activeInFlight >= policy.concurrency.maxInFlight;
308
- const rpmBlocked = rpmInWindow >= policy.rpm.requestsPerMinute;
309
- if (!concurrencyBlocked && !rpmBlocked) {
310
- const leaseId = randomUUID();
311
- state.leases.push({
312
- leaseId,
313
- requestId,
314
- pid: process.pid,
315
- startedAt: now,
316
- expiresAt: now + policy.concurrency.staleLeaseMs
317
- });
318
- state.rpmEvents.push({
319
- requestId,
320
- startedAt: now
321
- });
322
- state.updatedAt = now;
323
- await writeTrafficState(stateFile, state);
324
- const waitedMs = Math.max(0, now - startedAt);
325
- return {
326
- permit: {
827
+ let waiterSlotHeld = false;
828
+ try {
829
+ while (true) {
830
+ let delayAfterReleaseMs = 0;
831
+ const lock = await this.acquireFileLock(lockFile, deadlineAt);
832
+ try {
833
+ const now = Date.now();
834
+ let state = await readTrafficState(stateFile);
835
+ state = this.pruneState(state, now, policy);
836
+ const activeInFlight = state.leases.length;
837
+ const rpmInWindow = state.rpmEvents.length;
838
+ const concurrencyBlocked = activeInFlight >= policy.concurrency.maxInFlight;
839
+ const rpmBlocked = rpmInWindow >= policy.rpm.requestsPerMinute;
840
+ if (!concurrencyBlocked && !rpmBlocked) {
841
+ const leaseId = randomUUID();
842
+ state.leases.push({
843
+ leaseId,
844
+ requestId,
845
+ pid: process.pid,
846
+ startedAt: now,
847
+ expiresAt: now + policy.concurrency.staleLeaseMs
848
+ });
849
+ state.rpmEvents.push({
850
+ requestId,
851
+ startedAt: now
852
+ });
853
+ state.updatedAt = now;
854
+ await writeTrafficState(stateFile, state);
855
+ if (adaptiveState) {
856
+ const minute = toMinuteBucket(now);
857
+ const bucket = this.getOrCreateMinuteBucket(adaptiveState, minute);
858
+ bucket.requests += 1;
859
+ bucket.peakInFlight = Math.max(bucket.peakInFlight, activeInFlight + 1);
860
+ adaptiveState.updatedAtMs = now;
861
+ }
862
+ const waitedMs = Math.max(0, now - startedAt);
863
+ return {
864
+ permit: {
865
+ runtimeKey,
866
+ providerKey: options.providerKey,
867
+ requestId,
868
+ leaseId,
869
+ stateKey
870
+ },
871
+ policy,
872
+ waitedMs,
873
+ activeInFlight: activeInFlight + 1,
874
+ rpmInWindow: rpmInWindow + 1
875
+ };
876
+ }
877
+ if (!waiterSlotHeld) {
878
+ this.acquireWaiterSlot(runtimeKey);
879
+ waiterSlotHeld = true;
880
+ }
881
+ if (concurrencyBlocked && rpmBlocked) {
882
+ lastReason = 'mixed';
883
+ }
884
+ else if (concurrencyBlocked) {
885
+ lastReason = 'concurrency';
886
+ }
887
+ else {
888
+ lastReason = 'rpm';
889
+ }
890
+ const nowAfterCheck = Date.now();
891
+ const waitedMs = Math.max(0, nowAfterCheck - startedAt);
892
+ if (softWaitTimeoutMs > 0 && waitedMs >= softWaitTimeoutMs) {
893
+ throw new ProviderTrafficSaturatedError(`provider traffic wait exceeded soft timeout for runtime ${runtimeKey}`, {
894
+ reason: `acquire_soft_timeout_${lastReason}`,
327
895
  runtimeKey,
328
896
  providerKey: options.providerKey,
329
- requestId,
330
- leaseId,
331
- stateKey
332
- },
333
- policy,
334
- waitedMs,
335
- activeInFlight: activeInFlight + 1,
336
- rpmInWindow: rpmInWindow + 1
337
- };
338
- }
339
- if (concurrencyBlocked && rpmBlocked) {
340
- lastReason = 'mixed';
341
- }
342
- else if (concurrencyBlocked) {
343
- lastReason = 'concurrency';
344
- }
345
- else {
346
- lastReason = 'rpm';
347
- }
348
- const nowAfterCheck = Date.now();
349
- const waitedMs = Math.max(0, nowAfterCheck - startedAt);
350
- if (softWaitTimeoutMs > 0 && waitedMs >= softWaitTimeoutMs) {
351
- throw new ProviderTrafficSaturatedError(`provider traffic wait exceeded soft timeout for runtime ${runtimeKey}`, {
352
- reason: `acquire_soft_timeout_${lastReason}`,
353
- runtimeKey,
354
- providerKey: options.providerKey,
355
- maxInFlight: policy.concurrency.maxInFlight,
356
- requestsPerMinute: policy.rpm.requestsPerMinute,
357
- activeInFlight,
358
- rpmInWindow,
359
- waitedMs,
360
- softWaitTimeoutMs
361
- });
897
+ maxInFlight: policy.concurrency.maxInFlight,
898
+ requestsPerMinute: policy.rpm.requestsPerMinute,
899
+ activeInFlight,
900
+ rpmInWindow,
901
+ waitedMs,
902
+ softWaitTimeoutMs
903
+ });
904
+ }
905
+ if (nowAfterCheck >= deadlineAt) {
906
+ throw new ProviderTrafficSaturatedError(`provider traffic saturated for runtime ${runtimeKey}`, {
907
+ reason: `acquire_timeout_${lastReason}`,
908
+ runtimeKey,
909
+ providerKey: options.providerKey,
910
+ maxInFlight: policy.concurrency.maxInFlight,
911
+ requestsPerMinute: policy.rpm.requestsPerMinute,
912
+ activeInFlight,
913
+ rpmInWindow,
914
+ waitedMs
915
+ });
916
+ }
917
+ waitAttempt += 1;
918
+ const backoffMs = Math.min(ACQUIRE_WAIT_MAX_MS, ACQUIRE_WAIT_BASE_MS * Math.pow(2, Math.min(6, waitAttempt - 1)));
919
+ let rpmWaitMs = 0;
920
+ if (rpmBlocked && state.rpmEvents.length > 0) {
921
+ const oldest = state.rpmEvents[0];
922
+ rpmWaitMs = Math.max(0, oldest.startedAt + policy.rpm.windowMs - nowAfterCheck);
923
+ }
924
+ const adaptiveBlockedWaitMs = (() => {
925
+ if (!adaptiveState || !concurrencyBlocked) {
926
+ return 0;
927
+ }
928
+ if (adaptiveState.blockedBackoffUntilMs <= nowAfterCheck) {
929
+ return 0;
930
+ }
931
+ return Math.max(0, adaptiveState.blockedBackoffUntilMs - nowAfterCheck);
932
+ })();
933
+ const combinedWaitMs = Math.min(ACQUIRE_WAIT_MAX_MS, Math.max(backoffMs, rpmWaitMs, adaptiveBlockedWaitMs));
934
+ const jitterMs = Math.floor(Math.random() * ACQUIRE_JITTER_MS);
935
+ delayAfterReleaseMs = Math.max(40, Math.min(combinedWaitMs + jitterMs, deadlineAt - nowAfterCheck));
362
936
  }
363
- if (nowAfterCheck >= deadlineAt) {
364
- throw new ProviderTrafficSaturatedError(`provider traffic saturated for runtime ${runtimeKey}`, {
365
- reason: `acquire_timeout_${lastReason}`,
366
- runtimeKey,
367
- providerKey: options.providerKey,
368
- maxInFlight: policy.concurrency.maxInFlight,
369
- requestsPerMinute: policy.rpm.requestsPerMinute,
370
- activeInFlight,
371
- rpmInWindow,
372
- waitedMs
373
- });
937
+ finally {
938
+ await lock.release();
374
939
  }
375
- waitAttempt += 1;
376
- const backoffMs = Math.min(ACQUIRE_WAIT_MAX_MS, ACQUIRE_WAIT_BASE_MS * Math.pow(2, Math.min(6, waitAttempt - 1)));
377
- let rpmWaitMs = 0;
378
- if (rpmBlocked && state.rpmEvents.length > 0) {
379
- const oldest = state.rpmEvents[0];
380
- rpmWaitMs = Math.max(0, oldest.startedAt + policy.rpm.windowMs - nowAfterCheck);
940
+ if (delayAfterReleaseMs > 0) {
941
+ await sleep(delayAfterReleaseMs);
381
942
  }
382
- const combinedWaitMs = Math.min(ACQUIRE_WAIT_MAX_MS, Math.max(backoffMs, rpmWaitMs));
383
- const jitterMs = Math.floor(Math.random() * ACQUIRE_JITTER_MS);
384
- delayAfterReleaseMs = Math.max(40, Math.min(combinedWaitMs + jitterMs, deadlineAt - nowAfterCheck));
385
- }
386
- finally {
387
- await lock.release();
388
943
  }
389
- if (delayAfterReleaseMs > 0) {
390
- await sleep(delayAfterReleaseMs);
944
+ }
945
+ finally {
946
+ if (waiterSlotHeld) {
947
+ this.releaseWaiterSlot(runtimeKey);
391
948
  }
392
949
  }
393
950
  }
@@ -430,6 +987,32 @@ export class ProviderTrafficGovernor {
430
987
  await lock.release();
431
988
  }
432
989
  }
990
+ async observeOutcome(event) {
991
+ if (!this.adaptiveEnabled) {
992
+ return;
993
+ }
994
+ const runtimeKey = typeof event.runtimeKey === 'string' ? event.runtimeKey.trim() : '';
995
+ if (!runtimeKey) {
996
+ return;
997
+ }
998
+ await this.ensureAdaptiveLoaded();
999
+ const state = this.getOrCreateAdaptiveState(runtimeKey, clampPositiveInt(event.configuredMaxInFlight) ?? 2);
1000
+ const nowMs = typeof event.observedAtMs === 'number' && Number.isFinite(event.observedAtMs)
1001
+ ? Math.max(0, Math.floor(event.observedAtMs))
1002
+ : Date.now();
1003
+ const minute = toMinuteBucket(nowMs);
1004
+ const bucket = this.getOrCreateMinuteBucket(state, minute);
1005
+ if (bucket.requests <= 0) {
1006
+ bucket.requests = 1;
1007
+ }
1008
+ if (typeof event.activeInFlight === 'number' && Number.isFinite(event.activeInFlight)) {
1009
+ bucket.peakInFlight = Math.max(bucket.peakInFlight, Math.max(0, Math.floor(event.activeInFlight)));
1010
+ }
1011
+ if (!event.success && isRecoverable429Like(event)) {
1012
+ bucket.http429 += 1;
1013
+ }
1014
+ this.maybeEvaluateAdaptiveState(runtimeKey, state, event, nowMs);
1015
+ }
433
1016
  }
434
1017
  let sharedGovernor = null;
435
1018
  export function getSharedProviderTrafficGovernor() {
@@ -461,6 +1044,9 @@ export function createNoopProviderTrafficGovernor() {
461
1044
  released: true,
462
1045
  activeInFlight: 0
463
1046
  };
1047
+ },
1048
+ async observeOutcome() {
1049
+ return;
464
1050
  }
465
1051
  };
466
1052
  }