@jsonstudio/rcc 0.89.168 → 0.89.333

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 (323) hide show
  1. package/README.md +18 -15
  2. package/dist/build-info.js +2 -2
  3. package/dist/cli.js +32 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/client/gemini-cli/gemini-cli-protocol-client.js +28 -5
  6. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  7. package/dist/error-handling/quiet-error-handling-center.d.ts +9 -0
  8. package/dist/error-handling/quiet-error-handling-center.js +141 -0
  9. package/dist/error-handling/quiet-error-handling-center.js.map +1 -0
  10. package/dist/error-handling/route-error-hub.js +8 -2
  11. package/dist/error-handling/route-error-hub.js.map +1 -1
  12. package/dist/modules/pipeline/utils/colored-logger.d.ts +2 -0
  13. package/dist/modules/pipeline/utils/colored-logger.js +20 -3
  14. package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
  15. package/dist/providers/auth/antigravity-userinfo-helper.d.ts +10 -0
  16. package/dist/providers/auth/antigravity-userinfo-helper.js +140 -0
  17. package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -0
  18. package/dist/providers/auth/oauth-lifecycle.js +140 -8
  19. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  20. package/dist/providers/auth/token-scanner/index.d.ts +32 -0
  21. package/dist/providers/auth/token-scanner/index.js +86 -0
  22. package/dist/providers/auth/token-scanner/index.js.map +1 -0
  23. package/dist/providers/auth/tokenfile-auth.d.ts +17 -0
  24. package/dist/providers/auth/tokenfile-auth.js +27 -5
  25. package/dist/providers/auth/tokenfile-auth.js.map +1 -1
  26. package/dist/providers/core/api/provider-types.d.ts +10 -0
  27. package/dist/providers/core/config/oauth-flows.d.ts +2 -0
  28. package/dist/providers/core/config/oauth-flows.js.map +1 -1
  29. package/dist/providers/core/config/provider-oauth-configs.js +85 -0
  30. package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
  31. package/dist/providers/core/runtime/base-provider.d.ts +2 -0
  32. package/dist/providers/core/runtime/base-provider.js +135 -15
  33. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  34. package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +8 -3
  35. package/dist/providers/core/runtime/gemini-cli-http-provider.js +262 -64
  36. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  37. package/dist/providers/core/runtime/http-transport-provider.d.ts +25 -0
  38. package/dist/providers/core/runtime/http-transport-provider.js +305 -67
  39. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  40. package/dist/providers/core/runtime/provider-error-classifier.d.ts +2 -2
  41. package/dist/providers/core/runtime/provider-error-classifier.js +14 -4
  42. package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
  43. package/dist/providers/core/runtime/provider-factory.d.ts +1 -0
  44. package/dist/providers/core/runtime/provider-factory.js +37 -8
  45. package/dist/providers/core/runtime/provider-factory.js.map +1 -1
  46. package/dist/providers/core/runtime/responses-provider.d.ts +3 -3
  47. package/dist/providers/core/runtime/responses-provider.js +48 -114
  48. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  49. package/dist/providers/core/strategies/oauth-auth-code-flow.js +11 -3
  50. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  51. package/dist/providers/core/utils/http-client.d.ts +5 -0
  52. package/dist/providers/core/utils/http-client.js +29 -3
  53. package/dist/providers/core/utils/http-client.js.map +1 -1
  54. package/dist/providers/core/utils/provider-error-reporter.js +8 -2
  55. package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
  56. package/dist/providers/core/utils/snapshot-writer.js +5 -1
  57. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  58. package/dist/providers/profile/provider-profile-loader.js +8 -4
  59. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  60. package/dist/runtime/runtime-flags.d.ts +4 -0
  61. package/dist/runtime/runtime-flags.js +32 -0
  62. package/dist/runtime/runtime-flags.js.map +1 -0
  63. package/dist/server/handlers/handler-utils.js +29 -2
  64. package/dist/server/handlers/handler-utils.js.map +1 -1
  65. package/dist/server/handlers/messages-handler.js +27 -26
  66. package/dist/server/handlers/messages-handler.js.map +1 -1
  67. package/dist/server/handlers/responses-handler.js +35 -1
  68. package/dist/server/handlers/responses-handler.js.map +1 -1
  69. package/dist/server/runtime/http-server/index.d.ts +1 -0
  70. package/dist/server/runtime/http-server/index.js +39 -4
  71. package/dist/server/runtime/http-server/index.js.map +1 -1
  72. package/dist/server/runtime/http-server/request-executor.d.ts +4 -0
  73. package/dist/server/runtime/http-server/request-executor.js +99 -4
  74. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  75. package/dist/server/utils/sse-request-parser.d.ts +1 -0
  76. package/dist/server/utils/sse-request-parser.js +17 -6
  77. package/dist/server/utils/sse-request-parser.js.map +1 -1
  78. package/dist/server/utils/warmup-detector.d.ts +7 -0
  79. package/dist/server/utils/warmup-detector.js +125 -0
  80. package/dist/server/utils/warmup-detector.js.map +1 -0
  81. package/dist/server/utils/warmup-storm-tracker.d.ts +9 -0
  82. package/dist/server/utils/warmup-storm-tracker.js +61 -0
  83. package/dist/server/utils/warmup-storm-tracker.js.map +1 -0
  84. package/dist/utils/debug-utils.js +14 -0
  85. package/dist/utils/debug-utils.js.map +1 -1
  86. package/dist/utils/error-handler-registry.js +6 -5
  87. package/dist/utils/error-handler-registry.js.map +1 -1
  88. package/dist/utils/error-handling-utils.js +4 -3
  89. package/dist/utils/error-handling-utils.js.map +1 -1
  90. package/dist/utils/log-helpers.d.ts +6 -0
  91. package/dist/utils/log-helpers.js +90 -0
  92. package/dist/utils/log-helpers.js.map +1 -0
  93. package/dist/utils/logger.d.ts +8 -0
  94. package/dist/utils/logger.js +55 -2
  95. package/dist/utils/logger.js.map +1 -1
  96. package/dist/utils/snapshot-writer.js +2 -6
  97. package/dist/utils/snapshot-writer.js.map +1 -1
  98. package/node_modules/@jsonstudio/llms/dist/conversion/codecs/gemini-openai-codec.js +15 -1
  99. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/auto-thinking.d.ts +6 -0
  100. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/auto-thinking.js +25 -0
  101. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/field-mapping.d.ts +14 -0
  102. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/field-mapping.js +155 -0
  103. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-tool-extraction.d.ts +2 -0
  104. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-tool-extraction.js +264 -0
  105. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwen-transform.d.ts +3 -0
  106. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwen-transform.js +209 -0
  107. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/request-rules.d.ts +24 -0
  108. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/request-rules.js +63 -0
  109. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-blacklist.d.ts +14 -0
  110. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-blacklist.js +85 -0
  111. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-normalize.d.ts +5 -0
  112. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-normalize.js +121 -0
  113. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-validate.d.ts +5 -0
  114. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-validate.js +76 -0
  115. package/{dist/providers/compat/utils/snapshot-writer.d.ts → node_modules/@jsonstudio/llms/dist/conversion/compat/actions/snapshot.d.ts} +2 -2
  116. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/snapshot.js +21 -0
  117. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/tool-schema.d.ts +6 -0
  118. package/{dist/providers/compat/glm/utils/tool-schema-helpers.js → node_modules/@jsonstudio/llms/dist/conversion/compat/actions/tool-schema.js} +6 -1
  119. package/{dist/providers/compat/filters → node_modules/@jsonstudio/llms/dist/conversion/compat/actions}/universal-shape-filter.d.ts +17 -22
  120. package/{dist/providers/compat/filters → node_modules/@jsonstudio/llms/dist/conversion/compat/actions}/universal-shape-filter.js +35 -99
  121. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-glm.json +187 -13
  122. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-iflow.json +177 -9
  123. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-lmstudio.json +10 -2
  124. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwen.json +14 -10
  125. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-engine.d.ts +7 -2
  126. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-engine.js +5 -665
  127. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.d.ts +9 -0
  128. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.js +845 -0
  129. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-types.d.ts +47 -0
  130. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.d.ts +2 -0
  131. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.js +35 -1
  132. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage3_compat/index.js +2 -2
  133. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/target-utils.js +3 -0
  134. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-runtime.js +19 -2
  135. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-host-policy.d.ts +6 -0
  136. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-host-policy.js +14 -0
  137. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge.js +51 -2
  138. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils.js +6 -0
  139. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.d.ts +4 -0
  140. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.js +62 -1
  141. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-response-utils.js +23 -1
  142. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-canonicalizer.d.ts +2 -0
  143. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-filter-pipeline.js +11 -0
  144. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap.js +251 -12
  145. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/classifier.js +11 -4
  146. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.d.ts +21 -0
  147. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.js +76 -0
  148. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.d.ts +11 -0
  149. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.js +187 -28
  150. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/features.js +22 -457
  151. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/health-manager.js +2 -7
  152. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/message-utils.d.ts +7 -0
  153. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/message-utils.js +66 -0
  154. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-registry.js +6 -2
  155. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-estimator.d.ts +2 -0
  156. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-estimator.js +16 -0
  157. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-file-scanner.d.ts +15 -0
  158. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-file-scanner.js +56 -0
  159. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.d.ts +13 -0
  160. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.js +403 -0
  161. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.d.ts +21 -1
  162. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.js +1 -0
  163. package/node_modules/@jsonstudio/llms/package.json +2 -2
  164. package/package.json +11 -10
  165. package/scripts/README.md +26 -12
  166. package/scripts/auth-antigravity-token.mjs +64 -0
  167. package/scripts/auth-gemini-cli-token.mjs +96 -0
  168. package/scripts/auth-iflow-manual.mjs +81 -0
  169. package/scripts/auth-iflow-token-direct.mjs +87 -0
  170. package/scripts/auth-iflow-token.mjs +77 -0
  171. package/scripts/copy-compat-assets.mjs +3 -15
  172. package/scripts/install-verify.mjs +1 -0
  173. package/scripts/replay-codex-sample.mjs +13 -8
  174. package/scripts/tests/chat-pipeline-blackbox.mjs +1 -1
  175. package/scripts/tools/capture-provider-goldens.mjs +8 -7
  176. package/scripts/verify-client-headers.mjs +224 -0
  177. package/dist/providers/compat/base-compatibility.d.ts +0 -27
  178. package/dist/providers/compat/base-compatibility.js +0 -143
  179. package/dist/providers/compat/base-compatibility.js.map +0 -1
  180. package/dist/providers/compat/compat-directory-loader.d.ts +0 -4
  181. package/dist/providers/compat/compat-directory-loader.js +0 -85
  182. package/dist/providers/compat/compat-directory-loader.js.map +0 -1
  183. package/dist/providers/compat/compatibility-adapter.d.ts +0 -18
  184. package/dist/providers/compat/compatibility-adapter.js +0 -104
  185. package/dist/providers/compat/compatibility-adapter.js.map +0 -1
  186. package/dist/providers/compat/compatibility-factory.d.ts +0 -57
  187. package/dist/providers/compat/compatibility-factory.js +0 -155
  188. package/dist/providers/compat/compatibility-factory.js.map +0 -1
  189. package/dist/providers/compat/compatibility-interface.d.ts +0 -35
  190. package/dist/providers/compat/compatibility-interface.js +0 -2
  191. package/dist/providers/compat/compatibility-interface.js.map +0 -1
  192. package/dist/providers/compat/compatibility-manager.d.ts +0 -85
  193. package/dist/providers/compat/compatibility-manager.js +0 -368
  194. package/dist/providers/compat/compatibility-manager.js.map +0 -1
  195. package/dist/providers/compat/config/config-compatibility.d.ts +0 -28
  196. package/dist/providers/compat/config/config-compatibility.js +0 -95
  197. package/dist/providers/compat/config/config-compatibility.js.map +0 -1
  198. package/dist/providers/compat/field-mapping.d.ts +0 -102
  199. package/dist/providers/compat/field-mapping.js +0 -447
  200. package/dist/providers/compat/field-mapping.js.map +0 -1
  201. package/dist/providers/compat/filters/blacklist-sanitizer.d.ts +0 -45
  202. package/dist/providers/compat/filters/blacklist-sanitizer.js +0 -133
  203. package/dist/providers/compat/filters/blacklist-sanitizer.js.map +0 -1
  204. package/dist/providers/compat/filters/response-blacklist-sanitizer.d.ts +0 -28
  205. package/dist/providers/compat/filters/response-blacklist-sanitizer.js +0 -138
  206. package/dist/providers/compat/filters/response-blacklist-sanitizer.js.map +0 -1
  207. package/dist/providers/compat/filters/universal-shape-filter.js.map +0 -1
  208. package/dist/providers/compat/glm/config/blacklist-rules.json +0 -22
  209. package/dist/providers/compat/glm/config/field-mappings.json +0 -92
  210. package/dist/providers/compat/glm/config/response-blacklist.json +0 -7
  211. package/dist/providers/compat/glm/config/shape-filters.json +0 -37
  212. package/dist/providers/compat/glm/field-mapping/field-mapping-processor.d.ts +0 -28
  213. package/dist/providers/compat/glm/field-mapping/field-mapping-processor.js +0 -306
  214. package/dist/providers/compat/glm/field-mapping/field-mapping-processor.js.map +0 -1
  215. package/dist/providers/compat/glm/functions/glm-processor.d.ts +0 -50
  216. package/dist/providers/compat/glm/functions/glm-processor.js +0 -134
  217. package/dist/providers/compat/glm/functions/glm-processor.js.map +0 -1
  218. package/dist/providers/compat/glm/glm-compatibility.d.ts +0 -34
  219. package/dist/providers/compat/glm/glm-compatibility.js +0 -117
  220. package/dist/providers/compat/glm/glm-compatibility.js.map +0 -1
  221. package/dist/providers/compat/glm/hooks/base-hook.d.ts +0 -21
  222. package/dist/providers/compat/glm/hooks/base-hook.js +0 -53
  223. package/dist/providers/compat/glm/hooks/base-hook.js.map +0 -1
  224. package/dist/providers/compat/glm/hooks/glm-request-validation-hook.d.ts +0 -24
  225. package/dist/providers/compat/glm/hooks/glm-request-validation-hook.js +0 -268
  226. package/dist/providers/compat/glm/hooks/glm-request-validation-hook.js.map +0 -1
  227. package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.d.ts +0 -21
  228. package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.js +0 -171
  229. package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.js.map +0 -1
  230. package/dist/providers/compat/glm/hooks/glm-response-validation-hook.d.ts +0 -25
  231. package/dist/providers/compat/glm/hooks/glm-response-validation-hook.js +0 -236
  232. package/dist/providers/compat/glm/hooks/glm-response-validation-hook.js.map +0 -1
  233. package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.d.ts +0 -26
  234. package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.js +0 -186
  235. package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.js.map +0 -1
  236. package/dist/providers/compat/glm/index.d.ts +0 -24
  237. package/dist/providers/compat/glm/index.js +0 -29
  238. package/dist/providers/compat/glm/index.js.map +0 -1
  239. package/dist/providers/compat/glm/utils/tool-schema-helpers.d.ts +0 -3
  240. package/dist/providers/compat/glm/utils/tool-schema-helpers.js.map +0 -1
  241. package/dist/providers/compat/iflow/config/field-mappings.json +0 -92
  242. package/dist/providers/compat/iflow/config/shape-filters.json +0 -37
  243. package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.d.ts +0 -34
  244. package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.js +0 -386
  245. package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.js.map +0 -1
  246. package/dist/providers/compat/iflow/functions/iflow-processor.d.ts +0 -53
  247. package/dist/providers/compat/iflow/functions/iflow-processor.js +0 -215
  248. package/dist/providers/compat/iflow/functions/iflow-processor.js.map +0 -1
  249. package/dist/providers/compat/iflow/hooks/base-hook.d.ts +0 -23
  250. package/dist/providers/compat/iflow/hooks/base-hook.js +0 -59
  251. package/dist/providers/compat/iflow/hooks/base-hook.js.map +0 -1
  252. package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.d.ts +0 -23
  253. package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.js +0 -279
  254. package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.js.map +0 -1
  255. package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.d.ts +0 -20
  256. package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.js +0 -180
  257. package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.js.map +0 -1
  258. package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.d.ts +0 -23
  259. package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.js +0 -232
  260. package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.js.map +0 -1
  261. package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.d.ts +0 -25
  262. package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.js +0 -216
  263. package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.js.map +0 -1
  264. package/dist/providers/compat/iflow/iflow-compatibility.d.ts +0 -24
  265. package/dist/providers/compat/iflow/iflow-compatibility.js +0 -94
  266. package/dist/providers/compat/iflow/iflow-compatibility.js.map +0 -1
  267. package/dist/providers/compat/index.d.ts +0 -59
  268. package/dist/providers/compat/index.js +0 -83
  269. package/dist/providers/compat/index.js.map +0 -1
  270. package/dist/providers/compat/lmstudio-compatibility.d.ts +0 -44
  271. package/dist/providers/compat/lmstudio-compatibility.js +0 -193
  272. package/dist/providers/compat/lmstudio-compatibility.js.map +0 -1
  273. package/dist/providers/compat/passthrough-compatibility.d.ts +0 -29
  274. package/dist/providers/compat/passthrough-compatibility.js +0 -83
  275. package/dist/providers/compat/passthrough-compatibility.js.map +0 -1
  276. package/dist/providers/compat/profiles/chat/glm/index.d.ts +0 -6
  277. package/dist/providers/compat/profiles/chat/glm/index.js +0 -6
  278. package/dist/providers/compat/profiles/chat/glm/index.js.map +0 -1
  279. package/dist/providers/compat/profiles/chat/iflow/index.d.ts +0 -6
  280. package/dist/providers/compat/profiles/chat/iflow/index.js +0 -6
  281. package/dist/providers/compat/profiles/chat/iflow/index.js.map +0 -1
  282. package/dist/providers/compat/profiles/chat/lmstudio/index.d.ts +0 -6
  283. package/dist/providers/compat/profiles/chat/lmstudio/index.js +0 -6
  284. package/dist/providers/compat/profiles/chat/lmstudio/index.js.map +0 -1
  285. package/dist/providers/compat/profiles/chat/qwen/index.d.ts +0 -6
  286. package/dist/providers/compat/profiles/chat/qwen/index.js +0 -6
  287. package/dist/providers/compat/profiles/chat/qwen/index.js.map +0 -1
  288. package/dist/providers/compat/profiles/compat/passthrough/index.d.ts +0 -6
  289. package/dist/providers/compat/profiles/compat/passthrough/index.js +0 -6
  290. package/dist/providers/compat/profiles/compat/passthrough/index.js.map +0 -1
  291. package/dist/providers/compat/profiles/responses/c4m/index.d.ts +0 -6
  292. package/dist/providers/compat/profiles/responses/c4m/index.js +0 -6
  293. package/dist/providers/compat/profiles/responses/c4m/index.js.map +0 -1
  294. package/dist/providers/compat/profiles/responses/default/index.d.ts +0 -6
  295. package/dist/providers/compat/profiles/responses/default/index.js +0 -6
  296. package/dist/providers/compat/profiles/responses/default/index.js.map +0 -1
  297. package/dist/providers/compat/profiles/responses/fai/index.d.ts +0 -6
  298. package/dist/providers/compat/profiles/responses/fai/index.js +0 -6
  299. package/dist/providers/compat/profiles/responses/fai/index.js.map +0 -1
  300. package/dist/providers/compat/profiles/responses/fc/index.d.ts +0 -6
  301. package/dist/providers/compat/profiles/responses/fc/index.js +0 -6
  302. package/dist/providers/compat/profiles/responses/fc/index.js.map +0 -1
  303. package/dist/providers/compat/qwen/index.d.ts +0 -4
  304. package/dist/providers/compat/qwen/index.js +0 -6
  305. package/dist/providers/compat/qwen/index.js.map +0 -1
  306. package/dist/providers/compat/qwen-compatibility.d.ts +0 -52
  307. package/dist/providers/compat/qwen-compatibility.js +0 -330
  308. package/dist/providers/compat/qwen-compatibility.js.map +0 -1
  309. package/dist/providers/compat/register-compat-module.d.ts +0 -8
  310. package/dist/providers/compat/register-compat-module.js +0 -53
  311. package/dist/providers/compat/register-compat-module.js.map +0 -1
  312. package/dist/providers/compat/responses/c4m-responses-compatibility.d.ts +0 -27
  313. package/dist/providers/compat/responses/c4m-responses-compatibility.js +0 -197
  314. package/dist/providers/compat/responses/c4m-responses-compatibility.js.map +0 -1
  315. package/dist/providers/compat/standard-compatibility-utils.d.ts +0 -1
  316. package/dist/providers/compat/standard-compatibility-utils.js +0 -77
  317. package/dist/providers/compat/standard-compatibility-utils.js.map +0 -1
  318. package/dist/providers/compat/standard-compatibility.d.ts +0 -31
  319. package/dist/providers/compat/standard-compatibility.js +0 -118
  320. package/dist/providers/compat/standard-compatibility.js.map +0 -1
  321. package/dist/providers/compat/utils/snapshot-writer.js +0 -62
  322. package/dist/providers/compat/utils/snapshot-writer.js.map +0 -1
  323. 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,14 @@ 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';
