@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.
- package/README.md +18 -15
- package/dist/build-info.js +3 -3
- package/dist/build-info.js.map +1 -1
- package/dist/cli.js +94 -0
- package/dist/cli.js.map +1 -1
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js +28 -5
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
- package/dist/commands/token-daemon.d.ts +2 -0
- package/dist/commands/token-daemon.js +183 -0
- package/dist/commands/token-daemon.js.map +1 -0
- package/dist/error-handling/quiet-error-handling-center.d.ts +9 -0
- package/dist/error-handling/quiet-error-handling-center.js +141 -0
- package/dist/error-handling/quiet-error-handling-center.js.map +1 -0
- package/dist/error-handling/route-error-hub.js +8 -2
- package/dist/error-handling/route-error-hub.js.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/llmswitch/bridge.d.ts +1 -1
- package/dist/modules/llmswitch/bridge.js +3 -2
- package/dist/modules/llmswitch/bridge.js.map +1 -1
- package/dist/modules/pipeline/utils/colored-logger.d.ts +2 -0
- package/dist/modules/pipeline/utils/colored-logger.js +22 -3
- package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
- package/dist/providers/auth/antigravity-userinfo-helper.d.ts +10 -0
- package/dist/providers/auth/antigravity-userinfo-helper.js +140 -0
- package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -0
- package/dist/providers/auth/gemini-cli-userinfo-helper.js +12 -2
- package/dist/providers/auth/gemini-cli-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle.js +395 -24
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/auth/token-scanner/index.d.ts +32 -0
- package/dist/providers/auth/token-scanner/index.js +86 -0
- package/dist/providers/auth/token-scanner/index.js.map +1 -0
- package/dist/providers/auth/tokenfile-auth.d.ts +17 -0
- package/dist/providers/auth/tokenfile-auth.js +27 -5
- package/dist/providers/auth/tokenfile-auth.js.map +1 -1
- package/dist/providers/core/api/provider-types.d.ts +10 -0
- package/dist/providers/core/config/oauth-flows.d.ts +25 -0
- package/dist/providers/core/config/oauth-flows.js +92 -5
- package/dist/providers/core/config/oauth-flows.js.map +1 -1
- package/dist/providers/core/config/provider-oauth-configs.js +93 -2
- package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
- package/dist/providers/core/config/service-profiles.js +18 -10
- package/dist/providers/core/config/service-profiles.js.map +1 -1
- package/dist/providers/core/runtime/base-provider.d.ts +2 -0
- package/dist/providers/core/runtime/base-provider.js +135 -15
- package/dist/providers/core/runtime/base-provider.js.map +1 -1
- package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +8 -3
- package/dist/providers/core/runtime/gemini-cli-http-provider.js +332 -67
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-request-executor.d.ts +1 -0
- package/dist/providers/core/runtime/http-request-executor.js +41 -1
- package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +27 -0
- package/dist/providers/core/runtime/http-transport-provider.js +342 -69
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/runtime/provider-error-classifier.d.ts +2 -2
- package/dist/providers/core/runtime/provider-error-classifier.js +14 -4
- package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
- package/dist/providers/core/runtime/provider-factory.d.ts +1 -0
- package/dist/providers/core/runtime/provider-factory.js +37 -8
- package/dist/providers/core/runtime/provider-factory.js.map +1 -1
- package/dist/providers/core/runtime/responses-provider.d.ts +3 -3
- package/dist/providers/core/runtime/responses-provider.js +56 -117
- package/dist/providers/core/runtime/responses-provider.js.map +1 -1
- package/dist/providers/core/runtime/vision-debug-utils.d.ts +13 -0
- package/dist/providers/core/runtime/vision-debug-utils.js +114 -0
- package/dist/providers/core/runtime/vision-debug-utils.js.map +1 -0
- package/dist/providers/core/strategies/oauth-auth-code-flow.js +82 -25
- package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
- package/dist/providers/core/utils/http-client.d.ts +5 -0
- package/dist/providers/core/utils/http-client.js +31 -4
- package/dist/providers/core/utils/http-client.js.map +1 -1
- package/dist/providers/core/utils/provider-error-reporter.js +8 -2
- package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
- package/dist/providers/core/utils/snapshot-writer.d.ts +1 -1
- package/dist/providers/core/utils/snapshot-writer.js +5 -1
- package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
- package/dist/providers/profile/provider-profile-loader.js +8 -4
- package/dist/providers/profile/provider-profile-loader.js.map +1 -1
- package/dist/runtime/runtime-flags.d.ts +4 -0
- package/dist/runtime/runtime-flags.js +32 -0
- package/dist/runtime/runtime-flags.js.map +1 -0
- package/dist/server/handlers/handler-utils.js +29 -2
- package/dist/server/handlers/handler-utils.js.map +1 -1
- package/dist/server/handlers/messages-handler.js +27 -26
- package/dist/server/handlers/messages-handler.js.map +1 -1
- package/dist/server/handlers/responses-handler.js +35 -1
- package/dist/server/handlers/responses-handler.js.map +1 -1
- package/dist/server/handlers/sse-dispatcher.js +22 -2
- package/dist/server/handlers/sse-dispatcher.js.map +1 -1
- package/dist/server/runtime/http-server/index.d.ts +10 -0
- package/dist/server/runtime/http-server/index.js +551 -148
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.d.ts +14 -0
- package/dist/server/runtime/http-server/request-executor.js +638 -149
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.d.ts +5 -0
- package/dist/server/runtime/http-server/routes.js +69 -0
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/runtime-manager.js +18 -0
- package/dist/server/runtime/http-server/runtime-manager.js.map +1 -1
- package/dist/server/utils/sse-request-parser.d.ts +1 -0
- package/dist/server/utils/sse-request-parser.js +17 -6
- package/dist/server/utils/sse-request-parser.js.map +1 -1
- package/dist/server/utils/utf8-chunk-buffer.d.ts +43 -0
- package/dist/server/utils/utf8-chunk-buffer.js +132 -0
- package/dist/server/utils/utf8-chunk-buffer.js.map +1 -0
- package/dist/server/utils/warmup-detector.d.ts +7 -0
- package/dist/server/utils/warmup-detector.js +125 -0
- package/dist/server/utils/warmup-detector.js.map +1 -0
- package/dist/server/utils/warmup-storm-tracker.d.ts +9 -0
- package/dist/server/utils/warmup-storm-tracker.js +61 -0
- package/dist/server/utils/warmup-storm-tracker.js.map +1 -0
- package/dist/token-daemon/index.d.ts +7 -0
- package/dist/token-daemon/index.js +242 -0
- package/dist/token-daemon/index.js.map +1 -0
- package/dist/token-daemon/server-utils.d.ts +33 -0
- package/dist/token-daemon/server-utils.js +155 -0
- package/dist/token-daemon/server-utils.js.map +1 -0
- package/dist/token-daemon/token-daemon.d.ts +20 -0
- package/dist/token-daemon/token-daemon.js +144 -0
- package/dist/token-daemon/token-daemon.js.map +1 -0
- package/dist/token-daemon/token-types.d.ts +44 -0
- package/dist/token-daemon/token-types.js +18 -0
- package/dist/token-daemon/token-types.js.map +1 -0
- package/dist/token-daemon/token-utils.d.ts +17 -0
- package/dist/token-daemon/token-utils.js +153 -0
- package/dist/token-daemon/token-utils.js.map +1 -0
- package/dist/tools/semantic-replay.js +7 -6
- package/dist/tools/semantic-replay.js.map +1 -1
- package/dist/utils/debug-utils.js +14 -0
- package/dist/utils/debug-utils.js.map +1 -1
- package/dist/utils/error-handler-registry.d.ts +36 -0
- package/dist/utils/error-handler-registry.js +99 -12
- package/dist/utils/error-handler-registry.js.map +1 -1
- package/dist/utils/error-handling-utils.js +4 -3
- package/dist/utils/error-handling-utils.js.map +1 -1
- package/dist/utils/log-helpers.d.ts +6 -0
- package/dist/utils/log-helpers.js +90 -0
- package/dist/utils/log-helpers.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.js +55 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/snapshot-writer.js +2 -6
- package/dist/utils/snapshot-writer.js.map +1 -1
- package/node_modules/@jsonstudio/llms/README.md +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/codecs/gemini-openai-codec.js +152 -6
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/auto-thinking.d.ts +6 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/auto-thinking.js +25 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/field-mapping.d.ts +14 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/field-mapping.js +155 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/gemini-web-search.d.ts +17 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/gemini-web-search.js +68 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-image-content.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-image-content.js +83 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-tool-extraction.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-tool-extraction.js +264 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-vision-prompt.d.ts +11 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-vision-prompt.js +177 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-web-search.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-web-search.js +63 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwen-transform.d.ts +3 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwen-transform.js +209 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/request-rules.d.ts +24 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/request-rules.js +63 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-blacklist.d.ts +14 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-blacklist.js +85 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-normalize.d.ts +5 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-normalize.js +121 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-validate.d.ts +5 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-validate.js +76 -0
- package/{dist/providers/compat/utils/snapshot-writer.d.ts → node_modules/@jsonstudio/llms/dist/conversion/compat/actions/snapshot.d.ts} +2 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/snapshot.js +21 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/tool-schema.d.ts +6 -0
- package/{dist/providers/compat/glm/utils/tool-schema-helpers.js → node_modules/@jsonstudio/llms/dist/conversion/compat/actions/tool-schema.js} +6 -1
- package/{dist/providers/compat/filters → node_modules/@jsonstudio/llms/dist/conversion/compat/actions}/universal-shape-filter.d.ts +17 -22
- package/{dist/providers/compat/filters → node_modules/@jsonstudio/llms/dist/conversion/compat/actions}/universal-shape-filter.js +46 -99
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-gemini.json +17 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-glm.json +196 -13
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-iflow.json +194 -26
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-lmstudio.json +43 -35
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwen.json +20 -16
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/responses-c4m.json +42 -42
- package/node_modules/@jsonstudio/llms/dist/conversion/config/sample-config.json +1 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-engine.d.ts +7 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-engine.js +5 -665
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.d.ts +9 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.js +869 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-types.d.ts +55 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.js +74 -5
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage3_compat/index.js +2 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/target-utils.js +9 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process.js +213 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.d.ts +34 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.js +84 -24
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-runtime.js +19 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/server-side-tools.d.ts +26 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/server-side-tools.js +383 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/semantic-mappers/gemini-mapper.js +241 -14
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/semantic-mappers/responses-mapper.js +17 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/standardized-bridge.js +14 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/types/standardized.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-host-policy.d.ts +6 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-host-policy.js +14 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge.js +133 -5
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils.js +98 -3
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/bridge-message-utils.js +137 -10
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-output-builder.js +43 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.d.ts +4 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.js +62 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-response-utils.js +23 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/snapshot-utils.js +17 -47
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-canonicalizer.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-filter-pipeline.js +12 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-mapping.js +25 -2
- package/node_modules/@jsonstudio/llms/dist/index.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/index.js +1 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap.js +540 -36
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/classifier.js +12 -11
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.d.ts +19 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.js +64 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.d.ts +26 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.js +450 -54
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/features.js +23 -458
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/health-manager.js +2 -7
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/message-utils.d.ts +7 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/message-utils.js +78 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-registry.js +7 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-counter.js +14 -3
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-estimator.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-estimator.js +16 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-file-scanner.d.ts +15 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-file-scanner.js +56 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.d.ts +13 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.js +403 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.d.ts +86 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.js +3 -1
- package/node_modules/@jsonstudio/llms/dist/servertool/engine.d.ts +27 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/engine.js +60 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/flow-types.d.ts +40 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/flow-types.js +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/vision.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/vision.js +194 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.js +638 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/orchestration-types.d.ts +33 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/orchestration-types.js +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/registry.d.ts +18 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/registry.js +27 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.d.ts +8 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.js +208 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/types.d.ts +88 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/types.js +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/vision-tool.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/vision-tool.js +185 -0
- package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/responses.js +15 -3
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.js +6 -3
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/gemini-sse-to-json-converter.js +27 -1
- package/node_modules/@jsonstudio/llms/dist/sse/types/gemini-types.d.ts +20 -1
- package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.js +1 -1
- package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.d.ts +73 -0
- package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.js +280 -0
- package/node_modules/@jsonstudio/llms/package.json +2 -2
- package/package.json +11 -10
- package/scripts/README.md +26 -12
- package/scripts/auth-antigravity-token.mjs +64 -0
- package/scripts/auth-gemini-cli-token.mjs +96 -0
- package/scripts/auth-iflow-manual.mjs +81 -0
- package/scripts/auth-iflow-token-direct.mjs +87 -0
- package/scripts/auth-iflow-token.mjs +77 -0
- package/scripts/copy-compat-assets.mjs +3 -15
- package/scripts/install-verify.mjs +1 -0
- package/scripts/pack-mode.mjs +2 -1
- package/scripts/publish-rcc.mjs +20 -4
- package/scripts/replay-codex-sample.mjs +13 -8
- package/scripts/tests/chat-pipeline-blackbox.mjs +1 -1
- package/scripts/tests/virtual-router-health.mjs +141 -6
- package/scripts/tools/capture-provider-goldens.mjs +8 -7
- package/scripts/verify-client-headers.mjs +224 -0
- package/dist/providers/compat/base-compatibility.d.ts +0 -27
- package/dist/providers/compat/base-compatibility.js +0 -143
- package/dist/providers/compat/base-compatibility.js.map +0 -1
- package/dist/providers/compat/compat-directory-loader.d.ts +0 -4
- package/dist/providers/compat/compat-directory-loader.js +0 -85
- package/dist/providers/compat/compat-directory-loader.js.map +0 -1
- package/dist/providers/compat/compatibility-adapter.d.ts +0 -18
- package/dist/providers/compat/compatibility-adapter.js +0 -104
- package/dist/providers/compat/compatibility-adapter.js.map +0 -1
- package/dist/providers/compat/compatibility-factory.d.ts +0 -57
- package/dist/providers/compat/compatibility-factory.js +0 -155
- package/dist/providers/compat/compatibility-factory.js.map +0 -1
- package/dist/providers/compat/compatibility-interface.d.ts +0 -35
- package/dist/providers/compat/compatibility-interface.js +0 -2
- package/dist/providers/compat/compatibility-interface.js.map +0 -1
- package/dist/providers/compat/compatibility-manager.d.ts +0 -85
- package/dist/providers/compat/compatibility-manager.js +0 -368
- package/dist/providers/compat/compatibility-manager.js.map +0 -1
- package/dist/providers/compat/config/config-compatibility.d.ts +0 -28
- package/dist/providers/compat/config/config-compatibility.js +0 -95
- package/dist/providers/compat/config/config-compatibility.js.map +0 -1
- package/dist/providers/compat/field-mapping.d.ts +0 -102
- package/dist/providers/compat/field-mapping.js +0 -447
- package/dist/providers/compat/field-mapping.js.map +0 -1
- package/dist/providers/compat/filters/blacklist-sanitizer.d.ts +0 -45
- package/dist/providers/compat/filters/blacklist-sanitizer.js +0 -133
- package/dist/providers/compat/filters/blacklist-sanitizer.js.map +0 -1
- package/dist/providers/compat/filters/response-blacklist-sanitizer.d.ts +0 -28
- package/dist/providers/compat/filters/response-blacklist-sanitizer.js +0 -138
- package/dist/providers/compat/filters/response-blacklist-sanitizer.js.map +0 -1
- package/dist/providers/compat/filters/universal-shape-filter.js.map +0 -1
- package/dist/providers/compat/glm/config/blacklist-rules.json +0 -22
- package/dist/providers/compat/glm/config/field-mappings.json +0 -92
- package/dist/providers/compat/glm/config/response-blacklist.json +0 -7
- package/dist/providers/compat/glm/config/shape-filters.json +0 -37
- package/dist/providers/compat/glm/field-mapping/field-mapping-processor.d.ts +0 -28
- package/dist/providers/compat/glm/field-mapping/field-mapping-processor.js +0 -306
- package/dist/providers/compat/glm/field-mapping/field-mapping-processor.js.map +0 -1
- package/dist/providers/compat/glm/functions/glm-processor.d.ts +0 -50
- package/dist/providers/compat/glm/functions/glm-processor.js +0 -134
- package/dist/providers/compat/glm/functions/glm-processor.js.map +0 -1
- package/dist/providers/compat/glm/glm-compatibility.d.ts +0 -34
- package/dist/providers/compat/glm/glm-compatibility.js +0 -117
- package/dist/providers/compat/glm/glm-compatibility.js.map +0 -1
- package/dist/providers/compat/glm/hooks/base-hook.d.ts +0 -21
- package/dist/providers/compat/glm/hooks/base-hook.js +0 -53
- package/dist/providers/compat/glm/hooks/base-hook.js.map +0 -1
- package/dist/providers/compat/glm/hooks/glm-request-validation-hook.d.ts +0 -24
- package/dist/providers/compat/glm/hooks/glm-request-validation-hook.js +0 -268
- package/dist/providers/compat/glm/hooks/glm-request-validation-hook.js.map +0 -1
- package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.d.ts +0 -21
- package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.js +0 -171
- package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.js.map +0 -1
- package/dist/providers/compat/glm/hooks/glm-response-validation-hook.d.ts +0 -25
- package/dist/providers/compat/glm/hooks/glm-response-validation-hook.js +0 -236
- package/dist/providers/compat/glm/hooks/glm-response-validation-hook.js.map +0 -1
- package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.d.ts +0 -26
- package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.js +0 -186
- package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.js.map +0 -1
- package/dist/providers/compat/glm/index.d.ts +0 -24
- package/dist/providers/compat/glm/index.js +0 -29
- package/dist/providers/compat/glm/index.js.map +0 -1
- package/dist/providers/compat/glm/utils/tool-schema-helpers.d.ts +0 -3
- package/dist/providers/compat/glm/utils/tool-schema-helpers.js.map +0 -1
- package/dist/providers/compat/iflow/config/field-mappings.json +0 -92
- package/dist/providers/compat/iflow/config/shape-filters.json +0 -37
- package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.d.ts +0 -34
- package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.js +0 -386
- package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.js.map +0 -1
- package/dist/providers/compat/iflow/functions/iflow-processor.d.ts +0 -53
- package/dist/providers/compat/iflow/functions/iflow-processor.js +0 -215
- package/dist/providers/compat/iflow/functions/iflow-processor.js.map +0 -1
- package/dist/providers/compat/iflow/hooks/base-hook.d.ts +0 -23
- package/dist/providers/compat/iflow/hooks/base-hook.js +0 -59
- package/dist/providers/compat/iflow/hooks/base-hook.js.map +0 -1
- package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.d.ts +0 -23
- package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.js +0 -279
- package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.js.map +0 -1
- package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.d.ts +0 -20
- package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.js +0 -180
- package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.js.map +0 -1
- package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.d.ts +0 -23
- package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.js +0 -232
- package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.js.map +0 -1
- package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.d.ts +0 -25
- package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.js +0 -216
- package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.js.map +0 -1
- package/dist/providers/compat/iflow/iflow-compatibility.d.ts +0 -24
- package/dist/providers/compat/iflow/iflow-compatibility.js +0 -94
- package/dist/providers/compat/iflow/iflow-compatibility.js.map +0 -1
- package/dist/providers/compat/index.d.ts +0 -59
- package/dist/providers/compat/index.js +0 -83
- package/dist/providers/compat/index.js.map +0 -1
- package/dist/providers/compat/lmstudio-compatibility.d.ts +0 -44
- package/dist/providers/compat/lmstudio-compatibility.js +0 -193
- package/dist/providers/compat/lmstudio-compatibility.js.map +0 -1
- package/dist/providers/compat/passthrough-compatibility.d.ts +0 -29
- package/dist/providers/compat/passthrough-compatibility.js +0 -83
- package/dist/providers/compat/passthrough-compatibility.js.map +0 -1
- package/dist/providers/compat/profiles/chat/glm/index.d.ts +0 -6
- package/dist/providers/compat/profiles/chat/glm/index.js +0 -6
- package/dist/providers/compat/profiles/chat/glm/index.js.map +0 -1
- package/dist/providers/compat/profiles/chat/iflow/index.d.ts +0 -6
- package/dist/providers/compat/profiles/chat/iflow/index.js +0 -6
- package/dist/providers/compat/profiles/chat/iflow/index.js.map +0 -1
- package/dist/providers/compat/profiles/chat/lmstudio/index.d.ts +0 -6
- package/dist/providers/compat/profiles/chat/lmstudio/index.js +0 -6
- package/dist/providers/compat/profiles/chat/lmstudio/index.js.map +0 -1
- package/dist/providers/compat/profiles/chat/qwen/index.d.ts +0 -6
- package/dist/providers/compat/profiles/chat/qwen/index.js +0 -6
- package/dist/providers/compat/profiles/chat/qwen/index.js.map +0 -1
- package/dist/providers/compat/profiles/compat/passthrough/index.d.ts +0 -6
- package/dist/providers/compat/profiles/compat/passthrough/index.js +0 -6
- package/dist/providers/compat/profiles/compat/passthrough/index.js.map +0 -1
- package/dist/providers/compat/profiles/responses/c4m/index.d.ts +0 -6
- package/dist/providers/compat/profiles/responses/c4m/index.js +0 -6
- package/dist/providers/compat/profiles/responses/c4m/index.js.map +0 -1
- package/dist/providers/compat/profiles/responses/default/index.d.ts +0 -6
- package/dist/providers/compat/profiles/responses/default/index.js +0 -6
- package/dist/providers/compat/profiles/responses/default/index.js.map +0 -1
- package/dist/providers/compat/profiles/responses/fai/index.d.ts +0 -6
- package/dist/providers/compat/profiles/responses/fai/index.js +0 -6
- package/dist/providers/compat/profiles/responses/fai/index.js.map +0 -1
- package/dist/providers/compat/profiles/responses/fc/index.d.ts +0 -6
- package/dist/providers/compat/profiles/responses/fc/index.js +0 -6
- package/dist/providers/compat/profiles/responses/fc/index.js.map +0 -1
- package/dist/providers/compat/qwen/index.d.ts +0 -4
- package/dist/providers/compat/qwen/index.js +0 -6
- package/dist/providers/compat/qwen/index.js.map +0 -1
- package/dist/providers/compat/qwen-compatibility.d.ts +0 -52
- package/dist/providers/compat/qwen-compatibility.js +0 -330
- package/dist/providers/compat/qwen-compatibility.js.map +0 -1
- package/dist/providers/compat/register-compat-module.d.ts +0 -8
- package/dist/providers/compat/register-compat-module.js +0 -53
- package/dist/providers/compat/register-compat-module.js.map +0 -1
- package/dist/providers/compat/responses/c4m-responses-compatibility.d.ts +0 -27
- package/dist/providers/compat/responses/c4m-responses-compatibility.js +0 -197
- package/dist/providers/compat/responses/c4m-responses-compatibility.js.map +0 -1
- package/dist/providers/compat/standard-compatibility-utils.d.ts +0 -1
- package/dist/providers/compat/standard-compatibility-utils.js +0 -77
- package/dist/providers/compat/standard-compatibility-utils.js.map +0 -1
- package/dist/providers/compat/standard-compatibility.d.ts +0 -31
- package/dist/providers/compat/standard-compatibility.js +0 -118
- package/dist/providers/compat/standard-compatibility.js.map +0 -1
- package/dist/providers/compat/utils/snapshot-writer.js +0 -62
- package/dist/providers/compat/utils/snapshot-writer.js.map +0 -1
- package/dist/tools/replay-request.d.ts +0 -0
- package/dist/tools/replay-request.js +0 -2
- package/dist/tools/replay-request.js.map +0 -1
- 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 = '
|
|
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'
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
244
|
+
const resolvedOAuthProviderId = authMode === 'oauth'
|
|
242
245
|
? this.ensureOAuthProviderId(auth, extensions)
|
|
243
|
-
:
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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 ${
|
|
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 = (
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
354
|
-
|
|
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
|
-
//
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
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 =
|
|
691
|
-
const uaFromService =
|
|
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
|
-
|
|
719
|
+
this.assignHeader(finalHeaders, 'User-Agent', resolvedUa);
|
|
694
720
|
// originator: do not invent one; only forward from config or inbound client
|
|
695
|
-
const originatorFromConfig =
|
|
696
|
-
const originatorFromService =
|
|
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
|
-
|
|
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
|
|
749
|
-
|
|
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
|