@jsonstudio/rcc 0.89.168 → 0.89.524

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 (431) hide show
  1. package/README.md +18 -15
  2. package/dist/build-info.js +3 -3
  3. package/dist/build-info.js.map +1 -1
  4. package/dist/cli.js +94 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/client/gemini-cli/gemini-cli-protocol-client.js +28 -5
  7. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  8. package/dist/commands/token-daemon.d.ts +2 -0
  9. package/dist/commands/token-daemon.js +183 -0
  10. package/dist/commands/token-daemon.js.map +1 -0
  11. package/dist/error-handling/quiet-error-handling-center.d.ts +9 -0
  12. package/dist/error-handling/quiet-error-handling-center.js +141 -0
  13. package/dist/error-handling/quiet-error-handling-center.js.map +1 -0
  14. package/dist/error-handling/route-error-hub.js +8 -2
  15. package/dist/error-handling/route-error-hub.js.map +1 -1
  16. package/dist/index.js +4 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/modules/llmswitch/bridge.d.ts +1 -1
  19. package/dist/modules/llmswitch/bridge.js +3 -2
  20. package/dist/modules/llmswitch/bridge.js.map +1 -1
  21. package/dist/modules/pipeline/utils/colored-logger.d.ts +2 -0
  22. package/dist/modules/pipeline/utils/colored-logger.js +22 -3
  23. package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
  24. package/dist/providers/auth/antigravity-userinfo-helper.d.ts +10 -0
  25. package/dist/providers/auth/antigravity-userinfo-helper.js +140 -0
  26. package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -0
  27. package/dist/providers/auth/gemini-cli-userinfo-helper.js +12 -2
  28. package/dist/providers/auth/gemini-cli-userinfo-helper.js.map +1 -1
  29. package/dist/providers/auth/oauth-lifecycle.js +395 -24
  30. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  31. package/dist/providers/auth/token-scanner/index.d.ts +32 -0
  32. package/dist/providers/auth/token-scanner/index.js +86 -0
  33. package/dist/providers/auth/token-scanner/index.js.map +1 -0
  34. package/dist/providers/auth/tokenfile-auth.d.ts +17 -0
  35. package/dist/providers/auth/tokenfile-auth.js +27 -5
  36. package/dist/providers/auth/tokenfile-auth.js.map +1 -1
  37. package/dist/providers/core/api/provider-types.d.ts +10 -0
  38. package/dist/providers/core/config/oauth-flows.d.ts +25 -0
  39. package/dist/providers/core/config/oauth-flows.js +92 -5
  40. package/dist/providers/core/config/oauth-flows.js.map +1 -1
  41. package/dist/providers/core/config/provider-oauth-configs.js +93 -2
  42. package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
  43. package/dist/providers/core/config/service-profiles.js +18 -10
  44. package/dist/providers/core/config/service-profiles.js.map +1 -1
  45. package/dist/providers/core/runtime/base-provider.d.ts +2 -0
  46. package/dist/providers/core/runtime/base-provider.js +135 -15
  47. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  48. package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +8 -3
  49. package/dist/providers/core/runtime/gemini-cli-http-provider.js +332 -67
  50. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  51. package/dist/providers/core/runtime/http-request-executor.d.ts +1 -0
  52. package/dist/providers/core/runtime/http-request-executor.js +41 -1
  53. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  54. package/dist/providers/core/runtime/http-transport-provider.d.ts +27 -0
  55. package/dist/providers/core/runtime/http-transport-provider.js +342 -69
  56. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  57. package/dist/providers/core/runtime/provider-error-classifier.d.ts +2 -2
  58. package/dist/providers/core/runtime/provider-error-classifier.js +14 -4
  59. package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
  60. package/dist/providers/core/runtime/provider-factory.d.ts +1 -0
  61. package/dist/providers/core/runtime/provider-factory.js +37 -8
  62. package/dist/providers/core/runtime/provider-factory.js.map +1 -1
  63. package/dist/providers/core/runtime/responses-provider.d.ts +3 -3
  64. package/dist/providers/core/runtime/responses-provider.js +56 -117
  65. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  66. package/dist/providers/core/runtime/vision-debug-utils.d.ts +13 -0
  67. package/dist/providers/core/runtime/vision-debug-utils.js +114 -0
  68. package/dist/providers/core/runtime/vision-debug-utils.js.map +1 -0
  69. package/dist/providers/core/strategies/oauth-auth-code-flow.js +82 -25
  70. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  71. package/dist/providers/core/utils/http-client.d.ts +5 -0
  72. package/dist/providers/core/utils/http-client.js +31 -4
  73. package/dist/providers/core/utils/http-client.js.map +1 -1
  74. package/dist/providers/core/utils/provider-error-reporter.js +8 -2
  75. package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
  76. package/dist/providers/core/utils/snapshot-writer.d.ts +1 -1
  77. package/dist/providers/core/utils/snapshot-writer.js +5 -1
  78. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  79. package/dist/providers/profile/provider-profile-loader.js +8 -4
  80. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  81. package/dist/runtime/runtime-flags.d.ts +4 -0
  82. package/dist/runtime/runtime-flags.js +32 -0
  83. package/dist/runtime/runtime-flags.js.map +1 -0
  84. package/dist/server/handlers/handler-utils.js +29 -2
  85. package/dist/server/handlers/handler-utils.js.map +1 -1
  86. package/dist/server/handlers/messages-handler.js +27 -26
  87. package/dist/server/handlers/messages-handler.js.map +1 -1
  88. package/dist/server/handlers/responses-handler.js +35 -1
  89. package/dist/server/handlers/responses-handler.js.map +1 -1
  90. package/dist/server/handlers/sse-dispatcher.js +22 -2
  91. package/dist/server/handlers/sse-dispatcher.js.map +1 -1
  92. package/dist/server/runtime/http-server/index.d.ts +10 -0
  93. package/dist/server/runtime/http-server/index.js +551 -148
  94. package/dist/server/runtime/http-server/index.js.map +1 -1
  95. package/dist/server/runtime/http-server/request-executor.d.ts +14 -0
  96. package/dist/server/runtime/http-server/request-executor.js +638 -149
  97. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  98. package/dist/server/runtime/http-server/routes.d.ts +5 -0
  99. package/dist/server/runtime/http-server/routes.js +69 -0
  100. package/dist/server/runtime/http-server/routes.js.map +1 -1
  101. package/dist/server/runtime/http-server/runtime-manager.js +18 -0
  102. package/dist/server/runtime/http-server/runtime-manager.js.map +1 -1
  103. package/dist/server/utils/sse-request-parser.d.ts +1 -0
  104. package/dist/server/utils/sse-request-parser.js +17 -6
  105. package/dist/server/utils/sse-request-parser.js.map +1 -1
  106. package/dist/server/utils/utf8-chunk-buffer.d.ts +43 -0
  107. package/dist/server/utils/utf8-chunk-buffer.js +132 -0
  108. package/dist/server/utils/utf8-chunk-buffer.js.map +1 -0
  109. package/dist/server/utils/warmup-detector.d.ts +7 -0
  110. package/dist/server/utils/warmup-detector.js +125 -0
  111. package/dist/server/utils/warmup-detector.js.map +1 -0
  112. package/dist/server/utils/warmup-storm-tracker.d.ts +9 -0
  113. package/dist/server/utils/warmup-storm-tracker.js +61 -0
  114. package/dist/server/utils/warmup-storm-tracker.js.map +1 -0
  115. package/dist/token-daemon/index.d.ts +7 -0
  116. package/dist/token-daemon/index.js +242 -0
  117. package/dist/token-daemon/index.js.map +1 -0
  118. package/dist/token-daemon/server-utils.d.ts +33 -0
  119. package/dist/token-daemon/server-utils.js +155 -0
  120. package/dist/token-daemon/server-utils.js.map +1 -0
  121. package/dist/token-daemon/token-daemon.d.ts +20 -0
  122. package/dist/token-daemon/token-daemon.js +144 -0
  123. package/dist/token-daemon/token-daemon.js.map +1 -0
  124. package/dist/token-daemon/token-types.d.ts +44 -0
  125. package/dist/token-daemon/token-types.js +18 -0
  126. package/dist/token-daemon/token-types.js.map +1 -0
  127. package/dist/token-daemon/token-utils.d.ts +17 -0
  128. package/dist/token-daemon/token-utils.js +153 -0
  129. package/dist/token-daemon/token-utils.js.map +1 -0
  130. package/dist/tools/semantic-replay.js +7 -6
  131. package/dist/tools/semantic-replay.js.map +1 -1
  132. package/dist/utils/debug-utils.js +14 -0
  133. package/dist/utils/debug-utils.js.map +1 -1
  134. package/dist/utils/error-handler-registry.d.ts +36 -0
  135. package/dist/utils/error-handler-registry.js +99 -12
  136. package/dist/utils/error-handler-registry.js.map +1 -1
  137. package/dist/utils/error-handling-utils.js +4 -3
  138. package/dist/utils/error-handling-utils.js.map +1 -1
  139. package/dist/utils/log-helpers.d.ts +6 -0
  140. package/dist/utils/log-helpers.js +90 -0
  141. package/dist/utils/log-helpers.js.map +1 -0
  142. package/dist/utils/logger.d.ts +8 -0
  143. package/dist/utils/logger.js +55 -2
  144. package/dist/utils/logger.js.map +1 -1
  145. package/dist/utils/snapshot-writer.js +2 -6
  146. package/dist/utils/snapshot-writer.js.map +1 -1
  147. package/node_modules/@jsonstudio/llms/README.md +2 -0
  148. package/node_modules/@jsonstudio/llms/dist/conversion/codecs/gemini-openai-codec.js +152 -6
  149. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/auto-thinking.d.ts +6 -0
  150. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/auto-thinking.js +25 -0
  151. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/field-mapping.d.ts +14 -0
  152. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/field-mapping.js +155 -0
  153. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/gemini-web-search.d.ts +17 -0
  154. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/gemini-web-search.js +68 -0
  155. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-image-content.d.ts +2 -0
  156. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-image-content.js +83 -0
  157. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-tool-extraction.d.ts +2 -0
  158. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-tool-extraction.js +264 -0
  159. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-vision-prompt.d.ts +11 -0
  160. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-vision-prompt.js +177 -0
  161. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-web-search.d.ts +2 -0
  162. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-web-search.js +63 -0
  163. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwen-transform.d.ts +3 -0
  164. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwen-transform.js +209 -0
  165. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/request-rules.d.ts +24 -0
  166. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/request-rules.js +63 -0
  167. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-blacklist.d.ts +14 -0
  168. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-blacklist.js +85 -0
  169. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-normalize.d.ts +5 -0
  170. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-normalize.js +121 -0
  171. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-validate.d.ts +5 -0
  172. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-validate.js +76 -0
  173. package/{dist/providers/compat/utils/snapshot-writer.d.ts → node_modules/@jsonstudio/llms/dist/conversion/compat/actions/snapshot.d.ts} +2 -2
  174. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/snapshot.js +21 -0
  175. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/tool-schema.d.ts +6 -0
  176. package/{dist/providers/compat/glm/utils/tool-schema-helpers.js → node_modules/@jsonstudio/llms/dist/conversion/compat/actions/tool-schema.js} +6 -1
  177. package/{dist/providers/compat/filters → node_modules/@jsonstudio/llms/dist/conversion/compat/actions}/universal-shape-filter.d.ts +17 -22
  178. package/{dist/providers/compat/filters → node_modules/@jsonstudio/llms/dist/conversion/compat/actions}/universal-shape-filter.js +46 -99
  179. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-gemini.json +17 -0
  180. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-glm.json +196 -13
  181. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-iflow.json +194 -26
  182. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-lmstudio.json +43 -35
  183. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwen.json +20 -16
  184. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/responses-c4m.json +42 -42
  185. package/node_modules/@jsonstudio/llms/dist/conversion/config/sample-config.json +1 -1
  186. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-engine.d.ts +7 -2
  187. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-engine.js +5 -665
  188. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.d.ts +9 -0
  189. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.js +869 -0
  190. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-types.d.ts +55 -0
  191. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.d.ts +2 -0
  192. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.js +74 -5
  193. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage3_compat/index.js +2 -2
  194. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/target-utils.js +9 -0
  195. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process.js +213 -1
  196. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.d.ts +34 -0
  197. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.js +84 -24
  198. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-runtime.js +19 -2
  199. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/server-side-tools.d.ts +26 -0
  200. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/server-side-tools.js +383 -0
  201. package/node_modules/@jsonstudio/llms/dist/conversion/hub/semantic-mappers/gemini-mapper.js +241 -14
  202. package/node_modules/@jsonstudio/llms/dist/conversion/hub/semantic-mappers/responses-mapper.js +17 -1
  203. package/node_modules/@jsonstudio/llms/dist/conversion/hub/standardized-bridge.js +14 -0
  204. package/node_modules/@jsonstudio/llms/dist/conversion/hub/types/standardized.d.ts +1 -0
  205. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-host-policy.d.ts +6 -0
  206. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-host-policy.js +14 -0
  207. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge.js +133 -5
  208. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils.js +98 -3
  209. package/node_modules/@jsonstudio/llms/dist/conversion/shared/bridge-message-utils.js +137 -10
  210. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-output-builder.js +43 -2
  211. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.d.ts +4 -0
  212. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.js +62 -1
  213. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-response-utils.js +23 -1
  214. package/node_modules/@jsonstudio/llms/dist/conversion/shared/snapshot-utils.js +17 -47
  215. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-canonicalizer.d.ts +2 -0
  216. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-filter-pipeline.js +12 -0
  217. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-mapping.js +25 -2
  218. package/node_modules/@jsonstudio/llms/dist/index.d.ts +1 -0
  219. package/node_modules/@jsonstudio/llms/dist/index.js +1 -0
  220. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap.js +540 -36
  221. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/classifier.js +12 -11
  222. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.d.ts +19 -0
  223. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.js +64 -0
  224. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.d.ts +26 -0
  225. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.js +450 -54
  226. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/features.js +23 -458
  227. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/health-manager.js +2 -7
  228. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/message-utils.d.ts +7 -0
  229. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/message-utils.js +78 -0
  230. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-registry.js +7 -2
  231. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-counter.js +14 -3
  232. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-estimator.d.ts +2 -0
  233. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-estimator.js +16 -0
  234. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-file-scanner.d.ts +15 -0
  235. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-file-scanner.js +56 -0
  236. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.d.ts +13 -0
  237. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.js +403 -0
  238. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.d.ts +86 -2
  239. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.js +3 -1
  240. package/node_modules/@jsonstudio/llms/dist/servertool/engine.d.ts +27 -0
  241. package/node_modules/@jsonstudio/llms/dist/servertool/engine.js +60 -0
  242. package/node_modules/@jsonstudio/llms/dist/servertool/flow-types.d.ts +40 -0
  243. package/node_modules/@jsonstudio/llms/dist/servertool/flow-types.js +1 -0
  244. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/vision.d.ts +1 -0
  245. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/vision.js +194 -0
  246. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.d.ts +1 -0
  247. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.js +638 -0
  248. package/node_modules/@jsonstudio/llms/dist/servertool/orchestration-types.d.ts +33 -0
  249. package/node_modules/@jsonstudio/llms/dist/servertool/orchestration-types.js +1 -0
  250. package/node_modules/@jsonstudio/llms/dist/servertool/registry.d.ts +18 -0
  251. package/node_modules/@jsonstudio/llms/dist/servertool/registry.js +27 -0
  252. package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.d.ts +8 -0
  253. package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.js +208 -0
  254. package/node_modules/@jsonstudio/llms/dist/servertool/types.d.ts +88 -0
  255. package/node_modules/@jsonstudio/llms/dist/servertool/types.js +1 -0
  256. package/node_modules/@jsonstudio/llms/dist/servertool/vision-tool.d.ts +2 -0
  257. package/node_modules/@jsonstudio/llms/dist/servertool/vision-tool.js +185 -0
  258. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/responses.js +15 -3
  259. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.js +6 -3
  260. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/gemini-sse-to-json-converter.js +27 -1
  261. package/node_modules/@jsonstudio/llms/dist/sse/types/gemini-types.d.ts +20 -1
  262. package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.js +1 -1
  263. package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.d.ts +73 -0
  264. package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.js +280 -0
  265. package/node_modules/@jsonstudio/llms/package.json +2 -2
  266. package/package.json +11 -10
  267. package/scripts/README.md +26 -12
  268. package/scripts/auth-antigravity-token.mjs +64 -0
  269. package/scripts/auth-gemini-cli-token.mjs +96 -0
  270. package/scripts/auth-iflow-manual.mjs +81 -0
  271. package/scripts/auth-iflow-token-direct.mjs +87 -0
  272. package/scripts/auth-iflow-token.mjs +77 -0
  273. package/scripts/copy-compat-assets.mjs +3 -15
  274. package/scripts/install-verify.mjs +1 -0
  275. package/scripts/pack-mode.mjs +2 -1
  276. package/scripts/publish-rcc.mjs +20 -4
  277. package/scripts/replay-codex-sample.mjs +13 -8
  278. package/scripts/tests/chat-pipeline-blackbox.mjs +1 -1
  279. package/scripts/tests/virtual-router-health.mjs +141 -6
  280. package/scripts/tools/capture-provider-goldens.mjs +8 -7
  281. package/scripts/verify-client-headers.mjs +224 -0
  282. package/dist/providers/compat/base-compatibility.d.ts +0 -27
  283. package/dist/providers/compat/base-compatibility.js +0 -143
  284. package/dist/providers/compat/base-compatibility.js.map +0 -1
  285. package/dist/providers/compat/compat-directory-loader.d.ts +0 -4
  286. package/dist/providers/compat/compat-directory-loader.js +0 -85
  287. package/dist/providers/compat/compat-directory-loader.js.map +0 -1
  288. package/dist/providers/compat/compatibility-adapter.d.ts +0 -18
  289. package/dist/providers/compat/compatibility-adapter.js +0 -104
  290. package/dist/providers/compat/compatibility-adapter.js.map +0 -1
  291. package/dist/providers/compat/compatibility-factory.d.ts +0 -57
  292. package/dist/providers/compat/compatibility-factory.js +0 -155
  293. package/dist/providers/compat/compatibility-factory.js.map +0 -1
  294. package/dist/providers/compat/compatibility-interface.d.ts +0 -35
  295. package/dist/providers/compat/compatibility-interface.js +0 -2
  296. package/dist/providers/compat/compatibility-interface.js.map +0 -1
  297. package/dist/providers/compat/compatibility-manager.d.ts +0 -85
  298. package/dist/providers/compat/compatibility-manager.js +0 -368
  299. package/dist/providers/compat/compatibility-manager.js.map +0 -1
  300. package/dist/providers/compat/config/config-compatibility.d.ts +0 -28
  301. package/dist/providers/compat/config/config-compatibility.js +0 -95
  302. package/dist/providers/compat/config/config-compatibility.js.map +0 -1
  303. package/dist/providers/compat/field-mapping.d.ts +0 -102
  304. package/dist/providers/compat/field-mapping.js +0 -447
  305. package/dist/providers/compat/field-mapping.js.map +0 -1
  306. package/dist/providers/compat/filters/blacklist-sanitizer.d.ts +0 -45
  307. package/dist/providers/compat/filters/blacklist-sanitizer.js +0 -133
  308. package/dist/providers/compat/filters/blacklist-sanitizer.js.map +0 -1
  309. package/dist/providers/compat/filters/response-blacklist-sanitizer.d.ts +0 -28
  310. package/dist/providers/compat/filters/response-blacklist-sanitizer.js +0 -138
  311. package/dist/providers/compat/filters/response-blacklist-sanitizer.js.map +0 -1
  312. package/dist/providers/compat/filters/universal-shape-filter.js.map +0 -1
  313. package/dist/providers/compat/glm/config/blacklist-rules.json +0 -22
  314. package/dist/providers/compat/glm/config/field-mappings.json +0 -92
  315. package/dist/providers/compat/glm/config/response-blacklist.json +0 -7
  316. package/dist/providers/compat/glm/config/shape-filters.json +0 -37
  317. package/dist/providers/compat/glm/field-mapping/field-mapping-processor.d.ts +0 -28
  318. package/dist/providers/compat/glm/field-mapping/field-mapping-processor.js +0 -306
  319. package/dist/providers/compat/glm/field-mapping/field-mapping-processor.js.map +0 -1
  320. package/dist/providers/compat/glm/functions/glm-processor.d.ts +0 -50
  321. package/dist/providers/compat/glm/functions/glm-processor.js +0 -134
  322. package/dist/providers/compat/glm/functions/glm-processor.js.map +0 -1
  323. package/dist/providers/compat/glm/glm-compatibility.d.ts +0 -34
  324. package/dist/providers/compat/glm/glm-compatibility.js +0 -117
  325. package/dist/providers/compat/glm/glm-compatibility.js.map +0 -1
  326. package/dist/providers/compat/glm/hooks/base-hook.d.ts +0 -21
  327. package/dist/providers/compat/glm/hooks/base-hook.js +0 -53
  328. package/dist/providers/compat/glm/hooks/base-hook.js.map +0 -1
  329. package/dist/providers/compat/glm/hooks/glm-request-validation-hook.d.ts +0 -24
  330. package/dist/providers/compat/glm/hooks/glm-request-validation-hook.js +0 -268
  331. package/dist/providers/compat/glm/hooks/glm-request-validation-hook.js.map +0 -1
  332. package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.d.ts +0 -21
  333. package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.js +0 -171
  334. package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.js.map +0 -1
  335. package/dist/providers/compat/glm/hooks/glm-response-validation-hook.d.ts +0 -25
  336. package/dist/providers/compat/glm/hooks/glm-response-validation-hook.js +0 -236
  337. package/dist/providers/compat/glm/hooks/glm-response-validation-hook.js.map +0 -1
  338. package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.d.ts +0 -26
  339. package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.js +0 -186
  340. package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.js.map +0 -1
  341. package/dist/providers/compat/glm/index.d.ts +0 -24
  342. package/dist/providers/compat/glm/index.js +0 -29
  343. package/dist/providers/compat/glm/index.js.map +0 -1
  344. package/dist/providers/compat/glm/utils/tool-schema-helpers.d.ts +0 -3
  345. package/dist/providers/compat/glm/utils/tool-schema-helpers.js.map +0 -1
  346. package/dist/providers/compat/iflow/config/field-mappings.json +0 -92
  347. package/dist/providers/compat/iflow/config/shape-filters.json +0 -37
  348. package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.d.ts +0 -34
  349. package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.js +0 -386
  350. package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.js.map +0 -1
  351. package/dist/providers/compat/iflow/functions/iflow-processor.d.ts +0 -53
  352. package/dist/providers/compat/iflow/functions/iflow-processor.js +0 -215
  353. package/dist/providers/compat/iflow/functions/iflow-processor.js.map +0 -1
  354. package/dist/providers/compat/iflow/hooks/base-hook.d.ts +0 -23
  355. package/dist/providers/compat/iflow/hooks/base-hook.js +0 -59
  356. package/dist/providers/compat/iflow/hooks/base-hook.js.map +0 -1
  357. package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.d.ts +0 -23
  358. package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.js +0 -279
  359. package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.js.map +0 -1
  360. package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.d.ts +0 -20
  361. package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.js +0 -180
  362. package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.js.map +0 -1
  363. package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.d.ts +0 -23
  364. package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.js +0 -232
  365. package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.js.map +0 -1
  366. package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.d.ts +0 -25
  367. package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.js +0 -216
  368. package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.js.map +0 -1
  369. package/dist/providers/compat/iflow/iflow-compatibility.d.ts +0 -24
  370. package/dist/providers/compat/iflow/iflow-compatibility.js +0 -94
  371. package/dist/providers/compat/iflow/iflow-compatibility.js.map +0 -1
  372. package/dist/providers/compat/index.d.ts +0 -59
  373. package/dist/providers/compat/index.js +0 -83
  374. package/dist/providers/compat/index.js.map +0 -1
  375. package/dist/providers/compat/lmstudio-compatibility.d.ts +0 -44
  376. package/dist/providers/compat/lmstudio-compatibility.js +0 -193
  377. package/dist/providers/compat/lmstudio-compatibility.js.map +0 -1
  378. package/dist/providers/compat/passthrough-compatibility.d.ts +0 -29
  379. package/dist/providers/compat/passthrough-compatibility.js +0 -83
  380. package/dist/providers/compat/passthrough-compatibility.js.map +0 -1
  381. package/dist/providers/compat/profiles/chat/glm/index.d.ts +0 -6
  382. package/dist/providers/compat/profiles/chat/glm/index.js +0 -6
  383. package/dist/providers/compat/profiles/chat/glm/index.js.map +0 -1
  384. package/dist/providers/compat/profiles/chat/iflow/index.d.ts +0 -6
  385. package/dist/providers/compat/profiles/chat/iflow/index.js +0 -6
  386. package/dist/providers/compat/profiles/chat/iflow/index.js.map +0 -1
  387. package/dist/providers/compat/profiles/chat/lmstudio/index.d.ts +0 -6
  388. package/dist/providers/compat/profiles/chat/lmstudio/index.js +0 -6
  389. package/dist/providers/compat/profiles/chat/lmstudio/index.js.map +0 -1
  390. package/dist/providers/compat/profiles/chat/qwen/index.d.ts +0 -6
  391. package/dist/providers/compat/profiles/chat/qwen/index.js +0 -6
  392. package/dist/providers/compat/profiles/chat/qwen/index.js.map +0 -1
  393. package/dist/providers/compat/profiles/compat/passthrough/index.d.ts +0 -6
  394. package/dist/providers/compat/profiles/compat/passthrough/index.js +0 -6
  395. package/dist/providers/compat/profiles/compat/passthrough/index.js.map +0 -1
  396. package/dist/providers/compat/profiles/responses/c4m/index.d.ts +0 -6
  397. package/dist/providers/compat/profiles/responses/c4m/index.js +0 -6
  398. package/dist/providers/compat/profiles/responses/c4m/index.js.map +0 -1
  399. package/dist/providers/compat/profiles/responses/default/index.d.ts +0 -6
  400. package/dist/providers/compat/profiles/responses/default/index.js +0 -6
  401. package/dist/providers/compat/profiles/responses/default/index.js.map +0 -1
  402. package/dist/providers/compat/profiles/responses/fai/index.d.ts +0 -6
  403. package/dist/providers/compat/profiles/responses/fai/index.js +0 -6
  404. package/dist/providers/compat/profiles/responses/fai/index.js.map +0 -1
  405. package/dist/providers/compat/profiles/responses/fc/index.d.ts +0 -6
  406. package/dist/providers/compat/profiles/responses/fc/index.js +0 -6
  407. package/dist/providers/compat/profiles/responses/fc/index.js.map +0 -1
  408. package/dist/providers/compat/qwen/index.d.ts +0 -4
  409. package/dist/providers/compat/qwen/index.js +0 -6
  410. package/dist/providers/compat/qwen/index.js.map +0 -1
  411. package/dist/providers/compat/qwen-compatibility.d.ts +0 -52
  412. package/dist/providers/compat/qwen-compatibility.js +0 -330
  413. package/dist/providers/compat/qwen-compatibility.js.map +0 -1
  414. package/dist/providers/compat/register-compat-module.d.ts +0 -8
  415. package/dist/providers/compat/register-compat-module.js +0 -53
  416. package/dist/providers/compat/register-compat-module.js.map +0 -1
  417. package/dist/providers/compat/responses/c4m-responses-compatibility.d.ts +0 -27
  418. package/dist/providers/compat/responses/c4m-responses-compatibility.js +0 -197
  419. package/dist/providers/compat/responses/c4m-responses-compatibility.js.map +0 -1
  420. package/dist/providers/compat/standard-compatibility-utils.d.ts +0 -1
  421. package/dist/providers/compat/standard-compatibility-utils.js +0 -77
  422. package/dist/providers/compat/standard-compatibility-utils.js.map +0 -1
  423. package/dist/providers/compat/standard-compatibility.d.ts +0 -31
  424. package/dist/providers/compat/standard-compatibility.js +0 -118
  425. package/dist/providers/compat/standard-compatibility.js.map +0 -1
  426. package/dist/providers/compat/utils/snapshot-writer.js +0 -62
  427. package/dist/providers/compat/utils/snapshot-writer.js.map +0 -1
  428. package/dist/tools/replay-request.d.ts +0 -0
  429. package/dist/tools/replay-request.js +0 -2
  430. package/dist/tools/replay-request.js.map +0 -1
  431. package/scripts/check-glm-compat.mjs +0 -47
