@jsonstudio/rcc 0.90.876 → 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 (833) 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/transport/auth-provider-factory.d.ts +0 -1
  219. package/dist/providers/core/runtime/transport/auth-provider-factory.js +1 -15
  220. package/dist/providers/core/runtime/transport/auth-provider-factory.js.map +1 -1
  221. package/dist/providers/core/runtime/transport/index.d.ts +0 -1
  222. package/dist/providers/core/runtime/transport/index.js +0 -1
  223. package/dist/providers/core/runtime/transport/index.js.map +1 -1
  224. package/dist/providers/core/runtime/transport/oauth-recovery-handler.d.ts +2 -0
  225. package/dist/providers/core/runtime/transport/oauth-recovery-handler.js +76 -5
  226. package/dist/providers/core/runtime/transport/oauth-recovery-handler.js.map +1 -1
  227. package/dist/providers/core/runtime/transport/request-header-builder.d.ts +0 -1
  228. package/dist/providers/core/runtime/transport/request-header-builder.js +1 -7
  229. package/dist/providers/core/runtime/transport/request-header-builder.js.map +1 -1
  230. package/dist/providers/core/runtime/transport/runtime-detector.d.ts +0 -2
  231. package/dist/providers/core/runtime/transport/runtime-detector.js +0 -20
  232. package/dist/providers/core/runtime/transport/runtime-detector.js.map +1 -1
  233. package/dist/providers/core/runtime/transport/session-header-utils.d.ts +6 -0
  234. package/dist/providers/core/runtime/transport/session-header-utils.js +61 -2
  235. package/dist/providers/core/runtime/transport/session-header-utils.js.map +1 -1
  236. package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-request-exec.js +2 -1
  237. package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-request-exec.js.map +1 -1
  238. package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js +2 -1
  239. package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js.map +1 -1
  240. package/dist/providers/core/strategies/oauth-auth-code-flow.d.ts +1 -4
  241. package/dist/providers/core/strategies/oauth-auth-code-flow.js +26 -84
  242. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  243. package/dist/providers/core/strategies/oauth-device-flow.d.ts +2 -0
  244. package/dist/providers/core/strategies/oauth-device-flow.js +43 -8
  245. package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
  246. package/dist/providers/core/utils/http-client.d.ts +7 -5
  247. package/dist/providers/core/utils/http-client.js +108 -33
  248. package/dist/providers/core/utils/http-client.js.map +1 -1
  249. package/dist/providers/core/utils/provider-error-reporter.d.ts +2 -2
  250. package/dist/providers/core/utils/provider-error-reporter.js +9 -85
  251. package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
  252. package/dist/providers/core/utils/provider-type-utils.js +1 -3
  253. package/dist/providers/core/utils/provider-type-utils.js.map +1 -1
  254. package/dist/providers/core/utils/qwen-client-fingerprint.d.ts +15 -0
  255. package/dist/providers/core/utils/qwen-client-fingerprint.js +47 -0
  256. package/dist/providers/core/utils/qwen-client-fingerprint.js.map +1 -0
  257. package/dist/providers/core/utils/snapshot-writer.d.ts +3 -0
  258. package/dist/providers/core/utils/snapshot-writer.js +385 -26
  259. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  260. package/dist/providers/profile/families/qwen-profile.js +285 -22
  261. package/dist/providers/profile/families/qwen-profile.js.map +1 -1
  262. package/dist/providers/profile/profile-registry.js +0 -2
  263. package/dist/providers/profile/profile-registry.js.map +1 -1
  264. package/dist/providers/profile/provider-directory.js +0 -1
  265. package/dist/providers/profile/provider-directory.js.map +1 -1
  266. package/dist/providers/profile/provider-profile-loader.js +1 -1
  267. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  268. package/dist/server/handlers/chat-handler.js +6 -5
  269. package/dist/server/handlers/chat-handler.js.map +1 -1
  270. package/dist/server/handlers/config-admin-handler.js +44 -69
  271. package/dist/server/handlers/config-admin-handler.js.map +1 -1
  272. package/dist/server/handlers/handler-response-utils.js +190 -27
  273. package/dist/server/handlers/handler-response-utils.js.map +1 -1
  274. package/dist/server/handlers/handler-utils.d.ts +3 -0
  275. package/dist/server/handlers/handler-utils.js +72 -0
  276. package/dist/server/handlers/handler-utils.js.map +1 -1
  277. package/dist/server/handlers/images-handler.js +7 -7
  278. package/dist/server/handlers/images-handler.js.map +1 -1
  279. package/dist/server/handlers/messages-handler.js +6 -5
  280. package/dist/server/handlers/messages-handler.js.map +1 -1
  281. package/dist/server/handlers/responses-handler.js +32 -14
  282. package/dist/server/handlers/responses-handler.js.map +1 -1
  283. package/dist/server/handlers/sse-dispatcher.js +55 -13
  284. package/dist/server/handlers/sse-dispatcher.js.map +1 -1
  285. package/dist/server/handlers/types.d.ts +12 -0
  286. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +5 -2
  287. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -1
  288. package/dist/server/runtime/http-server/daemon-admin/control-handler.js +62 -18
  289. package/dist/server/runtime/http-server/daemon-admin/control-handler.js.map +1 -1
  290. package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.js +1 -1
  291. package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.js.map +1 -1
  292. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +9 -9
  293. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
  294. package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js +36 -10
  295. package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js.map +1 -1
  296. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +11 -11
  297. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -1
  298. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +49 -8
  299. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -1
  300. package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +1 -0
  301. package/dist/server/runtime/http-server/daemon-admin-routes.js +46 -0
  302. package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -1
  303. package/dist/server/runtime/http-server/executor/client-injection-flow.js +2 -0
  304. package/dist/server/runtime/http-server/executor/client-injection-flow.js.map +1 -1
  305. package/dist/server/runtime/http-server/executor/log-rollup.d.ts +38 -0
  306. package/dist/server/runtime/http-server/executor/log-rollup.js +775 -0
  307. package/dist/server/runtime/http-server/executor/log-rollup.js.map +1 -0
  308. package/dist/server/runtime/http-server/executor/provider-response-converter.js +654 -281
  309. package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -1
  310. package/dist/server/runtime/http-server/executor/provider-response-utils.js +34 -3
  311. package/dist/server/runtime/http-server/executor/provider-response-utils.js.map +1 -1
  312. package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js +14 -68
  313. package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js.map +1 -1
  314. package/dist/server/runtime/http-server/executor/request-executor-core-utils.js +26 -2
  315. package/dist/server/runtime/http-server/executor/request-executor-core-utils.js.map +1 -1
  316. package/dist/server/runtime/http-server/executor/request-retry-helpers.js +20 -2
  317. package/dist/server/runtime/http-server/executor/request-retry-helpers.js.map +1 -1
  318. package/dist/server/runtime/http-server/executor/servertool-adapter-context.d.ts +10 -0
  319. package/dist/server/runtime/http-server/executor/servertool-adapter-context.js +120 -0
  320. package/dist/server/runtime/http-server/executor/servertool-adapter-context.js.map +1 -0
  321. package/dist/server/runtime/http-server/executor/servertool-followup-dispatch.d.ts +35 -0
  322. package/dist/server/runtime/http-server/executor/servertool-followup-dispatch.js +101 -0
  323. package/dist/server/runtime/http-server/executor/servertool-followup-dispatch.js.map +1 -0
  324. package/dist/server/runtime/http-server/executor/servertool-followup-error.d.ts +46 -0
  325. package/dist/server/runtime/http-server/executor/servertool-followup-error.js +127 -0
  326. package/dist/server/runtime/http-server/executor/servertool-followup-error.js.map +1 -0
  327. package/dist/server/runtime/http-server/executor/servertool-followup-metadata.d.ts +7 -0
  328. package/dist/server/runtime/http-server/executor/servertool-followup-metadata.js +186 -0
  329. package/dist/server/runtime/http-server/executor/servertool-followup-metadata.js.map +1 -0
  330. package/dist/server/runtime/http-server/executor/servertool-request-normalizer.d.ts +2 -0
  331. package/dist/server/runtime/http-server/executor/servertool-request-normalizer.js +56 -0
  332. package/dist/server/runtime/http-server/executor/servertool-request-normalizer.js.map +1 -0
  333. package/dist/server/runtime/http-server/executor/servertool-response-normalizer.d.ts +8 -0
  334. package/dist/server/runtime/http-server/executor/servertool-response-normalizer.js +31 -0
  335. package/dist/server/runtime/http-server/executor/servertool-response-normalizer.js.map +1 -0
  336. package/dist/server/runtime/http-server/executor/servertool-runtime-log.d.ts +8 -0
  337. package/dist/server/runtime/http-server/executor/servertool-runtime-log.js +33 -0
  338. package/dist/server/runtime/http-server/executor/servertool-runtime-log.js.map +1 -0
  339. package/dist/server/runtime/http-server/executor/sse-error-handler.js +37 -0
  340. package/dist/server/runtime/http-server/executor/sse-error-handler.js.map +1 -1
  341. package/dist/server/runtime/http-server/executor/usage-aggregator.js +32 -2
  342. package/dist/server/runtime/http-server/executor/usage-aggregator.js.map +1 -1
  343. package/dist/server/runtime/http-server/executor/usage-logger.d.ts +12 -0
  344. package/dist/server/runtime/http-server/executor/usage-logger.js +56 -1
  345. package/dist/server/runtime/http-server/executor/usage-logger.js.map +1 -1
  346. package/dist/server/runtime/http-server/executor-metadata.d.ts +15 -0
  347. package/dist/server/runtime/http-server/executor-metadata.js +60 -18
  348. package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
  349. package/dist/server/runtime/http-server/executor-provider.d.ts +2 -0
  350. package/dist/server/runtime/http-server/executor-provider.js +88 -205
  351. package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
  352. package/dist/server/runtime/http-server/executor-response.js +30 -149
  353. package/dist/server/runtime/http-server/executor-response.js.map +1 -1
  354. package/dist/server/runtime/http-server/http-server-bootstrap.js +53 -17
  355. package/dist/server/runtime/http-server/http-server-bootstrap.js.map +1 -1
  356. package/dist/server/runtime/http-server/http-server-legacy-pipeline.js +28 -1
  357. package/dist/server/runtime/http-server/http-server-legacy-pipeline.js.map +1 -1
  358. package/dist/server/runtime/http-server/http-server-lifecycle.js +17 -4
  359. package/dist/server/runtime/http-server/http-server-lifecycle.js.map +1 -1
  360. package/dist/server/runtime/http-server/http-server-runtime-providers.js +42 -13
  361. package/dist/server/runtime/http-server/http-server-runtime-providers.js.map +1 -1
  362. package/dist/server/runtime/http-server/http-server-runtime-setup.js +40 -2
  363. package/dist/server/runtime/http-server/http-server-runtime-setup.js.map +1 -1
  364. package/dist/server/runtime/http-server/hub-shadow-compare.js +8 -4
  365. package/dist/server/runtime/http-server/hub-shadow-compare.js.map +1 -1
  366. package/dist/server/runtime/http-server/managed-process-probe.js +30 -4
  367. package/dist/server/runtime/http-server/managed-process-probe.js.map +1 -1
  368. package/dist/server/runtime/http-server/middleware.js +32 -4
  369. package/dist/server/runtime/http-server/middleware.js.map +1 -1
  370. package/dist/server/runtime/http-server/provider-traffic-governor.d.ts +45 -1
  371. package/dist/server/runtime/http-server/provider-traffic-governor.js +697 -111
  372. package/dist/server/runtime/http-server/provider-traffic-governor.js.map +1 -1
  373. package/dist/server/runtime/http-server/provider-utils.js +2 -6
  374. package/dist/server/runtime/http-server/provider-utils.js.map +1 -1
  375. package/dist/server/runtime/http-server/request-activity-tracker.d.ts +4 -0
  376. package/dist/server/runtime/http-server/request-activity-tracker.js +54 -11
  377. package/dist/server/runtime/http-server/request-activity-tracker.js.map +1 -1
  378. package/dist/server/runtime/http-server/request-executor.d.ts +247 -0
  379. package/dist/server/runtime/http-server/request-executor.js +2444 -334
  380. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  381. package/dist/server/runtime/http-server/routes.js +59 -16
  382. package/dist/server/runtime/http-server/routes.js.map +1 -1
  383. package/dist/server/runtime/http-server/runtime-manager.js +0 -15
  384. package/dist/server/runtime/http-server/runtime-manager.js.map +1 -1
  385. package/dist/server/runtime/http-server/session-client-registry-utils.js +46 -10
  386. package/dist/server/runtime/http-server/session-client-registry-utils.js.map +1 -1
  387. package/dist/server/runtime/http-server/session-client-registry.js +22 -4
  388. package/dist/server/runtime/http-server/session-client-registry.js.map +1 -1
  389. package/dist/server/runtime/http-server/session-client-routes.js +40 -18
  390. package/dist/server/runtime/http-server/session-client-routes.js.map +1 -1
  391. package/dist/server/runtime/http-server/session-dir.js +35 -2
  392. package/dist/server/runtime/http-server/session-dir.js.map +1 -1
  393. package/dist/server/runtime/http-server/session-scope-resolution.js +38 -9
  394. package/dist/server/runtime/http-server/session-scope-resolution.js.map +1 -1
  395. package/dist/server/runtime/http-server/session-storage-cleanup.js +64 -27
  396. package/dist/server/runtime/http-server/session-storage-cleanup.js.map +1 -1
  397. package/dist/server/runtime/http-server/stats-manager.d.ts +5 -0
  398. package/dist/server/runtime/http-server/stats-manager.js +138 -6
  399. package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
  400. package/dist/server/runtime/http-server/tmux-injection-history.js +30 -4
  401. package/dist/server/runtime/http-server/tmux-injection-history.js.map +1 -1
  402. package/dist/server/runtime/http-server/tmux-session-probe.d.ts +3 -1
  403. package/dist/server/runtime/http-server/tmux-session-probe.js +198 -9
  404. package/dist/server/runtime/http-server/tmux-session-probe.js.map +1 -1
  405. package/dist/server/utils/client-connection-state.d.ts +1 -0
  406. package/dist/server/utils/client-connection-state.js +45 -5
  407. package/dist/server/utils/client-connection-state.js.map +1 -1
  408. package/dist/server/utils/finish-reason.js +61 -2
  409. package/dist/server/utils/finish-reason.js.map +1 -1
  410. package/dist/server/utils/http-error-mapper.d.ts +4 -0
  411. package/dist/server/utils/http-error-mapper.js +31 -6
  412. package/dist/server/utils/http-error-mapper.js.map +1 -1
  413. package/dist/server/utils/stage-logger.js +42 -13
  414. package/dist/server/utils/stage-logger.js.map +1 -1
  415. package/dist/server-lifecycle/port-utils.js +6 -2
  416. package/dist/server-lifecycle/port-utils.js.map +1 -1
  417. package/dist/token-daemon/index.js +44 -15
  418. package/dist/token-daemon/index.js.map +1 -1
  419. package/dist/token-daemon/leader-lock.js +65 -7
  420. package/dist/token-daemon/leader-lock.js.map +1 -1
  421. package/dist/token-daemon/provider-registry.js +1 -1
  422. package/dist/token-daemon/provider-registry.js.map +1 -1
  423. package/dist/token-daemon/server-utils.d.ts +11 -0
  424. package/dist/token-daemon/server-utils.js +71 -18
  425. package/dist/token-daemon/server-utils.js.map +1 -1
  426. package/dist/token-daemon/token-daemon.d.ts +0 -1
  427. package/dist/token-daemon/token-daemon.js +81 -63
  428. package/dist/token-daemon/token-daemon.js.map +1 -1
  429. package/dist/token-daemon/token-types.d.ts +1 -1
  430. package/dist/token-daemon/token-types.js +0 -1
  431. package/dist/token-daemon/token-types.js.map +1 -1
  432. package/dist/token-daemon/token-utils.js +4 -2
  433. package/dist/token-daemon/token-utils.js.map +1 -1
  434. package/dist/tools/provider-update/fetch-models.js +1 -5
  435. package/dist/tools/provider-update/fetch-models.js.map +1 -1
  436. package/dist/utils/error-handler-registry.js +50 -13
  437. package/dist/utils/error-handler-registry.js.map +1 -1
  438. package/dist/utils/errorsamples.d.ts +3 -1
  439. package/dist/utils/errorsamples.js +198 -14
  440. package/dist/utils/errorsamples.js.map +1 -1
  441. package/dist/utils/http-health-probe.d.ts +42 -0
  442. package/dist/utils/http-health-probe.js +231 -0
  443. package/dist/utils/http-health-probe.js.map +1 -0
  444. package/dist/utils/managed-server-pids.js +2 -2
  445. package/dist/utils/managed-server-pids.js.map +1 -1
  446. package/dist/utils/module-config-reader.js +11 -1
  447. package/dist/utils/module-config-reader.js.map +1 -1
  448. package/dist/utils/runtime-package-root.d.ts +2 -0
  449. package/dist/utils/runtime-package-root.js +47 -0
  450. package/dist/utils/runtime-package-root.js.map +1 -0
  451. package/dist/utils/snapshot-local-disk-gate.d.ts +3 -0
  452. package/dist/utils/snapshot-local-disk-gate.js +50 -0
  453. package/dist/utils/snapshot-local-disk-gate.js.map +1 -0
  454. package/dist/utils/snapshot-payload-guard.d.ts +1 -0
  455. package/dist/utils/snapshot-payload-guard.js +234 -0
  456. package/dist/utils/snapshot-payload-guard.js.map +1 -0
  457. package/dist/utils/snapshot-request-retention.d.ts +3 -0
  458. package/dist/utils/snapshot-request-retention.js +128 -0
  459. package/dist/utils/snapshot-request-retention.js.map +1 -0
  460. package/dist/utils/snapshot-stage-policy.d.ts +3 -0
  461. package/dist/utils/snapshot-stage-policy.js +111 -0
  462. package/dist/utils/snapshot-stage-policy.js.map +1 -0
  463. package/dist/utils/snapshot-writer.js +124 -127
  464. package/dist/utils/snapshot-writer.js.map +1 -1
  465. package/docs/CHAT_PROCESS_PROTOCOL_AND_PIPELINE.md +4 -0
  466. package/docs/CONFIG_ARCHITECTURE.md +2 -2
  467. package/docs/INSTALLATION_AND_QUICKSTART.md +5 -5
  468. package/docs/OAUTH.md +2 -5
  469. package/docs/PORTS.md +1 -1
  470. package/docs/PROVIDERS_BUILTIN.md +1 -5
  471. package/docs/PROVIDER_TYPES.md +1 -1
  472. package/docs/agent-routing/10-runtime-ssot-routing.md +4 -0
  473. package/docs/agent-routing/20-build-test-release-routing.md +2 -2
  474. package/docs/agent-routing/30-servertool-lifecycle-routing.md +2 -0
  475. package/docs/agent-routing/40-task-memory-routing.md +22 -2
  476. package/docs/audit/286.1-provider-failure-policy-audit.md +341 -0
  477. package/docs/audits/2026-04-26-fallback-silent-failure-audit.md +119 -0
  478. package/docs/audits/2026-04-27-provider-failure-policy-ssot-audit.md +153 -0
  479. package/docs/chat-process-continuation-state-contract.md +196 -0
  480. package/docs/chat-semantic-expansion-plan.md +2 -0
  481. package/docs/daemon-admin-api-design.md +9 -9
  482. package/docs/design/provider-failure-policy-ssot.md +215 -0
  483. package/docs/design/reasoning-stop-lifecycle.md +90 -0
  484. package/docs/design/servertool-unified-skeleton.md +202 -0
  485. package/docs/design/websearch-servertool-orchestration.md +190 -0
  486. package/docs/error-handling-v2.md +120 -11
  487. package/docs/protocol-compatibility-matrix.md +147 -0
  488. package/docs/providers/provider-composite-design.md +4 -5
  489. package/docs/providers/provider-composite-testing.md +1 -1
  490. package/docs/providers/provider-type-only-migration.md +2 -15
  491. package/docs/refactoring/compatibility-v2-architecture-design.md +1 -3
  492. package/docs/refactoring/host-164.3-responsibility-migration.md +0 -1
  493. package/docs/routing-instructions.md +42 -1
  494. package/docs/stop-message-auto.md +0 -1
  495. package/docs/token-refresh-daemon-plan.md +14 -14
  496. package/docs/v2-architecture/IMPLEMENTATION-ROADMAP.md +1 -1
  497. package/docs/v2-architecture/PROVIDER-V2-CHANGESET-RELEASE-CHECKLIST.md +1 -9
  498. package/docs/v2-architecture/PROVIDER-V2-LAYERING-ADR-DRAFT.md +3 -4
  499. package/docs/v2-architecture/PROVIDER-V2-MIGRATION-MATRIX-DRAFT.md +4 -15
  500. package/docs/v2-architecture/PROVIDER-V2-PHASED-MIGRATION-ROLLBACK-DRAFT.md +4 -5
  501. package/docs/v2-architecture/PROVIDER-V2-PROFILE-API-REGISTRY-DRAFT.md +4 -4
  502. package/docs/v2-architecture/PROVIDER-V2-REFACTOR-OVERVIEW-DRAFT.md +1 -2
  503. package/docs/v2-architecture/PROVIDER-V2-VERIFICATION-MATRIX-DRAFT.md +2 -2
  504. package/node_modules/@jsonstudio/llms/dist/config-unified/unified-config.js +36 -10
  505. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/deepseek-web-request.js +7 -0
  506. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/deepseek-web-response.js +2 -2
  507. package/node_modules/@jsonstudio/llms/dist/conversion/compat/antigravity-session-signature.js +33 -17
  508. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/header-policies.d.ts +20 -0
  509. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/header-policies.js +79 -0
  510. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/policy-overrides.d.ts +16 -0
  511. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/policy-overrides.js +27 -0
  512. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/provider-resolver.d.ts +26 -0
  513. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/provider-resolver.js +59 -0
  514. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/registry.d.ts +35 -0
  515. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/registry.js +154 -0
  516. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/types.d.ts +75 -0
  517. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/types.js +8 -0
  518. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/anthropic-claude-code.json +13 -7
  519. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-claude-code.json +13 -8
  520. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-deepseek-web.json +37 -8
  521. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwen.json +48 -11
  522. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/compat-passthrough.json +6 -0
  523. package/node_modules/@jsonstudio/llms/dist/conversion/compat/provider-resolution-config.json +24 -0
  524. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper-config.js +0 -1
  525. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper-from-chat.js +54 -7
  526. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper-to-chat.js +15 -2
  527. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-semantics-audit.d.ts +11 -0
  528. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-semantics-audit.js +16 -30
  529. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapper-config.js +0 -1
  530. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapper-from-chat.js +15 -1
  531. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapping-audit.d.ts +10 -0
  532. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapping-audit.js +9 -30
  533. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/protocol-mapping-audit.d.ts +43 -0
  534. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/protocol-mapping-audit.js +148 -0
  535. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-from-chat.js +16 -6
  536. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-helpers.d.ts +2 -1
  537. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-helpers.js +65 -3
  538. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-to-chat.js +1 -1
  539. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper.d.ts +1 -1
  540. package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper.js +1 -1
  541. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-types.d.ts +14 -154
  542. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-chat-process-request-utils.d.ts +6 -1
  543. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-chat-process-request-utils.js +83 -3
  544. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-chat-process-entry.js +6 -5
  545. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage-inbound.d.ts +0 -1
  546. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage-inbound.js +9 -5
  547. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage-provider-payload.js +132 -1
  548. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage.js +0 -1
  549. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-heavy-input-fastpath.d.ts +4 -22
  550. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-heavy-input-fastpath.js +109 -139
  551. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-max-tokens-policy.js +40 -1
  552. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-route-and-outbound.d.ts +0 -1
  553. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-route-and-outbound.js +19 -2
  554. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.d.ts +0 -2
  555. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.js +45 -43
  556. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/route-aware-responses-continuation.d.ts +10 -0
  557. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/route-aware-responses-continuation.js +143 -0
  558. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/index.js +37 -0
  559. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/semantic-lift.js +14 -2
  560. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/responses-context-snapshot.d.ts +3 -0
  561. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/responses-context-snapshot.js +22 -11
  562. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/chat-process-semantics-bridge.js +59 -2
  563. 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
  564. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/client-remap-protocol-switch.js +3 -1
  565. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/index.d.ts +1 -0
  566. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/index.js +2 -1
  567. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.d.ts +2 -0
  568. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.js +53 -1
  569. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage2_finalize/index.js +4 -1
  570. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage3_servertool_orchestration/index.d.ts +1 -0
  571. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage3_servertool_orchestration/index.js +16 -0
  572. package/node_modules/@jsonstudio/llms/dist/conversion/hub/policy/policy-engine.js +14 -4
  573. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-anthropic-alias.d.ts +1 -0
  574. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-anthropic-alias.js +29 -1
  575. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-pending-tool-sync.js +38 -2
  576. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-request-sanitizer.js +164 -1
  577. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.js +27 -2
  578. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-mappers.d.ts +9 -3
  579. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-mappers.js +8 -7
  580. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-runtime-anthropic.js +20 -5
  581. package/node_modules/@jsonstudio/llms/dist/conversion/hub/snapshot-recorder.js +1 -247
  582. package/node_modules/@jsonstudio/llms/dist/conversion/hub/types/chat-envelope.d.ts +84 -4
  583. package/node_modules/@jsonstudio/llms/dist/conversion/pipeline/codecs/v2/responses-openai-pipeline.js +26 -1
  584. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge/response-payload.js +10 -9
  585. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge/utils.js +20 -5
  586. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge.js +88 -4
  587. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils-core.js +5 -1
  588. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils-openai-request.js +55 -14
  589. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils-tool-schema.js +1 -2
  590. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils.js +38 -15
  591. package/node_modules/@jsonstudio/llms/dist/conversion/shared/openai-message-normalize.js +45 -6
  592. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-conversation-store.d.ts +15 -0
  593. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-conversation-store.js +157 -13
  594. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.d.ts +8 -2
  595. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.js +103 -9
  596. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-response-utils.js +10 -10
  597. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-filter-pipeline.js +59 -9
  598. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-governor-guards.d.ts +1 -1
  599. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-governor-guards.js +54 -43
  600. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-governor.js +62 -8
  601. package/node_modules/@jsonstudio/llms/dist/conversion/snapshot-utils.js +121 -8
  602. package/node_modules/@jsonstudio/llms/dist/filters/engine.js +64 -6
  603. package/node_modules/@jsonstudio/llms/dist/filters/special/request-tool-list-filter.js +32 -11
  604. package/node_modules/@jsonstudio/llms/dist/filters/special/request-toolcalls-stringify.js +26 -1
  605. package/node_modules/@jsonstudio/llms/dist/filters/special/request-tools-normalize.js +46 -7
  606. package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-blacklist.js +10 -1
  607. package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-schema-converge.js +10 -1
  608. package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-stringify.js +30 -5
  609. package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-whitelist.js +10 -1
  610. package/node_modules/@jsonstudio/llms/dist/filters/special/tool-filter-hooks.js +16 -14
  611. package/node_modules/@jsonstudio/llms/dist/filters/utils/snapshot-writer.js +47 -5
  612. package/node_modules/@jsonstudio/llms/dist/guidance/index.js +16 -2
  613. package/node_modules/@jsonstudio/llms/dist/http/sse-response.js +42 -6
  614. package/node_modules/@jsonstudio/llms/dist/native/router_hotpath_napi.node +0 -0
  615. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/auth-utils.js +33 -31
  616. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/provider-normalization.d.ts +6 -0
  617. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/provider-normalization.js +78 -98
  618. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/responses-helpers.js +22 -2
  619. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/routing-config.js +56 -3
  620. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/streaming-helpers.js +19 -1
  621. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap.js +62 -293
  622. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/classifier.js +11 -82
  623. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/antigravity/alias-lease.js +42 -15
  624. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/cooldown-manager.js +55 -3
  625. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/health/index.js +66 -15
  626. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-pools/index.js +44 -8
  627. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-state/keys.d.ts +7 -0
  628. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-state/keys.js +65 -21
  629. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-state/store.js +19 -2
  630. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/sticky-session-manager.d.ts +9 -0
  631. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/sticky-session-manager.js +139 -4
  632. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-logging.js +2 -1
  633. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-semantics.js +68 -59
  634. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-governance-semantics.js +156 -157
  635. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-node-result-semantics.d.ts +1 -0
  636. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-node-result-semantics.js +31 -0
  637. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-servertool-orchestration-semantics.js +94 -95
  638. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-compat-action-semantics.d.ts +0 -1
  639. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-compat-action-semantics.js +0 -7
  640. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-parsers.d.ts +1 -1
  641. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-parsers.js +203 -305
  642. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-tools-post.js +35 -0
  643. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-tools-request.js +2 -1
  644. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-types.d.ts +2 -0
  645. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-policy-semantics.js +173 -154
  646. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-edge-stage-semantics.d.ts +1 -0
  647. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-edge-stage-semantics.js +106 -57
  648. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-inbound-outbound-semantics.js +122 -114
  649. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-builders.d.ts +1 -0
  650. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-metadata-policy.js +100 -86
  651. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-passthrough.js +52 -33
  652. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-protocol.js +79 -62
  653. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics.d.ts +1 -0
  654. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-inbound-semantics-parsers.js +50 -33
  655. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-inbound-semantics-types.d.ts +2 -0
  656. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-outbound-semantics-parsers.d.ts +1 -1
  657. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-outbound-semantics-parsers.js +161 -177
  658. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-outbound-tools.d.ts +1 -0
  659. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-outbound-tools.js +1 -0
  660. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-parsers.d.ts +1 -1
  661. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-parsers.js +231 -286
  662. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-router-hotpath-analysis.js +143 -164
  663. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-router-hotpath-required-exports.d.ts +1 -1
  664. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-router-hotpath-required-exports.js +8 -1
  665. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics-reasoning.js +57 -28
  666. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics-responses.d.ts +8 -0
  667. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics-responses.js +76 -0
  668. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.d.ts +1 -1
  669. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.js +1 -1
  670. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-providers.d.ts +24 -0
  671. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-providers.js +78 -0
  672. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-routing.d.ts +17 -0
  673. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-routing.js +72 -0
  674. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/route-utils.js +9 -0
  675. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/tier-selection-select.js +11 -5
  676. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.js +4 -39
  677. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/features.js +199 -31
  678. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/health-manager.js +7 -2
  679. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/load-balancer.d.ts +3 -0
  680. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/load-balancer.js +47 -3
  681. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/native-error.d.ts +11 -0
  682. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/native-error.js +71 -0
  683. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-registry.js +81 -2
  684. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-runtime-ingress.d.ts +24 -0
  685. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-runtime-ingress.js +139 -0
  686. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-instructions/parse.js +21 -1
  687. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-instructions/state.js +46 -0
  688. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-instructions/types.d.ts +7 -0
  689. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-stop-message-state-codec.js +30 -1
  690. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/sticky-session-store.js +44 -15
  691. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/stop-message-state-sync.d.ts +1 -1
  692. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/stop-message-state-sync.js +10 -2
  693. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/success-center.js +39 -2
  694. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.d.ts +1 -0
  695. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.js +25 -24
  696. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.d.ts +3 -0
  697. package/node_modules/@jsonstudio/llms/dist/servertool/engine.js +255 -71
  698. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/clock.js +20 -2
  699. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/followup-request-builder.js +120 -85
  700. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/memory-appender.d.ts +6 -0
  701. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/memory-appender.js +42 -0
  702. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-only-continue.js +1 -1
  703. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop-guard.js +630 -0
  704. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop-state.d.ts +24 -0
  705. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop-state.js +606 -0
  706. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop.js +292 -0
  707. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/{iflow-followup.d.ts → ai-followup.d.ts} +3 -3
  708. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/{iflow-followup.js → ai-followup.js} +76 -81
  709. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/config.d.ts +1 -2
  710. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/config.js +2 -6
  711. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/runtime-utils.d.ts +1 -0
  712. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/runtime-utils.js +51 -11
  713. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto.js +5 -4
  714. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search-auto-trigger.d.ts +9 -0
  715. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search-auto-trigger.js +91 -0
  716. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.js +1 -131
  717. package/node_modules/@jsonstudio/llms/dist/servertool/heartbeat/session-store.js +49 -18
  718. package/node_modules/@jsonstudio/llms/dist/servertool/registry.js +3 -0
  719. package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.d.ts +2 -2
  720. package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.js +14 -10
  721. package/node_modules/@jsonstudio/llms/dist/servertool/strip-servertool-calls.js +2 -3
  722. package/node_modules/@jsonstudio/llms/dist/servertool/types.d.ts +11 -1
  723. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/chat-json-to-sse-converter.js +26 -1
  724. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/chat.d.ts +2 -2
  725. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/chat.js +38 -3
  726. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/sequencers/chat-sequencer.js +6 -3
  727. package/node_modules/@jsonstudio/llms/dist/sse/shared/chat-serializer.js +27 -3
  728. package/node_modules/@jsonstudio/llms/dist/sse/shared/constants.d.ts +6 -6
  729. package/node_modules/@jsonstudio/llms/dist/sse/shared/constants.js +3 -3
  730. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +1 -0
  731. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/anthropic-sse-to-json-converter.js +36 -1
  732. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/anthropic-response-builder.js +6 -20
  733. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.d.ts +3 -0
  734. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.js +125 -42
  735. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/chat-sse-to-json-converter.js +59 -10
  736. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/parsers/sse-parser.js +2 -0
  737. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/responses-sse-to-json-converter.d.ts +1 -0
  738. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/responses-sse-to-json-converter.js +71 -2
  739. package/node_modules/@jsonstudio/llms/dist/sse/types/chat-types.d.ts +1 -0
  740. package/node_modules/@jsonstudio/llms/dist/sse/types/chat-types.js +1 -1
  741. package/node_modules/@jsonstudio/llms/dist/sse/types/conversion-context.js +2 -2
  742. package/node_modules/@jsonstudio/llms/dist/sse/types/index.d.ts +1 -1
  743. package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.d.ts +1 -1
  744. package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.js +1 -1
  745. package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.js +34 -12
  746. package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/patch-text/fuzzy-match.d.ts +14 -0
  747. package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/patch-text/fuzzy-match.js +174 -0
  748. package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/patch-text/normalize.js +148 -0
  749. package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/structured.js +31 -2
  750. package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/validator.js +121 -4
  751. package/node_modules/@jsonstudio/llms/dist/tools/exec-command/normalize.d.ts +4 -1
  752. package/node_modules/@jsonstudio/llms/dist/tools/exec-command/normalize.js +31 -16
  753. package/node_modules/@jsonstudio/llms/dist/tools/exec-command/validator.d.ts +1 -0
  754. package/node_modules/@jsonstudio/llms/dist/tools/exec-command/validator.js +3 -1
  755. package/node_modules/@jsonstudio/llms/dist/tools/tool-registry.d.ts +1 -0
  756. package/node_modules/@jsonstudio/llms/dist/tools/tool-registry.js +5 -27
  757. package/node_modules/@jsonstudio/llms/package.json +1 -1
  758. package/package.json +6 -7
  759. package/scripts/ci/repo-sanity.mjs +1 -0
  760. package/scripts/ci/silent-failure-audit.mjs +112 -70
  761. package/scripts/cleanup-stale-server-pids.mjs +0 -6
  762. package/scripts/ensure-cli-command-shim.mjs +49 -15
  763. package/scripts/ensure-cli-executable.mjs +1 -1
  764. package/scripts/install-global.sh +7 -6
  765. package/scripts/install-release-snapshot.mjs +232 -0
  766. package/scripts/install-release.sh +30 -24
  767. package/scripts/link-global-llms-local.mjs +1 -2
  768. package/scripts/pack-mode.mjs +0 -4
  769. package/scripts/pack-rcc.mjs +17 -58
  770. package/scripts/run-bg.sh +0 -6
  771. package/scripts/run-fg-gtimeout.sh +0 -6
  772. package/scripts/tests/antigravity-codex-sample-pipeline-compare.mjs +1 -1
  773. package/scripts/tests/blackbox-rcc-vs-routecodex-antigravity.mjs +60 -39
  774. package/scripts/verify-install-e2e.mjs +64 -26
  775. package/configsamples/provider-default/qwenchat/config.v2.json +0 -53
  776. package/dist/providers/auth/iflow-cookie-auth.d.ts +0 -27
  777. package/dist/providers/auth/iflow-cookie-auth.js +0 -207
  778. package/dist/providers/auth/iflow-cookie-auth.js.map +0 -1
  779. package/dist/providers/auth/iflow-userinfo-helper.d.ts +0 -32
  780. package/dist/providers/auth/iflow-userinfo-helper.js +0 -81
  781. package/dist/providers/auth/iflow-userinfo-helper.js.map +0 -1
  782. package/dist/providers/core/runtime/iflow-http-provider.d.ts +0 -13
  783. package/dist/providers/core/runtime/iflow-http-provider.js +0 -22
  784. package/dist/providers/core/runtime/iflow-http-provider.js.map +0 -1
  785. package/dist/providers/core/runtime/provider-iflow-business-error-utils.d.ts +0 -15
  786. package/dist/providers/core/runtime/provider-iflow-business-error-utils.js +0 -49
  787. package/dist/providers/core/runtime/provider-iflow-business-error-utils.js.map +0 -1
  788. package/dist/providers/core/runtime/qwenchat-http-provider-helpers.d.ts +0 -89
  789. package/dist/providers/core/runtime/qwenchat-http-provider-helpers.js +0 -1698
  790. package/dist/providers/core/runtime/qwenchat-http-provider-helpers.js.map +0 -1
  791. package/dist/providers/core/runtime/qwenchat-http-provider.d.ts +0 -9
  792. package/dist/providers/core/runtime/qwenchat-http-provider.js +0 -78
  793. package/dist/providers/core/runtime/qwenchat-http-provider.js.map +0 -1
  794. package/dist/providers/core/runtime/standard-tool-text-request-transform.d.ts +0 -13
  795. package/dist/providers/core/runtime/standard-tool-text-request-transform.js +0 -138
  796. package/dist/providers/core/runtime/standard-tool-text-request-transform.js.map +0 -1
  797. package/dist/providers/core/runtime/transport/iflow-signer.d.ts +0 -12
  798. package/dist/providers/core/runtime/transport/iflow-signer.js +0 -63
  799. package/dist/providers/core/runtime/transport/iflow-signer.js.map +0 -1
  800. package/dist/providers/profile/families/iflow-profile.d.ts +0 -2
  801. package/dist/providers/profile/families/iflow-profile.js +0 -384
  802. package/dist/providers/profile/families/iflow-profile.js.map +0 -1
  803. package/docs/mapping-tables/iflow-to-openai.json +0 -215
  804. package/docs/mapping-tables/openai-to-iflow.json +0 -227
  805. package/docs/multi-token-auth-guide.md +0 -66
  806. package/docs/oauth-authentication-guide.md +0 -172
  807. package/docs/oauth-iflow-implementation.md +0 -157
  808. package/docs/release-iflow-400-gate.md +0 -58
  809. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-cli-defaults.d.ts +0 -10
  810. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-cli-defaults.js +0 -31
  811. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-history-media-placeholder.d.ts +0 -7
  812. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-history-media-placeholder.js +0 -25
  813. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-thinking-reasoning-fill.d.ts +0 -12
  814. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-thinking-reasoning-fill.js +0 -46
  815. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-native-compat.d.ts +0 -6
  816. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-native-compat.js +0 -36
  817. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-response-body-unwrap.d.ts +0 -9
  818. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-response-body-unwrap.js +0 -25
  819. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-tool-text-fallback.d.ts +0 -5
  820. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-tool-text-fallback.js +0 -29
  821. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-web-search.d.ts +0 -18
  822. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-web-search.js +0 -49
  823. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwenchat-web-request.d.ts +0 -3
  824. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwenchat-web-request.js +0 -62
  825. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-iflow.json +0 -353
  826. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwenchat-web.json +0 -47
  827. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-health.d.ts +0 -1
  828. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-health.js +0 -1
  829. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/iflow-model-error-retry.js +0 -92
  830. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/review.js +0 -202
  831. package/scripts/publish-rcc.mjs +0 -81
  832. /package/node_modules/@jsonstudio/llms/dist/servertool/handlers/{iflow-model-error-retry.d.ts → reasoning-stop-guard.d.ts} +0 -0
  833. /package/node_modules/@jsonstudio/llms/dist/servertool/handlers/{review.d.ts → reasoning-stop.d.ts} +0 -0
