@jsonstudio/rcc 0.89.1968 → 0.89.2202
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 +22 -0
- package/config/file-line-limit-policy.json +21 -0
- package/configsamples/config.json +1 -1
- package/configsamples/config.v1.quickstart.sanitized.json +6 -6
- package/configsamples/provider/iflow/config.v1.json +1 -1
- package/dist/app/config-readers.d.ts +18 -0
- package/dist/app/config-readers.js +95 -0
- package/dist/app/config-readers.js.map +1 -0
- package/dist/app/index.d.ts +9 -0
- package/dist/app/index.js +8 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/shutdown.d.ts +32 -0
- package/dist/app/shutdown.js +41 -0
- package/dist/app/shutdown.js.map +1 -0
- package/dist/bootstrap/index.d.ts +7 -0
- package/dist/bootstrap/index.js +7 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/bootstrap/log-filter.d.ts +15 -0
- package/dist/bootstrap/log-filter.js +81 -0
- package/dist/bootstrap/log-filter.js.map +1 -0
- package/dist/build-info.js +2 -2
- package/dist/cli/commands/claude.js +6 -5
- package/dist/cli/commands/claude.js.map +1 -1
- package/dist/cli/commands/init/basic.d.ts +1 -7
- package/dist/cli/commands/init/basic.js +0 -79
- package/dist/cli/commands/init/basic.js.map +1 -1
- package/dist/cli/commands/init/prompt-utils.d.ts +7 -0
- package/dist/cli/commands/init/prompt-utils.js +80 -0
- package/dist/cli/commands/init/prompt-utils.js.map +1 -0
- package/dist/cli/commands/init/workflows.js +2 -1
- package/dist/cli/commands/init/workflows.js.map +1 -1
- package/dist/cli/commands/init.js +74 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/launcher/index.d.ts +7 -0
- package/dist/cli/commands/launcher/index.js +7 -0
- package/dist/cli/commands/launcher/index.js.map +1 -0
- package/dist/cli/commands/launcher/types.d.ts +112 -0
- package/dist/cli/commands/launcher/types.js +7 -0
- package/dist/cli/commands/launcher/types.js.map +1 -0
- package/dist/cli/commands/launcher/utils.d.ts +114 -0
- package/dist/cli/commands/launcher/utils.js +378 -0
- package/dist/cli/commands/launcher/utils.js.map +1 -0
- package/dist/cli/commands/launcher-kernel.d.ts +2 -74
- package/dist/cli/commands/launcher-kernel.js +141 -143
- package/dist/cli/commands/launcher-kernel.js.map +1 -1
- package/dist/cli/commands/start-types.d.ts +67 -0
- package/dist/cli/commands/start-types.js +3 -0
- package/dist/cli/commands/start-types.js.map +1 -0
- package/dist/cli/commands/start-utils.d.ts +19 -0
- package/dist/cli/commands/start-utils.js +78 -0
- package/dist/cli/commands/start-utils.js.map +1 -0
- package/dist/cli/commands/start.d.ts +2 -67
- package/dist/cli/commands/start.js +201 -48
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/stop.js +17 -1
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/commands/tmux-inject.js +1 -1
- package/dist/cli/commands/tmux-inject.js.map +1 -1
- package/dist/cli/config/init-config.js +60 -2
- package/dist/cli/config/init-config.js.map +1 -1
- package/dist/cli/config/init-provider-catalog.js +3 -1
- package/dist/cli/config/init-provider-catalog.js.map +1 -1
- package/dist/cli/config/precommand-default-script.d.ts +17 -0
- package/dist/cli/config/precommand-default-script.js +47 -0
- package/dist/cli/config/precommand-default-script.js.map +1 -0
- package/dist/cli/server/port-utils.js +63 -51
- package/dist/cli/server/port-utils.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js +55 -5
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
- package/dist/commands/oauth.js +28 -4
- package/dist/commands/oauth.js.map +1 -1
- package/dist/commands/quota-daemon.js +12 -0
- package/dist/commands/quota-daemon.js.map +1 -1
- package/dist/configsamples/config.v1.quickstart.sanitized.json +6 -6
- package/dist/constants/index.d.ts +34 -0
- package/dist/constants/index.js +57 -0
- package/dist/constants/index.js.map +1 -1
- package/dist/docs/daemon-admin-ui.html +268 -11
- package/dist/error-handling/quiet-error-handling-center.js +19 -1
- package/dist/error-handling/quiet-error-handling-center.js.map +1 -1
- package/dist/index.js +233 -30
- package/dist/index.js.map +1 -1
- package/dist/manager/index.js +4 -4
- package/dist/manager/index.js.map +1 -1
- package/dist/manager/modules/quota/antigravity-quota-core.d.ts +26 -0
- package/dist/manager/modules/quota/antigravity-quota-core.js +23 -0
- package/dist/manager/modules/quota/antigravity-quota-core.js.map +1 -0
- package/dist/manager/modules/quota/antigravity-quota-helpers.d.ts +16 -0
- package/dist/manager/modules/quota/antigravity-quota-helpers.js +167 -0
- package/dist/manager/modules/quota/antigravity-quota-helpers.js.map +1 -0
- package/dist/manager/modules/quota/antigravity-quota-manager.d.ts +10 -39
- package/dist/manager/modules/quota/antigravity-quota-manager.js +167 -464
- package/dist/manager/modules/quota/antigravity-quota-manager.js.map +1 -1
- package/dist/manager/modules/quota/antigravity-quota-persistence.d.ts +20 -0
- package/dist/manager/modules/quota/antigravity-quota-persistence.js +139 -0
- package/dist/manager/modules/quota/antigravity-quota-persistence.js.map +1 -0
- package/dist/manager/modules/quota/antigravity-quota-runtime.d.ts +55 -0
- package/dist/manager/modules/quota/antigravity-quota-runtime.js +174 -0
- package/dist/manager/modules/quota/antigravity-quota-runtime.js.map +1 -0
- package/dist/manager/modules/quota/antigravity-quota-sync.d.ts +46 -0
- package/dist/manager/modules/quota/antigravity-quota-sync.js +162 -0
- package/dist/manager/modules/quota/antigravity-quota-sync.js.map +1 -0
- package/dist/manager/modules/quota/index.d.ts +1 -0
- package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.d.ts +13 -0
- package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.js +149 -0
- package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.js.map +1 -0
- package/dist/manager/modules/quota/provider-quota-daemon.events.js +1 -148
- package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.js.map +1 -1
- package/dist/manager/modules/quota/quota-adapter.d.ts +111 -0
- package/dist/manager/modules/quota/quota-adapter.js +325 -0
- package/dist/manager/modules/quota/quota-adapter.js.map +1 -0
- package/dist/manager/quota/provider-quota-center.d.ts +10 -0
- package/dist/manager/quota/provider-quota-center.js +15 -2
- package/dist/manager/quota/provider-quota-center.js.map +1 -1
- package/dist/modules/llmswitch/bridge/antigravity-signature.d.ts +28 -0
- package/dist/modules/llmswitch/bridge/antigravity-signature.js +180 -0
- package/dist/modules/llmswitch/bridge/antigravity-signature.js.map +1 -0
- package/dist/modules/llmswitch/bridge/index.d.ts +13 -0
- package/dist/modules/llmswitch/bridge/index.js +14 -0
- package/dist/modules/llmswitch/bridge/index.js.map +1 -0
- package/dist/modules/llmswitch/bridge/module-loader.d.ts +16 -0
- package/dist/modules/llmswitch/bridge/module-loader.js +59 -0
- package/dist/modules/llmswitch/bridge/module-loader.js.map +1 -0
- package/dist/modules/llmswitch/bridge/quota-manager.d.ts +8 -0
- package/dist/modules/llmswitch/bridge/quota-manager.js +37 -0
- package/dist/modules/llmswitch/bridge/quota-manager.js.map +1 -0
- package/dist/modules/llmswitch/bridge/response-converter.d.ts +11 -0
- package/dist/modules/llmswitch/bridge/response-converter.js +68 -0
- package/dist/modules/llmswitch/bridge/response-converter.js.map +1 -0
- package/dist/modules/llmswitch/bridge/routing-integrations.d.ts +12 -0
- package/dist/modules/llmswitch/bridge/routing-integrations.js +56 -0
- package/dist/modules/llmswitch/bridge/routing-integrations.js.map +1 -0
- package/dist/modules/llmswitch/bridge/runtime-integrations.d.ts +34 -0
- package/dist/modules/llmswitch/bridge/runtime-integrations.js +87 -0
- package/dist/modules/llmswitch/bridge/runtime-integrations.js.map +1 -0
- package/dist/modules/llmswitch/bridge/snapshot-recorder.d.ts +13 -0
- package/dist/modules/llmswitch/bridge/snapshot-recorder.js +484 -0
- package/dist/modules/llmswitch/bridge/snapshot-recorder.js.map +1 -0
- package/dist/modules/llmswitch/bridge/state-integrations.d.ts +59 -0
- package/dist/modules/llmswitch/bridge/state-integrations.js +264 -0
- package/dist/modules/llmswitch/bridge/state-integrations.js.map +1 -0
- package/dist/modules/llmswitch/bridge.d.ts +14 -131
- package/dist/modules/llmswitch/bridge.js +14 -834
- package/dist/modules/llmswitch/bridge.js.map +1 -1
- package/dist/modules/pipeline/types/provider-config-types.d.ts +240 -0
- package/dist/modules/pipeline/types/provider-config-types.js +2 -0
- package/dist/modules/pipeline/types/provider-config-types.js.map +1 -0
- package/dist/modules/pipeline/types/provider-types.d.ts +2 -239
- package/dist/modules/pipeline/types/provider-types.js +1 -1
- package/dist/modules/pipeline/types/provider-types.js.map +1 -1
- package/dist/modules/pipeline/utils/debug-logger.js +3 -5
- package/dist/modules/pipeline/utils/debug-logger.js.map +1 -1
- package/dist/providers/auth/apikey-auth.d.ts +57 -1
- package/dist/providers/auth/apikey-auth.js +131 -1
- package/dist/providers/auth/apikey-auth.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle/error-detection.d.ts +8 -0
- package/dist/providers/auth/oauth-lifecycle/error-detection.js +71 -0
- package/dist/providers/auth/oauth-lifecycle/error-detection.js.map +1 -0
- package/dist/providers/auth/oauth-lifecycle/index.d.ts +10 -0
- package/dist/providers/auth/oauth-lifecycle/index.js +11 -0
- package/dist/providers/auth/oauth-lifecycle/index.js.map +1 -0
- package/dist/providers/auth/oauth-lifecycle/path-resolver.d.ts +18 -0
- package/dist/providers/auth/oauth-lifecycle/path-resolver.js +121 -0
- package/dist/providers/auth/oauth-lifecycle/path-resolver.js.map +1 -0
- package/dist/providers/auth/oauth-lifecycle/throttle.d.ts +22 -0
- package/dist/providers/auth/oauth-lifecycle/throttle.js +37 -0
- package/dist/providers/auth/oauth-lifecycle/throttle.js.map +1 -0
- package/dist/providers/auth/oauth-lifecycle/token-helpers.d.ts +36 -0
- package/dist/providers/auth/oauth-lifecycle/token-helpers.js +127 -0
- package/dist/providers/auth/oauth-lifecycle/token-helpers.js.map +1 -0
- package/dist/providers/auth/oauth-lifecycle/token-io.d.ts +14 -0
- package/dist/providers/auth/oauth-lifecycle/token-io.js +151 -0
- package/dist/providers/auth/oauth-lifecycle/token-io.js.map +1 -0
- package/dist/providers/auth/oauth-lifecycle.js +70 -446
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/auth/oauth-repair-cooldown.js +8 -3
- package/dist/providers/auth/oauth-repair-cooldown.js.map +1 -1
- package/dist/providers/auth/oauth-repair-env.js +5 -3
- package/dist/providers/auth/oauth-repair-env.js.map +1 -1
- package/dist/providers/auth/oauth-token-utils.d.ts +61 -0
- package/dist/providers/auth/oauth-token-utils.js +187 -0
- package/dist/providers/auth/oauth-token-utils.js.map +1 -0
- package/dist/providers/auth/oauth-utils/camoufox-helper.d.ts +21 -0
- package/dist/providers/auth/oauth-utils/camoufox-helper.js +82 -0
- package/dist/providers/auth/oauth-utils/camoufox-helper.js.map +1 -0
- package/dist/providers/auth/oauth-utils/error-extraction.d.ts +17 -0
- package/dist/providers/auth/oauth-utils/error-extraction.js +80 -0
- package/dist/providers/auth/oauth-utils/error-extraction.js.map +1 -0
- package/dist/providers/auth/oauth-utils/index.d.ts +7 -0
- package/dist/providers/auth/oauth-utils/index.js +8 -0
- package/dist/providers/auth/oauth-utils/index.js.map +1 -0
- package/dist/providers/auth/token-refresh/index.d.ts +6 -0
- package/dist/providers/auth/token-refresh/index.js +7 -0
- package/dist/providers/auth/token-refresh/index.js.map +1 -0
- package/dist/providers/auth/token-refresh/token-state.d.ts +17 -0
- package/dist/providers/auth/token-refresh/token-state.js +30 -0
- package/dist/providers/auth/token-refresh/token-state.js.map +1 -0
- package/dist/providers/auth/token-storage/index.d.ts +7 -0
- package/dist/providers/auth/token-storage/index.js +8 -0
- package/dist/providers/auth/token-storage/index.js.map +1 -0
- package/dist/providers/auth/token-storage/token-file-resolver.d.ts +12 -0
- package/dist/providers/auth/token-storage/token-file-resolver.js +117 -0
- package/dist/providers/auth/token-storage/token-file-resolver.js.map +1 -0
- package/dist/providers/auth/token-storage/token-persistence.d.ts +22 -0
- package/dist/providers/auth/token-storage/token-persistence.js +86 -0
- package/dist/providers/auth/token-storage/token-persistence.js.map +1 -0
- package/dist/providers/auth/tokenfile-auth.js +12 -9
- package/dist/providers/auth/tokenfile-auth.js.map +1 -1
- package/dist/providers/core/api/provider-config.d.ts +8 -0
- package/dist/providers/core/config/camoufox-launcher.d.ts +1 -0
- package/dist/providers/core/config/camoufox-launcher.js +40 -9
- package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
- package/dist/providers/core/config/oauth-flows.js +7 -2
- package/dist/providers/core/config/oauth-flows.js.map +1 -1
- package/dist/providers/core/config/provider-debug-hooks.d.ts +0 -12
- package/dist/providers/core/config/provider-debug-hooks.js +16 -56
- package/dist/providers/core/config/provider-debug-hooks.js.map +1 -1
- package/dist/providers/core/config/provider-debug-output-utils.d.ts +38 -0
- package/dist/providers/core/config/provider-debug-output-utils.js +46 -0
- package/dist/providers/core/config/provider-debug-output-utils.js.map +1 -0
- package/dist/providers/core/config/provider-oauth-configs.js +13 -9
- package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
- package/dist/providers/core/runtime/antigravity-request-type.d.ts +2 -0
- package/dist/providers/core/runtime/antigravity-request-type.js +126 -0
- package/dist/providers/core/runtime/antigravity-request-type.js.map +1 -0
- package/dist/providers/core/runtime/base-provider-runtime-helpers.d.ts +27 -0
- package/dist/providers/core/runtime/base-provider-runtime-helpers.js +105 -0
- package/dist/providers/core/runtime/base-provider-runtime-helpers.js.map +1 -0
- package/dist/providers/core/runtime/base-provider-series-cooldown.d.ts +19 -0
- package/dist/providers/core/runtime/base-provider-series-cooldown.js +363 -0
- package/dist/providers/core/runtime/base-provider-series-cooldown.js.map +1 -0
- package/dist/providers/core/runtime/base-provider.d.ts +4 -35
- package/dist/providers/core/runtime/base-provider.js +20 -501
- package/dist/providers/core/runtime/base-provider.js.map +1 -1
- package/dist/providers/core/runtime/deepseek-http-provider-helpers.d.ts +32 -0
- package/dist/providers/core/runtime/deepseek-http-provider-helpers.js +301 -0
- package/dist/providers/core/runtime/deepseek-http-provider-helpers.js.map +1 -0
- package/dist/providers/core/runtime/deepseek-http-provider.d.ts +0 -3
- package/dist/providers/core/runtime/deepseek-http-provider.js +5 -127
- package/dist/providers/core/runtime/deepseek-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/deepseek-session-pow-helpers.d.ts +21 -0
- package/dist/providers/core/runtime/deepseek-session-pow-helpers.js +99 -0
- package/dist/providers/core/runtime/deepseek-session-pow-helpers.js.map +1 -0
- package/dist/providers/core/runtime/deepseek-session-pow.js +13 -108
- package/dist/providers/core/runtime/deepseek-session-pow.js.map +1 -1
- package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +0 -15
- package/dist/providers/core/runtime/gemini-cli-http-provider.js +13 -303
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/gemini-cli-response-postprocessor.d.ts +9 -0
- package/dist/providers/core/runtime/gemini-cli-response-postprocessor.js +85 -0
- package/dist/providers/core/runtime/gemini-cli-response-postprocessor.js.map +1 -0
- package/dist/providers/core/runtime/gemini-http-provider.js +2 -2
- package/dist/providers/core/runtime/gemini-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/gemini-sse-normalizer.d.ts +25 -0
- package/dist/providers/core/runtime/gemini-sse-normalizer.js +159 -0
- package/dist/providers/core/runtime/gemini-sse-normalizer.js.map +1 -0
- package/dist/providers/core/runtime/http-request-executor.js +1 -48
- package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +2 -48
- package/dist/providers/core/runtime/http-transport-provider.js +158 -1273
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/runtime/provider-bootstrap-utils.d.ts +20 -0
- package/dist/providers/core/runtime/provider-bootstrap-utils.js +78 -0
- package/dist/providers/core/runtime/provider-bootstrap-utils.js.map +1 -0
- package/dist/providers/core/runtime/provider-factory-helpers.d.ts +19 -0
- package/dist/providers/core/runtime/provider-factory-helpers.js +203 -0
- package/dist/providers/core/runtime/provider-factory-helpers.js.map +1 -0
- package/dist/providers/core/runtime/provider-factory.d.ts +9 -7
- package/dist/providers/core/runtime/provider-factory.js +57 -214
- package/dist/providers/core/runtime/provider-factory.js.map +1 -1
- package/dist/providers/core/runtime/provider-family-profile-utils.d.ts +23 -0
- package/dist/providers/core/runtime/provider-family-profile-utils.js +57 -0
- package/dist/providers/core/runtime/provider-family-profile-utils.js.map +1 -0
- package/dist/providers/core/runtime/provider-http-executor-utils.d.ts +32 -0
- package/dist/providers/core/runtime/provider-http-executor-utils.js +92 -0
- package/dist/providers/core/runtime/provider-http-executor-utils.js.map +1 -0
- package/dist/providers/core/runtime/provider-iflow-business-error-utils.d.ts +15 -0
- package/dist/providers/core/runtime/provider-iflow-business-error-utils.js +49 -0
- package/dist/providers/core/runtime/provider-iflow-business-error-utils.js.map +1 -0
- package/dist/providers/core/runtime/provider-request-executor-deps-factory.d.ts +29 -0
- package/dist/providers/core/runtime/provider-request-executor-deps-factory.js +41 -0
- package/dist/providers/core/runtime/provider-request-executor-deps-factory.js.map +1 -0
- package/dist/providers/core/runtime/provider-request-header-orchestrator.d.ts +30 -0
- package/dist/providers/core/runtime/provider-request-header-orchestrator.js +91 -0
- package/dist/providers/core/runtime/provider-request-header-orchestrator.js.map +1 -0
- package/dist/providers/core/runtime/provider-request-preprocessor.d.ts +5 -0
- package/dist/providers/core/runtime/provider-request-preprocessor.js +39 -0
- package/dist/providers/core/runtime/provider-request-preprocessor.js.map +1 -0
- package/dist/providers/core/runtime/provider-request-shaping-utils.d.ts +37 -0
- package/dist/providers/core/runtime/provider-request-shaping-utils.js +65 -0
- package/dist/providers/core/runtime/provider-request-shaping-utils.js.map +1 -0
- package/dist/providers/core/runtime/provider-response-postprocessor.d.ts +7 -0
- package/dist/providers/core/runtime/provider-response-postprocessor.js +28 -0
- package/dist/providers/core/runtime/provider-response-postprocessor.js.map +1 -0
- package/dist/providers/core/runtime/provider-runtime-utils.d.ts +16 -0
- package/dist/providers/core/runtime/provider-runtime-utils.js +51 -0
- package/dist/providers/core/runtime/provider-runtime-utils.js.map +1 -0
- package/dist/providers/core/runtime/responses-provider-helpers.d.ts +37 -0
- package/dist/providers/core/runtime/responses-provider-helpers.js +212 -0
- package/dist/providers/core/runtime/responses-provider-helpers.js.map +1 -0
- package/dist/providers/core/runtime/responses-provider.d.ts +0 -10
- package/dist/providers/core/runtime/responses-provider.js +14 -224
- package/dist/providers/core/runtime/responses-provider.js.map +1 -1
- package/dist/providers/core/runtime/runtime-endpoint-resolver.d.ts +21 -0
- package/dist/providers/core/runtime/runtime-endpoint-resolver.js +64 -0
- package/dist/providers/core/runtime/runtime-endpoint-resolver.js.map +1 -0
- package/dist/providers/core/runtime/service-profile-resolver.d.ts +29 -0
- package/dist/providers/core/runtime/service-profile-resolver.js +88 -0
- package/dist/providers/core/runtime/service-profile-resolver.js.map +1 -0
- package/dist/providers/core/runtime/transport/auth-mode-utils.d.ts +13 -0
- package/dist/providers/core/runtime/transport/auth-mode-utils.js +43 -0
- package/dist/providers/core/runtime/transport/auth-mode-utils.js.map +1 -0
- package/dist/providers/core/runtime/transport/auth-provider-factory.d.ts +37 -0
- package/dist/providers/core/runtime/transport/auth-provider-factory.js +131 -0
- package/dist/providers/core/runtime/transport/auth-provider-factory.js.map +1 -0
- package/dist/providers/core/runtime/transport/header-utils.d.ts +15 -0
- package/dist/providers/core/runtime/transport/header-utils.js +85 -0
- package/dist/providers/core/runtime/transport/header-utils.js.map +1 -0
- package/dist/providers/core/runtime/transport/iflow-signer.d.ts +12 -0
- package/dist/providers/core/runtime/transport/iflow-signer.js +63 -0
- package/dist/providers/core/runtime/transport/iflow-signer.js.map +1 -0
- package/dist/providers/core/runtime/transport/index.d.ts +15 -0
- package/dist/providers/core/runtime/transport/index.js +16 -0
- package/dist/providers/core/runtime/transport/index.js.map +1 -0
- package/dist/providers/core/runtime/transport/oauth-header-preflight.d.ts +12 -0
- package/dist/providers/core/runtime/transport/oauth-header-preflight.js +56 -0
- package/dist/providers/core/runtime/transport/oauth-header-preflight.js.map +1 -0
- package/dist/providers/core/runtime/transport/oauth-recovery-handler.d.ts +34 -0
- package/dist/providers/core/runtime/transport/oauth-recovery-handler.js +126 -0
- package/dist/providers/core/runtime/transport/oauth-recovery-handler.js.map +1 -0
- package/dist/providers/core/runtime/transport/provider-payload-utils.d.ts +21 -0
- package/dist/providers/core/runtime/transport/provider-payload-utils.js +88 -0
- package/dist/providers/core/runtime/transport/provider-payload-utils.js.map +1 -0
- package/dist/providers/core/runtime/transport/request-header-builder.d.ts +24 -0
- package/dist/providers/core/runtime/transport/request-header-builder.js +90 -0
- package/dist/providers/core/runtime/transport/request-header-builder.js.map +1 -0
- package/dist/providers/core/runtime/transport/runtime-detector.d.ts +22 -0
- package/dist/providers/core/runtime/transport/runtime-detector.js +63 -0
- package/dist/providers/core/runtime/transport/runtime-detector.js.map +1 -0
- package/dist/providers/core/runtime/transport/session-header-utils.d.ts +8 -0
- package/dist/providers/core/runtime/transport/session-header-utils.js +72 -0
- package/dist/providers/core/runtime/transport/session-header-utils.js.map +1 -0
- package/dist/providers/core/runtime/vision-debug-utils.d.ts +2 -0
- package/dist/providers/core/runtime/vision-debug-utils.js +31 -0
- package/dist/providers/core/runtime/vision-debug-utils.js.map +1 -1
- package/dist/providers/core/strategies/oauth-auth-code-flow.d.ts +13 -0
- package/dist/providers/core/strategies/oauth-auth-code-flow.js +272 -55
- package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
- package/dist/providers/core/utils/snapshot-writer-buffer.d.ts +13 -0
- package/dist/providers/core/utils/snapshot-writer-buffer.js +39 -0
- package/dist/providers/core/utils/snapshot-writer-buffer.js.map +1 -0
- package/dist/providers/core/utils/snapshot-writer.js +75 -54
- package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
- package/dist/providers/profile/families/antigravity-profile.js +2 -10
- package/dist/providers/profile/families/antigravity-profile.js.map +1 -1
- package/dist/providers/profile/families/deepseek-profile.d.ts +2 -0
- package/dist/providers/profile/families/deepseek-profile.js +110 -0
- package/dist/providers/profile/families/deepseek-profile.js.map +1 -0
- package/dist/providers/profile/families/iflow-profile.js +89 -10
- package/dist/providers/profile/families/iflow-profile.js.map +1 -1
- package/dist/providers/profile/provider-profile-loader.d.ts +5 -0
- package/dist/providers/profile/provider-profile-loader.js +35 -0
- package/dist/providers/profile/provider-profile-loader.js.map +1 -1
- package/dist/providers/profile/provider-profile.d.ts +16 -1
- package/dist/runtime/runtime-flags.js +1 -1
- package/dist/runtime/runtime-flags.js.map +1 -1
- package/dist/runtime/wasm-runtime/index.d.ts +56 -0
- package/dist/runtime/wasm-runtime/index.js +69 -0
- package/dist/runtime/wasm-runtime/index.js.map +1 -0
- package/dist/scripts/camoufox/launch-auth.mjs +158 -10
- package/dist/server/handlers/handler-response-utils.d.ts +13 -0
- package/dist/server/handlers/handler-response-utils.js +427 -0
- package/dist/server/handlers/handler-response-utils.js.map +1 -0
- package/dist/server/handlers/handler-utils.d.ts +2 -11
- package/dist/server/handlers/handler-utils.js +21 -421
- package/dist/server/handlers/handler-utils.js.map +1 -1
- package/dist/server/runtime/http-server/clock-client-reaper.d.ts +23 -0
- package/dist/server/runtime/http-server/clock-client-reaper.js +159 -0
- package/dist/server/runtime/http-server/clock-client-reaper.js.map +1 -0
- package/dist/server/runtime/http-server/clock-client-registry-utils.d.ts +87 -0
- package/dist/server/runtime/http-server/clock-client-registry-utils.js +276 -0
- package/dist/server/runtime/http-server/clock-client-registry-utils.js.map +1 -0
- package/dist/server/runtime/http-server/clock-client-registry.d.ts +5 -50
- package/dist/server/runtime/http-server/clock-client-registry.js +74 -320
- package/dist/server/runtime/http-server/clock-client-registry.js.map +1 -1
- package/dist/server/runtime/http-server/clock-client-route-utils.d.ts +12 -0
- package/dist/server/runtime/http-server/clock-client-route-utils.js +210 -0
- package/dist/server/runtime/http-server/clock-client-route-utils.js.map +1 -0
- package/dist/server/runtime/http-server/clock-client-routes.js +27 -201
- package/dist/server/runtime/http-server/clock-client-routes.js.map +1 -1
- package/dist/server/runtime/http-server/clock-daemon-log-throttle.d.ts +12 -0
- package/dist/server/runtime/http-server/clock-daemon-log-throttle.js +56 -0
- package/dist/server/runtime/http-server/clock-daemon-log-throttle.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/control-handler.js +143 -14
- package/dist/server/runtime/http-server/daemon-admin/control-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.d.ts +19 -0
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.js +107 -0
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +2 -104
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.d.ts +28 -0
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js +298 -0
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-utils.d.ts +22 -0
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-utils.js +211 -0
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-utils.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +25 -454
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +81 -32
- package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/routecodex-x7e-gate.d.ts +22 -0
- package/dist/server/runtime/http-server/daemon-admin/routecodex-x7e-gate.js +70 -0
- package/dist/server/runtime/http-server/daemon-admin/routecodex-x7e-gate.js.map +1 -0
- package/dist/server/runtime/http-server/executor/antigravity-detector.d.ts +34 -0
- package/dist/server/runtime/http-server/executor/antigravity-detector.js +118 -0
- package/dist/server/runtime/http-server/executor/antigravity-detector.js.map +1 -0
- package/dist/server/runtime/http-server/executor/env-config.d.ts +13 -0
- package/dist/server/runtime/http-server/executor/env-config.js +20 -0
- package/dist/server/runtime/http-server/executor/env-config.js.map +1 -0
- package/dist/server/runtime/http-server/executor/index.d.ts +11 -0
- package/dist/server/runtime/http-server/executor/index.js +18 -0
- package/dist/server/runtime/http-server/executor/index.js.map +1 -0
- package/dist/server/runtime/http-server/executor/provider-request-context.d.ts +20 -0
- package/dist/server/runtime/http-server/executor/provider-request-context.js +38 -0
- package/dist/server/runtime/http-server/executor/provider-request-context.js.map +1 -0
- package/dist/server/runtime/http-server/executor/provider-response-converter.d.ts +23 -0
- package/dist/server/runtime/http-server/executor/provider-response-converter.js +337 -0
- package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -0
- package/dist/server/runtime/http-server/executor/provider-response-utils.d.ts +8 -0
- package/dist/server/runtime/http-server/executor/provider-response-utils.js +93 -0
- package/dist/server/runtime/http-server/executor/provider-response-utils.js.map +1 -0
- package/dist/server/runtime/http-server/executor/provider-runtime-resolver.d.ts +23 -0
- package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js +85 -0
- package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js.map +1 -0
- package/dist/server/runtime/http-server/executor/request-executor-core-utils.d.ts +7 -0
- package/dist/server/runtime/http-server/executor/request-executor-core-utils.js +39 -0
- package/dist/server/runtime/http-server/executor/request-executor-core-utils.js.map +1 -0
- package/dist/server/runtime/http-server/executor/request-retry-helpers.d.ts +16 -0
- package/dist/server/runtime/http-server/executor/request-retry-helpers.js +218 -0
- package/dist/server/runtime/http-server/executor/request-retry-helpers.js.map +1 -0
- package/dist/server/runtime/http-server/executor/retry-engine.d.ts +21 -0
- package/dist/server/runtime/http-server/executor/retry-engine.js +73 -0
- package/dist/server/runtime/http-server/executor/retry-engine.js.map +1 -0
- package/dist/server/runtime/http-server/executor/sse-error-handler.d.ts +14 -0
- package/dist/server/runtime/http-server/executor/sse-error-handler.js +127 -0
- package/dist/server/runtime/http-server/executor/sse-error-handler.js.map +1 -0
- package/dist/server/runtime/http-server/executor/usage-aggregator.d.ts +39 -0
- package/dist/server/runtime/http-server/executor/usage-aggregator.js +177 -0
- package/dist/server/runtime/http-server/executor/usage-aggregator.js.map +1 -0
- package/dist/server/runtime/http-server/executor/usage-logger.d.ts +7 -0
- package/dist/server/runtime/http-server/executor/usage-logger.js +13 -0
- package/dist/server/runtime/http-server/executor/usage-logger.js.map +1 -0
- package/dist/server/runtime/http-server/executor/utils.d.ts +21 -0
- package/dist/server/runtime/http-server/executor/utils.js +62 -0
- package/dist/server/runtime/http-server/executor/utils.js.map +1 -0
- package/dist/server/runtime/http-server/executor-metadata.js +83 -2
- package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
- package/dist/server/runtime/http-server/executor-response.js +17 -9
- package/dist/server/runtime/http-server/executor-response.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-bootstrap.d.ts +31 -0
- package/dist/server/runtime/http-server/http-server-bootstrap.js +367 -0
- package/dist/server/runtime/http-server/http-server-bootstrap.js.map +1 -0
- package/dist/server/runtime/http-server/http-server-clock-daemon.d.ts +5 -0
- package/dist/server/runtime/http-server/http-server-clock-daemon.js +242 -0
- package/dist/server/runtime/http-server/http-server-clock-daemon.js.map +1 -0
- package/dist/server/runtime/http-server/http-server-legacy-pipeline.d.ts +2 -0
- package/dist/server/runtime/http-server/http-server-legacy-pipeline.js +65 -0
- package/dist/server/runtime/http-server/http-server-legacy-pipeline.js.map +1 -0
- package/dist/server/runtime/http-server/http-server-lifecycle.d.ts +27 -0
- package/dist/server/runtime/http-server/http-server-lifecycle.js +285 -0
- package/dist/server/runtime/http-server/http-server-lifecycle.js.map +1 -0
- package/dist/server/runtime/http-server/http-server-runtime-providers.d.ts +10 -0
- package/dist/server/runtime/http-server/http-server-runtime-providers.js +415 -0
- package/dist/server/runtime/http-server/http-server-runtime-providers.js.map +1 -0
- package/dist/server/runtime/http-server/http-server-runtime-setup.d.ts +2 -0
- package/dist/server/runtime/http-server/http-server-runtime-setup.js +93 -0
- package/dist/server/runtime/http-server/http-server-runtime-setup.js.map +1 -0
- package/dist/server/runtime/http-server/index.d.ts +2 -46
- package/dist/server/runtime/http-server/index.js +96 -2615
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.d.ts +8 -21
- package/dist/server/runtime/http-server/request-executor.js +94 -956
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.js +2 -2
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/servertool-admin-state.d.ts +42 -0
- package/dist/server/runtime/http-server/servertool-admin-state.js +210 -0
- package/dist/server/runtime/http-server/servertool-admin-state.js.map +1 -0
- package/dist/server/runtime/http-server/stats-manager-internals.d.ts +96 -0
- package/dist/server/runtime/http-server/stats-manager-internals.js +311 -0
- package/dist/server/runtime/http-server/stats-manager-internals.js.map +1 -0
- package/dist/server/runtime/http-server/stats-manager-table.d.ts +6 -0
- package/dist/server/runtime/http-server/stats-manager-table.js +135 -0
- package/dist/server/runtime/http-server/stats-manager-table.js.map +1 -0
- package/dist/server/runtime/http-server/stats-manager.d.ts +0 -23
- package/dist/server/runtime/http-server/stats-manager.js +95 -483
- package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
- package/dist/server/utils/client-connection-state.js +61 -0
- package/dist/server/utils/client-connection-state.js.map +1 -1
- package/dist/server/utils/request-id-manager.d.ts +6 -0
- package/dist/server/utils/request-id-manager.js +105 -15
- package/dist/server/utils/request-id-manager.js.map +1 -1
- package/dist/server/utils/stage-logger.js +14 -4
- package/dist/server/utils/stage-logger.js.map +1 -1
- package/dist/server-lifecycle/index.d.ts +6 -0
- package/dist/server-lifecycle/index.js +7 -0
- package/dist/server-lifecycle/index.js.map +1 -0
- package/dist/server-lifecycle/port-utils.d.ts +18 -0
- package/dist/server-lifecycle/port-utils.js +204 -0
- package/dist/server-lifecycle/port-utils.js.map +1 -0
- package/dist/sharedmodule/process-snapshot.d.ts +26 -0
- package/dist/sharedmodule/process-snapshot.js +141 -0
- package/dist/sharedmodule/process-snapshot.js.map +1 -0
- package/dist/token-daemon/index.js +10 -3
- package/dist/token-daemon/index.js.map +1 -1
- package/dist/token-daemon/token-daemon.js +9 -11
- package/dist/token-daemon/token-daemon.js.map +1 -1
- package/dist/token-daemon/token-utils.d.ts +1 -1
- package/dist/token-daemon/token-utils.js +19 -3
- package/dist/token-daemon/token-utils.js.map +1 -1
- package/dist/tools/semantic-replay-snapshot-loader.d.ts +4 -0
- package/dist/tools/semantic-replay-snapshot-loader.js +396 -0
- package/dist/tools/semantic-replay-snapshot-loader.js.map +1 -0
- package/dist/tools/semantic-replay.js +2 -393
- package/dist/tools/semantic-replay.js.map +1 -1
- package/dist/utils/daemon-stop-intent.d.ts +17 -0
- package/dist/utils/daemon-stop-intent.js +104 -0
- package/dist/utils/daemon-stop-intent.js.map +1 -0
- package/dist/utils/key-429-tracker.js +6 -5
- package/dist/utils/key-429-tracker.js.map +1 -1
- package/dist/utils/managed-server-pids.js +44 -6
- package/dist/utils/managed-server-pids.js.map +1 -1
- package/dist/utils/pipeline-health-manager.js +7 -6
- package/dist/utils/pipeline-health-manager.js.map +1 -1
- package/dist/utils/process-lifecycle-logger.js +45 -1
- package/dist/utils/process-lifecycle-logger.js.map +1 -1
- package/dist/utils/runtime-exit-forensics.d.ts +2 -2
- package/dist/utils/runtime-exit-forensics.js +10 -5
- package/dist/utils/runtime-exit-forensics.js.map +1 -1
- package/dist/utils/snapshot-writer.js +3 -3
- package/dist/utils/snapshot-writer.js.map +1 -1
- package/docs/QUOTA_MANAGER_V3.md +3 -0
- package/docs/VIRTUAL_ROUTER_PRIORITY_AND_HEALTH.md +114 -0
- package/docs/daemon-admin-ui.html +268 -11
- package/docs/file-line-limit-gate.md +30 -0
- package/docs/refactoring/host-164.3-responsibility-migration.md +62 -0
- package/docs/release-iflow-400-gate.md +58 -0
- package/docs/replay-evidence-iflow-400.txt +33 -0
- package/docs/stop-message-auto.md +4 -3
- package/package.json +4 -3
- package/scripts/auth-iflow-manual.mjs +13 -23
- package/scripts/camoufox/launch-auth.mjs +158 -10
- package/scripts/ci/check-file-line-limit.mjs +149 -0
- package/scripts/copy-compat-assets.mjs +26 -0
- package/scripts/tests/ci-jest.mjs +4 -0
- package/scripts/verify-codex-error-samples.mjs +27 -6
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { CODEX_IDENTIFIER_MAX_LENGTH } from '../../../../constants/index.js';
|
|
3
|
+
import { HeaderUtils } from './header-utils.js';
|
|
4
|
+
import { ProviderPayloadUtils } from './provider-payload-utils.js';
|
|
5
|
+
export class SessionHeaderUtils {
|
|
6
|
+
static normalizeCodexClientHeaders(headers, codexUaMode) {
|
|
7
|
+
if (!headers) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
if (!codexUaMode) {
|
|
11
|
+
return headers;
|
|
12
|
+
}
|
|
13
|
+
const normalizedHeaders = { ...headers };
|
|
14
|
+
HeaderUtils.copyHeaderValue(normalizedHeaders, headers, 'anthropic-session-id', 'session_id');
|
|
15
|
+
HeaderUtils.copyHeaderValue(normalizedHeaders, headers, 'anthropic-conversation-id', 'conversation_id');
|
|
16
|
+
HeaderUtils.copyHeaderValue(normalizedHeaders, headers, 'anthropic-user-agent', 'User-Agent');
|
|
17
|
+
HeaderUtils.copyHeaderValue(normalizedHeaders, headers, 'anthropic-originator', 'originator');
|
|
18
|
+
return normalizedHeaders;
|
|
19
|
+
}
|
|
20
|
+
static ensureCodexSessionHeaders(headers, runtimeMetadata) {
|
|
21
|
+
HeaderUtils.setHeaderIfMissing(headers, 'session_id', SessionHeaderUtils.buildCodexIdentifier('session', runtimeMetadata));
|
|
22
|
+
HeaderUtils.setHeaderIfMissing(headers, 'conversation_id', SessionHeaderUtils.buildCodexIdentifier('conversation', runtimeMetadata));
|
|
23
|
+
}
|
|
24
|
+
static extractClientHeaders(source) {
|
|
25
|
+
if (!source || typeof source !== 'object') {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const candidates = [];
|
|
29
|
+
const metadataNode = source.metadata;
|
|
30
|
+
if (metadataNode && typeof metadataNode === 'object') {
|
|
31
|
+
const headersNode = metadataNode.clientHeaders;
|
|
32
|
+
if (headersNode) {
|
|
33
|
+
candidates.push(headersNode);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const directNode = source.clientHeaders;
|
|
37
|
+
if (directNode) {
|
|
38
|
+
candidates.push(directNode);
|
|
39
|
+
}
|
|
40
|
+
for (const candidate of candidates) {
|
|
41
|
+
const normalized = ProviderPayloadUtils.normalizeClientHeaders(candidate);
|
|
42
|
+
if (normalized) {
|
|
43
|
+
return normalized;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
static buildCodexIdentifier(kind, runtimeMetadata) {
|
|
49
|
+
const fallbackId = runtimeMetadata?.metadata && typeof runtimeMetadata.metadata === 'object'
|
|
50
|
+
? runtimeMetadata.metadata.clientRequestId
|
|
51
|
+
: undefined;
|
|
52
|
+
const requestId = runtimeMetadata?.requestId ?? fallbackId;
|
|
53
|
+
const routeName = runtimeMetadata?.routeName;
|
|
54
|
+
const suffix = (requestId ?? `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`)
|
|
55
|
+
.toString()
|
|
56
|
+
.replace(/[^A-Za-z0-9_-]/g, '_');
|
|
57
|
+
const parts = ['codex_cli', kind, suffix];
|
|
58
|
+
if (routeName) {
|
|
59
|
+
parts.push(routeName.replace(/[^A-Za-z0-9_-]/g, '_'));
|
|
60
|
+
}
|
|
61
|
+
return SessionHeaderUtils.enforceCodexIdentifierLength(parts.join('_'));
|
|
62
|
+
}
|
|
63
|
+
static enforceCodexIdentifierLength(value) {
|
|
64
|
+
if (value.length <= CODEX_IDENTIFIER_MAX_LENGTH) {
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
const hash = createHash('sha256').update(value).digest('hex').slice(0, 10);
|
|
68
|
+
const keep = Math.max(1, CODEX_IDENTIFIER_MAX_LENGTH - hash.length - 1);
|
|
69
|
+
return `${value.slice(0, keep)}_${hash}`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=session-header-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-header-utils.js","sourceRoot":"","sources":["../../../../../src/providers/core/runtime/transport/session-header-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,4 +10,6 @@ export declare function shouldCaptureVisionDebug(source?: UnknownObject, fallbac
|
|
|
10
10
|
};
|
|
11
11
|
export declare function summarizeVisionMessages(source?: UnknownObject): string;
|
|
12
12
|
export declare function buildVisionSnapshotPayload(payload: UnknownObject, extras?: Record<string, unknown>): Record<string, unknown>;
|
|
13
|
+
export declare function logVisionDebugSummary(stage: string, payload: UnknownObject): void;
|
|
14
|
+
export declare function captureVisionDebugPayloadSnapshot(stage: 'provider-preprocess-debug' | 'provider-body-debug', payload: UnknownObject): Promise<void>;
|
|
13
15
|
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { extractProviderRuntimeMetadata } from './provider-runtime-metadata.js';
|
|
2
|
+
import { writeProviderSnapshot } from '../utils/snapshot-writer.js';
|
|
2
3
|
const DEBUG_ENV_KEY = 'ROUTECODEX_VISION_DEBUG';
|
|
3
4
|
const truthyValues = new Set(['1', 'true', 'yes']);
|
|
4
5
|
function visionDebugEnabled() {
|
|
@@ -111,4 +112,34 @@ export function buildVisionSnapshotPayload(payload, extras) {
|
|
|
111
112
|
}
|
|
112
113
|
return snapshot;
|
|
113
114
|
}
|
|
115
|
+
export function logVisionDebugSummary(stage, payload) {
|
|
116
|
+
const debug = shouldCaptureVisionDebug(payload);
|
|
117
|
+
if (!debug.enabled) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const summary = summarizeVisionMessages(payload);
|
|
121
|
+
const label = debug.routeName ?? 'vision';
|
|
122
|
+
console.debug(`[vision-debug][${stage}] route=${label} request=${debug.requestId ?? '-'} ${summary}`);
|
|
123
|
+
}
|
|
124
|
+
export async function captureVisionDebugPayloadSnapshot(stage, payload) {
|
|
125
|
+
const debug = shouldCaptureVisionDebug(payload);
|
|
126
|
+
if (!debug.enabled || !debug.requestId) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const metadataNode = payload.metadata;
|
|
131
|
+
const entryEndpoint = metadataNode && typeof metadataNode === 'object' && typeof metadataNode.entryEndpoint === 'string'
|
|
132
|
+
? metadataNode.entryEndpoint
|
|
133
|
+
: undefined;
|
|
134
|
+
await writeProviderSnapshot({
|
|
135
|
+
phase: stage,
|
|
136
|
+
requestId: debug.requestId,
|
|
137
|
+
data: buildVisionSnapshotPayload(payload),
|
|
138
|
+
entryEndpoint
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// snapshot is best-effort only
|
|
143
|
+
}
|
|
144
|
+
}
|
|
114
145
|
//# sourceMappingURL=vision-debug-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vision-debug-utils.js","sourceRoot":"","sources":["../../../../src/providers/core/runtime/vision-debug-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"vision-debug-utils.js","sourceRoot":"","sources":["../../../../src/providers/core/runtime/vision-debug-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,19 @@ export declare class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
40
40
|
* 处理令牌后激活(如API密钥交换)
|
|
41
41
|
*/
|
|
42
42
|
private handlePostTokenActivation;
|
|
43
|
+
private resolveExpiresInSeconds;
|
|
44
|
+
private readPositiveNumber;
|
|
45
|
+
private readNonEmptyString;
|
|
46
|
+
private normalizeTokenResponse;
|
|
47
|
+
private buildTokenRequestHeaders;
|
|
48
|
+
/**
|
|
49
|
+
* Token endpoint requests keep headers minimal and bypass provider-level common headers,
|
|
50
|
+
* matching iFlow CLI behavior and avoiding compat surprises.
|
|
51
|
+
*/
|
|
52
|
+
private requestTokenEndpoint;
|
|
53
|
+
private isIflowOAuthProvider;
|
|
54
|
+
private fetchIflowUserInfoWithRetry;
|
|
55
|
+
private applyAuthRedirectParams;
|
|
43
56
|
private coerceStoredToken;
|
|
44
57
|
private ensureStoredToken;
|
|
45
58
|
/**
|
|
@@ -67,15 +67,7 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
67
67
|
// 3.2 更新授权URL中的重定向参数(与本地回调服务一致),再打开浏览器
|
|
68
68
|
try {
|
|
69
69
|
const urlObj = new URL(authCodeData.authUrl);
|
|
70
|
-
|
|
71
|
-
if (style === 'web' || style === 'legacy') {
|
|
72
|
-
// iflow web 登录样式:redirect=<redirectUri> & state=<state>
|
|
73
|
-
// 由 URLSearchParams 负责一次性编码,避免双重编码;state 保持独立参数
|
|
74
|
-
urlObj.searchParams.set('redirect', serverResult.redirectUri);
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
urlObj.searchParams.set('redirect_uri', serverResult.redirectUri);
|
|
78
|
-
}
|
|
70
|
+
this.applyAuthRedirectParams(urlObj, authCodeData.flowStyle, serverResult.redirectUri, authCodeData.state);
|
|
79
71
|
authCodeData.authUrl = urlObj.toString();
|
|
80
72
|
authCodeData.redirectUri = serverResult.redirectUri;
|
|
81
73
|
}
|
|
@@ -127,6 +119,9 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
127
119
|
}
|
|
128
120
|
const styleEnv = (process.env.IFLOW_AUTH_STYLE || '').toLowerCase();
|
|
129
121
|
const style = isIflowHost
|
|
122
|
+
// Official iFlow CLI auth URL shape:
|
|
123
|
+
// redirect=<encoded callback>&state=<state>&client_id=...
|
|
124
|
+
// In URLSearchParams this corresponds to "web" style (redirect raw + state top-level).
|
|
130
125
|
? normalizeFlowStyle(styleEnv, 'web')
|
|
131
126
|
: styleEnv === 'legacy'
|
|
132
127
|
? 'legacy'
|
|
@@ -136,12 +131,9 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
136
131
|
const redirectUri = this.config.client.redirectUri;
|
|
137
132
|
authUrl.searchParams.set('loginMethod', 'phone');
|
|
138
133
|
authUrl.searchParams.set('type', 'phone');
|
|
139
|
-
authUrl.searchParams.set('redirect',
|
|
134
|
+
authUrl.searchParams.set('redirect', redirectUri);
|
|
140
135
|
authUrl.searchParams.set('state', state);
|
|
141
136
|
authUrl.searchParams.set('client_id', this.config.client.clientId);
|
|
142
|
-
// 可选:保留 PKCE 参数(服务端可能忽略)
|
|
143
|
-
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
144
|
-
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
145
137
|
}
|
|
146
138
|
else if (style === 'legacy') {
|
|
147
139
|
// 老式 iflow Web 登录参数(state 融合在 redirect),兼容历史
|
|
@@ -150,8 +142,6 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
150
142
|
authUrl.searchParams.set('type', 'phone');
|
|
151
143
|
authUrl.searchParams.set('redirect', `${encodeURIComponent(redirectUri)}&state=${state}`);
|
|
152
144
|
authUrl.searchParams.set('client_id', this.config.client.clientId);
|
|
153
|
-
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
154
|
-
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
155
145
|
}
|
|
156
146
|
else {
|
|
157
147
|
// 标准 OAuth2 授权码样式
|
|
@@ -186,7 +176,8 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
186
176
|
async startCallbackServer(state, codeVerifier) {
|
|
187
177
|
const http = await import('http');
|
|
188
178
|
const url = await import('url');
|
|
189
|
-
//
|
|
179
|
+
// 回调路径固定为 /oauth2callback;监听地址放宽为所有本地地址,
|
|
180
|
+
// 避免 localhost 在 IPv4/IPv6 解析差异时出现连接拒绝。
|
|
190
181
|
const configured = this.config.client.redirectUri;
|
|
191
182
|
let redirectHost = 'localhost';
|
|
192
183
|
let port = 8080;
|
|
@@ -203,12 +194,46 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
203
194
|
}
|
|
204
195
|
}
|
|
205
196
|
catch { /* ignore parsing errors */ }
|
|
197
|
+
const envPortRaw = String(process.env.OAUTH_CALLBACK_PORT || '').trim();
|
|
198
|
+
if (this.isIflowOAuthProvider() && !envPortRaw) {
|
|
199
|
+
// Align with official iFlow CLI: choose ephemeral callback port by default.
|
|
200
|
+
port = 0;
|
|
201
|
+
}
|
|
202
|
+
if (envPortRaw) {
|
|
203
|
+
const parsedEnvPort = Number(envPortRaw);
|
|
204
|
+
if (!Number.isFinite(parsedEnvPort) || parsedEnvPort <= 0 || parsedEnvPort > 65535) {
|
|
205
|
+
throw new Error(`Invalid value for OAUTH_CALLBACK_PORT: "${envPortRaw}"`);
|
|
206
|
+
}
|
|
207
|
+
port = parsedEnvPort;
|
|
208
|
+
}
|
|
206
209
|
let timeoutHandle = null;
|
|
210
|
+
let listeningPort = port;
|
|
211
|
+
let startupSettled = false;
|
|
212
|
+
let resolveStartup = null;
|
|
213
|
+
let rejectStartup = null;
|
|
214
|
+
const startupPromise = new Promise((resolve, reject) => {
|
|
215
|
+
resolveStartup = resolve;
|
|
216
|
+
rejectStartup = reject;
|
|
217
|
+
});
|
|
218
|
+
const settleStartupSuccess = (boundPort) => {
|
|
219
|
+
if (startupSettled) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
startupSettled = true;
|
|
223
|
+
resolveStartup?.(boundPort);
|
|
224
|
+
};
|
|
225
|
+
const settleStartupFailure = (message) => {
|
|
226
|
+
if (startupSettled) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
startupSettled = true;
|
|
230
|
+
rejectStartup?.(new Error(message));
|
|
231
|
+
};
|
|
207
232
|
const callbackPromise = new Promise((resolve, reject) => {
|
|
208
233
|
const server = http.createServer(async (req, res) => {
|
|
209
234
|
try {
|
|
210
235
|
logOAuthDebug(`[OAuth] Callback server received request: ${req.url}`);
|
|
211
|
-
const full = new url.URL(req.url || '/', `http://${redirectHost}:${
|
|
236
|
+
const full = new url.URL(req.url || '/', `http://${redirectHost}:${listeningPort}`);
|
|
212
237
|
const reqPath = full.pathname || '';
|
|
213
238
|
const okPath = reqPath === pathName || /oauth.*callback/i.test(reqPath);
|
|
214
239
|
if (!req.url || !okPath) {
|
|
@@ -289,20 +314,43 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
289
314
|
reject(error instanceof Error ? error : new Error(String(error)));
|
|
290
315
|
}
|
|
291
316
|
});
|
|
292
|
-
|
|
317
|
+
let retriedWithEphemeralPort = false;
|
|
293
318
|
server.on('error', (error) => {
|
|
294
319
|
logOAuthDebug(`[OAuth] Callback server error: ${error.message}`);
|
|
320
|
+
if (error.code === 'EADDRINUSE' && !retriedWithEphemeralPort) {
|
|
321
|
+
retriedWithEphemeralPort = true;
|
|
322
|
+
console.warn(`[OAuth] Callback port ${port} is in use; retrying with an ephemeral local port.`);
|
|
323
|
+
try {
|
|
324
|
+
server.listen(0);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
catch (listenError) {
|
|
328
|
+
const msg = listenError instanceof Error ? listenError.message : String(listenError);
|
|
329
|
+
const startupMsg = `Failed to retry callback server on ephemeral port: ${msg}`;
|
|
330
|
+
settleStartupFailure(startupMsg);
|
|
331
|
+
if (timeoutHandle) {
|
|
332
|
+
clearTimeout(timeoutHandle);
|
|
333
|
+
}
|
|
334
|
+
reject(new Error(startupMsg));
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
295
338
|
console.error('[OAuth] Callback server failed to start or encountered an error:', error.message);
|
|
339
|
+
const startupMsg = `Failed to start callback server: ${error.message}`;
|
|
340
|
+
settleStartupFailure(startupMsg);
|
|
296
341
|
if (timeoutHandle) {
|
|
297
342
|
clearTimeout(timeoutHandle);
|
|
298
343
|
}
|
|
299
|
-
reject(new Error(
|
|
344
|
+
reject(new Error(startupMsg));
|
|
300
345
|
});
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
346
|
+
server.on('listening', () => {
|
|
347
|
+
const addr = server.address();
|
|
348
|
+
if (addr && typeof addr === 'object' && 'port' in addr && typeof addr.port === 'number') {
|
|
349
|
+
listeningPort = addr.port;
|
|
350
|
+
}
|
|
351
|
+
settleStartupSuccess(listeningPort);
|
|
352
|
+
logOAuthDebug(`[OAuth] Callback server listening on 0.0.0.0:${listeningPort}${pathName} (redirect host=${redirectHost})`);
|
|
353
|
+
console.log(`[OAuth] Waiting for OAuth callback at http://${redirectHost}:${listeningPort}${pathName}`);
|
|
306
354
|
console.log(`[OAuth] You have 10 minutes to complete the authentication in your browser`);
|
|
307
355
|
try {
|
|
308
356
|
const envBrowser = String(process.env.ROUTECODEX_OAUTH_BROWSER || '').trim().toLowerCase();
|
|
@@ -327,9 +375,21 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
327
375
|
reject(new Error('OAuth callback timeout after 10 minutes'));
|
|
328
376
|
}, 10 * 60 * 1000);
|
|
329
377
|
});
|
|
378
|
+
// 不指定 host,监听所有地址,避免 localhost 解析到仅 IPv6 或仅 IPv4 时造成连接被拒绝
|
|
379
|
+
try {
|
|
380
|
+
server.listen(port);
|
|
381
|
+
}
|
|
382
|
+
catch (listenError) {
|
|
383
|
+
const msg = listenError instanceof Error ? listenError.message : String(listenError);
|
|
384
|
+
const startupMsg = `Failed to start callback server: ${msg}`;
|
|
385
|
+
settleStartupFailure(startupMsg);
|
|
386
|
+
reject(new Error(startupMsg));
|
|
387
|
+
}
|
|
330
388
|
});
|
|
389
|
+
// Wait for callback server to bind. This also allows EADDRINUSE fallback to settle final port.
|
|
390
|
+
listeningPort = await startupPromise;
|
|
331
391
|
// 更新重定向URI(使用配置中的路径或默认)
|
|
332
|
-
const redirectUri = `http://${redirectHost}:${
|
|
392
|
+
const redirectUri = `http://${redirectHost}:${listeningPort}${pathName}`;
|
|
333
393
|
logOAuthDebug(`[OAuth] Callback redirect URI: ${redirectUri}`);
|
|
334
394
|
return { callbackPromise, redirectUri };
|
|
335
395
|
}
|
|
@@ -343,13 +403,7 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
343
403
|
const serverResult = await this.startCallbackServer(data.state, data.codeVerifier);
|
|
344
404
|
// 更新授权URL中的重定向参数
|
|
345
405
|
const authUrl = new URL(data.authUrl);
|
|
346
|
-
|
|
347
|
-
// 由 URLSearchParams 统一编码,不手动 encodeURIComponent,避免双重编码
|
|
348
|
-
authUrl.searchParams.set('redirect', serverResult.redirectUri);
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
351
|
-
authUrl.searchParams.set('redirect_uri', serverResult.redirectUri);
|
|
352
|
-
}
|
|
406
|
+
this.applyAuthRedirectParams(authUrl, data.flowStyle, serverResult.redirectUri, data.state);
|
|
353
407
|
data.authUrl = authUrl.toString();
|
|
354
408
|
data.redirectUri = serverResult.redirectUri;
|
|
355
409
|
// 等待回调
|
|
@@ -375,21 +429,12 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
375
429
|
if (this.config.client.clientSecret) {
|
|
376
430
|
formData.append('client_secret', this.config.client.clientSecret);
|
|
377
431
|
}
|
|
378
|
-
|
|
379
|
-
const tokenHeaders = { 'Content-Type': 'application/x-www-form-urlencoded' };
|
|
380
|
-
if (this.config.client.clientSecret) {
|
|
381
|
-
const basic = Buffer.from(`${this.config.client.clientId}:${this.config.client.clientSecret}`).toString('base64');
|
|
382
|
-
tokenHeaders['Authorization'] = `Basic ${basic}`;
|
|
383
|
-
}
|
|
384
|
-
const response = await this.makeRequest(this.config.endpoints.tokenUrl, {
|
|
385
|
-
method: 'POST',
|
|
386
|
-
headers: tokenHeaders,
|
|
387
|
-
body: formData
|
|
388
|
-
});
|
|
432
|
+
const response = await this.requestTokenEndpoint(formData);
|
|
389
433
|
if (!response.ok) {
|
|
390
434
|
throw await this.parseErrorResponse(response);
|
|
391
435
|
}
|
|
392
|
-
|
|
436
|
+
const raw = await response.json();
|
|
437
|
+
return this.normalizeTokenResponse(raw);
|
|
393
438
|
}
|
|
394
439
|
/**
|
|
395
440
|
* 生成状态参数
|
|
@@ -405,7 +450,10 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
405
450
|
// 尝试获取API密钥(如果有用户信息端点)
|
|
406
451
|
if (this.config.features?.supportsApiKeyExchange && this.config.endpoints.userInfoUrl && tokenResponse.access_token) {
|
|
407
452
|
try {
|
|
408
|
-
const
|
|
453
|
+
const userInfoUrl = `${this.config.endpoints.userInfoUrl}?accessToken=${encodeURIComponent(tokenResponse.access_token)}`;
|
|
454
|
+
const userInfoResponse = this.isIflowOAuthProvider()
|
|
455
|
+
? await this.fetchIflowUserInfoWithRetry(userInfoUrl)
|
|
456
|
+
: await this.makeRequest(userInfoUrl, { method: 'GET' });
|
|
409
457
|
if (userInfoResponse.ok) {
|
|
410
458
|
const userInfo = await userInfoResponse.json();
|
|
411
459
|
const apiKey = typeof userInfo.apiKey === 'string'
|
|
@@ -433,11 +481,167 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
433
481
|
}
|
|
434
482
|
}
|
|
435
483
|
// 转换为标准格式
|
|
436
|
-
const
|
|
484
|
+
const expiresIn = this.resolveExpiresInSeconds(tokenResponse);
|
|
485
|
+
const expiresAt = Date.now() + (expiresIn * 1000);
|
|
486
|
+
enrichedToken.expires_in = expiresIn;
|
|
437
487
|
enrichedToken.expires_at = expiresAt;
|
|
438
488
|
enrichedToken.expired = new Date(expiresAt).toISOString();
|
|
439
489
|
return enrichedToken;
|
|
440
490
|
}
|
|
491
|
+
resolveExpiresInSeconds(tokenResponse) {
|
|
492
|
+
const parsePositiveNumber = (value) => {
|
|
493
|
+
if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
|
|
494
|
+
return value;
|
|
495
|
+
}
|
|
496
|
+
if (typeof value === 'string') {
|
|
497
|
+
const parsed = Number(value.trim());
|
|
498
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
499
|
+
return parsed;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return null;
|
|
503
|
+
};
|
|
504
|
+
const direct = parsePositiveNumber(tokenResponse.expires_in) ??
|
|
505
|
+
parsePositiveNumber(tokenResponse.expiresIn) ??
|
|
506
|
+
parsePositiveNumber(tokenResponse.expires);
|
|
507
|
+
if (direct !== null) {
|
|
508
|
+
return direct;
|
|
509
|
+
}
|
|
510
|
+
const storedExpiresAt = this.tokenStorage?.expires_at;
|
|
511
|
+
const remainingMs = typeof storedExpiresAt === 'number' && Number.isFinite(storedExpiresAt)
|
|
512
|
+
? storedExpiresAt - Date.now()
|
|
513
|
+
: NaN;
|
|
514
|
+
if (Number.isFinite(remainingMs) && remainingMs > 60_000) {
|
|
515
|
+
return Math.floor(remainingMs / 1000);
|
|
516
|
+
}
|
|
517
|
+
// Fallback: avoid NaN timestamp crashes when provider omits expires_in.
|
|
518
|
+
return 3600;
|
|
519
|
+
}
|
|
520
|
+
readPositiveNumber(value) {
|
|
521
|
+
if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
|
|
522
|
+
return value;
|
|
523
|
+
}
|
|
524
|
+
if (typeof value === 'string') {
|
|
525
|
+
const parsed = Number(value.trim());
|
|
526
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
527
|
+
return parsed;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
return null;
|
|
531
|
+
}
|
|
532
|
+
readNonEmptyString(value) {
|
|
533
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
|
|
534
|
+
}
|
|
535
|
+
normalizeTokenResponse(payload) {
|
|
536
|
+
const root = payload && typeof payload === 'object'
|
|
537
|
+
? payload
|
|
538
|
+
: {};
|
|
539
|
+
const data = root.data && typeof root.data === 'object'
|
|
540
|
+
? root.data
|
|
541
|
+
: root;
|
|
542
|
+
const accessToken = this.readNonEmptyString(data.access_token) ??
|
|
543
|
+
this.readNonEmptyString(data.accessToken) ??
|
|
544
|
+
this.readNonEmptyString(data.token);
|
|
545
|
+
const message = this.readNonEmptyString(root.message) ??
|
|
546
|
+
this.readNonEmptyString(root.msg) ??
|
|
547
|
+
this.readNonEmptyString(root.error_description) ??
|
|
548
|
+
this.readNonEmptyString(root.error?.message);
|
|
549
|
+
const code = this.readNonEmptyString(root.code);
|
|
550
|
+
const markedFailure = root.success === false || (code !== undefined && code !== '' && code !== '0');
|
|
551
|
+
if (!accessToken) {
|
|
552
|
+
if (markedFailure) {
|
|
553
|
+
throw new Error(`OAuth token endpoint rejected request${code ? ` (${code})` : ''}: ${message || 'unknown error'}`);
|
|
554
|
+
}
|
|
555
|
+
throw new Error(`OAuth token endpoint response missing access_token${message ? `: ${message}` : ''}`);
|
|
556
|
+
}
|
|
557
|
+
return {
|
|
558
|
+
access_token: accessToken,
|
|
559
|
+
refresh_token: this.readNonEmptyString(data.refresh_token) ??
|
|
560
|
+
this.readNonEmptyString(data.refreshToken),
|
|
561
|
+
token_type: this.readNonEmptyString(data.token_type) ??
|
|
562
|
+
this.readNonEmptyString(data.tokenType),
|
|
563
|
+
scope: this.readNonEmptyString(data.scope),
|
|
564
|
+
expires_in: this.readPositiveNumber(data.expires_in) ??
|
|
565
|
+
this.readPositiveNumber(data.expiresIn) ??
|
|
566
|
+
this.readPositiveNumber(data.expires) ??
|
|
567
|
+
undefined,
|
|
568
|
+
resource_url: this.readNonEmptyString(data.resource_url) ?? this.readNonEmptyString(data.resourceUrl),
|
|
569
|
+
apiKey: this.readNonEmptyString(data.apiKey) ?? this.readNonEmptyString(data.api_key)
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
buildTokenRequestHeaders() {
|
|
573
|
+
const tokenHeaders = {
|
|
574
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
575
|
+
};
|
|
576
|
+
if (this.config.client.clientSecret) {
|
|
577
|
+
const basic = Buffer.from(`${this.config.client.clientId}:${this.config.client.clientSecret}`).toString('base64');
|
|
578
|
+
tokenHeaders.Authorization = `Basic ${basic}`;
|
|
579
|
+
}
|
|
580
|
+
return tokenHeaders;
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Token endpoint requests keep headers minimal and bypass provider-level common headers,
|
|
584
|
+
* matching iFlow CLI behavior and avoiding compat surprises.
|
|
585
|
+
*/
|
|
586
|
+
async requestTokenEndpoint(formData) {
|
|
587
|
+
return this.httpClient(this.config.endpoints.tokenUrl, {
|
|
588
|
+
method: 'POST',
|
|
589
|
+
headers: this.buildTokenRequestHeaders(),
|
|
590
|
+
body: formData.toString()
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
isIflowOAuthProvider() {
|
|
594
|
+
const authUrl = String(this.config.endpoints.authorizationUrl || '').toLowerCase();
|
|
595
|
+
const tokenUrl = String(this.config.endpoints.tokenUrl || '').toLowerCase();
|
|
596
|
+
const userInfoUrl = String(this.config.endpoints.userInfoUrl || '').toLowerCase();
|
|
597
|
+
return (authUrl.includes('iflow.cn') ||
|
|
598
|
+
tokenUrl.includes('iflow.cn/oauth/token') ||
|
|
599
|
+
userInfoUrl.includes('iflow.cn/api/oauth/getuserinfo'));
|
|
600
|
+
}
|
|
601
|
+
async fetchIflowUserInfoWithRetry(url) {
|
|
602
|
+
const retryDelaysMs = [1000, 2000, 3000];
|
|
603
|
+
let lastError;
|
|
604
|
+
for (let attempt = 0; attempt < retryDelaysMs.length; attempt++) {
|
|
605
|
+
try {
|
|
606
|
+
const response = await this.httpClient(url, { method: 'GET' });
|
|
607
|
+
if (response.ok) {
|
|
608
|
+
return response;
|
|
609
|
+
}
|
|
610
|
+
const shouldRetry = (response.status >= 500 || response.status === 408 || response.status === 429) &&
|
|
611
|
+
attempt < retryDelaysMs.length - 1;
|
|
612
|
+
if (!shouldRetry) {
|
|
613
|
+
return response;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
catch (error) {
|
|
617
|
+
lastError = error;
|
|
618
|
+
if (attempt >= retryDelaysMs.length - 1) {
|
|
619
|
+
break;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelaysMs[attempt]));
|
|
623
|
+
}
|
|
624
|
+
throw lastError instanceof Error ? lastError : new Error('Failed to fetch iFlow user info');
|
|
625
|
+
}
|
|
626
|
+
applyAuthRedirectParams(authUrl, flowStyle, redirectUri, state) {
|
|
627
|
+
if (flowStyle === 'legacy') {
|
|
628
|
+
// Keep parity with official iFlow CLI:
|
|
629
|
+
// redirect=<encodeURIComponent(redirectUri)>&state=<state> (state embedded in redirect).
|
|
630
|
+
authUrl.searchParams.delete('state');
|
|
631
|
+
authUrl.searchParams.delete('redirect_uri');
|
|
632
|
+
authUrl.searchParams.set('redirect', `${encodeURIComponent(redirectUri)}&state=${state}`);
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
635
|
+
if (flowStyle === 'web') {
|
|
636
|
+
authUrl.searchParams.delete('redirect_uri');
|
|
637
|
+
authUrl.searchParams.set('redirect', redirectUri);
|
|
638
|
+
authUrl.searchParams.set('state', state);
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
641
|
+
authUrl.searchParams.delete('redirect');
|
|
642
|
+
authUrl.searchParams.delete('state');
|
|
643
|
+
authUrl.searchParams.set('redirect_uri', redirectUri);
|
|
644
|
+
}
|
|
441
645
|
coerceStoredToken(token) {
|
|
442
646
|
if (!token || typeof token !== 'object') {
|
|
443
647
|
return null;
|
|
@@ -446,7 +650,25 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
446
650
|
const candidate = record.token && typeof record.token === 'object'
|
|
447
651
|
? record.token
|
|
448
652
|
: record;
|
|
449
|
-
if (typeof candidate.access_token
|
|
653
|
+
if (typeof candidate.access_token !== 'string') {
|
|
654
|
+
return null;
|
|
655
|
+
}
|
|
656
|
+
const expiresInRaw = candidate.expires_in ?? candidate.expiresIn ?? candidate.expires;
|
|
657
|
+
if (typeof expiresInRaw === 'number' && Number.isFinite(expiresInRaw) && expiresInRaw > 0) {
|
|
658
|
+
candidate.expires_in = expiresInRaw;
|
|
659
|
+
return candidate;
|
|
660
|
+
}
|
|
661
|
+
if (typeof expiresInRaw === 'string') {
|
|
662
|
+
const parsed = Number(expiresInRaw.trim());
|
|
663
|
+
if (Number.isFinite(parsed) && parsed > 0) {
|
|
664
|
+
candidate.expires_in = parsed;
|
|
665
|
+
return candidate;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
if (typeof candidate.expires_at === 'number' && Number.isFinite(candidate.expires_at)) {
|
|
669
|
+
return candidate;
|
|
670
|
+
}
|
|
671
|
+
if (typeof candidate.expired === 'string' && Number.isFinite(Date.parse(candidate.expired))) {
|
|
450
672
|
return candidate;
|
|
451
673
|
}
|
|
452
674
|
return null;
|
|
@@ -479,17 +701,12 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
|
|
|
479
701
|
if (this.config.client.clientSecret) {
|
|
480
702
|
formData.append('client_secret', this.config.client.clientSecret);
|
|
481
703
|
}
|
|
482
|
-
const response = await this.
|
|
483
|
-
method: 'POST',
|
|
484
|
-
headers: {
|
|
485
|
-
'Content-Type': 'application/x-www-form-urlencoded'
|
|
486
|
-
},
|
|
487
|
-
body: formData
|
|
488
|
-
});
|
|
704
|
+
const response = await this.requestTokenEndpoint(formData);
|
|
489
705
|
if (!response.ok) {
|
|
490
706
|
throw await this.parseErrorResponse(response);
|
|
491
707
|
}
|
|
492
|
-
const
|
|
708
|
+
const raw = await response.json();
|
|
709
|
+
const tokenData = this.normalizeTokenResponse(raw);
|
|
493
710
|
// Google OAuth doesn't always return a new refresh_token during refresh
|
|
494
711
|
// Preserve the original refresh_token if not provided in the new response
|
|
495
712
|
if (!tokenData.refresh_token && refreshToken) {
|