@@ -8,6 +8,8 @@
8
8
  *
9
9
  * 各协议具体行为(OpenAI Chat、Responses、Anthropic、Gemini 等)通过子类覆写钩子实现。
10
10
  */
11
+ import { createHash } from 'node:crypto';
12
+ import fs from 'node:fs/promises';
11
13
  import { BaseProvider } from './base-provider.js';
12
14
  import { HttpClient } from '../utils/http-client.js';
13
15
  import { DynamicProfileLoader, ServiceProfileValidator } from '../config/service-profiles.js';
@@ -16,13 +18,15 @@ import { OAuthAuthProvider } from '../../auth/oauth-auth.js';
16
18
  import { logOAuthDebug } from '../../auth/oauth-logger.js';
17
19
  import { TokenFileAuthProvider } from '../../auth/tokenfile-auth.js';
18
20
  import { ensureValidOAuthToken, handleUpstreamInvalidOAuthToken } from '../../auth/oauth-lifecycle.js';
21
+ import { fetchAntigravityProjectId } from '../../auth/antigravity-userinfo-helper.js';
19
22
  import { attachProviderSseSnapshotStream, writeProviderSnapshot } from '../utils/snapshot-writer.js';
20
- import { attachProviderRuntimeMetadata } from './provider-runtime-metadata.js';
23
+ import { attachProviderRuntimeMetadata, extractProviderRuntimeMetadata } from './provider-runtime-metadata.js';
24
+ import { buildVisionSnapshotPayload, shouldCaptureVisionDebug, summarizeVisionMessages } from './vision-debug-utils.js';
21
25
  import { OpenAIChatProtocolClient } from '../../../client/openai/chat-protocol-client.js';
