@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.
- package/README.md +18 -15
- package/dist/build-info.js +2 -2
- package/dist/cli.js +32 -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/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/modules/pipeline/utils/colored-logger.d.ts +2 -0
- package/dist/modules/pipeline/utils/colored-logger.js +20 -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/oauth-lifecycle.js +140 -8
- 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 +2 -0
- package/dist/providers/core/config/oauth-flows.js.map +1 -1
- package/dist/providers/core/config/provider-oauth-configs.js +85 -0
- package/dist/providers/core/config/provider-oauth-configs.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 +262 -64
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +25 -0
- package/dist/providers/core/runtime/http-transport-provider.js +305 -67
- 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 +48 -114
- package/dist/providers/core/runtime/responses-provider.js.map +1 -1
- package/dist/providers/core/strategies/oauth-auth-code-flow.js +11 -3
- 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 +29 -3
- 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.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/runtime/http-server/index.d.ts +1 -0
- package/dist/server/runtime/http-server/index.js +39 -4
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.d.ts +4 -0
- package/dist/server/runtime/http-server/request-executor.js +99 -4
- package/dist/server/runtime/http-server/request-executor.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/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/utils/debug-utils.js +14 -0
- package/dist/utils/debug-utils.js.map +1 -1
- package/dist/utils/error-handler-registry.js +6 -5
- 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/dist/conversion/codecs/gemini-openai-codec.js +15 -1
- 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/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/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 +35 -99
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-glm.json +187 -13
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-iflow.json +177 -9
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-lmstudio.json +10 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwen.json +14 -10
- 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 +845 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-types.d.ts +47 -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 +35 -1
- 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 +3 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-runtime.js +19 -2
- 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 +51 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils.js +6 -0
- 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/tool-canonicalizer.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-filter-pipeline.js +11 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap.js +251 -12
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/classifier.js +11 -4
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.d.ts +21 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.js +76 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.d.ts +11 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.js +187 -28
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/features.js +22 -457
- 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 +66 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-registry.js +6 -2
- 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 +21 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.js +1 -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/replay-codex-sample.mjs +13 -8
- package/scripts/tests/chat-pipeline-blackbox.mjs +1 -1
- 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/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 = '
|
|
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'
|
|
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:
|
|
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
|
-
|
|
242
|
+
const resolvedOAuthProviderId = authMode === 'oauth'
|
|
242
243
|
? this.ensureOAuthProviderId(auth, extensions)
|
|
243
|
-
:
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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 ${
|
|
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 = (
|
|
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,
|
|
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
|
-
//
|
|
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
|
-
};
|
|
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 =
|
|
691
|
-
const uaFromService =
|
|
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
|
-
|
|
684
|
+
this.assignHeader(finalHeaders, 'User-Agent', resolvedUa);
|
|
694
685
|
// originator: do not invent one; only forward from config or inbound client
|
|
695
|
-
const originatorFromConfig =
|
|
696
|
-
const originatorFromService =
|
|
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
|
-
|
|
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
|
|
749
|
-
|
|
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
|