21
24
  import { OpenAIChatProtocolClient } from '../../../client/openai/chat-protocol-client.js';
22
25
  import { HttpRequestExecutor } from './http-request-executor.js';
23
26
  import { extractStatusCodeFromError } from './provider-error-classifier.js';
24
27
  const isRecord = (value) => typeof value === 'object' && value !== null;
25
- const DEFAULT_USER_AGENT = 'RouteCodex/2.0';
28
+ const DEFAULT_USER_AGENT = 'codex_cli_rs/0.73.0 (Mac OS 15.6.1; arm64) iTerm.app/3.6.5';
26
29
  export class HttpTransportProvider extends BaseProvider {
27
30
  type;
28
31
  authProvider = null;
@@ -56,9 +59,9 @@ export class HttpTransportProvider extends BaseProvider {
56
59
  const extensions = this.getConfigExtensions();
57
60
  const auth = providerConfig.auth;
58
61
  const usesTokenFile = this.authProvider instanceof TokenFileAuthProvider;
59
- if (this.normalizeAuthMode(auth.type) === 'oauth' && !usesTokenFile) {
62
+ if (this.normalizeAuthMode(auth.type) === 'oauth') {
60
63
  const oauthAuth = auth;
61
- const oauthProviderId = this.ensureOAuthProviderId(oauthAuth, extensions);
64
+ const oauthProviderId = this.oauthProviderId || this.ensureOAuthProviderId(oauthAuth, extensions);
62
65
  const forceReauthorize = false;
63
66
  const tokenFileHint = oauthAuth.tokenFile ?? '(default)';
64
67
  logOAuthDebug(`[OAuth] [init] provider=${oauthProviderId} type=${auth.type} tokenFile=${tokenFileHint} forceReauth=${forceReauthorize}`);
@@ -73,9 +76,13 @@ export class HttpTransportProvider extends BaseProvider {
73
76
  openBrowser: true,
74
77
  forceReauthorize
75
78
  });
79
+ if (this.oauthProviderId === 'antigravity') {
80
+ await this.ensureAntigravityProjectMetadata(oauthAuth);
81
+ }
76
82
  logOAuthDebug('[OAuth] [init] ensureValid OK');
77
83
  try {
78
84
  if (this.authProvider instanceof TokenFileAuthProvider) {
85
+ // 令牌文件可能在 ensureValidOAuthToken 中被创建/更新,重新加载一次
79
86
  await this.authProvider.initialize();
80
87
  }
81
88
  else {
@@ -94,17 +101,11 @@ export class HttpTransportProvider extends BaseProvider {
94
101
  const msg = err?.message ? String(err.message) : String(error);
95
102
  console.error(`[OAuth] [init] ensureValid ERROR: ${msg}`);
96
103
  this.dependencies.logger?.logModule?.(this.id, 'oauth-init-error', {
97
- providerType: this.providerType,
104
+ providerType: oauthProviderId,
98
105
  error: msg
99
106
  });
100
107
  throw error;
101
108
  }
102
- try {
103
- this.authProvider.getOAuthClient?.()?.loadToken?.();
104
- }
105
- catch {
106
- // ignore
107
- }
108
109
  }
109
110
  else {
110
111
  try {
@@ -238,18 +239,15 @@ export class HttpTransportProvider extends BaseProvider {
238
239
  const extensions = this.getConfigExtensions();
239
240
  const authMode = this.normalizeAuthMode(auth.type);
240
241
  this.authMode = authMode;
241
- let providerIdForAuth = authMode === 'oauth'
242
+ const resolvedOAuthProviderId = authMode === 'oauth'
242
243
  ? 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);
244
+ : undefined;
245
+ const serviceProfileKey = this.type === 'gemini-cli-http-provider'
246
+ ? 'gemini-cli'
247
+ : (resolvedOAuthProviderId ?? this.providerType);
248
+ const validation = ServiceProfileValidator.validateServiceProfile(serviceProfileKey, authMode);
251
249
  if (!validation.isValid) {
252
- throw new Error(`Invalid auth configuration for ${providerIdForAuth}: ${validation.errors.join(', ')}`);
250
+ throw new Error(`Invalid auth configuration for ${serviceProfileKey}: ${validation.errors.join(', ')}`);
253
251
  }
254
252
  // 根据认证类型创建对应的认证提供者
255
253
  if (authMode === 'apikey') {
@@ -257,16 +255,20 @@ export class HttpTransportProvider extends BaseProvider {
257
255
  }
258
256
  else if (authMode === 'oauth') {
259
257
  const oauthAuth = auth;
258
+ const oauthProviderId = resolvedOAuthProviderId ?? serviceProfileKey;
259
+ this.oauthProviderId = oauthProviderId;
260
260
  // For providers like Qwen/iflow/Gemini CLI where public OAuth client may not be available,
261
261
  // allow reading tokens produced by external login tools (CLIProxyAPI) via token file.
262
- const useTokenFile = (providerIdForAuth === 'qwen' || providerIdForAuth === 'iflow' || providerIdForAuth === 'gemini-cli') &&
262
+ const useTokenFile = (oauthProviderId === 'qwen' ||
263
+ oauthProviderId === 'iflow' ||
264
+ this.type === 'gemini-cli-http-provider') &&
263
265
  !oauthAuth.clientId &&
264
266
  !oauthAuth.tokenUrl &&
265
267
  !oauthAuth.deviceCodeUrl;
266
268
  if (useTokenFile) {
267
269
  return new TokenFileAuthProvider(oauthAuth);
268
270
  }
269
- return new OAuthAuthProvider(oauthAuth, providerIdForAuth);
271
+ return new OAuthAuthProvider(oauthAuth, oauthProviderId);
270
272
  }
271
273
  else {
272
274
  throw new Error(`Unsupported auth type: ${auth.type}`);
@@ -321,6 +323,19 @@ export class HttpTransportProvider extends BaseProvider {
321
323
  async preprocessRequest(request) {
322
324
  const context = this.createProviderContext();
323
325
  const runtimeMetadata = context.runtimeMetadata;
326
+ const headersFromRequest = this.normalizeClientHeaders(request?.metadata?.clientHeaders);
327
+ const headersFromRuntime = this.normalizeClientHeaders(runtimeMetadata?.metadata && typeof runtimeMetadata.metadata === 'object'
328
+ ? runtimeMetadata.metadata.clientHeaders
329
+ : undefined);
330
+ const effectiveClientHeaders = headersFromRequest ?? headersFromRuntime;
331
+ if (effectiveClientHeaders) {
332
+ if (runtimeMetadata) {
333
+ if (!runtimeMetadata.metadata || typeof runtimeMetadata.metadata !== 'object') {
334
+ runtimeMetadata.metadata = {};
335
+ }
336
+ runtimeMetadata.metadata.clientHeaders = effectiveClientHeaders;
337
+ }
338
+ }
324
339
  const ensureRuntimeMetadata = (payload) => {
325
340
  if (!runtimeMetadata || !payload || typeof payload !== 'object') {
326
341
  return;
@@ -346,20 +361,11 @@ export class HttpTransportProvider extends BaseProvider {
346
361
  ...processedMetadata,
347
362
  ...(entryEndpoint ? { entryEndpoint } : {}),
348
363
  ...(typeof streamFlag === 'boolean' ? { stream: !!streamFlag } : {}),
364
+ ...(effectiveClientHeaders ? { clientHeaders: effectiveClientHeaders } : {}),
349
365
  __origModel: inboundModel
350
366
  };
351
367
  }
352
368
  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 */ }
363
369
  return processedRequest;
364
370
  }
365
371
  async postprocessResponse(response, context) {
@@ -603,6 +609,8 @@ export class HttpTransportProvider extends BaseProvider {
603
609
  const inboundOriginator = typeof inboundMetadata?.clientOriginator === 'string' && inboundMetadata.clientOriginator.trim()
604
610
  ? inboundMetadata.clientOriginator.trim()
605
611
  : undefined;
612
+ const inboundClientHeaders = this.extractClientHeaders(runtimeMetadata);
613
+ const normalizedClientHeaders = this.normalizeCodexClientHeaders(inboundClientHeaders);
606
614
  // 服务特定头部
607
615
  const serviceHeaders = this.serviceProfile.headers || {};
608
616
  // 配置覆盖头部
@@ -613,7 +621,7 @@ export class HttpTransportProvider extends BaseProvider {
613
621
  const auth = this.config.config.auth;
614
622
  if (this.normalizeAuthMode(auth.type) === 'oauth') {
615
623
  const oauthAuth = auth;
616
- const oauthProviderId = this.ensureOAuthProviderId(oauthAuth);
624
+ const oauthProviderId = this.oauthProviderId || this.ensureOAuthProviderId(oauthAuth);
617
625
  logOAuthDebug('[OAuth] [headers] ensureValid start (openBrowser=true, forceReauth=false)');
618
626
  try {
619
627
  await ensureValidOAuthToken(oauthProviderId, oauthAuth, {
@@ -658,48 +666,146 @@ export class HttpTransportProvider extends BaseProvider {
658
666
  ...runtimeHeaders,
659
667
  ...authHeaders
660
668
  };
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
- };
669
+ // 保留客户端 Accept;无则默认为 application/json
670
+ const clientAccept = normalizedClientHeaders ? this.findHeaderValue(normalizedClientHeaders, 'Accept') : undefined;
671
+ if (clientAccept) {
672
+ this.assignHeader(finalHeaders, 'Accept', clientAccept);
673
+ }
674
+ else if (!this.findHeaderValue(finalHeaders, 'Accept')) {
675
+ this.assignHeader(finalHeaders, 'Accept', 'application/json');
676
+ }
686
677
  // Header priority:
687
678
  // - user/provider config (overrides/runtime) wins
688
679
  // - otherwise inherit from inbound client headers
689
680
  // - otherwise fall back to defaults
690
- const uaFromConfig = getHeader({ ...overrideHeaders, ...runtimeHeaders }, 'User-Agent');
691
- const uaFromService = getHeader(serviceHeaders, 'User-Agent');
681
+ const uaFromConfig = this.findHeaderValue({ ...overrideHeaders, ...runtimeHeaders }, 'User-Agent');
682
+ const uaFromService = this.findHeaderValue(serviceHeaders, 'User-Agent');
692
683
  const resolvedUa = uaFromConfig ?? inboundUserAgent ?? uaFromService ?? DEFAULT_USER_AGENT;
693
- setHeader(finalHeaders, 'User-Agent', resolvedUa);
684
+ this.assignHeader(finalHeaders, 'User-Agent', resolvedUa);
694
685
  // 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');
686
+ const originatorFromConfig = this.findHeaderValue({ ...overrideHeaders, ...runtimeHeaders }, 'originator');
687
+ const originatorFromService = this.findHeaderValue(serviceHeaders, 'originator');
697
688
  const resolvedOriginator = originatorFromConfig ?? inboundOriginator ?? originatorFromService;
698
689
  if (resolvedOriginator) {
699
- setHeader(finalHeaders, 'originator', resolvedOriginator);
690
+ this.assignHeader(finalHeaders, 'originator', resolvedOriginator);
691
+ }
692
+ if (normalizedClientHeaders) {
693
+ const conversationId = this.findHeaderValue(normalizedClientHeaders, 'conversation_id');
694
+ if (conversationId) {
695
+ this.assignHeader(finalHeaders, 'conversation_id', conversationId);
696
+ }
697
+ const sessionId = this.findHeaderValue(normalizedClientHeaders, 'session_id');
698
+ if (sessionId) {
699
+ this.assignHeader(finalHeaders, 'session_id', sessionId);
700
+ }
701
+ }
702
+ if (this.isCodexUaMode()) {
703
+ this.ensureCodexSessionHeaders(finalHeaders, runtimeMetadata);
700
704
  }
701
705
  return finalHeaders;
702
706
  }
707
+ isCodexUaMode() {
708
+ const raw = process.env.ROUTECODEX_UA_MODE ??
709
+ process.env.RCC_UA_MODE ??
710
+ '';
711
+ const normalized = typeof raw === 'string' ? raw.trim().toLowerCase() : '';
712
+ const runtime = this.getCurrentRuntimeMetadata();
713
+ if (!runtime) {
714
+ return false;
715
+ }
716
+ const providerType = runtime.providerType || this.providerType;
717
+ const entryEndpoint = this.getEntryEndpointFromRuntime(runtime);
718
+ // 显式 UA 模式(--codex / --ua codex):对所有 provider 激活
719
+ if (normalized === 'codex') {
720
+ return true;
721
+ }
722
+ // 隐式模式:未显式设置 UA 时,仅在 responses provider 且入口不是 /v1/responses 时激活
723
+ if (providerType === 'responses' && entryEndpoint) {
724
+ const lowered = entryEndpoint.trim().toLowerCase();
725
+ if (!lowered.includes('/responses')) {
726
+ return true;
727
+ }
728
+ }
729
+ return false;
730
+ }
731
+ normalizeCodexClientHeaders(headers) {
732
+ if (!headers) {
733
+ return undefined;
734
+ }
735
+ if (!this.isCodexUaMode()) {
736
+ return headers;
737
+ }
738
+ const normalizedHeaders = { ...headers };
739
+ this.copyHeaderValue(normalizedHeaders, headers, 'anthropic-session-id', 'session_id');
740
+ this.copyHeaderValue(normalizedHeaders, headers, 'anthropic-conversation-id', 'conversation_id');
741
+ this.copyHeaderValue(normalizedHeaders, headers, 'anthropic-user-agent', 'User-Agent');
742
+ this.copyHeaderValue(normalizedHeaders, headers, 'anthropic-originator', 'originator');
743
+ return normalizedHeaders;
744
+ }
745
+ copyHeaderValue(target, source, from, to) {
746
+ if (this.findHeaderValue(target, to)) {
747
+ return;
748
+ }
749
+ const value = this.findHeaderValue(source, from);
750
+ if (value) {
751
+ target[to] = value;
752
+ }
753
+ }
754
+ findHeaderValue(headers, target) {
755
+ const lowered = target.toLowerCase();
756
+ for (const [key, value] of Object.entries(headers)) {
757
+ if (key.toLowerCase() === lowered && typeof value === 'string' && value.trim()) {
758
+ return value.trim();
759
+ }
760
+ }
761
+ return undefined;
762
+ }
763
+ assignHeader(headers, target, value) {
764
+ if (!value || !value.trim()) {
765
+ return;
766
+ }
767
+ const lowered = target.toLowerCase();
768
+ for (const key of Object.keys(headers)) {
769
+ if (key.toLowerCase() === lowered) {
770
+ headers[key] = value;
771
+ return;
772
+ }
773
+ }
774
+ headers[target] = value;
775
+ }
776
+ ensureCodexSessionHeaders(headers, runtimeMetadata) {
777
+ this.setHeaderIfMissing(headers, 'session_id', this.buildCodexIdentifier('session', runtimeMetadata));
778
+ this.setHeaderIfMissing(headers, 'conversation_id', this.buildCodexIdentifier('conversation', runtimeMetadata));
779
+ }
780
+ setHeaderIfMissing(headers, target, value) {
781
+ if (this.findHeaderValue(headers, target)) {
782
+ return;
783
+ }
784
+ this.assignHeader(headers, target, value);
785
+ }
786
+ buildCodexIdentifier(kind, runtimeMetadata) {
787
+ const fallbackId = runtimeMetadata?.metadata && typeof runtimeMetadata.metadata === 'object'
788
+ ? runtimeMetadata.metadata.clientRequestId
789
+ : undefined;
790
+ const requestId = runtimeMetadata?.requestId ?? fallbackId;
791
+ const routeName = runtimeMetadata?.routeName;
792
+ const suffix = (requestId ?? `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`)
793
+ .toString()
794
+ .replace(/[^A-Za-z0-9_-]/g, '_');
795
+ const parts = ['codex_cli', kind, suffix];
796
+ if (routeName) {
797
+ parts.push(routeName.replace(/[^A-Za-z0-9_-]/g, '_'));
798
+ }
799
+ return this.enforceCodexIdentifierLength(parts.join('_'));
800
+ }
801
+ enforceCodexIdentifierLength(value) {
802
+ if (value.length <= CODEX_IDENTIFIER_MAX_LENGTH) {
803
+ return value;
804
+ }
805
+ const hash = createHash('sha256').update(value).digest('hex').slice(0, 10);
806
+ const keep = Math.max(1, CODEX_IDENTIFIER_MAX_LENGTH - hash.length - 1);
807
+ return `${value.slice(0, keep)}_${hash}`;
808
+ }
703
809
  getEffectiveBaseUrl() {
704
810
  const runtime = this.getRuntimeProfile();
705
811
  const runtimeEndpoint = this.pickRuntimeBaseUrl(runtime);
@@ -745,12 +851,23 @@ export class HttpTransportProvider extends BaseProvider {
745
851
  : {};
746
852
  }
747
853
  getEntryEndpointFromPayload(payload) {
748
- const metadata = payload.metadata;
749
- if (metadata && typeof metadata.entryEndpoint === 'string') {
854
+ const runtimeMeta = extractProviderRuntimeMetadata(payload);
855
+ const metadata = (runtimeMeta && typeof runtimeMeta.metadata === 'object')
856
+ ? runtimeMeta.metadata
857
+ : payload.metadata;
858
+ if (metadata && typeof metadata.entryEndpoint === 'string' && metadata.entryEndpoint.trim()) {
750
859
  return metadata.entryEndpoint;
751
860
  }
752
861
  return undefined;
753
862
  }
863
+ getEntryEndpointFromRuntime(runtime) {
864
+ if (!runtime || !runtime.metadata || typeof runtime.metadata !== 'object') {
865
+ return undefined;
866
+ }
867
+ const meta = runtime.metadata;
868
+ const value = meta.entryEndpoint;
869
+ return typeof value === 'string' && value.trim().length ? value : undefined;
870
+ }
754
871
  asResponseRecord(value) {
755
872
  if (isRecord(value)) {
756
873
  return value;
@@ -856,5 +973,126 @@ export class HttpTransportProvider extends BaseProvider {
856
973
  }
857
974
  return providerId;
858
975
  }
976
+ extractClientHeaders(source) {
977
+ const normalize = (value) => {
978
+ return this.normalizeClientHeaders(value);
979
+ };
980
+ if (!source || typeof source !== 'object') {
981
+ return undefined;
982
+ }
983
+ const candidates = [];
984
+ const metadataNode = source.metadata;
985
+ if (metadataNode && typeof metadataNode === 'object') {
986
+ const headersNode = metadataNode.clientHeaders;
987
+ if (headersNode) {
988
+ candidates.push(headersNode);
989
+ }
990
+ }
991
+ const directNode = source.clientHeaders;
992
+ if (directNode) {
993
+ candidates.push(directNode);
994
+ }
995
+ for (const candidate of candidates) {
996
+ const normalized = normalize(candidate);
997
+ if (normalized) {
998
+ return normalized;
999
+ }
1000
+ }
1001
+ return undefined;
1002
+ }
1003
+ normalizeClientHeaders(value) {
1004
+ if (!value || typeof value !== 'object') {
1005
+ return undefined;
1006
+ }
1007
+ const normalized = {};
1008
+ for (const [key, raw] of Object.entries(value)) {
1009
+ if (typeof raw === 'string' && raw.trim()) {
1010
+ normalized[key] = raw;
1011
+ }
1012
+ }
1013
+ return Object.keys(normalized).length ? normalized : undefined;
1014
+ }
1015
+ async ensureAntigravityProjectMetadata(oauthAuth) {
1016
+ const tokenFile = typeof oauthAuth?.tokenFile === 'string' ? oauthAuth.tokenFile.trim() : '';
1017
+ if (!tokenFile) {
1018
+ return;
1019
+ }
1020
+ const tokenPath = tokenFile.startsWith('~/')
1021
+ ? tokenFile.replace(/^~\//, `${process.env.HOME || ''}/`)
1022
+ : tokenFile;
1023
+ let raw;
1024
+ try {
1025
+ raw = await fs.readFile(tokenPath, 'utf-8');
1026
+ }
1027
+ catch {
1028
+ return;
1029
+ }
1030
+ let parsed;
1031
+ try {
1032
+ parsed = JSON.parse(raw);
1033
+ }
1034
+ catch {
1035
+ return;
1036
+ }
1037
+ if (this.extractProjectIdFromTokenSnapshot(parsed)) {
1038
+ return;
1039
+ }
1040
+ const accessToken = this.extractAccessTokenFromSnapshot(parsed);
1041
+ if (!accessToken) {
1042
+ return;
1043
+ }
1044
+ const baseOverride = oauthAuth.antigravityApiBase;
1045
+ const apiBaseHint = baseOverride || this.getEffectiveBaseUrl();
1046
+ const projectId = await fetchAntigravityProjectId(accessToken, apiBaseHint);
1047
+ if (!projectId) {
1048
+ logOAuthDebug('[OAuth] Antigravity: unable to resolve project_id for token file');
1049
+ return;
1050
+ }
1051
+ parsed.project_id = projectId;
1052
+ parsed.projectId = projectId;
1053
+ const projectsNode = parsed.projects;
1054
+ if (!Array.isArray(projectsNode) || !projectsNode.length) {
1055
+ parsed.projects = [{ projectId }];
1056
+ }
1057
+ await fs.writeFile(tokenPath, JSON.stringify(parsed, null, 2));
1058
+ logOAuthDebug(`[OAuth] Antigravity: persisted project_id=${projectId} for ${tokenPath}`);
1059
+ }
1060
+ extractAccessTokenFromSnapshot(snapshot) {
1061
+ const lower = snapshot.access_token;
1062
+ const upper = snapshot.AccessToken;
1063
+ const value = typeof lower === 'string'
1064
+ ? lower
1065
+ : typeof upper === 'string'
1066
+ ? upper
1067
+ : undefined;
1068
+ if (value && value.trim()) {
1069
+ return value.trim();
1070
+ }
1071
+ return undefined;
1072
+ }
1073
+ extractProjectIdFromTokenSnapshot(snapshot) {
1074
+ const directNode = snapshot.project_id;
1075
+ const direct = typeof directNode === 'string' ? directNode : undefined;
1076
+ if (direct && direct.trim()) {
1077
+ return direct.trim();
1078
+ }
1079
+ const camelNode = snapshot.projectId;
1080
+ const camel = typeof camelNode === 'string' ? camelNode : undefined;
1081
+ if (camel && camel.trim()) {
1082
+ return camel.trim();
1083
+ }
1084
+ if (Array.isArray(snapshot.projects)) {
1085
+ for (const entry of snapshot.projects ?? []) {
1086
+ if (entry && typeof entry === 'object' && typeof entry.projectId === 'string') {
1087
+ const candidate = String(entry.projectId);
1088
+ if (candidate.trim()) {
1089
+ return candidate.trim();
1090
+ }
1091
+ }
1092
+ }
1093
+ }
1094
+ return undefined;
1095
+ }
859
1096
  }
1097
+ const CODEX_IDENTIFIER_MAX_LENGTH = 64;
860
1098
  //# sourceMappingURL=http-transport-provider.js.map