22
26
  import { HttpRequestExecutor } from './http-request-executor.js';
23
27
  import { extractStatusCodeFromError } from './provider-error-classifier.js';
24
28
  const isRecord = (value) => typeof value === 'object' && value !== null;
25
- const DEFAULT_USER_AGENT = 'RouteCodex/2.0';
29
+ const DEFAULT_USER_AGENT = 'codex_cli_rs/0.73.0 (Mac OS 15.6.1; arm64) iTerm.app/3.6.5';
26
30
  export class HttpTransportProvider extends BaseProvider {
27
31
  type;
28
32
  authProvider = null;
@@ -56,9 +60,9 @@ export class HttpTransportProvider extends BaseProvider {
56
60
  const extensions = this.getConfigExtensions();
57
61
  const auth = providerConfig.auth;
58
62
  const usesTokenFile = this.authProvider instanceof TokenFileAuthProvider;
59
- if (this.normalizeAuthMode(auth.type) === 'oauth' && !usesTokenFile) {
63
+ if (this.normalizeAuthMode(auth.type) === 'oauth') {
60
64
  const oauthAuth = auth;
61
- const oauthProviderId = this.ensureOAuthProviderId(oauthAuth, extensions);
65
+ const oauthProviderId = this.oauthProviderId || this.ensureOAuthProviderId(oauthAuth, extensions);
62
66
  const forceReauthorize = false;
63
67
  const tokenFileHint = oauthAuth.tokenFile ?? '(default)';
64
68
  logOAuthDebug(`[OAuth] [init] provider=${oauthProviderId} type=${auth.type} tokenFile=${tokenFileHint} forceReauth=${forceReauthorize}`);
@@ -73,9 +77,13 @@ export class HttpTransportProvider extends BaseProvider {
73
77
  openBrowser: true,
74
78
  forceReauthorize
75
79
  });
80
+ if (this.oauthProviderId === 'antigravity') {
81
+ await this.ensureAntigravityProjectMetadata(oauthAuth);
82
+ }
76
83
  logOAuthDebug('[OAuth] [init] ensureValid OK');
77
84
  try {
78
85
  if (this.authProvider instanceof TokenFileAuthProvider) {
86
+ // 令牌文件可能在 ensureValidOAuthToken 中被创建/更新,重新加载一次
79
87
  await this.authProvider.initialize();
80
88
  }
81
89
  else {
@@ -94,17 +102,11 @@ export class HttpTransportProvider extends BaseProvider {
94
102
  const msg = err?.message ? String(err.message) : String(error);
95
103
  console.error(`[OAuth] [init] ensureValid ERROR: ${msg}`);
96
104
  this.dependencies.logger?.logModule?.(this.id, 'oauth-init-error', {
97
- providerType: this.providerType,
105
+ providerType: oauthProviderId,
98
106
  error: msg
99
107
  });
100
108
  throw error;
101
109
  }
102
- try {
103
- this.authProvider.getOAuthClient?.()?.loadToken?.();
104
- }
105
- catch {
106
- // ignore
107
- }
108
110
  }
109
111
  else {
110
112
  try {
@@ -206,7 +208,8 @@ export class HttpTransportProvider extends BaseProvider {
206
208
  };
207
209
  const timeout = typeof timeoutFromCfg === 'number'
208
210
  ? timeoutFromCfg
209
- : (baseProfile?.timeout ?? 300000);
211
+ // 默认 Provider 请求超时时间:500s
212
+ : (baseProfile?.timeout ?? 500000);
210
213
  const maxRetries = typeof maxRetriesFromCfg === 'number'
211
214
  ? maxRetriesFromCfg
212
215
  : (baseProfile?.maxRetries ?? 3);
@@ -238,18 +241,15 @@ export class HttpTransportProvider extends BaseProvider {
238
241
  const extensions = this.getConfigExtensions();
239
242
  const authMode = this.normalizeAuthMode(auth.type);
240
243
  this.authMode = authMode;
241
- let providerIdForAuth = authMode === 'oauth'
244
+ const resolvedOAuthProviderId = authMode === 'oauth'
242
245
  ? this.ensureOAuthProviderId(auth, extensions)
243
- : this.providerType;
244
- if (this.type === 'gemini-cli-http-provider') {
245
- providerIdForAuth = 'gemini-cli';
246
- }
247
- if (authMode === 'oauth') {
248
- this.oauthProviderId = providerIdForAuth;
249
- }
250
- const validation = ServiceProfileValidator.validateServiceProfile(providerIdForAuth, authMode);
246
+ : undefined;
247
+ const serviceProfileKey = this.type === 'gemini-cli-http-provider'
248
+ ? 'gemini-cli'
249
+ : (resolvedOAuthProviderId ?? this.providerType);
250
+ const validation = ServiceProfileValidator.validateServiceProfile(serviceProfileKey, authMode);
251
251
  if (!validation.isValid) {
252
- throw new Error(`Invalid auth configuration for ${providerIdForAuth}: ${validation.errors.join(', ')}`);
252
+ throw new Error(`Invalid auth configuration for ${serviceProfileKey}: ${validation.errors.join(', ')}`);
253
253
  }
254
254
  // 根据认证类型创建对应的认证提供者
255
255
  if (authMode === 'apikey') {
@@ -257,16 +257,20 @@ export class HttpTransportProvider extends BaseProvider {
257
257
  }
258
258
  else if (authMode === 'oauth') {
259
259
  const oauthAuth = auth;
260
+ const oauthProviderId = resolvedOAuthProviderId ?? serviceProfileKey;
261
+ this.oauthProviderId = oauthProviderId;
260
262
  // For providers like Qwen/iflow/Gemini CLI where public OAuth client may not be available,
261
263
  // allow reading tokens produced by external login tools (CLIProxyAPI) via token file.
262
- const useTokenFile = (providerIdForAuth === 'qwen' || providerIdForAuth === 'iflow' || providerIdForAuth === 'gemini-cli') &&
264
+ const useTokenFile = (oauthProviderId === 'qwen' ||
265
+ oauthProviderId === 'iflow' ||
266
+ this.type === 'gemini-cli-http-provider') &&
263
267
  !oauthAuth.clientId &&
264
268
  !oauthAuth.tokenUrl &&
265
269
  !oauthAuth.deviceCodeUrl;
266
270
  if (useTokenFile) {
267
271
  return new TokenFileAuthProvider(oauthAuth);
268
272
  }
269
- return new OAuthAuthProvider(oauthAuth, providerIdForAuth);
273
+ return new OAuthAuthProvider(oauthAuth, oauthProviderId);
270
274
  }
271
275
  else {
272
276
  throw new Error(`Unsupported auth type: ${auth.type}`);
@@ -278,7 +282,8 @@ export class HttpTransportProvider extends BaseProvider {
278
282
  const envTimeout = Number(process.env.ROUTECODEX_PROVIDER_TIMEOUT_MS || process.env.RCC_PROVIDER_TIMEOUT_MS || NaN);
279
283
  const effectiveTimeout = Number.isFinite(envTimeout) && envTimeout > 0
280
284
  ? envTimeout
281
- : (this.config.config.overrides?.timeout ?? profile.timeout ?? 300000);
285
+ // 默认 Provider 请求超时时间:500s(可被 env / overrides 覆盖)
286
+ : (this.config.config.overrides?.timeout ?? profile.timeout ?? 500000);
282
287
  const envRetries = Number(process.env.ROUTECODEX_PROVIDER_RETRIES || process.env.RCC_PROVIDER_RETRIES || NaN);
283
288
  const effectiveRetries = Number.isFinite(envRetries) && envRetries >= 0
284
289
  ? envRetries
@@ -321,6 +326,19 @@ export class HttpTransportProvider extends BaseProvider {
321
326
  async preprocessRequest(request) {
322
327
  const context = this.createProviderContext();
323
328
  const runtimeMetadata = context.runtimeMetadata;
329
+ const headersFromRequest = this.normalizeClientHeaders(request?.metadata?.clientHeaders);
330
+ const headersFromRuntime = this.normalizeClientHeaders(runtimeMetadata?.metadata && typeof runtimeMetadata.metadata === 'object'
331
+ ? runtimeMetadata.metadata.clientHeaders
332
+ : undefined);
333
+ const effectiveClientHeaders = headersFromRequest ?? headersFromRuntime;
334
+ if (effectiveClientHeaders) {
335
+ if (runtimeMetadata) {
336
+ if (!runtimeMetadata.metadata || typeof runtimeMetadata.metadata !== 'object') {
337
+ runtimeMetadata.metadata = {};
338
+ }
339
+ runtimeMetadata.metadata.clientHeaders = effectiveClientHeaders;
340
+ }
341
+ }
324
342
  const ensureRuntimeMetadata = (payload) => {
325
343
  if (!runtimeMetadata || !payload || typeof payload !== 'object') {
326
344
  return;
@@ -346,20 +364,13 @@ export class HttpTransportProvider extends BaseProvider {
346
364
  ...processedMetadata,
347
365
  ...(entryEndpoint ? { entryEndpoint } : {}),
348
366
  ...(typeof streamFlag === 'boolean' ? { stream: !!streamFlag } : {}),
367
+ ...(effectiveClientHeaders ? { clientHeaders: effectiveClientHeaders } : {}),
349
368
  __origModel: inboundModel
350
369
  };
351
370
  }
352
371
  catch { /* ignore */ }
353
- // 流式开关:基础 Provider 统一移除入口层的 stream 标记,
354
- // 具体协议(如 Responses/Anthropic)的真实流控由各自独立 Provider 处理
355
- try {
356
- // 统一:所有入口均移除 stream=true(Provider 始终走非流式),SSE 由上层合成
357
- const requestBody = processedRequest;
358
- if (requestBody.stream === true) {
359
- delete requestBody.stream;
360
- }
361
- }
362
- catch { /* ignore */ }
372
+ this.logVisionDebug('preprocess', processedRequest);
373
+ await this.captureVisionDebugSnapshot('provider-preprocess-debug', processedRequest);
363
374
  return processedRequest;
364
375
  }
365
376
  async postprocessResponse(response, context) {
@@ -387,6 +398,36 @@ export class HttpTransportProvider extends BaseProvider {
387
398
  }
388
399
  };
389
400
  }
401
+ logVisionDebug(stage, payload) {
402
+ const debug = shouldCaptureVisionDebug(payload);
403
+ if (!debug.enabled) {
404
+ return;
405
+ }
406
+ const summary = summarizeVisionMessages(payload);
407
+ const label = debug.routeName ?? 'vision';
408
+ console.debug(`[vision-debug][${stage}] route=${label} request=${debug.requestId ?? '-'} ${summary}`);
409
+ }
410
+ async captureVisionDebugSnapshot(stage, payload) {
411
+ const debug = shouldCaptureVisionDebug(payload);
412
+ if (!debug.enabled || !debug.requestId) {
413
+ return;
414
+ }
415
+ try {
416
+ const metadataNode = payload?.metadata;
417
+ const entryEndpoint = metadataNode && typeof metadataNode === 'object' && typeof metadataNode.entryEndpoint === 'string'
418
+ ? metadataNode.entryEndpoint
419
+ : undefined;
420
+ await writeProviderSnapshot({
421
+ phase: stage,
422
+ requestId: debug.requestId,
423
+ data: buildVisionSnapshotPayload(payload),
424
+ entryEndpoint
425
+ });
426
+ }
427
+ catch {
428
+ // snapshot is best-effort; ignore failures
429
+ }
430
+ }
390
431
  async sendRequestInternal(request) {
391
432
  const context = this.createProviderContext();
392
433
  return this.requestExecutor.execute(request, context);
@@ -603,6 +644,8 @@ export class HttpTransportProvider extends BaseProvider {
603
644
  const inboundOriginator = typeof inboundMetadata?.clientOriginator === 'string' && inboundMetadata.clientOriginator.trim()
604
645
  ? inboundMetadata.clientOriginator.trim()
605
646
  : undefined;
647
+ const inboundClientHeaders = this.extractClientHeaders(runtimeMetadata);
648
+ const normalizedClientHeaders = this.normalizeCodexClientHeaders(inboundClientHeaders);
606
649
  // 服务特定头部
607
650
  const serviceHeaders = this.serviceProfile.headers || {};
608
651
  // 配置覆盖头部
@@ -613,7 +656,7 @@ export class HttpTransportProvider extends BaseProvider {
613
656
  const auth = this.config.config.auth;
614
657
  if (this.normalizeAuthMode(auth.type) === 'oauth') {
615
658
  const oauthAuth = auth;
616
- const oauthProviderId = this.ensureOAuthProviderId(oauthAuth);
659
+ const oauthProviderId = this.oauthProviderId || this.ensureOAuthProviderId(oauthAuth);
617
660
  logOAuthDebug('[OAuth] [headers] ensureValid start (openBrowser=true, forceReauth=false)');
618
661
  try {
619
662
  await ensureValidOAuthToken(oauthProviderId, oauthAuth, {
@@ -658,48 +701,146 @@ export class HttpTransportProvider extends BaseProvider {
658
701
  ...runtimeHeaders,
659
702
  ...authHeaders
660
703
  };
661
- // 禁用上游SSE:设置 Accept application/json(若未被显式覆盖)
662
- if (!('Accept' in finalHeaders) && !('accept' in finalHeaders)) {
663
- finalHeaders['Accept'] = 'application/json';
664
- }
665
- const getHeader = (headers, target) => {
666
- const lowered = target.toLowerCase();
667
- for (const [key, value] of Object.entries(headers)) {
668
- if (key.toLowerCase() === lowered && typeof value === 'string' && value.trim()) {
669
- return value.trim();
670
- }
671
- }
672
- return undefined;
673
- };
674
- const setHeader = (headers, target, value) => {
675
- if (!value || !value.trim())
676
- return;
677
- const lowered = target.toLowerCase();
678
- for (const key of Object.keys(headers)) {
679
- if (key.toLowerCase() === lowered) {
680
- headers[key] = value;
681
- return;
682
- }
683
- }
684
- headers[target] = value;
685
- };
704
+ // 保留客户端 Accept;无则默认为 application/json
705
+ const clientAccept = normalizedClientHeaders ? this.findHeaderValue(normalizedClientHeaders, 'Accept') : undefined;
706
+ if (clientAccept) {
707
+ this.assignHeader(finalHeaders, 'Accept', clientAccept);
708
+ }
709
+ else if (!this.findHeaderValue(finalHeaders, 'Accept')) {
710
+ this.assignHeader(finalHeaders, 'Accept', 'application/json');
711
+ }
686
712
  // Header priority:
687
713
  // - user/provider config (overrides/runtime) wins
688
714
  // - otherwise inherit from inbound client headers
689
715
  // - otherwise fall back to defaults
690
- const uaFromConfig = getHeader({ ...overrideHeaders, ...runtimeHeaders }, 'User-Agent');
691
- const uaFromService = getHeader(serviceHeaders, 'User-Agent');
716
+ const uaFromConfig = this.findHeaderValue({ ...overrideHeaders, ...runtimeHeaders }, 'User-Agent');
717
+ const uaFromService = this.findHeaderValue(serviceHeaders, 'User-Agent');
692
718
  const resolvedUa = uaFromConfig ?? inboundUserAgent ?? uaFromService ?? DEFAULT_USER_AGENT;
693
- setHeader(finalHeaders, 'User-Agent', resolvedUa);
719
+ this.assignHeader(finalHeaders, 'User-Agent', resolvedUa);
694
720
  // originator: do not invent one; only forward from config or inbound client
695
- const originatorFromConfig = getHeader({ ...overrideHeaders, ...runtimeHeaders }, 'originator');
696
- const originatorFromService = getHeader(serviceHeaders, 'originator');
721
+ const originatorFromConfig = this.findHeaderValue({ ...overrideHeaders, ...runtimeHeaders }, 'originator');
722
+ const originatorFromService = this.findHeaderValue(serviceHeaders, 'originator');
697
723
  const resolvedOriginator = originatorFromConfig ?? inboundOriginator ?? originatorFromService;
698
724
  if (resolvedOriginator) {
699
- setHeader(finalHeaders, 'originator', resolvedOriginator);
725
+ this.assignHeader(finalHeaders, 'originator', resolvedOriginator);
726
+ }
727
+ if (normalizedClientHeaders) {
728
+ const conversationId = this.findHeaderValue(normalizedClientHeaders, 'conversation_id');
729
+ if (conversationId) {
730
+ this.assignHeader(finalHeaders, 'conversation_id', conversationId);
731
+ }
732
+ const sessionId = this.findHeaderValue(normalizedClientHeaders, 'session_id');
733
+ if (sessionId) {
734
+ this.assignHeader(finalHeaders, 'session_id', sessionId);
735
+ }
736
+ }
737
+ if (this.isCodexUaMode()) {
738
+ this.ensureCodexSessionHeaders(finalHeaders, runtimeMetadata);
700
739
  }
701
740
  return finalHeaders;
702
741
  }
742
+ isCodexUaMode() {
743
+ const raw = process.env.ROUTECODEX_UA_MODE ??
744
+ process.env.RCC_UA_MODE ??
745
+ '';
746
+ const normalized = typeof raw === 'string' ? raw.trim().toLowerCase() : '';
747
+ const runtime = this.getCurrentRuntimeMetadata();
748
+ if (!runtime) {
749
+ return false;
750
+ }
751
+ const providerType = runtime.providerType || this.providerType;
752
+ const entryEndpoint = this.getEntryEndpointFromRuntime(runtime);
753
+ // 显式 UA 模式(--codex / --ua codex):对所有 provider 激活
754
+ if (normalized === 'codex') {
755
+ return true;
756
+ }
757
+ // 隐式模式:未显式设置 UA 时,仅在 responses provider 且入口不是 /v1/responses 时激活
758
+ if (providerType === 'responses' && entryEndpoint) {
759
+ const lowered = entryEndpoint.trim().toLowerCase();
760
+ if (!lowered.includes('/responses')) {
761
+ return true;
762
+ }
763
+ }
764
+ return false;
765
+ }
766
+ normalizeCodexClientHeaders(headers) {
767
+ if (!headers) {
768
+ return undefined;
769
+ }
770
+ if (!this.isCodexUaMode()) {
771
+ return headers;
772
+ }
773
+ const normalizedHeaders = { ...headers };
774
+ this.copyHeaderValue(normalizedHeaders, headers, 'anthropic-session-id', 'session_id');
775
+ this.copyHeaderValue(normalizedHeaders, headers, 'anthropic-conversation-id', 'conversation_id');
776
+ this.copyHeaderValue(normalizedHeaders, headers, 'anthropic-user-agent', 'User-Agent');
777
+ this.copyHeaderValue(normalizedHeaders, headers, 'anthropic-originator', 'originator');
778
+ return normalizedHeaders;
779
+ }
780
+ copyHeaderValue(target, source, from, to) {
781
+ if (this.findHeaderValue(target, to)) {
782
+ return;
783
+ }
784
+ const value = this.findHeaderValue(source, from);
785
+ if (value) {
786
+ target[to] = value;
787
+ }
788
+ }
789
+ findHeaderValue(headers, target) {
790
+ const lowered = target.toLowerCase();
791
+ for (const [key, value] of Object.entries(headers)) {
792
+ if (key.toLowerCase() === lowered && typeof value === 'string' && value.trim()) {
793
+ return value.trim();
794
+ }
795
+ }
796
+ return undefined;
797
+ }
798
+ assignHeader(headers, target, value) {
799
+ if (!value || !value.trim()) {
800
+ return;
801
+ }
802
+ const lowered = target.toLowerCase();
803
+ for (const key of Object.keys(headers)) {
804
+ if (key.toLowerCase() === lowered) {
805
+ headers[key] = value;
806
+ return;
807
+ }
808
+ }
809
+ headers[target] = value;
810
+ }
811
+ ensureCodexSessionHeaders(headers, runtimeMetadata) {
812
+ this.setHeaderIfMissing(headers, 'session_id', this.buildCodexIdentifier('session', runtimeMetadata));
813
+ this.setHeaderIfMissing(headers, 'conversation_id', this.buildCodexIdentifier('conversation', runtimeMetadata));
814
+ }
815
+ setHeaderIfMissing(headers, target, value) {
816
+ if (this.findHeaderValue(headers, target)) {
817
+ return;
818
+ }
819
+ this.assignHeader(headers, target, value);
820
+ }
821
+ buildCodexIdentifier(kind, runtimeMetadata) {
822
+ const fallbackId = runtimeMetadata?.metadata && typeof runtimeMetadata.metadata === 'object'
823
+ ? runtimeMetadata.metadata.clientRequestId
824
+ : undefined;
825
+ const requestId = runtimeMetadata?.requestId ?? fallbackId;
826
+ const routeName = runtimeMetadata?.routeName;
827
+ const suffix = (requestId ?? `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`)
828
+ .toString()
829
+ .replace(/[^A-Za-z0-9_-]/g, '_');
830
+ const parts = ['codex_cli', kind, suffix];
831
+ if (routeName) {
832
+ parts.push(routeName.replace(/[^A-Za-z0-9_-]/g, '_'));
833
+ }
834
+ return this.enforceCodexIdentifierLength(parts.join('_'));
835
+ }
836
+ enforceCodexIdentifierLength(value) {
837
+ if (value.length <= CODEX_IDENTIFIER_MAX_LENGTH) {
838
+ return value;
839
+ }
840
+ const hash = createHash('sha256').update(value).digest('hex').slice(0, 10);
841
+ const keep = Math.max(1, CODEX_IDENTIFIER_MAX_LENGTH - hash.length - 1);
842
+ return `${value.slice(0, keep)}_${hash}`;
843
+ }
703
844
  getEffectiveBaseUrl() {
704
845
  const runtime = this.getRuntimeProfile();
705
846
  const runtimeEndpoint = this.pickRuntimeBaseUrl(runtime);
@@ -745,12 +886,23 @@ export class HttpTransportProvider extends BaseProvider {
745
886
  : {};
746
887
  }
747
888
  getEntryEndpointFromPayload(payload) {
748
- const metadata = payload.metadata;
749
- if (metadata && typeof metadata.entryEndpoint === 'string') {
889
+ const runtimeMeta = extractProviderRuntimeMetadata(payload);
890
+ const metadata = (runtimeMeta && typeof runtimeMeta.metadata === 'object')
891
+ ? runtimeMeta.metadata
892
+ : payload.metadata;
893
+ if (metadata && typeof metadata.entryEndpoint === 'string' && metadata.entryEndpoint.trim()) {
750
894
  return metadata.entryEndpoint;
751
895
  }
752
896
  return undefined;
753
897
  }
898
+ getEntryEndpointFromRuntime(runtime) {
899
+ if (!runtime || !runtime.metadata || typeof runtime.metadata !== 'object') {
900
+ return undefined;
901
+ }
902
+ const meta = runtime.metadata;
903
+ const value = meta.entryEndpoint;
904
+ return typeof value === 'string' && value.trim().length ? value : undefined;
905
+ }
754
906
  asResponseRecord(value) {
755
907
  if (isRecord(value)) {
756
908
  return value;
@@ -856,5 +1008,126 @@ export class HttpTransportProvider extends BaseProvider {
856
1008
  }
857
1009
  return providerId;
858
1010
  }
1011
+ extractClientHeaders(source) {
1012
+ const normalize = (value) => {
1013
+ return this.normalizeClientHeaders(value);
1014
+ };
1015
+ if (!source || typeof source !== 'object') {
1016
+ return undefined;
1017
+ }
1018
+ const candidates = [];
1019
+ const metadataNode = source.metadata;
1020
+ if (metadataNode && typeof metadataNode === 'object') {
1021
+ const headersNode = metadataNode.clientHeaders;
1022
+ if (headersNode) {
1023
+ candidates.push(headersNode);
1024
+ }
1025
+ }
1026
+ const directNode = source.clientHeaders;
1027
+ if (directNode) {
1028
+ candidates.push(directNode);
1029
+ }
1030
+ for (const candidate of candidates) {
1031
+ const normalized = normalize(candidate);
1032
+ if (normalized) {
1033
+ return normalized;
1034
+ }
1035
+ }
1036
+ return undefined;
1037
+ }
1038
+ normalizeClientHeaders(value) {
1039
+ if (!value || typeof value !== 'object') {
1040
+ return undefined;
1041
+ }
1042
+ const normalized = {};
1043
+ for (const [key, raw] of Object.entries(value)) {
1044
+ if (typeof raw === 'string' && raw.trim()) {
1045
+ normalized[key] = raw;
1046
+ }
1047
+ }
1048
+ return Object.keys(normalized).length ? normalized : undefined;
1049
+ }
1050
+ async ensureAntigravityProjectMetadata(oauthAuth) {
1051
+ const tokenFile = typeof oauthAuth?.tokenFile === 'string' ? oauthAuth.tokenFile.trim() : '';
1052
+ if (!tokenFile) {
1053
+ return;
1054
+ }
1055
+ const tokenPath = tokenFile.startsWith('~/')
1056
+ ? tokenFile.replace(/^~\//, `${process.env.HOME || ''}/`)
1057
+ : tokenFile;
1058
+ let raw;
1059
+ try {
1060
+ raw = await fs.readFile(tokenPath, 'utf-8');
1061
+ }
1062
+ catch {
1063
+ return;
1064
+ }
1065
+ let parsed;
1066
+ try {
1067
+ parsed = JSON.parse(raw);
1068
+ }
1069
+ catch {
1070
+ return;
1071
+ }
1072
+ if (this.extractProjectIdFromTokenSnapshot(parsed)) {
1073
+ return;
1074
+ }
1075
+ const accessToken = this.extractAccessTokenFromSnapshot(parsed);
1076
+ if (!accessToken) {
1077
+ return;
1078
+ }
1079
+ const baseOverride = oauthAuth.antigravityApiBase;
1080
+ const apiBaseHint = baseOverride || this.getEffectiveBaseUrl();
1081
+ const projectId = await fetchAntigravityProjectId(accessToken, apiBaseHint);
1082
+ if (!projectId) {
1083
+ logOAuthDebug('[OAuth] Antigravity: unable to resolve project_id for token file');
1084
+ return;
1085
+ }
1086
+ parsed.project_id = projectId;
1087
+ parsed.projectId = projectId;
1088
+ const projectsNode = parsed.projects;
1089
+ if (!Array.isArray(projectsNode) || !projectsNode.length) {
1090
+ parsed.projects = [{ projectId }];
1091
+ }
1092
+ await fs.writeFile(tokenPath, JSON.stringify(parsed, null, 2));
1093
+ logOAuthDebug(`[OAuth] Antigravity: persisted project_id=${projectId} for ${tokenPath}`);
1094
+ }
1095
+ extractAccessTokenFromSnapshot(snapshot) {
1096
+ const lower = snapshot.access_token;
1097
+ const upper = snapshot.AccessToken;
1098
+ const value = typeof lower === 'string'
1099
+ ? lower
1100
+ : typeof upper === 'string'
1101
+ ? upper
1102
+ : undefined;
1103
+ if (value && value.trim()) {
1104
+ return value.trim();
1105
+ }
1106
+ return undefined;
1107
+ }
1108
+ extractProjectIdFromTokenSnapshot(snapshot) {
1109
+ const directNode = snapshot.project_id;
1110
+ const direct = typeof directNode === 'string' ? directNode : undefined;
1111
+ if (direct && direct.trim()) {
1112
+ return direct.trim();
1113
+ }
1114
+ const camelNode = snapshot.projectId;
1115
+ const camel = typeof camelNode === 'string' ? camelNode : undefined;
1116
+ if (camel && camel.trim()) {
1117
+ return camel.trim();
1118
+ }
1119
+ if (Array.isArray(snapshot.projects)) {
1120
+ for (const entry of snapshot.projects ?? []) {
1121
+ if (entry && typeof entry === 'object' && typeof entry.projectId === 'string') {
1122
+ const candidate = String(entry.projectId);
1123
+ if (candidate.trim()) {
1124
+ return candidate.trim();
1125
+ }
1126
+ }
1127
+ }
1128
+ }
1129
+ return undefined;
1130
+ }
859
1131
  }
1132
+ const CODEX_IDENTIFIER_MAX_LENGTH = 64;
860
1133
  //# sourceMappingURL=http-transport-provider.js.map