@@ -5,8 +5,7 @@ import fsSync from 'fs';
5
5
  import path from 'path';
6
6
  import os from 'os';
7
7
  import { spawnSync } from 'node:child_process';
8
- import { fetchIFlowUserInfo, mergeIFlowTokenData } from './iflow-userinfo-helper.js';
9
- import { fetchQwenUserInfo, mergeQwenTokenData } from './qwen-userinfo-helper.js';
8
+ import { fetchQwenUserInfo, mergeQwenTokenData, validateQwenAccessToken } from './qwen-userinfo-helper.js';
10
9
  import { fetchGeminiCLIUserInfo, fetchGeminiCLIProjects, mergeGeminiCLITokenData, getDefaultProjectId } from './gemini-cli-userinfo-helper.js';
11
10
  import { parseTokenSequenceFromPath } from './token-scanner/index.js';
12
11
  import { logOAuthDebug } from './oauth-logger.js';
@@ -22,12 +21,19 @@ import { extractStatusCode, isGoogleAccountVerificationRequiredMessage, extractG
22
21
  import { hasNonEmptyString, extractAccessToken, extractApiKey, hasApiKeyField, hasStableQwenApiKey, hasAccessToken, getExpiresAt, resolveProjectId, coerceExpiryTimestampSeconds, hasNoRefreshFlag, evaluateTokenState } from './oauth-lifecycle/token-helpers.js';
23
22
  import { normalizeGeminiCliAccountToken, sanitizeToken, readTokenFromFile, backupTokenFile, restoreTokenFileFromBackup, discardBackupFile, clearTokenFile, readRawTokenFile } from './oauth-lifecycle/token-io.js';
24
23
  import { resolveRccAuthDir } from '../../config/user-data-paths.js';
24
+ import { isPermanentOAuthRefreshErrorMessage } from '../core/strategies/oauth-refresh-errors.js';
25
25
  const OAUTH_INTERACTIVE_LOCK_FILE = path.join(resolveRccAuthDir(), '.oauth-interactive.lock.json');
26
- const IFLOW_AUTO_FAILURE_FILE = path.join(resolveRccAuthDir(), '.iflow-auto-failures.json');
27
26
  const OAUTH_THROTTLE_WINDOW_MS = 60_000;
28
- const IFLOW_REFRESH_FAILURE_BACKOFF_MS = 5 * 60_000;
29
27
  const TOKEN_REFRESH_SKEW_MS = 60_000;
30
- function logOAuthLifecycleNonBlockingError(operation, error, details, options) {
28
+ function logOAuthLifecycleNonBlocking(operation, error, details, options) {
29
+ const throttleKey = options?.throttleKey;
30
+ if (throttleKey) {
31
+ const throttleMs = options?.throttleMs ?? OAUTH_THROTTLE_WINDOW_MS;
32
+ if (shouldThrottle(throttleKey, throttleMs)) {
33
+ return;
34
+ }
35
+ updateThrottle(throttleKey);
36
+ }
31
37
  const reason = error instanceof Error ? error.message : String(error);
32
38
  const detailPairs = Object.entries(details || {})
33
39
  .map(([key, value]) => `${key}=${String(value)}`)
@@ -62,7 +68,7 @@ async function openGoogleAccountVerificationInCamoufox(args) {
62
68
  }
63
69
  }
64
70
  catch (error) {
65
- logOAuthLifecycleNonBlockingError('openGoogleAccountVerificationInCamoufox', error, { providerType, alias, url }, { warn: true });
71
+ logOAuthLifecycleNonBlocking('openGoogleAccountVerificationInCamoufox', error, { providerType, alias, url }, { warn: true });
66
72
  }
67
73
  finally {
68
74
  if (prevBrowser === undefined) {
@@ -91,53 +97,143 @@ async function openGoogleAccountVerificationInCamoufox(args) {
91
97
  }
92
98
  }
93
99
  }
94
- function isIflowRefreshEndpointRejectionMessage(message) {
95
- const normalized = (message || '').toLowerCase();
96
- if (!normalized) {
97
- return false;
100
+ async function maybeMarkTokenFileNoRefresh(filePath) {
101
+ if (!filePath) {
102
+ return;
103
+ }
104
+ try {
105
+ const parsed = await readRawTokenFile(filePath);
106
+ if (!parsed || typeof parsed !== 'object') {
107
+ return;
108
+ }
109
+ const token = sanitizeToken(parsed);
110
+ const providerType = inferProviderTypeFromTokenFilePath(token, filePath);
111
+ if (providerType === 'qwen' && !hasStableQwenApiKey(token)) {
112
+ return;
113
+ }
114
+ const current = parsed.norefresh ??
115
+ parsed.noRefresh;
116
+ if (current === true ||
117
+ current === 'true' ||
118
+ current === '1' ||
119
+ current === 'yes') {
120
+ return;
121
+ }
122
+ const next = {
123
+ ...parsed,
124
+ norefresh: true,
125
+ noRefresh: true
126
+ };
127
+ await fs.writeFile(filePath, JSON.stringify(next, null, 2) + '\n', {
128
+ mode: 0o600
129
+ });
130
+ }
131
+ catch (error) {
132
+ logOAuthLifecycleNonBlocking('maybeMarkTokenFileNoRefresh', error, { filePath });
98
133
  }
99
- return (normalized.includes('oauth token endpoint rejected request') ||
100
- (normalized.includes('token refresh failed') && normalized.includes('iflow.cn/oauth/token')));
101
134
  }
102
- function isIflowAkBlockedMessage(message) {
103
- const normalized = (message || '').toLowerCase();
104
- if (!normalized) {
135
+ async function hasTokenFileNoRefresh(filePath) {
136
+ if (!filePath) {
105
137
  return false;
106
138
  }
107
- return normalized.includes('access to the current ak has been blocked due to unauthorized requests');
108
- }
109
- function shouldClearIflowTokenOnRefreshFailure(message) {
110
- const normalized = (message || '').toLowerCase();
111
- if (!normalized) {
139
+ const parsed = await readRawTokenFile(filePath);
140
+ const token = sanitizeToken(parsed);
141
+ const providerType = inferProviderTypeFromTokenFilePath(token, filePath);
142
+ const direct = parsed?.norefresh ??
143
+ parsed?.noRefresh;
144
+ const flagged = typeof direct === 'boolean'
145
+ ? direct
146
+ : typeof direct === 'string'
147
+ ? ['1', 'true', 'yes'].includes(direct.trim().toLowerCase())
148
+ : false;
149
+ if (!flagged) {
112
150
  return false;
113
151
  }
114
- if (isIflowAkBlockedMessage(normalized)) {
152
+ if (providerType === 'qwen') {
153
+ return hasStableQwenApiKey(token);
154
+ }
155
+ return true;
156
+ }
157
+ function shouldHonorNoRefresh(providerType, token) {
158
+ if (!hasNoRefreshFlag(token)) {
115
159
  return false;
116
160
  }
117
- if (normalized.includes('oauth error: invalid_grant')) {
118
- return true;
161
+ return providerType.trim().toLowerCase() === 'qwen' ? hasStableQwenApiKey(token) : true;
162
+ }
163
+ function inferProviderTypeFromTokenFilePath(token, tokenFilePath) {
164
+ const fromToken = token && typeof token.type === 'string'
165
+ ? String(token.type).trim().toLowerCase()
166
+ : '';
167
+ if (fromToken) {
168
+ return fromToken;
119
169
  }
120
- if (normalized.includes('oauth error: invalid_client')) {
121
- return true;
170
+ const base = path.basename(String(tokenFilePath || '').trim()).toLowerCase();
171
+ if (base.startsWith('qwen-')) {
172
+ return 'qwen';
122
173
  }
123
- if (normalized.includes('oauth error: unauthorized_client')) {
124
- return true;
174
+ if (base.startsWith('gemini-')) {
175
+ return 'gemini';
125
176
  }
126
- if (normalized.includes('oauth error: invalid_request') &&
127
- (normalized.includes('refresh token') ||
128
- normalized.includes('refresh_token') ||
129
- normalized.includes('client_id'))) {
130
- return true;
177
+ if (base.startsWith('antigravity-')) {
178
+ return 'antigravity';
131
179
  }
132
- return false;
180
+ return '';
133
181
  }
134
- function applyRefreshFailureBackoff(cacheKey, providerType, message) {
135
- if (providerType !== 'iflow' || !isIflowRefreshEndpointRejectionMessage(message)) {
136
- return;
182
+ function isQwenDefaultAliasTokenFile(providerType, tokenFilePath) {
183
+ if (providerType.trim().toLowerCase() !== 'qwen') {
184
+ return false;
185
+ }
186
+ const alias = resolveTokenAliasFromPath(tokenFilePath) ?? 'default';
187
+ return alias.trim().toLowerCase() === 'default';
188
+ }
189
+ function resolveOfficialQwenCodeTokenFile() {
190
+ const homeDir = String(process.env.HOME || '').trim() || os.homedir();
191
+ return path.join(homeDir, '.qwen', 'oauth_creds.json');
192
+ }
193
+ function extractRefreshTokenString(token) {
194
+ const value = token?.refresh_token;
195
+ return typeof value === 'string' ? value.trim() : '';
196
+ }
197
+ async function maybeAdoptOfficialQwenCodeToken(args) {
198
+ if (!isQwenDefaultAliasTokenFile(args.providerType, args.tokenFilePath)) {
199
+ return null;
200
+ }
201
+ const officialTokenFile = resolveOfficialQwenCodeTokenFile();
202
+ if (!officialTokenFile || officialTokenFile === args.tokenFilePath) {
203
+ return null;
137
204
  }
138
- // For iFlow refresh endpoint 500/generic failures, avoid hammering token endpoint
139
- // from preflight/retry loops. Keep a longer cooldown before next refresh attempt.
140
- lastRunAt.set(cacheKey, Date.now() + IFLOW_REFRESH_FAILURE_BACKOFF_MS - OAUTH_THROTTLE_WINDOW_MS);
205
+ const officialRaw = await readRawTokenFile(officialTokenFile);
206
+ const officialToken = sanitizeToken(officialRaw);
207
+ if (!officialToken) {
208
+ return null;
209
+ }
210
+ const officialAccessToken = extractAccessToken(officialToken);
211
+ const officialRefreshToken = extractRefreshTokenString(officialToken);
212
+ if (!officialAccessToken && !officialRefreshToken) {
213
+ return null;
214
+ }
215
+ const currentAccessToken = extractAccessToken(args.currentToken);
216
+ const currentRefreshToken = extractRefreshTokenString(args.currentToken);
217
+ if (currentAccessToken === officialAccessToken &&
218
+ currentRefreshToken === officialRefreshToken) {
219
+ return args.currentToken ?? officialToken;
220
+ }
221
+ if (!args.force && args.currentToken) {
222
+ return null;
223
+ }
224
+ const prepared = await prepareTokenForStorage(args.providerType, args.tokenFilePath, officialRaw ?? officialToken);
225
+ if (typeof args.strategy.saveToken === 'function') {
226
+ await args.strategy.saveToken(prepared);
227
+ }
228
+ else {
229
+ await fs.writeFile(args.tokenFilePath, JSON.stringify(prepared, null, 2) + '\n', {
230
+ mode: 0o600
231
+ });
232
+ }
233
+ logOAuthDebug(`[OAuth] Qwen default: adopted official qwen code token ${officialTokenFile} -> ${args.tokenFilePath}`);
234
+ return sanitizeToken(prepared) ?? officialToken;
235
+ }
236
+ function applyRefreshFailureBackoff(_cacheKey, _providerType, _message) {
141
237
  }
142
238
  function isElementMissingAutomationFailure(message) {
143
239
  const normalized = String(message || '').toLowerCase();
@@ -148,6 +244,10 @@ function isElementMissingAutomationFailure(message) {
148
244
  normalized.includes('element_not_found') ||
149
245
  normalized.includes('required but not matched'));
150
246
  }
247
+ function isAutoOAuthDisabledProvider(providerType) {
248
+ const normalized = String(providerType || '').trim().toLowerCase();
249
+ return normalized === 'qwen';
250
+ }
151
251
  async function runInteractiveRepairWithAutoFallback(args) {
152
252
  const { providerType, auth, ensureValid, opts } = args;
153
253
  const autoModeAtStart = String(process.env.ROUTECODEX_CAMOUFOX_AUTO_MODE || '').trim();
@@ -159,6 +259,7 @@ async function runInteractiveRepairWithAutoFallback(args) {
159
259
  if (!autoModeAtStart) {
160
260
  throw error;
161
261
  }
262
+ const normalizedProviderType = String(providerType || '').trim().toLowerCase();
162
263
  const msg = error instanceof Error ? error.message : String(error || '');
163
264
  const selectorFailure = isElementMissingAutomationFailure(msg);
164
265
  let tokenFilePath = '';
@@ -166,12 +267,16 @@ async function runInteractiveRepairWithAutoFallback(args) {
166
267
  tokenFilePath = resolveTokenFilePath(auth, providerType);
167
268
  }
168
269
  catch (error) {
169
- logOAuthLifecycleNonBlockingError('runInteractiveRepairWithAutoFallback.resolveTokenFilePath', error, { providerType });
270
+ logOAuthLifecycleNonBlocking('runInteractiveRepairWithAutoFallback.resolveTokenFilePath', error, { providerType });
170
271
  tokenFilePath = '';
171
272
  }
172
273
  if (tokenFilePath) {
173
274
  closeOAuthAuthResources(providerType, tokenFilePath);
174
275
  }
276
+ if (isAutoOAuthDisabledProvider(normalizedProviderType)) {
277
+ console.warn(`[OAuth] Camoufox auto OAuth failed (${providerType}, autoMode=${autoModeAtStart}): ${msg}. Auto OAuth is disabled for this provider; manual re-auth is required.`);
278
+ throw error;
279
+ }
175
280
  console.warn(`[OAuth] Camoufox auto OAuth failed (${providerType}, autoMode=${autoModeAtStart}): ${msg}. Falling back to headful manual mode once.`);
176
281
  if (selectorFailure) {
177
282
  console.warn(`[OAuth] Camoufox auto selector step failed; switched to headful manual mode (provider=${providerType}${tokenFilePath ? ` tokenFile=${tokenFilePath}` : ''}).`);
@@ -326,17 +431,66 @@ async function prepareTokenForStorage(providerType, tokenFilePath, tokenData) {
326
431
  if (isGeminiCliFamily(providerType)) {
327
432
  return await wrapGeminiCliTokenForStorage(tokenData, tokenFilePath);
328
433
  }
329
- if (providerType === 'iflow') {
434
+ if (providerType === 'qwen') {
435
+ const rawExisting = await readRawTokenFile(tokenFilePath);
436
+ const existing = rawExisting && typeof rawExisting === 'object' ? rawExisting : null;
437
+ const resolvedAlias = resolveTokenAliasFromPath(tokenFilePath);
330
438
  const token = sanitizeToken(tokenData) ?? tokenData;
331
439
  const expiresAt = getExpiresAt(token);
332
- if (typeof expiresAt === 'number' && Number.isFinite(expiresAt)) {
333
- const expiresAtMs = expiresAt > 10_000_000_000 ? Math.floor(expiresAt) : Math.floor(expiresAt * 1000);
334
- return {
335
- ...tokenData,
336
- expires_at: expiresAtMs,
337
- expired: new Date(expiresAtMs).toISOString()
338
- };
339
- }
440
+ const expiresInRaw = token.expires_in;
441
+ const expiresIn = typeof expiresInRaw === 'number' && Number.isFinite(expiresInRaw)
442
+ ? expiresInRaw
443
+ : (expiresAt && expiresAt > 10_000_000_000
444
+ ? Math.max(1, Math.floor((expiresAt - Date.now()) / 1000))
445
+ : 21600);
446
+ const { resource_url: _dropLegacyResourceUrl, resourceUrl: _dropLegacyResourceUrlCamel, norefresh: _dropLegacyNoRefresh, noRefresh: _dropLegacyNoRefreshCamel, api_key: _dropLegacyApiKey, apiKey: _dropLegacyApiKeyCamel, ...existingWithoutLegacyQwenFields } = existing || {};
447
+ const { resource_url: _dropIncomingResourceUrl, resourceUrl: _dropIncomingResourceUrlCamel, norefresh: _dropIncomingNoRefresh, noRefresh: _dropIncomingNoRefreshCamel, api_key: _dropIncomingApiKey, apiKey: _dropIncomingApiKeyCamel, ...tokenDataWithoutLegacyQwenFields } = tokenData;
448
+ const rawResourceUrl = typeof tokenData.resource_url === 'string' &&
449
+ String(tokenData.resource_url).trim()
450
+ ? String(tokenData.resource_url).trim()
451
+ : typeof tokenData.resourceUrl === 'string' &&
452
+ String(tokenData.resourceUrl).trim()
453
+ ? String(tokenData.resourceUrl).trim()
454
+ : undefined;
455
+ const resourceUrl = (() => {
456
+ if (!rawResourceUrl) {
457
+ return undefined;
458
+ }
459
+ let normalized = rawResourceUrl;
460
+ if (!/^https?:\/\//i.test(normalized)) {
461
+ normalized = `https://${normalized}`;
462
+ }
463
+ normalized = normalized.replace(/\/+$/, '');
464
+ try {
465
+ const parsed = new URL(normalized);
466
+ const host = parsed.hostname.trim().toLowerCase();
467
+ const pathname = parsed.pathname.replace(/\/+$/, '');
468
+ const isOfficialQwenCodeHost = host === 'portal.qwen.ai' || host === 'chat.qwen.ai';
469
+ const isDashscopeCompatibleHost = host === 'dashscope.aliyuncs.com' && /^\/compatible-mode(?:\/v1)?$/i.test(pathname);
470
+ if (isOfficialQwenCodeHost && (!pathname || pathname === '/v1')) {
471
+ return parsed.origin;
472
+ }
473
+ if (!isDashscopeCompatibleHost) {
474
+ return undefined;
475
+ }
476
+ return `${parsed.origin}${pathname}`;
477
+ }
478
+ catch {
479
+ return undefined;
480
+ }
481
+ })();
482
+ const stableApiKey = hasStableQwenApiKey(token) ? extractApiKey(token) : undefined;
483
+ return {
484
+ ...existingWithoutLegacyQwenFields,
485
+ ...tokenDataWithoutLegacyQwenFields,
486
+ status: 'success',
487
+ type: 'qwen',
488
+ ...(resolvedAlias ? { alias: resolvedAlias } : {}),
489
+ expires_in: expiresIn,
490
+ access_token: String(token.access_token ?? ''),
491
+ ...(resourceUrl ? { resource_url: resourceUrl } : {}),
492
+ ...(stableApiKey ? { apiKey: stableApiKey, api_key: stableApiKey, norefresh: true, noRefresh: true } : {})
493
+ };
340
494
  }
341
495
  return tokenData;
342
496
  }
@@ -346,12 +500,9 @@ function logTokenSnapshot(providerType, token, endpoints) {
346
500
  const hasAccess = hasAccessToken(token);
347
501
  const expRaw = token?.expires_at ?? token?.expired ?? token?.expiry_date ?? null;
348
502
  logOAuthDebug(`[OAuth] token.read: provider=${providerType} exists=${Boolean(token)} hasApiKey=${hasApiKey} hasAccess=${hasAccess} expRaw=${String(expRaw)}`);
349
- if (providerType === 'iflow') {
350
- logOAuthDebug(`[OAuth] iflow endpoints: deviceCodeUrl=${String(endpoints.deviceCodeUrl)} tokenUrl=${String(endpoints.tokenUrl)}`);
351
- }
352
503
  }
353
504
  catch (error) {
354
- logOAuthLifecycleNonBlockingError('logTokenSnapshot', error, { providerType });
505
+ logOAuthLifecycleNonBlocking('logTokenSnapshot', error, { providerType });
355
506
  }
356
507
  }
357
508
  function buildEndpointOverrides(defaults, auth) {
@@ -370,25 +521,6 @@ function buildEndpointOverrides(defaults, auth) {
370
521
  }
371
522
  return overridden;
372
523
  }
373
- async function enrichIflowClientConfig(client) {
374
- const next = { ...client };
375
- if (hasNonEmptyString(process.env.IFLOW_CLIENT_ID)) {
376
- next.clientId = process.env.IFLOW_CLIENT_ID.trim();
377
- }
378
- if (hasNonEmptyString(process.env.IFLOW_CLIENT_SECRET)) {
379
- next.clientSecret = process.env.IFLOW_CLIENT_SECRET.trim();
380
- }
381
- if (!hasNonEmptyString(next.clientId) || !hasNonEmptyString(next.clientSecret)) {
382
- const inferred = await inferIflowClientCredsFromLog();
383
- if (inferred?.clientId && !hasNonEmptyString(next.clientId)) {
384
- next.clientId = inferred.clientId;
385
- }
386
- if (inferred?.clientSecret && !hasNonEmptyString(next.clientSecret)) {
387
- next.clientSecret = inferred.clientSecret;
388
- }
389
- }
390
- return next;
391
- }
392
524
  async function buildClientOverrides(defaults, auth, providerType) {
393
525
  const base = { ...defaults.client };
394
526
  if (hasNonEmptyString(auth.clientId)) {
@@ -403,9 +535,6 @@ async function buildClientOverrides(defaults, auth, providerType) {
403
535
  if (hasNonEmptyString(auth.redirectUri)) {
404
536
  base.redirectUri = auth.redirectUri;
405
537
  }
406
- if (providerType === 'iflow') {
407
- return await enrichIflowClientConfig(base);
408
- }
409
538
  return base;
410
539
  }
411
540
  async function ensureGeminiCLIServicesEnabled(accessToken, projectId) {
@@ -432,7 +561,7 @@ async function ensureGeminiCLIServicesEnabled(accessToken, projectId) {
432
561
  }
433
562
  }
434
563
  catch (error) {
435
- logOAuthLifecycleNonBlockingError('ensureGeminiCLIServicesEnabled.parseCheckResponse', error, { service, projectId });
564
+ logOAuthLifecycleNonBlocking('ensureGeminiCLIServicesEnabled.parseCheckResponse', error, { service, projectId });
436
565
  }
437
566
  }
438
567
  else {
@@ -443,7 +572,7 @@ async function ensureGeminiCLIServicesEnabled(accessToken, projectId) {
443
572
  }
444
573
  }
445
574
  catch (error) {
446
- logOAuthDebug(`[OAuth] Gemini CLI: failed to check service ${service} for project ${projectId} - ${error instanceof Error ? error.message : String(error)}`);
575
+ logOAuthLifecycleNonBlocking('ensureGeminiCLIServicesEnabled.checkService', error, { service, projectId });
447
576
  // best-effort; continue to try enable
448
577
  }
449
578
  // 2) 尝试启用服务
@@ -472,7 +601,7 @@ async function ensureGeminiCLIServicesEnabled(accessToken, projectId) {
472
601
  }
473
602
  }
474
603
  catch (error) {
475
- logOAuthLifecycleNonBlockingError('ensureGeminiCLIServicesEnabled.parseEnableResponse', error, { service, projectId });
604
+ logOAuthLifecycleNonBlocking('ensureGeminiCLIServicesEnabled.parseEnableResponse', error, { service, projectId });
476
605
  }
477
606
  if (enableResp && (enableResp.ok || enableResp.status === 201)) {
478
607
  logOAuthDebug(`[OAuth] Gemini CLI: service ${service} enabled for project ${projectId} (status=${enableResp.status})`);
@@ -487,16 +616,6 @@ async function ensureGeminiCLIServicesEnabled(accessToken, projectId) {
487
616
  }
488
617
  function buildHeaderOverrides(defaults, providerType) {
489
618
  const baseHeaders = { ...(defaults.headers || {}) };
490
- if (providerType === 'iflow') {
491
- return {
492
- ...baseHeaders,
493
- 'User-Agent': 'iFlow-Cli',
494
- 'X-Requested-With': 'XMLHttpRequest',
495
- 'Origin': 'https://iflow.cn',
496
- 'Referer': 'https://iflow.cn/oauth',
497
- 'Accept': 'application/json'
498
- };
499
- }
500
619
  return baseHeaders;
501
620
  }
502
621
  function resolveTokenAliasFromPath(tokenFilePath) {
@@ -552,18 +671,19 @@ async function buildOverrides(providerType, defaults, auth, openBrowser, tokenFi
552
671
  }
553
672
  return { overrides, endpoints, client };
554
673
  }
555
- async function finalizeTokenWrite(providerType, strategy, tokenFilePath, tokenData, reason) {
674
+ async function finalizeTokenWrite(providerType, strategy, tokenFilePath, tokenData, reason, options) {
556
675
  if (!tokenData || typeof strategy.saveToken !== 'function') {
557
676
  return;
558
677
  }
559
- const enriched = await maybeEnrichToken(providerType, tokenData, tokenFilePath);
678
+ const enriched = await maybeEnrichToken(providerType, tokenData, tokenFilePath, options);
560
679
  const prepared = await prepareTokenForStorage(providerType, tokenFilePath, enriched);
561
680
  await strategy.saveToken(prepared);
562
681
  logOAuthDebug(`[OAuth] Token ${reason} saved: ${tokenFilePath}`);
563
682
  }
564
- async function maybeEnrichToken(providerType, tokenData, tokenFilePath) {
683
+ async function maybeEnrichToken(providerType, tokenData, tokenFilePath, options) {
565
684
  if (providerType === 'qwen') {
566
685
  const sanitized = sanitizeToken(tokenData) ?? tokenData;
686
+ const tokenRecord = tokenData;
567
687
  if (hasStableQwenApiKey(sanitized)) {
568
688
  return tokenData;
569
689
  }
@@ -572,6 +692,29 @@ async function maybeEnrichToken(providerType, tokenData, tokenFilePath) {
572
692
  logOAuthDebug('[OAuth] Qwen: no access_token found in auth result, skipping API Key fetch');
573
693
  return tokenData;
574
694
  }
695
+ if (options?.strictQwenValidation) {
696
+ try {
697
+ const resourceUrl = typeof sanitized.resource_url === 'string' && sanitized.resource_url.trim()
698
+ ? sanitized.resource_url.trim()
699
+ : typeof tokenRecord.resource_url === 'string' && tokenRecord.resource_url.trim()
700
+ ? tokenRecord.resource_url.trim()
701
+ : typeof tokenRecord.resourceUrl === 'string' && tokenRecord.resourceUrl.trim()
702
+ ? tokenRecord.resourceUrl.trim()
703
+ : undefined;
704
+ const model = typeof tokenRecord.model === 'string' && tokenRecord.model.trim()
705
+ ? tokenRecord.model.trim()
706
+ : undefined;
707
+ await validateQwenAccessToken({
708
+ accessToken,
709
+ resourceUrl,
710
+ model
711
+ });
712
+ }
713
+ catch (error) {
714
+ const msg = formatOAuthErrorMessage(error);
715
+ throw new Error(`[OAuth] Qwen token validation failed after refresh/acquire: ${msg}`);
716
+ }
717
+ }
575
718
  try {
576
719
  const userInfo = await fetchQwenUserInfo(accessToken);
577
720
  if (userInfo.apiKey) {
@@ -583,29 +726,7 @@ async function maybeEnrichToken(providerType, tokenData, tokenFilePath) {
583
726
  return mergeQwenTokenData(tokenData, userInfo);
584
727
  }
585
728
  catch (error) {
586
- const msg = formatOAuthErrorMessage(error);
587
- // If userInfo endpoint is unavailable (404), treat access_token as api_key to avoid repeated lookups.
588
- if (/\bHTTP\s+404\b/i.test(msg) || /\bnot\s+found\b/i.test(msg)) {
589
- logOAuthDebug('[OAuth] Qwen: userInfo endpoint unavailable (404); using access_token as api_key fallback');
590
- return mergeQwenTokenData(tokenData, { apiKey: accessToken });
591
- }
592
- logOAuthDebug(`[OAuth] Qwen: failed to fetch user info - ${msg}`);
593
- return tokenData;
594
- }
595
- }
596
- if (providerType === 'iflow') {
597
- const accessToken = extractAccessToken(sanitizeToken(tokenData) ?? null);
598
- if (!accessToken) {
599
- logOAuthDebug('[OAuth] iFlow: no access_token found in auth result, skipping API Key fetch');
600
- return tokenData;
601
- }
602
- try {
603
- const userInfo = await fetchIFlowUserInfo(accessToken);
604
- logOAuthDebug(`[OAuth] iFlow: successfully fetched API Key for ${userInfo.email}`);
605
- return mergeIFlowTokenData(tokenData, userInfo);
606
- }
607
- catch (error) {
608
- console.error(`[OAuth] iFlow: failed to fetch API Key - ${formatOAuthErrorMessage(error)}`);
729
+ logOAuthLifecycleNonBlocking('maybeEnrichToken.qwenUserInfo', error, { tokenFilePath, fallback: 'keep_token_data' });
609
730
  return tokenData;
610
731
  }
611
732
  }
@@ -668,7 +789,7 @@ async function maybeEnrichToken(providerType, tokenData, tokenFilePath) {
668
789
  catch (error) {
669
790
  const msg = error instanceof Error ? error.message : String(error);
670
791
  logOAuthDebug(`[OAuth] ${label}: service enablement failed for project ${projectId} - ${msg}`);
671
- // 服务启用失败不再视为致命错误,后续真实调用时再由 providerErrorCenter 处理。
792
+ // 服务启用失败不再视为致命错误,后续真实调用时再由 Virtual Router provider-runtime-ingress 处理。
672
793
  }
673
794
  }
674
795
  return merged;
@@ -698,12 +819,9 @@ function logOAuthSetup(providerType, defaults, overrides, endpoints, client, tok
698
819
  if (endpoints.deviceCodeUrl || endpoints.authorizationUrl) {
699
820
  logOAuthDebug(`[OAuth] endpoints: deviceCodeUrl=${String(endpoints.deviceCodeUrl || '')} tokenUrl=${String(endpoints.tokenUrl)} authUrl=${String(endpoints.authorizationUrl || '')} userInfoUrl=${String(endpoints.userInfoUrl || '')}`);
700
821
  }
701
- if (providerType === 'iflow') {
702
- logOAuthDebug(`[OAuth] iflow client: id=${String(client.clientId || '(missing)')} secret=${client.clientSecret ? '(present)' : '(missing)'} redirect=${String(client.redirectUri || '(default)')}`);
703
- }
704
822
  }
705
823
  catch (error) {
706
- logOAuthLifecycleNonBlockingError('logEnsureContext', error, { providerType, tokenFilePath });
824
+ logOAuthLifecycleNonBlocking('logEnsureContext', error, { providerType, tokenFilePath });
707
825
  }
708
826
  }
709
827
  function createStrategy(providerType, overrides, tokenFilePath) {
@@ -780,7 +898,7 @@ function readInteractiveOAuthLock() {
780
898
  };
781
899
  }
782
900
  catch (error) {
783
- logOAuthLifecycleNonBlockingError('readInteractiveOAuthLock', error, {
901
+ logOAuthLifecycleNonBlocking('readInteractiveOAuthLock', error, {
784
902
  lockFile: OAUTH_INTERACTIVE_LOCK_FILE
785
903
  });
786
904
  return null;
@@ -799,7 +917,8 @@ function isProcessAlive(pid) {
799
917
  process.kill(pid, 0);
800
918
  return true;
801
919
  }
802
- catch {
920
+ catch (error) {
921
+ logOAuthLifecycleNonBlocking('isProcessAlive', error, { pid }, { throttleKey: keyFor('interactive-oauth-process-alive', String(pid)) });
803
922
  return false;
804
923
  }
805
924
  }
@@ -814,7 +933,7 @@ async function forceReclaimInteractiveOAuthLock(lock) {
814
933
  return true;
815
934
  }
816
935
  catch (error) {
817
- logOAuthLifecycleNonBlockingError('forceReclaimInteractiveOAuthLock', error, {
936
+ logOAuthLifecycleNonBlocking('forceReclaimInteractiveOAuthLock', error, {
818
937
  pid: lock.pid,
819
938
  providerType: lock.providerType,
820
939
  tokenFile: lock.tokenFile
@@ -856,7 +975,7 @@ async function acquireInteractiveOAuthLock(providerType, tokenFilePath) {
856
975
  }
857
976
  }
858
977
  catch (error) {
859
- logOAuthLifecycleNonBlockingError('acquireInteractiveOAuthLock.release', error, {
978
+ logOAuthLifecycleNonBlocking('acquireInteractiveOAuthLock.release', error, {
860
979
  lockFile: OAUTH_INTERACTIVE_LOCK_FILE,
861
980
  providerType,
862
981
  tokenFile: current.tokenFile
@@ -880,7 +999,7 @@ async function acquireInteractiveOAuthLock(providerType, tokenFilePath) {
880
999
  await fs.unlink(OAUTH_INTERACTIVE_LOCK_FILE);
881
1000
  }
882
1001
  catch (error) {
883
- logOAuthLifecycleNonBlockingError('acquireInteractiveOAuthLock.removeStaleEmptyLock', error, {
1002
+ logOAuthLifecycleNonBlocking('acquireInteractiveOAuthLock.removeStaleEmptyLock', error, {
884
1003
  lockFile: OAUTH_INTERACTIVE_LOCK_FILE,
885
1004
  providerType,
886
1005
  tokenFile: current.tokenFile
@@ -893,7 +1012,7 @@ async function acquireInteractiveOAuthLock(providerType, tokenFilePath) {
893
1012
  await fs.unlink(OAUTH_INTERACTIVE_LOCK_FILE);
894
1013
  }
895
1014
  catch (error) {
896
- logOAuthLifecycleNonBlockingError('acquireInteractiveOAuthLock.removeDeadProcessLock', error, {
1015
+ logOAuthLifecycleNonBlocking('acquireInteractiveOAuthLock.removeDeadProcessLock', error, {
897
1016
  lockFile: OAUTH_INTERACTIVE_LOCK_FILE,
898
1017
  stalePid: existing.pid,
899
1018
  providerType: existing.providerType,
@@ -922,66 +1041,6 @@ async function acquireInteractiveOAuthLock(providerType, tokenFilePath) {
922
1041
  }
923
1042
  throw new Error('Failed to acquire interactive OAuth lock after multiple attempts');
924
1043
  }
925
- function readIflowAutoFailureState() {
926
- try {
927
- if (!fsSync.existsSync(IFLOW_AUTO_FAILURE_FILE)) {
928
- return {};
929
- }
930
- const raw = fsSync.readFileSync(IFLOW_AUTO_FAILURE_FILE, 'utf8');
931
- const parsed = JSON.parse(raw);
932
- if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
933
- return {};
934
- }
935
- return parsed;
936
- }
937
- catch (error) {
938
- logOAuthLifecycleNonBlockingError('readIflowAutoFailureState', error, {
939
- file: IFLOW_AUTO_FAILURE_FILE
940
- });
941
- return {};
942
- }
943
- }
944
- function writeIflowAutoFailureState(state) {
945
- try {
946
- fsSync.mkdirSync(path.dirname(IFLOW_AUTO_FAILURE_FILE), { recursive: true });
947
- fsSync.writeFileSync(IFLOW_AUTO_FAILURE_FILE, `${JSON.stringify(state, null, 2)}\n`, 'utf8');
948
- }
949
- catch (error) {
950
- logOAuthLifecycleNonBlockingError('writeIflowAutoFailureState', error, { file: IFLOW_AUTO_FAILURE_FILE }, { warn: true });
951
- }
952
- }
953
- function resolveIflowFailureKey(tokenFilePath) {
954
- return path.resolve(tokenFilePath);
955
- }
956
- function clearIflowAutoFailureState(tokenFilePath) {
957
- const state = readIflowAutoFailureState();
958
- const key = resolveIflowFailureKey(tokenFilePath);
959
- if (!state[key]) {
960
- return;
961
- }
962
- delete state[key];
963
- writeIflowAutoFailureState(state);
964
- }
965
- function markIflowAutoFailureState(tokenFilePath, maxAttempts, errorText) {
966
- const state = readIflowAutoFailureState();
967
- const key = resolveIflowFailureKey(tokenFilePath);
968
- const previous = state[key];
969
- const nextCount = (previous?.count || 0) + 1;
970
- const record = {
971
- count: nextCount,
972
- manualRequired: nextCount >= maxAttempts,
973
- updatedAt: Date.now(),
974
- lastError: errorText
975
- };
976
- state[key] = record;
977
- writeIflowAutoFailureState(state);
978
- return record;
979
- }
980
- function getIflowAutoFailureState(tokenFilePath) {
981
- const state = readIflowAutoFailureState();
982
- const key = resolveIflowFailureKey(tokenFilePath);
983
- return state[key] || null;
984
- }
985
1044
  async function runInteractiveAuthorizationFlow(providerType, overrides, tokenFilePath, openBrowser, forceTokenReset, forceReauth) {
986
1045
  const execute = async () => {
987
1046
  let backupFile = null;
@@ -991,14 +1050,11 @@ async function runInteractiveAuthorizationFlow(providerType, overrides, tokenFil
991
1050
  backupFile = await backupTokenFile(tokenFilePath);
992
1051
  }
993
1052
  try {
994
- if (providerType === 'iflow') {
995
- await runIflowAuthorizationSequence(providerType, overrides, tokenFilePath, forceReauth);
996
- }
997
- else {
998
- const strategy = createStrategy(providerType, overrides, tokenFilePath);
999
- const authed = await strategy.authenticate?.({ openBrowser, forceReauthorize: forceReauth });
1000
- await finalizeTokenWrite(providerType, strategy, tokenFilePath, authed, 'acquired');
1001
- }
1053
+ const strategy = createStrategy(providerType, overrides, tokenFilePath);
1054
+ const authed = await strategy.authenticate?.({ openBrowser, forceReauthorize: forceReauth });
1055
+ await finalizeTokenWrite(providerType, strategy, tokenFilePath, authed, 'acquired', {
1056
+ strictQwenValidation: providerType === 'qwen'
1057
+ });
1002
1058
  await discardBackupFile(backupFile);
1003
1059
  if (openBrowser && shouldAutoCloseOAuthBrowserSession()) {
1004
1060
  // Optional: close only after token is fully written; never close browser on failed auth.
@@ -1033,78 +1089,6 @@ async function runInteractiveAuthorizationFlow(providerType, overrides, tokenFil
1033
1089
  interactiveTail.next = queued.then(() => undefined, () => undefined);
1034
1090
  await queued;
1035
1091
  }
1036
- async function runIflowAuthorizationSequence(providerType, overrides, tokenFilePath, forceReauth) {
1037
- const authCodeOverrides = { ...overrides, flowType: OAuthFlowType.AUTHORIZATION_CODE };
1038
- const autoMode = String(process.env.ROUTECODEX_CAMOUFOX_AUTO_MODE || '').trim().toLowerCase();
1039
- if (autoMode === 'iflow') {
1040
- // Auto mode should stay single-path to keep retry lifecycle deterministic.
1041
- await executeAuthFlow(providerType, authCodeOverrides, tokenFilePath, forceReauth);
1042
- return;
1043
- }
1044
- try {
1045
- await executeAuthFlow(providerType, authCodeOverrides, tokenFilePath, forceReauth);
1046
- return;
1047
- }
1048
- catch (firstError) {
1049
- logOAuthDebug(`[OAuth] auth_code flow failed: ${firstError instanceof Error ? firstError.message : String(firstError || '')}`);
1050
- }
1051
- const deviceOverrides = { ...overrides, flowType: OAuthFlowType.DEVICE_CODE };
1052
- await executeAuthFlow(providerType, deviceOverrides, tokenFilePath, forceReauth);
1053
- }
1054
- async function executeAuthFlow(providerType, overrides, tokenFilePath, forceReauth) {
1055
- const runOnce = async () => {
1056
- const strategy = createStrategy(providerType, overrides, tokenFilePath);
1057
- const authed = await strategy.authenticate?.({ openBrowser: true, forceReauthorize: forceReauth });
1058
- await finalizeTokenWrite(providerType, strategy, tokenFilePath, authed, overrides.flowType ? `acquired (${String(overrides.flowType)})` : 'acquired');
1059
- };
1060
- const autoMode = String(process.env.ROUTECODEX_CAMOUFOX_AUTO_MODE || '').trim().toLowerCase();
1061
- const iflowAutoEnabled = providerType === 'iflow' && autoMode === 'iflow';
1062
- if (!iflowAutoEnabled) {
1063
- await runOnce();
1064
- if (providerType === 'iflow') {
1065
- clearIflowAutoFailureState(tokenFilePath);
1066
- }
1067
- return;
1068
- }
1069
- const headfulMode = isTruthyFlag(process.env.ROUTECODEX_CAMOUFOX_DEV_MODE);
1070
- const maxAutoAttemptsRaw = Number.parseInt(String(process.env.ROUTECODEX_IFLOW_AUTO_MAX_ATTEMPTS || '').trim(), 10);
1071
- const maxAutoAttempts = Number.isFinite(maxAutoAttemptsRaw) && maxAutoAttemptsRaw > 0 ? maxAutoAttemptsRaw : 3;
1072
- const retryDelayRaw = Number.parseInt(String(process.env.ROUTECODEX_IFLOW_AUTO_RETRY_DELAY_MS || '').trim(), 10);
1073
- const retryDelayMs = Number.isFinite(retryDelayRaw) && retryDelayRaw >= 0 ? retryDelayRaw : 1000;
1074
- // Headful run is considered manual trigger; successful manual run clears auto failure gate.
1075
- if (headfulMode) {
1076
- await runOnce();
1077
- clearIflowAutoFailureState(tokenFilePath);
1078
- return;
1079
- }
1080
- const existingFailure = getIflowAutoFailureState(tokenFilePath);
1081
- if (existingFailure?.manualRequired) {
1082
- throw new Error(`[OAuth] iflow auto auth is disabled for token=${tokenFilePath} after ${existingFailure.count} failures. Manual trigger required.`);
1083
- }
1084
- let lastError = null;
1085
- for (let attempt = 1; attempt <= maxAutoAttempts; attempt += 1) {
1086
- try {
1087
- await runOnce();
1088
- clearIflowAutoFailureState(tokenFilePath);
1089
- return;
1090
- }
1091
- catch (error) {
1092
- lastError = error;
1093
- const msg = error instanceof Error ? error.message : String(error || '');
1094
- const record = markIflowAutoFailureState(tokenFilePath, maxAutoAttempts, msg);
1095
- logOAuthDebug(`[OAuth] iflow auto auth attempt ${attempt}/${maxAutoAttempts} failed: ${msg} ` +
1096
- `(failureCount=${record.count} manualRequired=${record.manualRequired ? '1' : '0'})`);
1097
- if (attempt < maxAutoAttempts) {
1098
- await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
1099
- }
1100
- }
1101
- }
1102
- const finalRecord = getIflowAutoFailureState(tokenFilePath);
1103
- if (finalRecord?.manualRequired) {
1104
- throw new Error(`[OAuth] iflow auto auth failed ${finalRecord.count} times; manual trigger is required and auto retries are suspended.`);
1105
- }
1106
- throw (lastError instanceof Error ? lastError : new Error(String(lastError || 'iflow auto auth failed')));
1107
- }
1108
1092
  export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
1109
1093
  if (!isOAuthConfig(auth)) {
1110
1094
  return;
@@ -1118,11 +1102,12 @@ export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
1118
1102
  // Only treat "open browser" as explicit user intent when caller passed it explicitly.
1119
1103
  // This prevents background flows (daemon/provider init) from bypassing noRefresh due to env defaults.
1120
1104
  const openBrowserRequested = opts.openBrowser === true;
1105
+ const forceRefreshRequested = opts.forceRefresh === true;
1121
1106
  // 当 opts.forceReauthorize 显式为 true 时,跳过节流检查,
1122
1107
  // 确保来自上游 401/406 等认证错误的修复请求不会被初始化阶段的调用吞掉。
1123
1108
  // Explicit user-triggered OAuth (openBrowser=true) must also bypass throttle,
1124
1109
  // otherwise repeated "Authorize" clicks in WebUI can become a silent no-op.
1125
- if (!opts.forceReauthorize && !openBrowserRequested && shouldThrottle(cacheKey)) {
1110
+ if (!opts.forceReauthorize && !openBrowserRequested && !forceRefreshRequested && shouldThrottle(cacheKey)) {
1126
1111
  return;
1127
1112
  }
1128
1113
  const aliasInfo = parseTokenSequenceFromPath(tokenFilePath);
@@ -1142,6 +1127,14 @@ export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
1142
1127
  logOAuthSetup(providerType, defaults, overrides, endpoints, client, tokenFilePath, openBrowser, forceReauth);
1143
1128
  const strategy = createStrategy(providerType, overrides, tokenFilePath);
1144
1129
  let token = await readTokenFromFile(tokenFilePath);
1130
+ if (!token) {
1131
+ token = await maybeAdoptOfficialQwenCodeToken({
1132
+ providerType,
1133
+ tokenFilePath,
1134
+ currentToken: null,
1135
+ strategy
1136
+ });
1137
+ }
1145
1138
  const hadExistingTokenFile = token !== null;
1146
1139
  // Qwen: ensure api_key is present even when access_token is still valid.
1147
1140
  // Qwen OpenAI-compatible endpoints may require api_key (not access_token) for business requests.
@@ -1189,35 +1182,60 @@ export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
1189
1182
  }
1190
1183
  logTokenSnapshot(providerType, token, endpoints);
1191
1184
  const tokenState = evaluateTokenState(token, providerType);
1192
- const noRefresh = hasNoRefreshFlag(token);
1193
- if (noRefresh && !forceReauth && !openBrowserRequested) {
1185
+ const noRefresh = shouldHonorNoRefresh(providerType, token);
1186
+ if (noRefresh && !forceReauth && !openBrowserRequested && !forceRefreshRequested) {
1194
1187
  logOAuthDebug(`[OAuth] norefresh flag set for provider=${providerType} tokenFile=${tokenFilePath} - skip auto-refresh and re-authorization.`);
1195
1188
  updateThrottle(cacheKey);
1196
1189
  return;
1197
1190
  }
1198
- if (!forceReauth && tokenState.validAccess) {
1191
+ if (!forceReauth && !forceRefreshRequested && tokenState.validAccess) {
1199
1192
  logOAuthDebug(`[OAuth] Using existing token (${tokenState.hasApiKey ? 'apiKey' : 'access_token'} valid). No authorization required.`);
1200
1193
  updateThrottle(cacheKey);
1201
1194
  return;
1202
1195
  }
1203
1196
  if (!forceReauth &&
1204
- tokenState.isExpiredOrNear &&
1197
+ (forceRefreshRequested || tokenState.isExpiredOrNear) &&
1205
1198
  token?.refresh_token &&
1206
1199
  typeof strategy.refreshToken === 'function') {
1207
1200
  try {
1208
- logOAuthDebug('[OAuth] refreshing token...');
1201
+ logOAuthDebug(forceRefreshRequested
1202
+ ? '[OAuth] refreshing token (forced by upstream invalid-token repair)...'
1203
+ : '[OAuth] refreshing token...');
1209
1204
  const refreshed = await strategy.refreshToken(token.refresh_token);
1210
- await finalizeTokenWrite(providerType, strategy, tokenFilePath, refreshed, 'refreshed and saved');
1205
+ await finalizeTokenWrite(providerType, strategy, tokenFilePath, refreshed, 'refreshed and saved', {
1206
+ strictQwenValidation: providerType === 'qwen'
1207
+ });
1211
1208
  updateThrottle(cacheKey);
1212
1209
  return;
1213
1210
  }
1214
1211
  catch (error) {
1215
1212
  const message = error instanceof Error ? error.message : String(error || '');
1216
- applyRefreshFailureBackoff(cacheKey, providerType, message);
1217
- if (providerType === 'iflow' && shouldClearIflowTokenOnRefreshFailure(message)) {
1218
- // Only clear token file for permanent refresh-credential failures.
1219
- await clearTokenFile(tokenFilePath);
1213
+ if (providerType === 'qwen' &&
1214
+ isPermanentOAuthRefreshErrorMessage(message)) {
1215
+ try {
1216
+ const adopted = await maybeAdoptOfficialQwenCodeToken({
1217
+ providerType,
1218
+ tokenFilePath,
1219
+ currentToken: token,
1220
+ strategy,
1221
+ force: true
1222
+ });
1223
+ const adoptedRefreshToken = extractRefreshTokenString(adopted);
1224
+ if (adoptedRefreshToken && adoptedRefreshToken !== extractRefreshTokenString(token)) {
1225
+ logOAuthDebug('[OAuth] Qwen default: refresh failed, retrying with official qwen code token');
1226
+ const refreshed = await strategy.refreshToken(adoptedRefreshToken);
1227
+ await finalizeTokenWrite(providerType, strategy, tokenFilePath, refreshed, 'repaired from official qwen code token and saved', {
1228
+ strictQwenValidation: true
1229
+ });
1230
+ updateThrottle(cacheKey);
1231
+ return;
1232
+ }
1233
+ }
1234
+ catch (repairError) {
1235
+ logOAuthLifecycleNonBlocking('qwen_default_official_token_repair', repairError, { tokenFilePath });
1236
+ }
1220
1237
  }
1238
+ applyRefreshFailureBackoff(cacheKey, providerType, message);
1221
1239
  if (!opts.forceReacquireIfRefreshFails) {
1222
1240
  throw error;
1223
1241
  }
@@ -1261,6 +1279,41 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
1261
1279
  const pt = providerType.toLowerCase();
1262
1280
  const allowBlocking = options?.allowBlocking !== false;
1263
1281
  const ensureValid = options?.ensureValidOAuthToken ?? ensureValidOAuthToken;
1282
+ let tokenFilePath;
1283
+ const autoOAuthDisabled = isAutoOAuthDisabledProvider(providerType);
1284
+ const attemptSilentRefreshOnly = async (lowerMessage) => {
1285
+ try {
1286
+ await withOAuthRepairEnv(providerType, async () => {
1287
+ await ensureValid(providerType, auth, {
1288
+ forceReacquireIfRefreshFails: false,
1289
+ openBrowser: false,
1290
+ forceReauthorize: false,
1291
+ forceRefresh: pt === 'qwen'
1292
+ });
1293
+ });
1294
+ if (tokenFilePath) {
1295
+ await markInteractiveOAuthRepairSuccess({
1296
+ providerType,
1297
+ tokenFile: tokenFilePath
1298
+ });
1299
+ }
1300
+ return true;
1301
+ }
1302
+ catch (error) {
1303
+ const refreshMsg = error instanceof Error ? error.message : String(error);
1304
+ if (pt === 'qwen' && isPermanentOAuthRefreshErrorMessage(refreshMsg)) {
1305
+ await maybeMarkTokenFileNoRefresh(tokenFilePath || '');
1306
+ logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.qwenPermanentRefreshFailure', new Error('qwen silent refresh permanently failed; standard re-auth required'), { providerType, tokenFilePath, reason: refreshMsg }, { warn: true, throttleKey: `qwen-permanent-refresh:${tokenFilePath || 'unknown'}` });
1307
+ return false;
1308
+ }
1309
+ if (pt === 'qwen') {
1310
+ logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.qwenSilentRefreshFailure', new Error('qwen silent refresh failed; standard re-auth required'), { providerType, tokenFilePath, reason: refreshMsg }, { warn: true, throttleKey: `qwen-silent-refresh:${tokenFilePath || 'unknown'}` });
1311
+ return false;
1312
+ }
1313
+ logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.autoOAuthDisabled', new Error('auto OAuth has been removed for this provider; manual re-auth required'), { providerType, tokenFilePath, reason: refreshMsg }, { warn: true, throttleKey: `oauth-auto-disabled:${providerType}:${tokenFilePath || 'unknown'}` });
1314
+ return false;
1315
+ }
1316
+ };
1264
1317
  try {
1265
1318
  if (!shouldTriggerInteractiveOAuthRepair(providerType, upstreamError)) {
1266
1319
  return false;
@@ -1272,7 +1325,14 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
1272
1325
  : String(upstreamError || '');
1273
1326
  const lower = msg.toLowerCase();
1274
1327
  const statusCode = extractStatusCode(upstreamError);
1275
- const tokenFilePath = resolveTokenFilePath(auth, providerType);
1328
+ tokenFilePath = resolveTokenFilePath(auth, providerType);
1329
+ if (pt === 'qwen' && await hasTokenFileNoRefresh(tokenFilePath)) {
1330
+ logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.qwenNoRefresh', new Error('qwen auto-refresh disabled; standard re-auth required'), { providerType, tokenFilePath }, { warn: true, throttleKey: `qwen-norefresh:${tokenFilePath}` });
1331
+ return false;
1332
+ }
1333
+ if (autoOAuthDisabled) {
1334
+ return await attemptSilentRefreshOnly(lower);
1335
+ }
1276
1336
  const cooldownReason = statusCode === 403 && isGoogleAccountVerificationRequiredMessage(lower) ? 'google_verify' : 'generic';
1277
1337
  const gate = await shouldSkipInteractiveOAuthRepair({
1278
1338
  providerType,
@@ -1309,32 +1369,39 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
1309
1369
  }
1310
1370
  return false;
1311
1371
  }
1312
- const refreshRejectedForIflow = pt === 'iflow' && isIflowRefreshEndpointRejectionMessage(lower);
1313
- if (!refreshRejectedForIflow) {
1314
- try {
1315
- await withOAuthRepairEnv(providerType, async () => {
1316
- await ensureValid(providerType, auth, {
1317
- forceReacquireIfRefreshFails: false,
1318
- openBrowser: false,
1319
- forceReauthorize: false
1320
- });
1321
- });
1322
- await markInteractiveOAuthRepairSuccess({
1323
- providerType,
1324
- tokenFile: tokenFilePath
1372
+ try {
1373
+ await withOAuthRepairEnv(providerType, async () => {
1374
+ await ensureValid(providerType, auth, {
1375
+ forceReacquireIfRefreshFails: false,
1376
+ openBrowser: false,
1377
+ forceReauthorize: false,
1378
+ forceRefresh: pt === 'qwen'
1325
1379
  });
1326
- return true;
1380
+ });
1381
+ await markInteractiveOAuthRepairSuccess({
1382
+ providerType,
1383
+ tokenFile: tokenFilePath
1384
+ });
1385
+ return true;
1386
+ }
1387
+ catch (error) {
1388
+ const refreshMsg = error instanceof Error ? error.message : String(error);
1389
+ if (pt === 'qwen' && isPermanentOAuthRefreshErrorMessage(refreshMsg)) {
1390
+ await maybeMarkTokenFileNoRefresh(tokenFilePath);
1391
+ logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.qwenPermanentRefreshFailure', new Error('qwen silent refresh permanently failed; standard re-auth required'), { providerType, tokenFilePath, reason: refreshMsg }, { warn: true, throttleKey: `qwen-permanent-refresh:${tokenFilePath}` });
1392
+ return false;
1327
1393
  }
1328
- catch (error) {
1329
- logOAuthDebug(`[OAuth] silent refresh failed; falling back to background interactive repair (provider=${providerType}) - ${error instanceof Error ? error.message : String(error)}`);
1394
+ if (pt === 'qwen') {
1395
+ logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.qwenSilentRefreshFailure', new Error('qwen silent refresh failed; standard re-auth required'), { providerType, tokenFilePath, reason: refreshMsg }, { warn: true, throttleKey: `qwen-silent-refresh:${tokenFilePath}` });
1396
+ return false;
1330
1397
  }
1398
+ logOAuthDebug(`[OAuth] silent refresh failed; falling back to background interactive repair (provider=${providerType}) - ${refreshMsg}`);
1331
1399
  }
1332
1400
  const interactiveOpts = {
1333
1401
  forceReacquireIfRefreshFails: true,
1334
1402
  openBrowser: true,
1335
- // 上游已经明确返回“认证失效”(包括 iflow 的 406/439),
1336
1403
  // 此时强制跳过节流并允许走完整 OAuth 流程。
1337
- forceReauthorize: pt === 'gemini' || pt === 'gemini-cli' || pt === 'antigravity' || pt === 'iflow' || pt === 'qwen'
1404
+ forceReauthorize: pt === 'gemini' || pt === 'gemini-cli' || pt === 'antigravity' || pt === 'qwen'
1338
1405
  };
1339
1406
  void withOAuthRepairEnv(providerType, async () => {
1340
1407
  await runInteractiveRepairWithAutoFallback({
@@ -1351,9 +1418,8 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
1351
1418
  const opts = {
1352
1419
  forceReacquireIfRefreshFails: true,
1353
1420
  openBrowser: true,
1354
- // 上游已经明确返回“认证失效”(包括 iflow 的 406/439),
1355
1421
  // 此时强制跳过节流并允许走完整 OAuth 流程。
1356
- forceReauthorize: pt === 'gemini' || pt === 'gemini-cli' || pt === 'antigravity' || pt === 'iflow' || pt === 'qwen'
1422
+ forceReauthorize: pt === 'gemini' || pt === 'gemini-cli' || pt === 'antigravity' || pt === 'qwen'
1357
1423
  };
1358
1424
  await withOAuthRepairEnv(providerType, async () => {
1359
1425
  await runInteractiveRepairWithAutoFallback({
@@ -1370,7 +1436,10 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
1370
1436
  return true;
1371
1437
  }
1372
1438
  catch (error) {
1373
- logOAuthDebug(`[OAuth] interactive repair flow failed (provider=${providerType}) - ${error instanceof Error ? error.message : String(error)}`);
1439
+ logOAuthLifecycleNonBlocking('interactiveRepairFlow', error, {
1440
+ providerType,
1441
+ tokenFilePath
1442
+ });
1374
1443
  return false;
1375
1444
  }
1376
1445
  }
@@ -1383,23 +1452,8 @@ export function shouldTriggerInteractiveOAuthRepair(providerType, upstreamError)
1383
1452
  : String(upstreamError || '');
1384
1453
  const lower = msg.toLowerCase();
1385
1454
  const statusCode = extractStatusCode(upstreamError);
1386
- if (pt === 'iflow' && (statusCode === 434 || isIflowAkBlockedMessage(lower))) {
1387
- // iFlow 434 是账号级封禁,必须人工恢复,不走自动修复。
1388
- return false;
1389
- }
1390
1455
  // 基本令牌失效判定:只看典型 OAuth 文案
1391
1456
  let looksInvalid = /invalid[_-]?token|invalid[_-]?grant|unauthenticated|unauthorized|token has expired|access token expired/.test(lower);
1392
- // 对于 iflow / qwen,保留基于 401/403 的宽松判定,避免破坏既有行为。
1393
- if (!looksInvalid && (pt === 'iflow' || pt === 'qwen')) {
1394
- if (statusCode === 401 ||
1395
- statusCode === 403 ||
1396
- /\b401\b|\b403\b|40308/.test(msg)) {
1397
- looksInvalid = true;
1398
- }
1399
- }
1400
- if (!looksInvalid && pt === 'iflow' && isIflowRefreshEndpointRejectionMessage(lower)) {
1401
- looksInvalid = true;
1402
- }
1403
1457
  // 对于 gemini / gemini-cli / antigravity,排除纯服务开关类错误,
1404
1458
  // 但如果明确提示缺少 project_id 或需要重新 OAuth,则视为令牌失效。
1405
1459
  if (pt === 'gemini' || pt === 'gemini-cli' || pt === 'antigravity') {
@@ -1420,44 +1474,7 @@ export function shouldTriggerInteractiveOAuthRepair(providerType, upstreamError)
1420
1474
  }
1421
1475
  return looksInvalid;
1422
1476
  }
1423
- async function inferIflowClientCredsFromLog() {
1424
- try {
1425
- const file = path.join(resolveRccAuthDir(), 'iflow-oauth.log');
1426
- const txt = await fs.readFile(file, 'utf-8').catch((error) => {
1427
- logOAuthDebug(`[OAuth] failed to read iflow oauth log for client creds inference (non-blocking) file=${file}: ${error instanceof Error ? error.message : String(error)}`);
1428
- return '';
1429
- });
1430
- if (!txt) {
1431
- return null;
1432
- }
1433
- const lines = txt.split(/\r?\n/).filter((l) => l.trim().length > 0);
1434
- if (lines.length === 0) {
1435
- return null;
1436
- }
1437
- for (let i = lines.length - 1; i >= 0; i--) {
1438
- const line = lines[i];
1439
- try {
1440
- const obj = JSON.parse(line);
1441
- const decoded = typeof obj.decoded === 'string' ? obj.decoded : '';
1442
- if (!decoded.includes(':')) {
1443
- continue;
1444
- }
1445
- const idx = decoded.indexOf(':');
1446
- const id = decoded.slice(0, idx).trim();
1447
- const secret = decoded.slice(idx + 1).trim();
1448
- if (id && secret) {
1449
- return { clientId: id, clientSecret: secret };
1450
- }
1451
- }
1452
- catch {
1453
- // skip parse errors
1454
- }
1455
- }
1456
- return null;
1457
- }
1458
- catch (error) {
1459
- logOAuthDebug(`[OAuth] inferIflowClientCredsFromLog failed (non-blocking): ${error instanceof Error ? error.message : String(error)}`);
1460
- return null;
1461
- }
1462
- }
1477
+ export const __oauthLifecycleTestables = {
1478
+ isProcessAlive
1479
+ };
1463
1480
  //# sourceMappingURL=oauth-lifecycle.js.map