@jsonstudio/rcc 0.90.872 → 0.90.1270
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 +5 -6
- package/configsamples/provider-default/ali-coding-plan/config.v2.json +6 -1
- package/configsamples/provider-default/antigravity/config.v2.json +6 -1
- package/configsamples/provider-default/ark-coding-plan/config.v2.json +7 -2
- package/configsamples/provider-default/crs/config.v2.json +6 -1
- package/configsamples/provider-default/deepseek-web/config.v2.json +6 -1
- package/configsamples/provider-default/gemini/config.v2.json +6 -1
- package/configsamples/provider-default/gemini-cli/config.v2.json +6 -1
- package/configsamples/provider-default/gemini-native/config.v2.json +6 -1
- package/configsamples/provider-default/glm/config.v2.json +7 -2
- package/configsamples/provider-default/glm-anthropic/config.v2.json +6 -1
- package/configsamples/provider-default/kimi/config.v2.json +7 -2
- package/configsamples/provider-default/lmstudio/config.v2.json +6 -1
- package/configsamples/provider-default/lmstudio-proxy/config.v2.json +6 -1
- package/configsamples/provider-default/manifest.json +0 -1
- package/configsamples/provider-default/meituan/config.v2.json +6 -1
- package/configsamples/provider-default/mimo/config.v2.json +7 -2
- package/configsamples/provider-default/modelscope/config.v2.json +7 -2
- package/configsamples/provider-default/my-openai/config.v2.json +6 -1
- package/configsamples/provider-default/nvidia/config.v2.json +7 -2
- package/configsamples/provider-default/opencode-zen-free/config.v2.json +6 -1
- package/configsamples/provider-default/openrouter/config.v2.json +6 -1
- package/configsamples/provider-default/qwen/config.v2.json +11 -1
- package/configsamples/provider-default/tab/config.v2.json +6 -1
- package/configsamples/provider-default/tabglm/config.v2.json +7 -2
- package/dist/build-info.js +2 -2
- package/dist/build-info.js.map +1 -1
- package/dist/cli/commands/camoufox.js +44 -3
- package/dist/cli/commands/camoufox.js.map +1 -1
- package/dist/cli/commands/config.js +2 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/heartbeat.js +82 -27
- package/dist/cli/commands/heartbeat.js.map +1 -1
- package/dist/cli/commands/init.js +1 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/launcher/utils.js +37 -24
- package/dist/cli/commands/launcher/utils.js.map +1 -1
- package/dist/cli/commands/launcher-kernel.js +6 -3
- package/dist/cli/commands/launcher-kernel.js.map +1 -1
- package/dist/cli/commands/restart.js +102 -31
- package/dist/cli/commands/restart.js.map +1 -1
- package/dist/cli/commands/start-types.d.ts +1 -0
- package/dist/cli/commands/start-utils.d.ts +1 -0
- package/dist/cli/commands/start-utils.js +3 -0
- package/dist/cli/commands/start-utils.js.map +1 -1
- package/dist/cli/commands/start.js +217 -51
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.js +48 -9
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/config/bootstrap-provider-templates.js +1 -1
- package/dist/cli/config/bootstrap-provider-templates.js.map +1 -1
- package/dist/cli/config/init-provider-catalog.js +3 -50
- package/dist/cli/config/init-provider-catalog.js.map +1 -1
- package/dist/cli/config/init-v2-builder.js +0 -1
- package/dist/cli/config/init-v2-builder.js.map +1 -1
- package/dist/cli/guardian/client.js +40 -18
- package/dist/cli/guardian/client.js.map +1 -1
- package/dist/cli/server/port-utils.d.ts +5 -0
- package/dist/cli/server/port-utils.js +45 -31
- package/dist/cli/server/port-utils.js.map +1 -1
- package/dist/commands/camoufox-fp.js +1 -1
- package/dist/commands/camoufox-fp.js.map +1 -1
- package/dist/commands/oauth.js +48 -64
- package/dist/commands/oauth.js.map +1 -1
- package/dist/commands/provider-update-maintenance.js +4 -4
- package/dist/commands/provider-update-maintenance.js.map +1 -1
- package/dist/commands/token-daemon.js +38 -10
- package/dist/commands/token-daemon.js.map +1 -1
- package/dist/commands/validate.js +31 -3
- package/dist/commands/validate.js.map +1 -1
- package/dist/config/provider-v2-loader.d.ts +5 -2
- package/dist/config/provider-v2-loader.js +80 -26
- package/dist/config/provider-v2-loader.js.map +1 -1
- package/dist/config/routecodex-config-loader.d.ts +1 -0
- package/dist/config/routecodex-config-loader.js +18 -207
- package/dist/config/routecodex-config-loader.js.map +1 -1
- package/dist/config/virtual-router-builder.d.ts +3 -2
- package/dist/config/virtual-router-builder.js +4 -214
- package/dist/config/virtual-router-builder.js.map +1 -1
- package/dist/constants/index.d.ts +2 -3
- package/dist/constants/index.js +2 -4
- package/dist/constants/index.js.map +1 -1
- package/dist/error-handling/route-error-hub.js +1 -0
- package/dist/error-handling/route-error-hub.js.map +1 -1
- package/dist/index.js +98 -21
- package/dist/index.js.map +1 -1
- package/dist/manager/modules/quota/antigravity-quota-manager.d.ts +1 -1
- package/dist/manager/modules/quota/antigravity-quota-manager.js +21 -12
- package/dist/manager/modules/quota/antigravity-quota-manager.js.map +1 -1
- package/dist/manager/modules/quota/antigravity-quota-runtime.d.ts +1 -1
- package/dist/manager/modules/quota/antigravity-quota-runtime.js +32 -45
- package/dist/manager/modules/quota/antigravity-quota-runtime.js.map +1 -1
- package/dist/manager/modules/quota/provider-key-normalization.js +10 -1
- package/dist/manager/modules/quota/provider-key-normalization.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.d.ts +2 -1
- package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.d.ts +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.js +22 -12
- package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.events.js +69 -33
- package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.js +47 -35
- package/dist/manager/modules/quota/provider-quota-daemon.js.map +1 -1
- package/dist/manager/storage/file-store.js +3 -0
- package/dist/manager/storage/file-store.js.map +1 -1
- package/dist/modules/llmswitch/bridge/antigravity-signature.js +58 -20
- package/dist/modules/llmswitch/bridge/antigravity-signature.js.map +1 -1
- package/dist/modules/llmswitch/bridge/index.d.ts +1 -1
- package/dist/modules/llmswitch/bridge/index.js +1 -1
- package/dist/modules/llmswitch/bridge/index.js.map +1 -1
- package/dist/modules/llmswitch/bridge/runtime-integrations.d.ts +22 -16
- package/dist/modules/llmswitch/bridge/runtime-integrations.js +89 -30
- package/dist/modules/llmswitch/bridge/runtime-integrations.js.map +1 -1
- package/dist/modules/llmswitch/bridge/snapshot-recorder-runtime.js +10 -9
- package/dist/modules/llmswitch/bridge/snapshot-recorder-runtime.js.map +1 -1
- package/dist/modules/llmswitch/bridge/snapshot-recorder.js +3 -0
- package/dist/modules/llmswitch/bridge/snapshot-recorder.js.map +1 -1
- package/dist/modules/llmswitch/bridge/state-integrations.d.ts +1 -0
- package/dist/modules/llmswitch/bridge/state-integrations.js +263 -51
- package/dist/modules/llmswitch/bridge/state-integrations.js.map +1 -1
- package/dist/modules/llmswitch/bridge.d.ts +2 -2
- package/dist/modules/llmswitch/bridge.js +2 -2
- package/dist/modules/llmswitch/bridge.js.map +1 -1
- package/dist/provider-sdk/provider-add-template.d.ts +1 -1
- package/dist/provider-sdk/provider-add-template.js.map +1 -1
- package/dist/provider-sdk/provider-runtime-inference.js +48 -13
- package/dist/provider-sdk/provider-runtime-inference.js.map +1 -1
- package/dist/providers/auth/deepseek-account-token-acquirer.d.ts +24 -0
- package/dist/providers/auth/deepseek-account-token-acquirer.js +42 -13
- package/dist/providers/auth/deepseek-account-token-acquirer.js.map +1 -1
- package/dist/providers/auth/oauth-auth.js +12 -5
- package/dist/providers/auth/oauth-auth.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle/path-resolver.d.ts +0 -1
- package/dist/providers/auth/oauth-lifecycle/path-resolver.js +10 -9
- package/dist/providers/auth/oauth-lifecycle/path-resolver.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle/token-helpers.js +0 -1
- package/dist/providers/auth/oauth-lifecycle/token-helpers.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle/token-io.js +18 -8
- package/dist/providers/auth/oauth-lifecycle/token-io.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle.d.ts +5 -0
- package/dist/providers/auth/oauth-lifecycle.js +370 -353
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/auth/oauth-repair-env.js +0 -26
- package/dist/providers/auth/oauth-repair-env.js.map +1 -1
- package/dist/providers/auth/qwen-userinfo-helper.d.ts +11 -0
- package/dist/providers/auth/qwen-userinfo-helper.js +85 -13
- package/dist/providers/auth/qwen-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/token-refresh/token-state.js +1 -4
- package/dist/providers/auth/token-refresh/token-state.js.map +1 -1
- package/dist/providers/auth/token-scanner/index.d.ts +1 -1
- package/dist/providers/auth/token-scanner/index.js +2 -2
- package/dist/providers/auth/token-storage/token-file-resolver.js +0 -3
- package/dist/providers/auth/token-storage/token-file-resolver.js.map +1 -1
- package/dist/providers/auth/token-storage/token-persistence.js +10 -3
- package/dist/providers/auth/token-storage/token-persistence.js.map +1 -1
- package/dist/providers/auth/tokenfile-auth.d.ts +0 -1
- package/dist/providers/auth/tokenfile-auth.js +23 -30
- package/dist/providers/auth/tokenfile-auth.js.map +1 -1
- package/dist/providers/core/api/provider-config.d.ts +1 -1
- package/dist/providers/core/api/provider-types.d.ts +2 -1
- package/dist/providers/core/config/camoufox-actions.js +23 -15
- package/dist/providers/core/config/camoufox-actions.js.map +1 -1
- package/dist/providers/core/config/camoufox-launcher.js +235 -121
- package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
- package/dist/providers/core/config/oauth-flows.js +23 -1
- package/dist/providers/core/config/oauth-flows.js.map +1 -1
- package/dist/providers/core/config/provider-oauth-configs.js +2 -93
- package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
- package/dist/providers/core/config/service-profiles.d.ts +0 -1
- package/dist/providers/core/config/service-profiles.js +23 -66
- package/dist/providers/core/config/service-profiles.js.map +1 -1
- package/dist/providers/core/runtime/base-provider-runtime-helpers.js +4 -1
- package/dist/providers/core/runtime/base-provider-runtime-helpers.js.map +1 -1
- package/dist/providers/core/runtime/base-provider.js +21 -11
- package/dist/providers/core/runtime/base-provider.js.map +1 -1
- package/dist/providers/core/runtime/deepseek-http-provider-helpers.d.ts +1 -0
- package/dist/providers/core/runtime/deepseek-http-provider-helpers.js +28 -0
- package/dist/providers/core/runtime/deepseek-http-provider-helpers.js.map +1 -1
- package/dist/providers/core/runtime/deepseek-http-provider.d.ts +0 -2
- package/dist/providers/core/runtime/deepseek-http-provider.js +3 -33
- package/dist/providers/core/runtime/deepseek-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-request-executor.d.ts +1 -0
- package/dist/providers/core/runtime/http-request-executor.js +131 -47
- package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +5 -5
- package/dist/providers/core/runtime/http-transport-provider.js +97 -38
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/runtime/openai-responses-sdk-transport.js +2 -1
- package/dist/providers/core/runtime/openai-responses-sdk-transport.js.map +1 -1
- package/dist/providers/core/runtime/provider-error-classifier.js +19 -126
- package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
- package/dist/providers/core/runtime/provider-factory-helpers.d.ts +1 -0
- package/dist/providers/core/runtime/provider-factory-helpers.js +8 -12
- package/dist/providers/core/runtime/provider-factory-helpers.js.map +1 -1
- package/dist/providers/core/runtime/provider-factory.js +2 -9
- package/dist/providers/core/runtime/provider-factory.js.map +1 -1
- package/dist/providers/core/runtime/provider-failure-policy.d.ts +135 -0
- package/dist/providers/core/runtime/provider-failure-policy.js +685 -0
- package/dist/providers/core/runtime/provider-failure-policy.js.map +1 -0
- package/dist/providers/core/runtime/provider-family-profile-utils.d.ts +0 -10
- package/dist/providers/core/runtime/provider-family-profile-utils.js +0 -28
- package/dist/providers/core/runtime/provider-family-profile-utils.js.map +1 -1
- package/dist/providers/core/runtime/provider-http-executor-utils.js +40 -1
- package/dist/providers/core/runtime/provider-http-executor-utils.js.map +1 -1
- package/dist/providers/core/runtime/provider-request-header-orchestrator.d.ts +0 -2
- package/dist/providers/core/runtime/provider-request-header-orchestrator.js +35 -8
- package/dist/providers/core/runtime/provider-request-header-orchestrator.js.map +1 -1
- package/dist/providers/core/runtime/provider-response-postprocessor.js +3 -23
- package/dist/providers/core/runtime/provider-response-postprocessor.js.map +1 -1
- package/dist/providers/core/runtime/provider-runtime-utils.js +4 -1
- package/dist/providers/core/runtime/provider-runtime-utils.js.map +1 -1
- package/dist/providers/core/runtime/provider-startup-tasks.js +18 -2
- package/dist/providers/core/runtime/provider-startup-tasks.js.map +1 -1
- package/dist/providers/core/runtime/responses-provider-helpers.d.ts +1 -0
- package/dist/providers/core/runtime/responses-provider-helpers.js +11 -12
- package/dist/providers/core/runtime/responses-provider-helpers.js.map +1 -1
- package/dist/providers/core/runtime/responses-provider.js +15 -10
- package/dist/providers/core/runtime/responses-provider.js.map +1 -1
- package/dist/providers/core/runtime/standard-tool-text-harvest.js +10 -2
- package/dist/providers/core/runtime/standard-tool-text-harvest.js.map +1 -1
- package/dist/providers/core/runtime/transport/auth-provider-factory.d.ts +0 -1
- package/dist/providers/core/runtime/transport/auth-provider-factory.js +1 -15
- package/dist/providers/core/runtime/transport/auth-provider-factory.js.map +1 -1
- package/dist/providers/core/runtime/transport/index.d.ts +0 -1
- package/dist/providers/core/runtime/transport/index.js +0 -1
- package/dist/providers/core/runtime/transport/index.js.map +1 -1
- package/dist/providers/core/runtime/transport/oauth-recovery-handler.d.ts +2 -0
- package/dist/providers/core/runtime/transport/oauth-recovery-handler.js +76 -5
- package/dist/providers/core/runtime/transport/oauth-recovery-handler.js.map +1 -1
- package/dist/providers/core/runtime/transport/request-header-builder.d.ts +0 -1
- package/dist/providers/core/runtime/transport/request-header-builder.js +1 -7
- package/dist/providers/core/runtime/transport/request-header-builder.js.map +1 -1
- package/dist/providers/core/runtime/transport/runtime-detector.d.ts +0 -2
- package/dist/providers/core/runtime/transport/runtime-detector.js +0 -20
- package/dist/providers/core/runtime/transport/runtime-detector.js.map +1 -1
- package/dist/providers/core/runtime/transport/session-header-utils.d.ts +6 -0
- package/dist/providers/core/runtime/transport/session-header-utils.js +61 -2
- package/dist/providers/core/runtime/transport/session-header-utils.js.map +1 -1
- package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-request-exec.js +2 -1
- package/dist/providers/core/runtime/vercel-ai-sdk/anthropic-sdk-request-exec.js.map +1 -1
- package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js +2 -1
- package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js.map +1 -1
- package/dist/providers/core/strategies/oauth-auth-code-flow.d.ts +1 -4
- package/dist/providers/core/strategies/oauth-auth-code-flow.js +26 -84
- package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
- package/dist/providers/core/strategies/oauth-device-flow.d.ts +2 -0
- package/dist/providers/core/strategies/oauth-device-flow.js +43 -8
- package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
- package/dist/providers/core/utils/http-client.d.ts +7 -5
- package/dist/providers/core/utils/http-client.js +108 -33
- package/dist/providers/core/utils/http-client.js.map +1 -1
- package/dist/providers/core/utils/provider-error-reporter.d.ts +2 -2
- package/dist/providers/core/utils/provider-error-reporter.js +9 -85
- package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
- package/dist/providers/core/utils/provider-type-utils.js +1 -3
- package/dist/providers/core/utils/provider-type-utils.js.map +1 -1
- package/dist/providers/core/utils/qwen-client-fingerprint.d.ts +15 -0
- package/dist/providers/core/utils/qwen-client-fingerprint.js +47 -0
- package/dist/providers/core/utils/qwen-client-fingerprint.js.map +1 -0
- package/dist/providers/core/utils/snapshot-writer.d.ts +3 -0
- package/dist/providers/core/utils/snapshot-writer.js +385 -26
- package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
- package/dist/providers/profile/families/qwen-profile.js +285 -22
- package/dist/providers/profile/families/qwen-profile.js.map +1 -1
- package/dist/providers/profile/profile-registry.js +0 -2
- package/dist/providers/profile/profile-registry.js.map +1 -1
- package/dist/providers/profile/provider-directory.js +0 -1
- package/dist/providers/profile/provider-directory.js.map +1 -1
- package/dist/providers/profile/provider-profile-loader.js +1 -1
- package/dist/providers/profile/provider-profile-loader.js.map +1 -1
- package/dist/server/handlers/chat-handler.js +6 -5
- package/dist/server/handlers/chat-handler.js.map +1 -1
- package/dist/server/handlers/config-admin-handler.js +44 -69
- package/dist/server/handlers/config-admin-handler.js.map +1 -1
- package/dist/server/handlers/handler-response-utils.js +190 -27
- package/dist/server/handlers/handler-response-utils.js.map +1 -1
- package/dist/server/handlers/handler-utils.d.ts +3 -0
- package/dist/server/handlers/handler-utils.js +72 -0
- package/dist/server/handlers/handler-utils.js.map +1 -1
- package/dist/server/handlers/images-handler.js +7 -7
- package/dist/server/handlers/images-handler.js.map +1 -1
- package/dist/server/handlers/messages-handler.js +6 -5
- package/dist/server/handlers/messages-handler.js.map +1 -1
- package/dist/server/handlers/responses-handler.js +32 -14
- package/dist/server/handlers/responses-handler.js.map +1 -1
- package/dist/server/handlers/sse-dispatcher.js +55 -13
- package/dist/server/handlers/sse-dispatcher.js.map +1 -1
- package/dist/server/handlers/types.d.ts +12 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +5 -2
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/control-handler.js +62 -18
- 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.js +1 -1
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +9 -9
- 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.js +36 -10
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +11 -11
- 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 +49 -8
- package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +1 -0
- package/dist/server/runtime/http-server/daemon-admin-routes.js +46 -0
- package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -1
- package/dist/server/runtime/http-server/executor/client-injection-flow.js +2 -0
- package/dist/server/runtime/http-server/executor/client-injection-flow.js.map +1 -1
- package/dist/server/runtime/http-server/executor/log-rollup.d.ts +38 -0
- package/dist/server/runtime/http-server/executor/log-rollup.js +775 -0
- package/dist/server/runtime/http-server/executor/log-rollup.js.map +1 -0
- package/dist/server/runtime/http-server/executor/provider-response-converter.js +654 -281
- package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -1
- package/dist/server/runtime/http-server/executor/provider-response-utils.js +34 -3
- package/dist/server/runtime/http-server/executor/provider-response-utils.js.map +1 -1
- package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js +14 -68
- package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js.map +1 -1
- package/dist/server/runtime/http-server/executor/request-executor-core-utils.js +26 -2
- package/dist/server/runtime/http-server/executor/request-executor-core-utils.js.map +1 -1
- package/dist/server/runtime/http-server/executor/request-retry-helpers.js +20 -2
- package/dist/server/runtime/http-server/executor/request-retry-helpers.js.map +1 -1
- package/dist/server/runtime/http-server/executor/servertool-adapter-context.d.ts +10 -0
- package/dist/server/runtime/http-server/executor/servertool-adapter-context.js +120 -0
- package/dist/server/runtime/http-server/executor/servertool-adapter-context.js.map +1 -0
- package/dist/server/runtime/http-server/executor/servertool-followup-dispatch.d.ts +35 -0
- package/dist/server/runtime/http-server/executor/servertool-followup-dispatch.js +101 -0
- package/dist/server/runtime/http-server/executor/servertool-followup-dispatch.js.map +1 -0
- package/dist/server/runtime/http-server/executor/servertool-followup-error.d.ts +46 -0
- package/dist/server/runtime/http-server/executor/servertool-followup-error.js +127 -0
- package/dist/server/runtime/http-server/executor/servertool-followup-error.js.map +1 -0
- package/dist/server/runtime/http-server/executor/servertool-followup-metadata.d.ts +7 -0
- package/dist/server/runtime/http-server/executor/servertool-followup-metadata.js +186 -0
- package/dist/server/runtime/http-server/executor/servertool-followup-metadata.js.map +1 -0
- package/dist/server/runtime/http-server/executor/servertool-request-normalizer.d.ts +2 -0
- package/dist/server/runtime/http-server/executor/servertool-request-normalizer.js +56 -0
- package/dist/server/runtime/http-server/executor/servertool-request-normalizer.js.map +1 -0
- package/dist/server/runtime/http-server/executor/servertool-response-normalizer.d.ts +8 -0
- package/dist/server/runtime/http-server/executor/servertool-response-normalizer.js +31 -0
- package/dist/server/runtime/http-server/executor/servertool-response-normalizer.js.map +1 -0
- package/dist/server/runtime/http-server/executor/servertool-runtime-log.d.ts +8 -0
- package/dist/server/runtime/http-server/executor/servertool-runtime-log.js +33 -0
- package/dist/server/runtime/http-server/executor/servertool-runtime-log.js.map +1 -0
- package/dist/server/runtime/http-server/executor/sse-error-handler.js +37 -0
- package/dist/server/runtime/http-server/executor/sse-error-handler.js.map +1 -1
- package/dist/server/runtime/http-server/executor/usage-aggregator.js +32 -2
- package/dist/server/runtime/http-server/executor/usage-aggregator.js.map +1 -1
- package/dist/server/runtime/http-server/executor/usage-logger.d.ts +12 -0
- package/dist/server/runtime/http-server/executor/usage-logger.js +56 -1
- package/dist/server/runtime/http-server/executor/usage-logger.js.map +1 -1
- package/dist/server/runtime/http-server/executor-metadata.d.ts +15 -0
- package/dist/server/runtime/http-server/executor-metadata.js +60 -18
- package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
- package/dist/server/runtime/http-server/executor-provider.d.ts +2 -0
- package/dist/server/runtime/http-server/executor-provider.js +88 -205
- package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
- package/dist/server/runtime/http-server/executor-response.js +30 -149
- package/dist/server/runtime/http-server/executor-response.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-bootstrap.js +53 -17
- package/dist/server/runtime/http-server/http-server-bootstrap.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-legacy-pipeline.js +28 -1
- package/dist/server/runtime/http-server/http-server-legacy-pipeline.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-lifecycle.js +17 -4
- package/dist/server/runtime/http-server/http-server-lifecycle.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-runtime-providers.js +42 -13
- package/dist/server/runtime/http-server/http-server-runtime-providers.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-runtime-setup.js +40 -2
- package/dist/server/runtime/http-server/http-server-runtime-setup.js.map +1 -1
- package/dist/server/runtime/http-server/hub-shadow-compare.js +8 -4
- package/dist/server/runtime/http-server/hub-shadow-compare.js.map +1 -1
- package/dist/server/runtime/http-server/managed-process-probe.js +30 -4
- package/dist/server/runtime/http-server/managed-process-probe.js.map +1 -1
- package/dist/server/runtime/http-server/middleware.js +32 -4
- package/dist/server/runtime/http-server/middleware.js.map +1 -1
- package/dist/server/runtime/http-server/provider-traffic-governor.d.ts +45 -1
- package/dist/server/runtime/http-server/provider-traffic-governor.js +697 -111
- package/dist/server/runtime/http-server/provider-traffic-governor.js.map +1 -1
- package/dist/server/runtime/http-server/provider-utils.js +2 -6
- package/dist/server/runtime/http-server/provider-utils.js.map +1 -1
- package/dist/server/runtime/http-server/request-activity-tracker.d.ts +4 -0
- package/dist/server/runtime/http-server/request-activity-tracker.js +54 -11
- package/dist/server/runtime/http-server/request-activity-tracker.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.d.ts +247 -0
- package/dist/server/runtime/http-server/request-executor.js +2444 -334
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.js +59 -16
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/runtime-manager.js +0 -15
- package/dist/server/runtime/http-server/runtime-manager.js.map +1 -1
- package/dist/server/runtime/http-server/session-client-registry-utils.js +46 -10
- package/dist/server/runtime/http-server/session-client-registry-utils.js.map +1 -1
- package/dist/server/runtime/http-server/session-client-registry.js +22 -4
- package/dist/server/runtime/http-server/session-client-registry.js.map +1 -1
- package/dist/server/runtime/http-server/session-client-routes.js +40 -18
- package/dist/server/runtime/http-server/session-client-routes.js.map +1 -1
- package/dist/server/runtime/http-server/session-dir.js +35 -2
- package/dist/server/runtime/http-server/session-dir.js.map +1 -1
- package/dist/server/runtime/http-server/session-scope-resolution.js +38 -9
- package/dist/server/runtime/http-server/session-scope-resolution.js.map +1 -1
- package/dist/server/runtime/http-server/session-storage-cleanup.js +64 -27
- package/dist/server/runtime/http-server/session-storage-cleanup.js.map +1 -1
- package/dist/server/runtime/http-server/stats-manager.d.ts +5 -0
- package/dist/server/runtime/http-server/stats-manager.js +138 -6
- package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
- package/dist/server/runtime/http-server/tmux-injection-history.js +30 -4
- package/dist/server/runtime/http-server/tmux-injection-history.js.map +1 -1
- package/dist/server/runtime/http-server/tmux-session-probe.d.ts +3 -1
- package/dist/server/runtime/http-server/tmux-session-probe.js +198 -9
- package/dist/server/runtime/http-server/tmux-session-probe.js.map +1 -1
- package/dist/server/utils/client-connection-state.d.ts +1 -0
- package/dist/server/utils/client-connection-state.js +45 -5
- package/dist/server/utils/client-connection-state.js.map +1 -1
- package/dist/server/utils/finish-reason.js +61 -2
- package/dist/server/utils/finish-reason.js.map +1 -1
- package/dist/server/utils/http-error-mapper.d.ts +4 -0
- package/dist/server/utils/http-error-mapper.js +31 -6
- package/dist/server/utils/http-error-mapper.js.map +1 -1
- package/dist/server/utils/stage-logger.js +42 -13
- package/dist/server/utils/stage-logger.js.map +1 -1
- package/dist/server-lifecycle/port-utils.js +6 -2
- package/dist/server-lifecycle/port-utils.js.map +1 -1
- package/dist/token-daemon/index.js +44 -15
- package/dist/token-daemon/index.js.map +1 -1
- package/dist/token-daemon/leader-lock.js +65 -7
- package/dist/token-daemon/leader-lock.js.map +1 -1
- package/dist/token-daemon/provider-registry.js +1 -1
- package/dist/token-daemon/provider-registry.js.map +1 -1
- package/dist/token-daemon/server-utils.d.ts +11 -0
- package/dist/token-daemon/server-utils.js +71 -18
- package/dist/token-daemon/server-utils.js.map +1 -1
- package/dist/token-daemon/token-daemon.d.ts +0 -1
- package/dist/token-daemon/token-daemon.js +81 -63
- package/dist/token-daemon/token-daemon.js.map +1 -1
- package/dist/token-daemon/token-types.d.ts +1 -1
- package/dist/token-daemon/token-types.js +0 -1
- package/dist/token-daemon/token-types.js.map +1 -1
- package/dist/token-daemon/token-utils.js +4 -2
- package/dist/token-daemon/token-utils.js.map +1 -1
- package/dist/tools/provider-update/fetch-models.js +1 -5
- package/dist/tools/provider-update/fetch-models.js.map +1 -1
- package/dist/utils/error-handler-registry.js +50 -13
- package/dist/utils/error-handler-registry.js.map +1 -1
- package/dist/utils/errorsamples.d.ts +3 -1
- package/dist/utils/errorsamples.js +198 -14
- package/dist/utils/errorsamples.js.map +1 -1
- package/dist/utils/http-health-probe.d.ts +42 -0
- package/dist/utils/http-health-probe.js +231 -0
- package/dist/utils/http-health-probe.js.map +1 -0
- package/dist/utils/managed-server-pids.js +2 -2
- package/dist/utils/managed-server-pids.js.map +1 -1
- package/dist/utils/module-config-reader.js +11 -1
- package/dist/utils/module-config-reader.js.map +1 -1
- package/dist/utils/runtime-package-root.d.ts +2 -0
- package/dist/utils/runtime-package-root.js +47 -0
- package/dist/utils/runtime-package-root.js.map +1 -0
- package/dist/utils/snapshot-local-disk-gate.d.ts +3 -0
- package/dist/utils/snapshot-local-disk-gate.js +50 -0
- package/dist/utils/snapshot-local-disk-gate.js.map +1 -0
- package/dist/utils/snapshot-payload-guard.d.ts +1 -0
- package/dist/utils/snapshot-payload-guard.js +234 -0
- package/dist/utils/snapshot-payload-guard.js.map +1 -0
- package/dist/utils/snapshot-request-retention.d.ts +3 -0
- package/dist/utils/snapshot-request-retention.js +128 -0
- package/dist/utils/snapshot-request-retention.js.map +1 -0
- package/dist/utils/snapshot-stage-policy.d.ts +3 -0
- package/dist/utils/snapshot-stage-policy.js +111 -0
- package/dist/utils/snapshot-stage-policy.js.map +1 -0
- package/dist/utils/snapshot-writer.js +176 -19
- package/dist/utils/snapshot-writer.js.map +1 -1
- package/docs/CHAT_PROCESS_PROTOCOL_AND_PIPELINE.md +4 -0
- package/docs/CONFIG_ARCHITECTURE.md +2 -2
- package/docs/INSTALLATION_AND_QUICKSTART.md +5 -5
- package/docs/OAUTH.md +2 -5
- package/docs/PORTS.md +1 -1
- package/docs/PROVIDERS_BUILTIN.md +1 -5
- package/docs/PROVIDER_TYPES.md +1 -1
- package/docs/agent-routing/10-runtime-ssot-routing.md +4 -0
- package/docs/agent-routing/20-build-test-release-routing.md +2 -2
- package/docs/agent-routing/30-servertool-lifecycle-routing.md +2 -0
- package/docs/agent-routing/40-task-memory-routing.md +22 -2
- package/docs/audit/286.1-provider-failure-policy-audit.md +341 -0
- package/docs/audits/2026-04-26-fallback-silent-failure-audit.md +119 -0
- package/docs/audits/2026-04-27-provider-failure-policy-ssot-audit.md +153 -0
- package/docs/chat-process-continuation-state-contract.md +196 -0
- package/docs/chat-semantic-expansion-plan.md +2 -0
- package/docs/daemon-admin-api-design.md +9 -9
- package/docs/design/provider-failure-policy-ssot.md +215 -0
- package/docs/design/reasoning-stop-lifecycle.md +90 -0
- package/docs/design/servertool-unified-skeleton.md +202 -0
- package/docs/design/websearch-servertool-orchestration.md +190 -0
- package/docs/error-handling-v2.md +120 -11
- package/docs/protocol-compatibility-matrix.md +147 -0
- package/docs/providers/provider-composite-design.md +4 -5
- package/docs/providers/provider-composite-testing.md +1 -1
- package/docs/providers/provider-type-only-migration.md +2 -15
- package/docs/refactoring/compatibility-v2-architecture-design.md +1 -3
- package/docs/refactoring/host-164.3-responsibility-migration.md +0 -1
- package/docs/routing-instructions.md +42 -1
- package/docs/stop-message-auto.md +0 -1
- package/docs/token-refresh-daemon-plan.md +14 -14
- package/docs/v2-architecture/IMPLEMENTATION-ROADMAP.md +1 -1
- package/docs/v2-architecture/PROVIDER-V2-CHANGESET-RELEASE-CHECKLIST.md +1 -9
- package/docs/v2-architecture/PROVIDER-V2-LAYERING-ADR-DRAFT.md +3 -4
- package/docs/v2-architecture/PROVIDER-V2-MIGRATION-MATRIX-DRAFT.md +4 -15
- package/docs/v2-architecture/PROVIDER-V2-PHASED-MIGRATION-ROLLBACK-DRAFT.md +4 -5
- package/docs/v2-architecture/PROVIDER-V2-PROFILE-API-REGISTRY-DRAFT.md +4 -4
- package/docs/v2-architecture/PROVIDER-V2-REFACTOR-OVERVIEW-DRAFT.md +1 -2
- package/docs/v2-architecture/PROVIDER-V2-VERIFICATION-MATRIX-DRAFT.md +2 -2
- package/node_modules/@jsonstudio/llms/dist/config-unified/unified-config.js +36 -10
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/deepseek-web-request.js +7 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/deepseek-web-response.js +2 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/antigravity-session-signature.js +33 -17
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/header-policies.d.ts +20 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/header-policies.js +79 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/policy-overrides.d.ts +16 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/policy-overrides.js +27 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/provider-resolver.d.ts +26 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/provider-resolver.js +59 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/registry.d.ts +35 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/registry.js +154 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/types.d.ts +75 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profile-registry/types.js +8 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/anthropic-claude-code.json +13 -7
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-claude-code.json +13 -8
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-deepseek-web.json +37 -8
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwen.json +48 -11
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/compat-passthrough.json +6 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/provider-resolution-config.json +24 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/node-support.js +5 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper-config.js +0 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper-from-chat.js +54 -7
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-mapper-to-chat.js +15 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-semantics-audit.d.ts +11 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/anthropic-semantics-audit.js +16 -30
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapper-config.js +0 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapper-from-chat.js +15 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapping-audit.d.ts +10 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/gemini-mapping-audit.js +9 -30
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/protocol-mapping-audit.d.ts +43 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/protocol-mapping-audit.js +148 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-from-chat.js +16 -6
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-helpers.d.ts +2 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-helpers.js +65 -3
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper-to-chat.js +1 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper.d.ts +1 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/operation-table/semantic-mappers/responses-mapper.js +1 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-types.d.ts +14 -154
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-chat-process-request-utils.d.ts +6 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-chat-process-request-utils.js +83 -3
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-chat-process-entry.js +6 -5
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage-inbound.d.ts +0 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage-inbound.js +9 -5
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage-provider-payload.js +132 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-execute-request-stage.js +0 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-heavy-input-fastpath.d.ts +4 -22
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-heavy-input-fastpath.js +109 -139
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-max-tokens-policy.js +40 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-route-and-outbound.d.ts +0 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline-route-and-outbound.js +19 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.d.ts +0 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.js +45 -43
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/route-aware-responses-continuation.d.ts +10 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/route-aware-responses-continuation.js +143 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/index.js +37 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage2_semantic_map/semantic-lift.js +14 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/responses-context-snapshot.d.ts +3 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_inbound/req_inbound_stage3_context_capture/responses-context-snapshot.js +22 -11
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/chat-process-semantics-bridge.js +59 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/client-remap-protocol-switch.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/client-remap-protocol-switch.js +3 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/index.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_outbound/resp_outbound_stage1_client_remap/index.js +2 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage1_tool_governance/index.js +53 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage2_finalize/index.js +4 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage3_servertool_orchestration/index.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/resp_process/resp_process_stage3_servertool_orchestration/index.js +16 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/policy/policy-engine.js +14 -4
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-anthropic-alias.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-anthropic-alias.js +29 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-pending-tool-sync.js +38 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process-request-sanitizer.js +164 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.js +27 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-mappers.d.ts +9 -3
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-mappers.js +8 -7
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-runtime-anthropic.js +20 -5
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/snapshot-recorder.js +1 -247
- package/node_modules/@jsonstudio/llms/dist/conversion/hub/types/chat-envelope.d.ts +84 -4
- package/node_modules/@jsonstudio/llms/dist/conversion/pipeline/codecs/v2/responses-openai-pipeline.js +26 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge/response-payload.js +10 -9
- package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge/utils.js +20 -5
- package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge.js +88 -4
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils-core.js +5 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils-openai-request.js +55 -14
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils-tool-schema.js +1 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils.js +38 -15
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/openai-message-normalize.js +45 -6
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-conversation-store.d.ts +15 -0
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-conversation-store.js +157 -13
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.d.ts +8 -2
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.js +103 -9
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-response-utils.js +10 -10
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-filter-pipeline.js +59 -9
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-governor-guards.d.ts +1 -1
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-governor-guards.js +54 -43
- package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-governor.js +62 -8
- package/node_modules/@jsonstudio/llms/dist/conversion/snapshot-utils.js +269 -12
- package/node_modules/@jsonstudio/llms/dist/filters/engine.js +64 -6
- package/node_modules/@jsonstudio/llms/dist/filters/special/request-tool-list-filter.js +32 -11
- package/node_modules/@jsonstudio/llms/dist/filters/special/request-toolcalls-stringify.js +26 -1
- package/node_modules/@jsonstudio/llms/dist/filters/special/request-tools-normalize.js +46 -7
- package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-blacklist.js +10 -1
- package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-schema-converge.js +10 -1
- package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-stringify.js +30 -5
- package/node_modules/@jsonstudio/llms/dist/filters/special/response-tool-arguments-whitelist.js +10 -1
- package/node_modules/@jsonstudio/llms/dist/filters/special/tool-filter-hooks.js +16 -14
- package/node_modules/@jsonstudio/llms/dist/filters/utils/snapshot-writer.js +47 -5
- package/node_modules/@jsonstudio/llms/dist/guidance/index.js +16 -2
- package/node_modules/@jsonstudio/llms/dist/http/sse-response.js +42 -6
- package/node_modules/@jsonstudio/llms/dist/native/router_hotpath_napi.node +0 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/auth-utils.js +33 -31
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/provider-normalization.d.ts +6 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/provider-normalization.js +78 -98
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/responses-helpers.js +22 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/routing-config.js +56 -3
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap/streaming-helpers.js +19 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap.js +62 -293
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/classifier.js +11 -82
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/antigravity/alias-lease.js +42 -15
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/cooldown-manager.js +55 -3
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/health/index.js +66 -15
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-pools/index.js +44 -8
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-state/keys.d.ts +7 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-state/keys.js +65 -21
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/routing-state/store.js +19 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/sticky-session-manager.d.ts +9 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine/sticky-session-manager.js +139 -4
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-logging.js +2 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-clock-reminder-semantics.js +68 -59
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-governance-semantics.js +156 -157
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-node-result-semantics.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-node-result-semantics.js +31 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-chat-process-servertool-orchestration-semantics.js +94 -95
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-compat-action-semantics.d.ts +0 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-compat-action-semantics.js +0 -7
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-parsers.d.ts +1 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-parsers.js +203 -305
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-tools-post.js +35 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-tools-request.js +2 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-action-semantics-types.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-bridge-policy-semantics.js +173 -154
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-edge-stage-semantics.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-edge-stage-semantics.js +106 -57
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-inbound-outbound-semantics.js +122 -114
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-builders.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-metadata-policy.js +100 -86
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-passthrough.js +52 -33
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics-protocol.js +79 -62
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-orchestration-semantics.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-inbound-semantics-parsers.js +50 -33
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-inbound-semantics-types.d.ts +2 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-outbound-semantics-parsers.d.ts +1 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-req-outbound-semantics-parsers.js +161 -177
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-outbound-tools.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-outbound-tools.js +1 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-parsers.d.ts +1 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-hub-pipeline-resp-semantics-parsers.js +231 -286
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-router-hotpath-analysis.js +143 -164
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-router-hotpath-required-exports.d.ts +1 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-router-hotpath-required-exports.js +8 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics-reasoning.js +57 -28
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics-responses.d.ts +8 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics-responses.js +76 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.d.ts +1 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-shared-conversion-semantics.js +1 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-providers.d.ts +24 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-providers.js +78 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-routing.d.ts +17 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/native-virtual-router-bootstrap-routing.js +72 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/route-utils.js +9 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-selection/tier-selection-select.js +11 -5
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.js +4 -39
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/features.js +199 -31
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/health-manager.js +7 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/load-balancer.d.ts +3 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/load-balancer.js +47 -3
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/native-error.d.ts +11 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/native-error.js +71 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-registry.js +81 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-runtime-ingress.d.ts +24 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-runtime-ingress.js +139 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-instructions/parse.js +21 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-instructions/state.js +46 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-instructions/types.d.ts +7 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/routing-stop-message-state-codec.js +30 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/sticky-session-store.js +44 -15
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/stop-message-state-sync.d.ts +1 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/stop-message-state-sync.js +10 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/success-center.js +39 -2
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.js +25 -24
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.d.ts +3 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/engine.js +255 -71
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/clock.js +20 -2
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/followup-request-builder.js +120 -85
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/memory-appender.d.ts +6 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/memory-appender.js +42 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-only-continue.js +1 -1
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop-guard.js +630 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop-state.d.ts +24 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop-state.js +606 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/reasoning-stop.js +292 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/{iflow-followup.d.ts → ai-followup.d.ts} +3 -3
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/{iflow-followup.js → ai-followup.js} +76 -81
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/config.d.ts +1 -2
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/config.js +2 -6
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/runtime-utils.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto/runtime-utils.js +51 -11
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/stop-message-auto.js +5 -4
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search-auto-trigger.d.ts +9 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search-auto-trigger.js +91 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.js +1 -131
- package/node_modules/@jsonstudio/llms/dist/servertool/heartbeat/session-store.js +49 -18
- package/node_modules/@jsonstudio/llms/dist/servertool/registry.js +3 -0
- package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.d.ts +2 -2
- package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.js +14 -10
- package/node_modules/@jsonstudio/llms/dist/servertool/strip-servertool-calls.js +2 -3
- package/node_modules/@jsonstudio/llms/dist/servertool/types.d.ts +11 -1
- package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/chat-json-to-sse-converter.js +26 -1
- package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/chat.d.ts +2 -2
- package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/chat.js +38 -3
- package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/sequencers/chat-sequencer.js +6 -3
- package/node_modules/@jsonstudio/llms/dist/sse/shared/chat-serializer.js +27 -3
- package/node_modules/@jsonstudio/llms/dist/sse/shared/constants.d.ts +6 -6
- package/node_modules/@jsonstudio/llms/dist/sse/shared/constants.js +3 -3
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/anthropic-sse-to-json-converter.js +36 -1
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/anthropic-response-builder.js +6 -20
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.d.ts +3 -0
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.js +125 -42
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/chat-sse-to-json-converter.js +59 -10
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/parsers/sse-parser.js +2 -0
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/responses-sse-to-json-converter.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/responses-sse-to-json-converter.js +71 -2
- package/node_modules/@jsonstudio/llms/dist/sse/types/chat-types.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/sse/types/chat-types.js +1 -1
- package/node_modules/@jsonstudio/llms/dist/sse/types/conversion-context.js +2 -2
- package/node_modules/@jsonstudio/llms/dist/sse/types/index.d.ts +1 -1
- package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.d.ts +1 -1
- package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.js +1 -1
- package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.js +34 -12
- package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/patch-text/fuzzy-match.d.ts +14 -0
- package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/patch-text/fuzzy-match.js +174 -0
- package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/patch-text/normalize.js +148 -0
- package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/structured.js +31 -2
- package/node_modules/@jsonstudio/llms/dist/tools/apply-patch/validator.js +121 -4
- package/node_modules/@jsonstudio/llms/dist/tools/exec-command/normalize.d.ts +4 -1
- package/node_modules/@jsonstudio/llms/dist/tools/exec-command/normalize.js +31 -16
- package/node_modules/@jsonstudio/llms/dist/tools/exec-command/validator.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/tools/exec-command/validator.js +3 -1
- package/node_modules/@jsonstudio/llms/dist/tools/tool-registry.d.ts +1 -0
- package/node_modules/@jsonstudio/llms/dist/tools/tool-registry.js +5 -27
- package/node_modules/@jsonstudio/llms/package.json +1 -1
- package/package.json +6 -7
- package/scripts/ci/repo-sanity.mjs +1 -0
- package/scripts/ci/silent-failure-audit.mjs +112 -70
- package/scripts/cleanup-stale-server-pids.mjs +0 -6
- package/scripts/ensure-cli-command-shim.mjs +49 -15
- package/scripts/ensure-cli-executable.mjs +1 -1
- package/scripts/install-global.sh +7 -6
- package/scripts/install-release-snapshot.mjs +232 -0
- package/scripts/install-release.sh +30 -24
- package/scripts/link-global-llms-local.mjs +1 -2
- package/scripts/monitor/memory-guard.mjs +207 -0
- package/scripts/pack-mode.mjs +0 -4
- package/scripts/pack-rcc.mjs +17 -58
- package/scripts/run-bg.sh +0 -6
- package/scripts/run-fg-gtimeout.sh +0 -6
- package/scripts/tests/antigravity-codex-sample-pipeline-compare.mjs +1 -1
- package/scripts/tests/blackbox-rcc-vs-routecodex-antigravity.mjs +60 -39
- package/scripts/verify-install-e2e.mjs +64 -26
- package/configsamples/provider-default/qwenchat/config.v2.json +0 -53
- package/dist/providers/auth/iflow-cookie-auth.d.ts +0 -27
- package/dist/providers/auth/iflow-cookie-auth.js +0 -207
- package/dist/providers/auth/iflow-cookie-auth.js.map +0 -1
- package/dist/providers/auth/iflow-userinfo-helper.d.ts +0 -32
- package/dist/providers/auth/iflow-userinfo-helper.js +0 -81
- package/dist/providers/auth/iflow-userinfo-helper.js.map +0 -1
- package/dist/providers/core/runtime/iflow-http-provider.d.ts +0 -13
- package/dist/providers/core/runtime/iflow-http-provider.js +0 -22
- package/dist/providers/core/runtime/iflow-http-provider.js.map +0 -1
- package/dist/providers/core/runtime/provider-iflow-business-error-utils.d.ts +0 -15
- package/dist/providers/core/runtime/provider-iflow-business-error-utils.js +0 -49
- package/dist/providers/core/runtime/provider-iflow-business-error-utils.js.map +0 -1
- package/dist/providers/core/runtime/qwenchat-http-provider-helpers.d.ts +0 -89
- package/dist/providers/core/runtime/qwenchat-http-provider-helpers.js +0 -1698
- package/dist/providers/core/runtime/qwenchat-http-provider-helpers.js.map +0 -1
- package/dist/providers/core/runtime/qwenchat-http-provider.d.ts +0 -9
- package/dist/providers/core/runtime/qwenchat-http-provider.js +0 -78
- package/dist/providers/core/runtime/qwenchat-http-provider.js.map +0 -1
- package/dist/providers/core/runtime/standard-tool-text-request-transform.d.ts +0 -13
- package/dist/providers/core/runtime/standard-tool-text-request-transform.js +0 -130
- package/dist/providers/core/runtime/standard-tool-text-request-transform.js.map +0 -1
- package/dist/providers/core/runtime/transport/iflow-signer.d.ts +0 -12
- package/dist/providers/core/runtime/transport/iflow-signer.js +0 -63
- package/dist/providers/core/runtime/transport/iflow-signer.js.map +0 -1
- package/dist/providers/profile/families/iflow-profile.d.ts +0 -2
- package/dist/providers/profile/families/iflow-profile.js +0 -384
- package/dist/providers/profile/families/iflow-profile.js.map +0 -1
- package/docs/mapping-tables/iflow-to-openai.json +0 -215
- package/docs/mapping-tables/openai-to-iflow.json +0 -227
- package/docs/multi-token-auth-guide.md +0 -66
- package/docs/oauth-authentication-guide.md +0 -172
- package/docs/oauth-iflow-implementation.md +0 -157
- package/docs/release-iflow-400-gate.md +0 -58
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-cli-defaults.d.ts +0 -10
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-cli-defaults.js +0 -31
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-history-media-placeholder.d.ts +0 -7
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-history-media-placeholder.js +0 -25
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-thinking-reasoning-fill.d.ts +0 -12
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-kimi-thinking-reasoning-fill.js +0 -46
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-native-compat.d.ts +0 -6
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-native-compat.js +0 -36
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-response-body-unwrap.d.ts +0 -9
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-response-body-unwrap.js +0 -25
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-tool-text-fallback.d.ts +0 -5
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-tool-text-fallback.js +0 -29
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-web-search.d.ts +0 -18
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/iflow-web-search.js +0 -49
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwenchat-web-request.d.ts +0 -3
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwenchat-web-request.js +0 -62
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-iflow.json +0 -353
- package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwenchat-web.json +0 -47
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-health.d.ts +0 -1
- package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine-health.js +0 -1
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/iflow-model-error-retry.js +0 -92
- package/node_modules/@jsonstudio/llms/dist/servertool/handlers/review.js +0 -202
- package/scripts/publish-rcc.mjs +0 -81
- /package/node_modules/@jsonstudio/llms/dist/servertool/handlers/{iflow-model-error-retry.d.ts → reasoning-stop-guard.d.ts} +0 -0
- /package/node_modules/@jsonstudio/llms/dist/servertool/handlers/{review.d.ts → reasoning-stop.d.ts} +0 -0
|
@@ -5,8 +5,7 @@ import fsSync from 'fs';
|
|
|
5
5
|
import path from 'path';
|
|
6
6
|
import os from 'os';
|
|
7
7
|
import { spawnSync } from 'node:child_process';
|
|
8
|
-
import {
|
|
9
|
-
import { fetchQwenUserInfo, mergeQwenTokenData } from './qwen-userinfo-helper.js';
|
|
8
|
+
import { fetchQwenUserInfo, mergeQwenTokenData, validateQwenAccessToken } from './qwen-userinfo-helper.js';
|
|
10
9
|
import { fetchGeminiCLIUserInfo, fetchGeminiCLIProjects, mergeGeminiCLITokenData, getDefaultProjectId } from './gemini-cli-userinfo-helper.js';
|
|
11
10
|
import { parseTokenSequenceFromPath } from './token-scanner/index.js';
|
|
12
11
|
import { logOAuthDebug } from './oauth-logger.js';
|
|
@@ -22,12 +21,19 @@ import { extractStatusCode, isGoogleAccountVerificationRequiredMessage, extractG
|
|
|
22
21
|
import { hasNonEmptyString, extractAccessToken, extractApiKey, hasApiKeyField, hasStableQwenApiKey, hasAccessToken, getExpiresAt, resolveProjectId, coerceExpiryTimestampSeconds, hasNoRefreshFlag, evaluateTokenState } from './oauth-lifecycle/token-helpers.js';
|
|
23
22
|
import { normalizeGeminiCliAccountToken, sanitizeToken, readTokenFromFile, backupTokenFile, restoreTokenFileFromBackup, discardBackupFile, clearTokenFile, readRawTokenFile } from './oauth-lifecycle/token-io.js';
|
|
24
23
|
import { resolveRccAuthDir } from '../../config/user-data-paths.js';
|
|
24
|
+
import { isPermanentOAuthRefreshErrorMessage } from '../core/strategies/oauth-refresh-errors.js';
|
|
25
25
|
const OAUTH_INTERACTIVE_LOCK_FILE = path.join(resolveRccAuthDir(), '.oauth-interactive.lock.json');
|
|
26
|
-
const IFLOW_AUTO_FAILURE_FILE = path.join(resolveRccAuthDir(), '.iflow-auto-failures.json');
|
|
27
26
|
const OAUTH_THROTTLE_WINDOW_MS = 60_000;
|
|
28
|
-
const IFLOW_REFRESH_FAILURE_BACKOFF_MS = 5 * 60_000;
|
|
29
27
|
const TOKEN_REFRESH_SKEW_MS = 60_000;
|
|
30
|
-
function
|
|
28
|
+
function logOAuthLifecycleNonBlocking(operation, error, details, options) {
|
|
29
|
+
const throttleKey = options?.throttleKey;
|
|
30
|
+
if (throttleKey) {
|
|
31
|
+
const throttleMs = options?.throttleMs ?? OAUTH_THROTTLE_WINDOW_MS;
|
|
32
|
+
if (shouldThrottle(throttleKey, throttleMs)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
updateThrottle(throttleKey);
|
|
36
|
+
}
|
|
31
37
|
const reason = error instanceof Error ? error.message : String(error);
|
|
32
38
|
const detailPairs = Object.entries(details || {})
|
|
33
39
|
.map(([key, value]) => `${key}=${String(value)}`)
|
|
@@ -62,7 +68,7 @@ async function openGoogleAccountVerificationInCamoufox(args) {
|
|
|
62
68
|
}
|
|
63
69
|
}
|
|
64
70
|
catch (error) {
|
|
65
|
-
|
|
71
|
+
logOAuthLifecycleNonBlocking('openGoogleAccountVerificationInCamoufox', error, { providerType, alias, url }, { warn: true });
|
|
66
72
|
}
|
|
67
73
|
finally {
|
|
68
74
|
if (prevBrowser === undefined) {
|
|
@@ -91,53 +97,143 @@ async function openGoogleAccountVerificationInCamoufox(args) {
|
|
|
91
97
|
}
|
|
92
98
|
}
|
|
93
99
|
}
|
|
94
|
-
function
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
100
|
+
async function maybeMarkTokenFileNoRefresh(filePath) {
|
|
101
|
+
if (!filePath) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const parsed = await readRawTokenFile(filePath);
|
|
106
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const token = sanitizeToken(parsed);
|
|
110
|
+
const providerType = inferProviderTypeFromTokenFilePath(token, filePath);
|
|
111
|
+
if (providerType === 'qwen' && !hasStableQwenApiKey(token)) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const current = parsed.norefresh ??
|
|
115
|
+
parsed.noRefresh;
|
|
116
|
+
if (current === true ||
|
|
117
|
+
current === 'true' ||
|
|
118
|
+
current === '1' ||
|
|
119
|
+
current === 'yes') {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const next = {
|
|
123
|
+
...parsed,
|
|
124
|
+
norefresh: true,
|
|
125
|
+
noRefresh: true
|
|
126
|
+
};
|
|
127
|
+
await fs.writeFile(filePath, JSON.stringify(next, null, 2) + '\n', {
|
|
128
|
+
mode: 0o600
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
logOAuthLifecycleNonBlocking('maybeMarkTokenFileNoRefresh', error, { filePath });
|
|
98
133
|
}
|
|
99
|
-
return (normalized.includes('oauth token endpoint rejected request') ||
|
|
100
|
-
(normalized.includes('token refresh failed') && normalized.includes('iflow.cn/oauth/token')));
|
|
101
134
|
}
|
|
102
|
-
function
|
|
103
|
-
|
|
104
|
-
if (!normalized) {
|
|
135
|
+
async function hasTokenFileNoRefresh(filePath) {
|
|
136
|
+
if (!filePath) {
|
|
105
137
|
return false;
|
|
106
138
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const
|
|
111
|
-
|
|
139
|
+
const parsed = await readRawTokenFile(filePath);
|
|
140
|
+
const token = sanitizeToken(parsed);
|
|
141
|
+
const providerType = inferProviderTypeFromTokenFilePath(token, filePath);
|
|
142
|
+
const direct = parsed?.norefresh ??
|
|
143
|
+
parsed?.noRefresh;
|
|
144
|
+
const flagged = typeof direct === 'boolean'
|
|
145
|
+
? direct
|
|
146
|
+
: typeof direct === 'string'
|
|
147
|
+
? ['1', 'true', 'yes'].includes(direct.trim().toLowerCase())
|
|
148
|
+
: false;
|
|
149
|
+
if (!flagged) {
|
|
112
150
|
return false;
|
|
113
151
|
}
|
|
114
|
-
if (
|
|
152
|
+
if (providerType === 'qwen') {
|
|
153
|
+
return hasStableQwenApiKey(token);
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
function shouldHonorNoRefresh(providerType, token) {
|
|
158
|
+
if (!hasNoRefreshFlag(token)) {
|
|
115
159
|
return false;
|
|
116
160
|
}
|
|
117
|
-
|
|
118
|
-
|
|
161
|
+
return providerType.trim().toLowerCase() === 'qwen' ? hasStableQwenApiKey(token) : true;
|
|
162
|
+
}
|
|
163
|
+
function inferProviderTypeFromTokenFilePath(token, tokenFilePath) {
|
|
164
|
+
const fromToken = token && typeof token.type === 'string'
|
|
165
|
+
? String(token.type).trim().toLowerCase()
|
|
166
|
+
: '';
|
|
167
|
+
if (fromToken) {
|
|
168
|
+
return fromToken;
|
|
119
169
|
}
|
|
120
|
-
|
|
121
|
-
|
|
170
|
+
const base = path.basename(String(tokenFilePath || '').trim()).toLowerCase();
|
|
171
|
+
if (base.startsWith('qwen-')) {
|
|
172
|
+
return 'qwen';
|
|
122
173
|
}
|
|
123
|
-
if (
|
|
124
|
-
return
|
|
174
|
+
if (base.startsWith('gemini-')) {
|
|
175
|
+
return 'gemini';
|
|
125
176
|
}
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
normalized.includes('refresh_token') ||
|
|
129
|
-
normalized.includes('client_id'))) {
|
|
130
|
-
return true;
|
|
177
|
+
if (base.startsWith('antigravity-')) {
|
|
178
|
+
return 'antigravity';
|
|
131
179
|
}
|
|
132
|
-
return
|
|
180
|
+
return '';
|
|
133
181
|
}
|
|
134
|
-
function
|
|
135
|
-
if (providerType !== '
|
|
136
|
-
return;
|
|
182
|
+
function isQwenDefaultAliasTokenFile(providerType, tokenFilePath) {
|
|
183
|
+
if (providerType.trim().toLowerCase() !== 'qwen') {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
const alias = resolveTokenAliasFromPath(tokenFilePath) ?? 'default';
|
|
187
|
+
return alias.trim().toLowerCase() === 'default';
|
|
188
|
+
}
|
|
189
|
+
function resolveOfficialQwenCodeTokenFile() {
|
|
190
|
+
const homeDir = String(process.env.HOME || '').trim() || os.homedir();
|
|
191
|
+
return path.join(homeDir, '.qwen', 'oauth_creds.json');
|
|
192
|
+
}
|
|
193
|
+
function extractRefreshTokenString(token) {
|
|
194
|
+
const value = token?.refresh_token;
|
|
195
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
196
|
+
}
|
|
197
|
+
async function maybeAdoptOfficialQwenCodeToken(args) {
|
|
198
|
+
if (!isQwenDefaultAliasTokenFile(args.providerType, args.tokenFilePath)) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
const officialTokenFile = resolveOfficialQwenCodeTokenFile();
|
|
202
|
+
if (!officialTokenFile || officialTokenFile === args.tokenFilePath) {
|
|
203
|
+
return null;
|
|
137
204
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
205
|
+
const officialRaw = await readRawTokenFile(officialTokenFile);
|
|
206
|
+
const officialToken = sanitizeToken(officialRaw);
|
|
207
|
+
if (!officialToken) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
const officialAccessToken = extractAccessToken(officialToken);
|
|
211
|
+
const officialRefreshToken = extractRefreshTokenString(officialToken);
|
|
212
|
+
if (!officialAccessToken && !officialRefreshToken) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
const currentAccessToken = extractAccessToken(args.currentToken);
|
|
216
|
+
const currentRefreshToken = extractRefreshTokenString(args.currentToken);
|
|
217
|
+
if (currentAccessToken === officialAccessToken &&
|
|
218
|
+
currentRefreshToken === officialRefreshToken) {
|
|
219
|
+
return args.currentToken ?? officialToken;
|
|
220
|
+
}
|
|
221
|
+
if (!args.force && args.currentToken) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
const prepared = await prepareTokenForStorage(args.providerType, args.tokenFilePath, officialRaw ?? officialToken);
|
|
225
|
+
if (typeof args.strategy.saveToken === 'function') {
|
|
226
|
+
await args.strategy.saveToken(prepared);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
await fs.writeFile(args.tokenFilePath, JSON.stringify(prepared, null, 2) + '\n', {
|
|
230
|
+
mode: 0o600
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
logOAuthDebug(`[OAuth] Qwen default: adopted official qwen code token ${officialTokenFile} -> ${args.tokenFilePath}`);
|
|
234
|
+
return sanitizeToken(prepared) ?? officialToken;
|
|
235
|
+
}
|
|
236
|
+
function applyRefreshFailureBackoff(_cacheKey, _providerType, _message) {
|
|
141
237
|
}
|
|
142
238
|
function isElementMissingAutomationFailure(message) {
|
|
143
239
|
const normalized = String(message || '').toLowerCase();
|
|
@@ -148,6 +244,10 @@ function isElementMissingAutomationFailure(message) {
|
|
|
148
244
|
normalized.includes('element_not_found') ||
|
|
149
245
|
normalized.includes('required but not matched'));
|
|
150
246
|
}
|
|
247
|
+
function isAutoOAuthDisabledProvider(providerType) {
|
|
248
|
+
const normalized = String(providerType || '').trim().toLowerCase();
|
|
249
|
+
return normalized === 'qwen';
|
|
250
|
+
}
|
|
151
251
|
async function runInteractiveRepairWithAutoFallback(args) {
|
|
152
252
|
const { providerType, auth, ensureValid, opts } = args;
|
|
153
253
|
const autoModeAtStart = String(process.env.ROUTECODEX_CAMOUFOX_AUTO_MODE || '').trim();
|
|
@@ -159,6 +259,7 @@ async function runInteractiveRepairWithAutoFallback(args) {
|
|
|
159
259
|
if (!autoModeAtStart) {
|
|
160
260
|
throw error;
|
|
161
261
|
}
|
|
262
|
+
const normalizedProviderType = String(providerType || '').trim().toLowerCase();
|
|
162
263
|
const msg = error instanceof Error ? error.message : String(error || '');
|
|
163
264
|
const selectorFailure = isElementMissingAutomationFailure(msg);
|
|
164
265
|
let tokenFilePath = '';
|
|
@@ -166,12 +267,16 @@ async function runInteractiveRepairWithAutoFallback(args) {
|
|
|
166
267
|
tokenFilePath = resolveTokenFilePath(auth, providerType);
|
|
167
268
|
}
|
|
168
269
|
catch (error) {
|
|
169
|
-
|
|
270
|
+
logOAuthLifecycleNonBlocking('runInteractiveRepairWithAutoFallback.resolveTokenFilePath', error, { providerType });
|
|
170
271
|
tokenFilePath = '';
|
|
171
272
|
}
|
|
172
273
|
if (tokenFilePath) {
|
|
173
274
|
closeOAuthAuthResources(providerType, tokenFilePath);
|
|
174
275
|
}
|
|
276
|
+
if (isAutoOAuthDisabledProvider(normalizedProviderType)) {
|
|
277
|
+
console.warn(`[OAuth] Camoufox auto OAuth failed (${providerType}, autoMode=${autoModeAtStart}): ${msg}. Auto OAuth is disabled for this provider; manual re-auth is required.`);
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
175
280
|
console.warn(`[OAuth] Camoufox auto OAuth failed (${providerType}, autoMode=${autoModeAtStart}): ${msg}. Falling back to headful manual mode once.`);
|
|
176
281
|
if (selectorFailure) {
|
|
177
282
|
console.warn(`[OAuth] Camoufox auto selector step failed; switched to headful manual mode (provider=${providerType}${tokenFilePath ? ` tokenFile=${tokenFilePath}` : ''}).`);
|
|
@@ -326,17 +431,66 @@ async function prepareTokenForStorage(providerType, tokenFilePath, tokenData) {
|
|
|
326
431
|
if (isGeminiCliFamily(providerType)) {
|
|
327
432
|
return await wrapGeminiCliTokenForStorage(tokenData, tokenFilePath);
|
|
328
433
|
}
|
|
329
|
-
if (providerType === '
|
|
434
|
+
if (providerType === 'qwen') {
|
|
435
|
+
const rawExisting = await readRawTokenFile(tokenFilePath);
|
|
436
|
+
const existing = rawExisting && typeof rawExisting === 'object' ? rawExisting : null;
|
|
437
|
+
const resolvedAlias = resolveTokenAliasFromPath(tokenFilePath);
|
|
330
438
|
const token = sanitizeToken(tokenData) ?? tokenData;
|
|
331
439
|
const expiresAt = getExpiresAt(token);
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
}
|
|
440
|
+
const expiresInRaw = token.expires_in;
|
|
441
|
+
const expiresIn = typeof expiresInRaw === 'number' && Number.isFinite(expiresInRaw)
|
|
442
|
+
? expiresInRaw
|
|
443
|
+
: (expiresAt && expiresAt > 10_000_000_000
|
|
444
|
+
? Math.max(1, Math.floor((expiresAt - Date.now()) / 1000))
|
|
445
|
+
: 21600);
|
|
446
|
+
const { resource_url: _dropLegacyResourceUrl, resourceUrl: _dropLegacyResourceUrlCamel, norefresh: _dropLegacyNoRefresh, noRefresh: _dropLegacyNoRefreshCamel, api_key: _dropLegacyApiKey, apiKey: _dropLegacyApiKeyCamel, ...existingWithoutLegacyQwenFields } = existing || {};
|
|
447
|
+
const { resource_url: _dropIncomingResourceUrl, resourceUrl: _dropIncomingResourceUrlCamel, norefresh: _dropIncomingNoRefresh, noRefresh: _dropIncomingNoRefreshCamel, api_key: _dropIncomingApiKey, apiKey: _dropIncomingApiKeyCamel, ...tokenDataWithoutLegacyQwenFields } = tokenData;
|
|
448
|
+
const rawResourceUrl = typeof tokenData.resource_url === 'string' &&
|
|
449
|
+
String(tokenData.resource_url).trim()
|
|
450
|
+
? String(tokenData.resource_url).trim()
|
|
451
|
+
: typeof tokenData.resourceUrl === 'string' &&
|
|
452
|
+
String(tokenData.resourceUrl).trim()
|
|
453
|
+
? String(tokenData.resourceUrl).trim()
|
|
454
|
+
: undefined;
|
|
455
|
+
const resourceUrl = (() => {
|
|
456
|
+
if (!rawResourceUrl) {
|
|
457
|
+
return undefined;
|
|
458
|
+
}
|
|
459
|
+
let normalized = rawResourceUrl;
|
|
460
|
+
if (!/^https?:\/\//i.test(normalized)) {
|
|
461
|
+
normalized = `https://${normalized}`;
|
|
462
|
+
}
|
|
463
|
+
normalized = normalized.replace(/\/+$/, '');
|
|
464
|
+
try {
|
|
465
|
+
const parsed = new URL(normalized);
|
|
466
|
+
const host = parsed.hostname.trim().toLowerCase();
|
|
467
|
+
const pathname = parsed.pathname.replace(/\/+$/, '');
|
|
468
|
+
const isOfficialQwenCodeHost = host === 'portal.qwen.ai' || host === 'chat.qwen.ai';
|
|
469
|
+
const isDashscopeCompatibleHost = host === 'dashscope.aliyuncs.com' && /^\/compatible-mode(?:\/v1)?$/i.test(pathname);
|
|
470
|
+
if (isOfficialQwenCodeHost && (!pathname || pathname === '/v1')) {
|
|
471
|
+
return parsed.origin;
|
|
472
|
+
}
|
|
473
|
+
if (!isDashscopeCompatibleHost) {
|
|
474
|
+
return undefined;
|
|
475
|
+
}
|
|
476
|
+
return `${parsed.origin}${pathname}`;
|
|
477
|
+
}
|
|
478
|
+
catch {
|
|
479
|
+
return undefined;
|
|
480
|
+
}
|
|
481
|
+
})();
|
|
482
|
+
const stableApiKey = hasStableQwenApiKey(token) ? extractApiKey(token) : undefined;
|
|
483
|
+
return {
|
|
484
|
+
...existingWithoutLegacyQwenFields,
|
|
485
|
+
...tokenDataWithoutLegacyQwenFields,
|
|
486
|
+
status: 'success',
|
|
487
|
+
type: 'qwen',
|
|
488
|
+
...(resolvedAlias ? { alias: resolvedAlias } : {}),
|
|
489
|
+
expires_in: expiresIn,
|
|
490
|
+
access_token: String(token.access_token ?? ''),
|
|
491
|
+
...(resourceUrl ? { resource_url: resourceUrl } : {}),
|
|
492
|
+
...(stableApiKey ? { apiKey: stableApiKey, api_key: stableApiKey, norefresh: true, noRefresh: true } : {})
|
|
493
|
+
};
|
|
340
494
|
}
|
|
341
495
|
return tokenData;
|
|
342
496
|
}
|
|
@@ -346,12 +500,9 @@ function logTokenSnapshot(providerType, token, endpoints) {
|
|
|
346
500
|
const hasAccess = hasAccessToken(token);
|
|
347
501
|
const expRaw = token?.expires_at ?? token?.expired ?? token?.expiry_date ?? null;
|
|
348
502
|
logOAuthDebug(`[OAuth] token.read: provider=${providerType} exists=${Boolean(token)} hasApiKey=${hasApiKey} hasAccess=${hasAccess} expRaw=${String(expRaw)}`);
|
|
349
|
-
if (providerType === 'iflow') {
|
|
350
|
-
logOAuthDebug(`[OAuth] iflow endpoints: deviceCodeUrl=${String(endpoints.deviceCodeUrl)} tokenUrl=${String(endpoints.tokenUrl)}`);
|
|
351
|
-
}
|
|
352
503
|
}
|
|
353
504
|
catch (error) {
|
|
354
|
-
|
|
505
|
+
logOAuthLifecycleNonBlocking('logTokenSnapshot', error, { providerType });
|
|
355
506
|
}
|
|
356
507
|
}
|
|
357
508
|
function buildEndpointOverrides(defaults, auth) {
|
|
@@ -370,25 +521,6 @@ function buildEndpointOverrides(defaults, auth) {
|
|
|
370
521
|
}
|
|
371
522
|
return overridden;
|
|
372
523
|
}
|
|
373
|
-
async function enrichIflowClientConfig(client) {
|
|
374
|
-
const next = { ...client };
|
|
375
|
-
if (hasNonEmptyString(process.env.IFLOW_CLIENT_ID)) {
|
|
376
|
-
next.clientId = process.env.IFLOW_CLIENT_ID.trim();
|
|
377
|
-
}
|
|
378
|
-
if (hasNonEmptyString(process.env.IFLOW_CLIENT_SECRET)) {
|
|
379
|
-
next.clientSecret = process.env.IFLOW_CLIENT_SECRET.trim();
|
|
380
|
-
}
|
|
381
|
-
if (!hasNonEmptyString(next.clientId) || !hasNonEmptyString(next.clientSecret)) {
|
|
382
|
-
const inferred = await inferIflowClientCredsFromLog();
|
|
383
|
-
if (inferred?.clientId && !hasNonEmptyString(next.clientId)) {
|
|
384
|
-
next.clientId = inferred.clientId;
|
|
385
|
-
}
|
|
386
|
-
if (inferred?.clientSecret && !hasNonEmptyString(next.clientSecret)) {
|
|
387
|
-
next.clientSecret = inferred.clientSecret;
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
return next;
|
|
391
|
-
}
|
|
392
524
|
async function buildClientOverrides(defaults, auth, providerType) {
|
|
393
525
|
const base = { ...defaults.client };
|
|
394
526
|
if (hasNonEmptyString(auth.clientId)) {
|
|
@@ -403,9 +535,6 @@ async function buildClientOverrides(defaults, auth, providerType) {
|
|
|
403
535
|
if (hasNonEmptyString(auth.redirectUri)) {
|
|
404
536
|
base.redirectUri = auth.redirectUri;
|
|
405
537
|
}
|
|
406
|
-
if (providerType === 'iflow') {
|
|
407
|
-
return await enrichIflowClientConfig(base);
|
|
408
|
-
}
|
|
409
538
|
return base;
|
|
410
539
|
}
|
|
411
540
|
async function ensureGeminiCLIServicesEnabled(accessToken, projectId) {
|
|
@@ -432,7 +561,7 @@ async function ensureGeminiCLIServicesEnabled(accessToken, projectId) {
|
|
|
432
561
|
}
|
|
433
562
|
}
|
|
434
563
|
catch (error) {
|
|
435
|
-
|
|
564
|
+
logOAuthLifecycleNonBlocking('ensureGeminiCLIServicesEnabled.parseCheckResponse', error, { service, projectId });
|
|
436
565
|
}
|
|
437
566
|
}
|
|
438
567
|
else {
|
|
@@ -443,7 +572,7 @@ async function ensureGeminiCLIServicesEnabled(accessToken, projectId) {
|
|
|
443
572
|
}
|
|
444
573
|
}
|
|
445
574
|
catch (error) {
|
|
446
|
-
|
|
575
|
+
logOAuthLifecycleNonBlocking('ensureGeminiCLIServicesEnabled.checkService', error, { service, projectId });
|
|
447
576
|
// best-effort; continue to try enable
|
|
448
577
|
}
|
|
449
578
|
// 2) 尝试启用服务
|
|
@@ -472,7 +601,7 @@ async function ensureGeminiCLIServicesEnabled(accessToken, projectId) {
|
|
|
472
601
|
}
|
|
473
602
|
}
|
|
474
603
|
catch (error) {
|
|
475
|
-
|
|
604
|
+
logOAuthLifecycleNonBlocking('ensureGeminiCLIServicesEnabled.parseEnableResponse', error, { service, projectId });
|
|
476
605
|
}
|
|
477
606
|
if (enableResp && (enableResp.ok || enableResp.status === 201)) {
|
|
478
607
|
logOAuthDebug(`[OAuth] Gemini CLI: service ${service} enabled for project ${projectId} (status=${enableResp.status})`);
|
|
@@ -487,16 +616,6 @@ async function ensureGeminiCLIServicesEnabled(accessToken, projectId) {
|
|
|
487
616
|
}
|
|
488
617
|
function buildHeaderOverrides(defaults, providerType) {
|
|
489
618
|
const baseHeaders = { ...(defaults.headers || {}) };
|
|
490
|
-
if (providerType === 'iflow') {
|
|
491
|
-
return {
|
|
492
|
-
...baseHeaders,
|
|
493
|
-
'User-Agent': 'iFlow-Cli',
|
|
494
|
-
'X-Requested-With': 'XMLHttpRequest',
|
|
495
|
-
'Origin': 'https://iflow.cn',
|
|
496
|
-
'Referer': 'https://iflow.cn/oauth',
|
|
497
|
-
'Accept': 'application/json'
|
|
498
|
-
};
|
|
499
|
-
}
|
|
500
619
|
return baseHeaders;
|
|
501
620
|
}
|
|
502
621
|
function resolveTokenAliasFromPath(tokenFilePath) {
|
|
@@ -552,18 +671,19 @@ async function buildOverrides(providerType, defaults, auth, openBrowser, tokenFi
|
|
|
552
671
|
}
|
|
553
672
|
return { overrides, endpoints, client };
|
|
554
673
|
}
|
|
555
|
-
async function finalizeTokenWrite(providerType, strategy, tokenFilePath, tokenData, reason) {
|
|
674
|
+
async function finalizeTokenWrite(providerType, strategy, tokenFilePath, tokenData, reason, options) {
|
|
556
675
|
if (!tokenData || typeof strategy.saveToken !== 'function') {
|
|
557
676
|
return;
|
|
558
677
|
}
|
|
559
|
-
const enriched = await maybeEnrichToken(providerType, tokenData, tokenFilePath);
|
|
678
|
+
const enriched = await maybeEnrichToken(providerType, tokenData, tokenFilePath, options);
|
|
560
679
|
const prepared = await prepareTokenForStorage(providerType, tokenFilePath, enriched);
|
|
561
680
|
await strategy.saveToken(prepared);
|
|
562
681
|
logOAuthDebug(`[OAuth] Token ${reason} saved: ${tokenFilePath}`);
|
|
563
682
|
}
|
|
564
|
-
async function maybeEnrichToken(providerType, tokenData, tokenFilePath) {
|
|
683
|
+
async function maybeEnrichToken(providerType, tokenData, tokenFilePath, options) {
|
|
565
684
|
if (providerType === 'qwen') {
|
|
566
685
|
const sanitized = sanitizeToken(tokenData) ?? tokenData;
|
|
686
|
+
const tokenRecord = tokenData;
|
|
567
687
|
if (hasStableQwenApiKey(sanitized)) {
|
|
568
688
|
return tokenData;
|
|
569
689
|
}
|
|
@@ -572,6 +692,29 @@ async function maybeEnrichToken(providerType, tokenData, tokenFilePath) {
|
|
|
572
692
|
logOAuthDebug('[OAuth] Qwen: no access_token found in auth result, skipping API Key fetch');
|
|
573
693
|
return tokenData;
|
|
574
694
|
}
|
|
695
|
+
if (options?.strictQwenValidation) {
|
|
696
|
+
try {
|
|
697
|
+
const resourceUrl = typeof sanitized.resource_url === 'string' && sanitized.resource_url.trim()
|
|
698
|
+
? sanitized.resource_url.trim()
|
|
699
|
+
: typeof tokenRecord.resource_url === 'string' && tokenRecord.resource_url.trim()
|
|
700
|
+
? tokenRecord.resource_url.trim()
|
|
701
|
+
: typeof tokenRecord.resourceUrl === 'string' && tokenRecord.resourceUrl.trim()
|
|
702
|
+
? tokenRecord.resourceUrl.trim()
|
|
703
|
+
: undefined;
|
|
704
|
+
const model = typeof tokenRecord.model === 'string' && tokenRecord.model.trim()
|
|
705
|
+
? tokenRecord.model.trim()
|
|
706
|
+
: undefined;
|
|
707
|
+
await validateQwenAccessToken({
|
|
708
|
+
accessToken,
|
|
709
|
+
resourceUrl,
|
|
710
|
+
model
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
catch (error) {
|
|
714
|
+
const msg = formatOAuthErrorMessage(error);
|
|
715
|
+
throw new Error(`[OAuth] Qwen token validation failed after refresh/acquire: ${msg}`);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
575
718
|
try {
|
|
576
719
|
const userInfo = await fetchQwenUserInfo(accessToken);
|
|
577
720
|
if (userInfo.apiKey) {
|
|
@@ -583,29 +726,7 @@ async function maybeEnrichToken(providerType, tokenData, tokenFilePath) {
|
|
|
583
726
|
return mergeQwenTokenData(tokenData, userInfo);
|
|
584
727
|
}
|
|
585
728
|
catch (error) {
|
|
586
|
-
|
|
587
|
-
// If userInfo endpoint is unavailable (404), treat access_token as api_key to avoid repeated lookups.
|
|
588
|
-
if (/\bHTTP\s+404\b/i.test(msg) || /\bnot\s+found\b/i.test(msg)) {
|
|
589
|
-
logOAuthDebug('[OAuth] Qwen: userInfo endpoint unavailable (404); using access_token as api_key fallback');
|
|
590
|
-
return mergeQwenTokenData(tokenData, { apiKey: accessToken });
|
|
591
|
-
}
|
|
592
|
-
logOAuthDebug(`[OAuth] Qwen: failed to fetch user info - ${msg}`);
|
|
593
|
-
return tokenData;
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
if (providerType === 'iflow') {
|
|
597
|
-
const accessToken = extractAccessToken(sanitizeToken(tokenData) ?? null);
|
|
598
|
-
if (!accessToken) {
|
|
599
|
-
logOAuthDebug('[OAuth] iFlow: no access_token found in auth result, skipping API Key fetch');
|
|
600
|
-
return tokenData;
|
|
601
|
-
}
|
|
602
|
-
try {
|
|
603
|
-
const userInfo = await fetchIFlowUserInfo(accessToken);
|
|
604
|
-
logOAuthDebug(`[OAuth] iFlow: successfully fetched API Key for ${userInfo.email}`);
|
|
605
|
-
return mergeIFlowTokenData(tokenData, userInfo);
|
|
606
|
-
}
|
|
607
|
-
catch (error) {
|
|
608
|
-
console.error(`[OAuth] iFlow: failed to fetch API Key - ${formatOAuthErrorMessage(error)}`);
|
|
729
|
+
logOAuthLifecycleNonBlocking('maybeEnrichToken.qwenUserInfo', error, { tokenFilePath, fallback: 'keep_token_data' });
|
|
609
730
|
return tokenData;
|
|
610
731
|
}
|
|
611
732
|
}
|
|
@@ -668,7 +789,7 @@ async function maybeEnrichToken(providerType, tokenData, tokenFilePath) {
|
|
|
668
789
|
catch (error) {
|
|
669
790
|
const msg = error instanceof Error ? error.message : String(error);
|
|
670
791
|
logOAuthDebug(`[OAuth] ${label}: service enablement failed for project ${projectId} - ${msg}`);
|
|
671
|
-
// 服务启用失败不再视为致命错误,后续真实调用时再由
|
|
792
|
+
// 服务启用失败不再视为致命错误,后续真实调用时再由 Virtual Router provider-runtime-ingress 处理。
|
|
672
793
|
}
|
|
673
794
|
}
|
|
674
795
|
return merged;
|
|
@@ -698,12 +819,9 @@ function logOAuthSetup(providerType, defaults, overrides, endpoints, client, tok
|
|
|
698
819
|
if (endpoints.deviceCodeUrl || endpoints.authorizationUrl) {
|
|
699
820
|
logOAuthDebug(`[OAuth] endpoints: deviceCodeUrl=${String(endpoints.deviceCodeUrl || '')} tokenUrl=${String(endpoints.tokenUrl)} authUrl=${String(endpoints.authorizationUrl || '')} userInfoUrl=${String(endpoints.userInfoUrl || '')}`);
|
|
700
821
|
}
|
|
701
|
-
if (providerType === 'iflow') {
|
|
702
|
-
logOAuthDebug(`[OAuth] iflow client: id=${String(client.clientId || '(missing)')} secret=${client.clientSecret ? '(present)' : '(missing)'} redirect=${String(client.redirectUri || '(default)')}`);
|
|
703
|
-
}
|
|
704
822
|
}
|
|
705
823
|
catch (error) {
|
|
706
|
-
|
|
824
|
+
logOAuthLifecycleNonBlocking('logEnsureContext', error, { providerType, tokenFilePath });
|
|
707
825
|
}
|
|
708
826
|
}
|
|
709
827
|
function createStrategy(providerType, overrides, tokenFilePath) {
|
|
@@ -780,7 +898,7 @@ function readInteractiveOAuthLock() {
|
|
|
780
898
|
};
|
|
781
899
|
}
|
|
782
900
|
catch (error) {
|
|
783
|
-
|
|
901
|
+
logOAuthLifecycleNonBlocking('readInteractiveOAuthLock', error, {
|
|
784
902
|
lockFile: OAUTH_INTERACTIVE_LOCK_FILE
|
|
785
903
|
});
|
|
786
904
|
return null;
|
|
@@ -799,7 +917,8 @@ function isProcessAlive(pid) {
|
|
|
799
917
|
process.kill(pid, 0);
|
|
800
918
|
return true;
|
|
801
919
|
}
|
|
802
|
-
catch {
|
|
920
|
+
catch (error) {
|
|
921
|
+
logOAuthLifecycleNonBlocking('isProcessAlive', error, { pid }, { throttleKey: keyFor('interactive-oauth-process-alive', String(pid)) });
|
|
803
922
|
return false;
|
|
804
923
|
}
|
|
805
924
|
}
|
|
@@ -814,7 +933,7 @@ async function forceReclaimInteractiveOAuthLock(lock) {
|
|
|
814
933
|
return true;
|
|
815
934
|
}
|
|
816
935
|
catch (error) {
|
|
817
|
-
|
|
936
|
+
logOAuthLifecycleNonBlocking('forceReclaimInteractiveOAuthLock', error, {
|
|
818
937
|
pid: lock.pid,
|
|
819
938
|
providerType: lock.providerType,
|
|
820
939
|
tokenFile: lock.tokenFile
|
|
@@ -856,7 +975,7 @@ async function acquireInteractiveOAuthLock(providerType, tokenFilePath) {
|
|
|
856
975
|
}
|
|
857
976
|
}
|
|
858
977
|
catch (error) {
|
|
859
|
-
|
|
978
|
+
logOAuthLifecycleNonBlocking('acquireInteractiveOAuthLock.release', error, {
|
|
860
979
|
lockFile: OAUTH_INTERACTIVE_LOCK_FILE,
|
|
861
980
|
providerType,
|
|
862
981
|
tokenFile: current.tokenFile
|
|
@@ -880,7 +999,7 @@ async function acquireInteractiveOAuthLock(providerType, tokenFilePath) {
|
|
|
880
999
|
await fs.unlink(OAUTH_INTERACTIVE_LOCK_FILE);
|
|
881
1000
|
}
|
|
882
1001
|
catch (error) {
|
|
883
|
-
|
|
1002
|
+
logOAuthLifecycleNonBlocking('acquireInteractiveOAuthLock.removeStaleEmptyLock', error, {
|
|
884
1003
|
lockFile: OAUTH_INTERACTIVE_LOCK_FILE,
|
|
885
1004
|
providerType,
|
|
886
1005
|
tokenFile: current.tokenFile
|
|
@@ -893,7 +1012,7 @@ async function acquireInteractiveOAuthLock(providerType, tokenFilePath) {
|
|
|
893
1012
|
await fs.unlink(OAUTH_INTERACTIVE_LOCK_FILE);
|
|
894
1013
|
}
|
|
895
1014
|
catch (error) {
|
|
896
|
-
|
|
1015
|
+
logOAuthLifecycleNonBlocking('acquireInteractiveOAuthLock.removeDeadProcessLock', error, {
|
|
897
1016
|
lockFile: OAUTH_INTERACTIVE_LOCK_FILE,
|
|
898
1017
|
stalePid: existing.pid,
|
|
899
1018
|
providerType: existing.providerType,
|
|
@@ -922,66 +1041,6 @@ async function acquireInteractiveOAuthLock(providerType, tokenFilePath) {
|
|
|
922
1041
|
}
|
|
923
1042
|
throw new Error('Failed to acquire interactive OAuth lock after multiple attempts');
|
|
924
1043
|
}
|
|
925
|
-
function readIflowAutoFailureState() {
|
|
926
|
-
try {
|
|
927
|
-
if (!fsSync.existsSync(IFLOW_AUTO_FAILURE_FILE)) {
|
|
928
|
-
return {};
|
|
929
|
-
}
|
|
930
|
-
const raw = fsSync.readFileSync(IFLOW_AUTO_FAILURE_FILE, 'utf8');
|
|
931
|
-
const parsed = JSON.parse(raw);
|
|
932
|
-
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
933
|
-
return {};
|
|
934
|
-
}
|
|
935
|
-
return parsed;
|
|
936
|
-
}
|
|
937
|
-
catch (error) {
|
|
938
|
-
logOAuthLifecycleNonBlockingError('readIflowAutoFailureState', error, {
|
|
939
|
-
file: IFLOW_AUTO_FAILURE_FILE
|
|
940
|
-
});
|
|
941
|
-
return {};
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
function writeIflowAutoFailureState(state) {
|
|
945
|
-
try {
|
|
946
|
-
fsSync.mkdirSync(path.dirname(IFLOW_AUTO_FAILURE_FILE), { recursive: true });
|
|
947
|
-
fsSync.writeFileSync(IFLOW_AUTO_FAILURE_FILE, `${JSON.stringify(state, null, 2)}\n`, 'utf8');
|
|
948
|
-
}
|
|
949
|
-
catch (error) {
|
|
950
|
-
logOAuthLifecycleNonBlockingError('writeIflowAutoFailureState', error, { file: IFLOW_AUTO_FAILURE_FILE }, { warn: true });
|
|
951
|
-
}
|
|
952
|
-
}
|
|
953
|
-
function resolveIflowFailureKey(tokenFilePath) {
|
|
954
|
-
return path.resolve(tokenFilePath);
|
|
955
|
-
}
|
|
956
|
-
function clearIflowAutoFailureState(tokenFilePath) {
|
|
957
|
-
const state = readIflowAutoFailureState();
|
|
958
|
-
const key = resolveIflowFailureKey(tokenFilePath);
|
|
959
|
-
if (!state[key]) {
|
|
960
|
-
return;
|
|
961
|
-
}
|
|
962
|
-
delete state[key];
|
|
963
|
-
writeIflowAutoFailureState(state);
|
|
964
|
-
}
|
|
965
|
-
function markIflowAutoFailureState(tokenFilePath, maxAttempts, errorText) {
|
|
966
|
-
const state = readIflowAutoFailureState();
|
|
967
|
-
const key = resolveIflowFailureKey(tokenFilePath);
|
|
968
|
-
const previous = state[key];
|
|
969
|
-
const nextCount = (previous?.count || 0) + 1;
|
|
970
|
-
const record = {
|
|
971
|
-
count: nextCount,
|
|
972
|
-
manualRequired: nextCount >= maxAttempts,
|
|
973
|
-
updatedAt: Date.now(),
|
|
974
|
-
lastError: errorText
|
|
975
|
-
};
|
|
976
|
-
state[key] = record;
|
|
977
|
-
writeIflowAutoFailureState(state);
|
|
978
|
-
return record;
|
|
979
|
-
}
|
|
980
|
-
function getIflowAutoFailureState(tokenFilePath) {
|
|
981
|
-
const state = readIflowAutoFailureState();
|
|
982
|
-
const key = resolveIflowFailureKey(tokenFilePath);
|
|
983
|
-
return state[key] || null;
|
|
984
|
-
}
|
|
985
1044
|
async function runInteractiveAuthorizationFlow(providerType, overrides, tokenFilePath, openBrowser, forceTokenReset, forceReauth) {
|
|
986
1045
|
const execute = async () => {
|
|
987
1046
|
let backupFile = null;
|
|
@@ -991,14 +1050,11 @@ async function runInteractiveAuthorizationFlow(providerType, overrides, tokenFil
|
|
|
991
1050
|
backupFile = await backupTokenFile(tokenFilePath);
|
|
992
1051
|
}
|
|
993
1052
|
try {
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
const authed = await strategy.authenticate?.({ openBrowser, forceReauthorize: forceReauth });
|
|
1000
|
-
await finalizeTokenWrite(providerType, strategy, tokenFilePath, authed, 'acquired');
|
|
1001
|
-
}
|
|
1053
|
+
const strategy = createStrategy(providerType, overrides, tokenFilePath);
|
|
1054
|
+
const authed = await strategy.authenticate?.({ openBrowser, forceReauthorize: forceReauth });
|
|
1055
|
+
await finalizeTokenWrite(providerType, strategy, tokenFilePath, authed, 'acquired', {
|
|
1056
|
+
strictQwenValidation: providerType === 'qwen'
|
|
1057
|
+
});
|
|
1002
1058
|
await discardBackupFile(backupFile);
|
|
1003
1059
|
if (openBrowser && shouldAutoCloseOAuthBrowserSession()) {
|
|
1004
1060
|
// Optional: close only after token is fully written; never close browser on failed auth.
|
|
@@ -1033,78 +1089,6 @@ async function runInteractiveAuthorizationFlow(providerType, overrides, tokenFil
|
|
|
1033
1089
|
interactiveTail.next = queued.then(() => undefined, () => undefined);
|
|
1034
1090
|
await queued;
|
|
1035
1091
|
}
|
|
1036
|
-
async function runIflowAuthorizationSequence(providerType, overrides, tokenFilePath, forceReauth) {
|
|
1037
|
-
const authCodeOverrides = { ...overrides, flowType: OAuthFlowType.AUTHORIZATION_CODE };
|
|
1038
|
-
const autoMode = String(process.env.ROUTECODEX_CAMOUFOX_AUTO_MODE || '').trim().toLowerCase();
|
|
1039
|
-
if (autoMode === 'iflow') {
|
|
1040
|
-
// Auto mode should stay single-path to keep retry lifecycle deterministic.
|
|
1041
|
-
await executeAuthFlow(providerType, authCodeOverrides, tokenFilePath, forceReauth);
|
|
1042
|
-
return;
|
|
1043
|
-
}
|
|
1044
|
-
try {
|
|
1045
|
-
await executeAuthFlow(providerType, authCodeOverrides, tokenFilePath, forceReauth);
|
|
1046
|
-
return;
|
|
1047
|
-
}
|
|
1048
|
-
catch (firstError) {
|
|
1049
|
-
logOAuthDebug(`[OAuth] auth_code flow failed: ${firstError instanceof Error ? firstError.message : String(firstError || '')}`);
|
|
1050
|
-
}
|
|
1051
|
-
const deviceOverrides = { ...overrides, flowType: OAuthFlowType.DEVICE_CODE };
|
|
1052
|
-
await executeAuthFlow(providerType, deviceOverrides, tokenFilePath, forceReauth);
|
|
1053
|
-
}
|
|
1054
|
-
async function executeAuthFlow(providerType, overrides, tokenFilePath, forceReauth) {
|
|
1055
|
-
const runOnce = async () => {
|
|
1056
|
-
const strategy = createStrategy(providerType, overrides, tokenFilePath);
|
|
1057
|
-
const authed = await strategy.authenticate?.({ openBrowser: true, forceReauthorize: forceReauth });
|
|
1058
|
-
await finalizeTokenWrite(providerType, strategy, tokenFilePath, authed, overrides.flowType ? `acquired (${String(overrides.flowType)})` : 'acquired');
|
|
1059
|
-
};
|
|
1060
|
-
const autoMode = String(process.env.ROUTECODEX_CAMOUFOX_AUTO_MODE || '').trim().toLowerCase();
|
|
1061
|
-
const iflowAutoEnabled = providerType === 'iflow' && autoMode === 'iflow';
|
|
1062
|
-
if (!iflowAutoEnabled) {
|
|
1063
|
-
await runOnce();
|
|
1064
|
-
if (providerType === 'iflow') {
|
|
1065
|
-
clearIflowAutoFailureState(tokenFilePath);
|
|
1066
|
-
}
|
|
1067
|
-
return;
|
|
1068
|
-
}
|
|
1069
|
-
const headfulMode = isTruthyFlag(process.env.ROUTECODEX_CAMOUFOX_DEV_MODE);
|
|
1070
|
-
const maxAutoAttemptsRaw = Number.parseInt(String(process.env.ROUTECODEX_IFLOW_AUTO_MAX_ATTEMPTS || '').trim(), 10);
|
|
1071
|
-
const maxAutoAttempts = Number.isFinite(maxAutoAttemptsRaw) && maxAutoAttemptsRaw > 0 ? maxAutoAttemptsRaw : 3;
|
|
1072
|
-
const retryDelayRaw = Number.parseInt(String(process.env.ROUTECODEX_IFLOW_AUTO_RETRY_DELAY_MS || '').trim(), 10);
|
|
1073
|
-
const retryDelayMs = Number.isFinite(retryDelayRaw) && retryDelayRaw >= 0 ? retryDelayRaw : 1000;
|
|
1074
|
-
// Headful run is considered manual trigger; successful manual run clears auto failure gate.
|
|
1075
|
-
if (headfulMode) {
|
|
1076
|
-
await runOnce();
|
|
1077
|
-
clearIflowAutoFailureState(tokenFilePath);
|
|
1078
|
-
return;
|
|
1079
|
-
}
|
|
1080
|
-
const existingFailure = getIflowAutoFailureState(tokenFilePath);
|
|
1081
|
-
if (existingFailure?.manualRequired) {
|
|
1082
|
-
throw new Error(`[OAuth] iflow auto auth is disabled for token=${tokenFilePath} after ${existingFailure.count} failures. Manual trigger required.`);
|
|
1083
|
-
}
|
|
1084
|
-
let lastError = null;
|
|
1085
|
-
for (let attempt = 1; attempt <= maxAutoAttempts; attempt += 1) {
|
|
1086
|
-
try {
|
|
1087
|
-
await runOnce();
|
|
1088
|
-
clearIflowAutoFailureState(tokenFilePath);
|
|
1089
|
-
return;
|
|
1090
|
-
}
|
|
1091
|
-
catch (error) {
|
|
1092
|
-
lastError = error;
|
|
1093
|
-
const msg = error instanceof Error ? error.message : String(error || '');
|
|
1094
|
-
const record = markIflowAutoFailureState(tokenFilePath, maxAutoAttempts, msg);
|
|
1095
|
-
logOAuthDebug(`[OAuth] iflow auto auth attempt ${attempt}/${maxAutoAttempts} failed: ${msg} ` +
|
|
1096
|
-
`(failureCount=${record.count} manualRequired=${record.manualRequired ? '1' : '0'})`);
|
|
1097
|
-
if (attempt < maxAutoAttempts) {
|
|
1098
|
-
await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
|
|
1099
|
-
}
|
|
1100
|
-
}
|
|
1101
|
-
}
|
|
1102
|
-
const finalRecord = getIflowAutoFailureState(tokenFilePath);
|
|
1103
|
-
if (finalRecord?.manualRequired) {
|
|
1104
|
-
throw new Error(`[OAuth] iflow auto auth failed ${finalRecord.count} times; manual trigger is required and auto retries are suspended.`);
|
|
1105
|
-
}
|
|
1106
|
-
throw (lastError instanceof Error ? lastError : new Error(String(lastError || 'iflow auto auth failed')));
|
|
1107
|
-
}
|
|
1108
1092
|
export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
|
|
1109
1093
|
if (!isOAuthConfig(auth)) {
|
|
1110
1094
|
return;
|
|
@@ -1118,11 +1102,12 @@ export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
|
|
|
1118
1102
|
// Only treat "open browser" as explicit user intent when caller passed it explicitly.
|
|
1119
1103
|
// This prevents background flows (daemon/provider init) from bypassing noRefresh due to env defaults.
|
|
1120
1104
|
const openBrowserRequested = opts.openBrowser === true;
|
|
1105
|
+
const forceRefreshRequested = opts.forceRefresh === true;
|
|
1121
1106
|
// 当 opts.forceReauthorize 显式为 true 时,跳过节流检查,
|
|
1122
1107
|
// 确保来自上游 401/406 等认证错误的修复请求不会被初始化阶段的调用吞掉。
|
|
1123
1108
|
// Explicit user-triggered OAuth (openBrowser=true) must also bypass throttle,
|
|
1124
1109
|
// otherwise repeated "Authorize" clicks in WebUI can become a silent no-op.
|
|
1125
|
-
if (!opts.forceReauthorize && !openBrowserRequested && shouldThrottle(cacheKey)) {
|
|
1110
|
+
if (!opts.forceReauthorize && !openBrowserRequested && !forceRefreshRequested && shouldThrottle(cacheKey)) {
|
|
1126
1111
|
return;
|
|
1127
1112
|
}
|
|
1128
1113
|
const aliasInfo = parseTokenSequenceFromPath(tokenFilePath);
|
|
@@ -1142,6 +1127,14 @@ export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
|
|
|
1142
1127
|
logOAuthSetup(providerType, defaults, overrides, endpoints, client, tokenFilePath, openBrowser, forceReauth);
|
|
1143
1128
|
const strategy = createStrategy(providerType, overrides, tokenFilePath);
|
|
1144
1129
|
let token = await readTokenFromFile(tokenFilePath);
|
|
1130
|
+
if (!token) {
|
|
1131
|
+
token = await maybeAdoptOfficialQwenCodeToken({
|
|
1132
|
+
providerType,
|
|
1133
|
+
tokenFilePath,
|
|
1134
|
+
currentToken: null,
|
|
1135
|
+
strategy
|
|
1136
|
+
});
|
|
1137
|
+
}
|
|
1145
1138
|
const hadExistingTokenFile = token !== null;
|
|
1146
1139
|
// Qwen: ensure api_key is present even when access_token is still valid.
|
|
1147
1140
|
// Qwen OpenAI-compatible endpoints may require api_key (not access_token) for business requests.
|
|
@@ -1189,35 +1182,60 @@ export async function ensureValidOAuthToken(providerType, auth, opts = {}) {
|
|
|
1189
1182
|
}
|
|
1190
1183
|
logTokenSnapshot(providerType, token, endpoints);
|
|
1191
1184
|
const tokenState = evaluateTokenState(token, providerType);
|
|
1192
|
-
const noRefresh =
|
|
1193
|
-
if (noRefresh && !forceReauth && !openBrowserRequested) {
|
|
1185
|
+
const noRefresh = shouldHonorNoRefresh(providerType, token);
|
|
1186
|
+
if (noRefresh && !forceReauth && !openBrowserRequested && !forceRefreshRequested) {
|
|
1194
1187
|
logOAuthDebug(`[OAuth] norefresh flag set for provider=${providerType} tokenFile=${tokenFilePath} - skip auto-refresh and re-authorization.`);
|
|
1195
1188
|
updateThrottle(cacheKey);
|
|
1196
1189
|
return;
|
|
1197
1190
|
}
|
|
1198
|
-
if (!forceReauth && tokenState.validAccess) {
|
|
1191
|
+
if (!forceReauth && !forceRefreshRequested && tokenState.validAccess) {
|
|
1199
1192
|
logOAuthDebug(`[OAuth] Using existing token (${tokenState.hasApiKey ? 'apiKey' : 'access_token'} valid). No authorization required.`);
|
|
1200
1193
|
updateThrottle(cacheKey);
|
|
1201
1194
|
return;
|
|
1202
1195
|
}
|
|
1203
1196
|
if (!forceReauth &&
|
|
1204
|
-
tokenState.isExpiredOrNear &&
|
|
1197
|
+
(forceRefreshRequested || tokenState.isExpiredOrNear) &&
|
|
1205
1198
|
token?.refresh_token &&
|
|
1206
1199
|
typeof strategy.refreshToken === 'function') {
|
|
1207
1200
|
try {
|
|
1208
|
-
logOAuthDebug(
|
|
1201
|
+
logOAuthDebug(forceRefreshRequested
|
|
1202
|
+
? '[OAuth] refreshing token (forced by upstream invalid-token repair)...'
|
|
1203
|
+
: '[OAuth] refreshing token...');
|
|
1209
1204
|
const refreshed = await strategy.refreshToken(token.refresh_token);
|
|
1210
|
-
await finalizeTokenWrite(providerType, strategy, tokenFilePath, refreshed, 'refreshed and saved'
|
|
1205
|
+
await finalizeTokenWrite(providerType, strategy, tokenFilePath, refreshed, 'refreshed and saved', {
|
|
1206
|
+
strictQwenValidation: providerType === 'qwen'
|
|
1207
|
+
});
|
|
1211
1208
|
updateThrottle(cacheKey);
|
|
1212
1209
|
return;
|
|
1213
1210
|
}
|
|
1214
1211
|
catch (error) {
|
|
1215
1212
|
const message = error instanceof Error ? error.message : String(error || '');
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1213
|
+
if (providerType === 'qwen' &&
|
|
1214
|
+
isPermanentOAuthRefreshErrorMessage(message)) {
|
|
1215
|
+
try {
|
|
1216
|
+
const adopted = await maybeAdoptOfficialQwenCodeToken({
|
|
1217
|
+
providerType,
|
|
1218
|
+
tokenFilePath,
|
|
1219
|
+
currentToken: token,
|
|
1220
|
+
strategy,
|
|
1221
|
+
force: true
|
|
1222
|
+
});
|
|
1223
|
+
const adoptedRefreshToken = extractRefreshTokenString(adopted);
|
|
1224
|
+
if (adoptedRefreshToken && adoptedRefreshToken !== extractRefreshTokenString(token)) {
|
|
1225
|
+
logOAuthDebug('[OAuth] Qwen default: refresh failed, retrying with official qwen code token');
|
|
1226
|
+
const refreshed = await strategy.refreshToken(adoptedRefreshToken);
|
|
1227
|
+
await finalizeTokenWrite(providerType, strategy, tokenFilePath, refreshed, 'repaired from official qwen code token and saved', {
|
|
1228
|
+
strictQwenValidation: true
|
|
1229
|
+
});
|
|
1230
|
+
updateThrottle(cacheKey);
|
|
1231
|
+
return;
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
catch (repairError) {
|
|
1235
|
+
logOAuthLifecycleNonBlocking('qwen_default_official_token_repair', repairError, { tokenFilePath });
|
|
1236
|
+
}
|
|
1220
1237
|
}
|
|
1238
|
+
applyRefreshFailureBackoff(cacheKey, providerType, message);
|
|
1221
1239
|
if (!opts.forceReacquireIfRefreshFails) {
|
|
1222
1240
|
throw error;
|
|
1223
1241
|
}
|
|
@@ -1261,6 +1279,41 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
|
|
|
1261
1279
|
const pt = providerType.toLowerCase();
|
|
1262
1280
|
const allowBlocking = options?.allowBlocking !== false;
|
|
1263
1281
|
const ensureValid = options?.ensureValidOAuthToken ?? ensureValidOAuthToken;
|
|
1282
|
+
let tokenFilePath;
|
|
1283
|
+
const autoOAuthDisabled = isAutoOAuthDisabledProvider(providerType);
|
|
1284
|
+
const attemptSilentRefreshOnly = async (lowerMessage) => {
|
|
1285
|
+
try {
|
|
1286
|
+
await withOAuthRepairEnv(providerType, async () => {
|
|
1287
|
+
await ensureValid(providerType, auth, {
|
|
1288
|
+
forceReacquireIfRefreshFails: false,
|
|
1289
|
+
openBrowser: false,
|
|
1290
|
+
forceReauthorize: false,
|
|
1291
|
+
forceRefresh: pt === 'qwen'
|
|
1292
|
+
});
|
|
1293
|
+
});
|
|
1294
|
+
if (tokenFilePath) {
|
|
1295
|
+
await markInteractiveOAuthRepairSuccess({
|
|
1296
|
+
providerType,
|
|
1297
|
+
tokenFile: tokenFilePath
|
|
1298
|
+
});
|
|
1299
|
+
}
|
|
1300
|
+
return true;
|
|
1301
|
+
}
|
|
1302
|
+
catch (error) {
|
|
1303
|
+
const refreshMsg = error instanceof Error ? error.message : String(error);
|
|
1304
|
+
if (pt === 'qwen' && isPermanentOAuthRefreshErrorMessage(refreshMsg)) {
|
|
1305
|
+
await maybeMarkTokenFileNoRefresh(tokenFilePath || '');
|
|
1306
|
+
logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.qwenPermanentRefreshFailure', new Error('qwen silent refresh permanently failed; standard re-auth required'), { providerType, tokenFilePath, reason: refreshMsg }, { warn: true, throttleKey: `qwen-permanent-refresh:${tokenFilePath || 'unknown'}` });
|
|
1307
|
+
return false;
|
|
1308
|
+
}
|
|
1309
|
+
if (pt === 'qwen') {
|
|
1310
|
+
logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.qwenSilentRefreshFailure', new Error('qwen silent refresh failed; standard re-auth required'), { providerType, tokenFilePath, reason: refreshMsg }, { warn: true, throttleKey: `qwen-silent-refresh:${tokenFilePath || 'unknown'}` });
|
|
1311
|
+
return false;
|
|
1312
|
+
}
|
|
1313
|
+
logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.autoOAuthDisabled', new Error('auto OAuth has been removed for this provider; manual re-auth required'), { providerType, tokenFilePath, reason: refreshMsg }, { warn: true, throttleKey: `oauth-auto-disabled:${providerType}:${tokenFilePath || 'unknown'}` });
|
|
1314
|
+
return false;
|
|
1315
|
+
}
|
|
1316
|
+
};
|
|
1264
1317
|
try {
|
|
1265
1318
|
if (!shouldTriggerInteractiveOAuthRepair(providerType, upstreamError)) {
|
|
1266
1319
|
return false;
|
|
@@ -1272,7 +1325,14 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
|
|
|
1272
1325
|
: String(upstreamError || '');
|
|
1273
1326
|
const lower = msg.toLowerCase();
|
|
1274
1327
|
const statusCode = extractStatusCode(upstreamError);
|
|
1275
|
-
|
|
1328
|
+
tokenFilePath = resolveTokenFilePath(auth, providerType);
|
|
1329
|
+
if (pt === 'qwen' && await hasTokenFileNoRefresh(tokenFilePath)) {
|
|
1330
|
+
logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.qwenNoRefresh', new Error('qwen auto-refresh disabled; standard re-auth required'), { providerType, tokenFilePath }, { warn: true, throttleKey: `qwen-norefresh:${tokenFilePath}` });
|
|
1331
|
+
return false;
|
|
1332
|
+
}
|
|
1333
|
+
if (autoOAuthDisabled) {
|
|
1334
|
+
return await attemptSilentRefreshOnly(lower);
|
|
1335
|
+
}
|
|
1276
1336
|
const cooldownReason = statusCode === 403 && isGoogleAccountVerificationRequiredMessage(lower) ? 'google_verify' : 'generic';
|
|
1277
1337
|
const gate = await shouldSkipInteractiveOAuthRepair({
|
|
1278
1338
|
providerType,
|
|
@@ -1309,32 +1369,39 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
|
|
|
1309
1369
|
}
|
|
1310
1370
|
return false;
|
|
1311
1371
|
}
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
forceReauthorize: false
|
|
1320
|
-
});
|
|
1321
|
-
});
|
|
1322
|
-
await markInteractiveOAuthRepairSuccess({
|
|
1323
|
-
providerType,
|
|
1324
|
-
tokenFile: tokenFilePath
|
|
1372
|
+
try {
|
|
1373
|
+
await withOAuthRepairEnv(providerType, async () => {
|
|
1374
|
+
await ensureValid(providerType, auth, {
|
|
1375
|
+
forceReacquireIfRefreshFails: false,
|
|
1376
|
+
openBrowser: false,
|
|
1377
|
+
forceReauthorize: false,
|
|
1378
|
+
forceRefresh: pt === 'qwen'
|
|
1325
1379
|
});
|
|
1326
|
-
|
|
1380
|
+
});
|
|
1381
|
+
await markInteractiveOAuthRepairSuccess({
|
|
1382
|
+
providerType,
|
|
1383
|
+
tokenFile: tokenFilePath
|
|
1384
|
+
});
|
|
1385
|
+
return true;
|
|
1386
|
+
}
|
|
1387
|
+
catch (error) {
|
|
1388
|
+
const refreshMsg = error instanceof Error ? error.message : String(error);
|
|
1389
|
+
if (pt === 'qwen' && isPermanentOAuthRefreshErrorMessage(refreshMsg)) {
|
|
1390
|
+
await maybeMarkTokenFileNoRefresh(tokenFilePath);
|
|
1391
|
+
logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.qwenPermanentRefreshFailure', new Error('qwen silent refresh permanently failed; standard re-auth required'), { providerType, tokenFilePath, reason: refreshMsg }, { warn: true, throttleKey: `qwen-permanent-refresh:${tokenFilePath}` });
|
|
1392
|
+
return false;
|
|
1327
1393
|
}
|
|
1328
|
-
|
|
1329
|
-
|
|
1394
|
+
if (pt === 'qwen') {
|
|
1395
|
+
logOAuthLifecycleNonBlocking('handleUpstreamInvalidOAuthToken.qwenSilentRefreshFailure', new Error('qwen silent refresh failed; standard re-auth required'), { providerType, tokenFilePath, reason: refreshMsg }, { warn: true, throttleKey: `qwen-silent-refresh:${tokenFilePath}` });
|
|
1396
|
+
return false;
|
|
1330
1397
|
}
|
|
1398
|
+
logOAuthDebug(`[OAuth] silent refresh failed; falling back to background interactive repair (provider=${providerType}) - ${refreshMsg}`);
|
|
1331
1399
|
}
|
|
1332
1400
|
const interactiveOpts = {
|
|
1333
1401
|
forceReacquireIfRefreshFails: true,
|
|
1334
1402
|
openBrowser: true,
|
|
1335
|
-
// 上游已经明确返回“认证失效”(包括 iflow 的 406/439),
|
|
1336
1403
|
// 此时强制跳过节流并允许走完整 OAuth 流程。
|
|
1337
|
-
forceReauthorize: pt === 'gemini' || pt === 'gemini-cli' || pt === 'antigravity' || pt === '
|
|
1404
|
+
forceReauthorize: pt === 'gemini' || pt === 'gemini-cli' || pt === 'antigravity' || pt === 'qwen'
|
|
1338
1405
|
};
|
|
1339
1406
|
void withOAuthRepairEnv(providerType, async () => {
|
|
1340
1407
|
await runInteractiveRepairWithAutoFallback({
|
|
@@ -1351,9 +1418,8 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
|
|
|
1351
1418
|
const opts = {
|
|
1352
1419
|
forceReacquireIfRefreshFails: true,
|
|
1353
1420
|
openBrowser: true,
|
|
1354
|
-
// 上游已经明确返回“认证失效”(包括 iflow 的 406/439),
|
|
1355
1421
|
// 此时强制跳过节流并允许走完整 OAuth 流程。
|
|
1356
|
-
forceReauthorize: pt === 'gemini' || pt === 'gemini-cli' || pt === 'antigravity' || pt === '
|
|
1422
|
+
forceReauthorize: pt === 'gemini' || pt === 'gemini-cli' || pt === 'antigravity' || pt === 'qwen'
|
|
1357
1423
|
};
|
|
1358
1424
|
await withOAuthRepairEnv(providerType, async () => {
|
|
1359
1425
|
await runInteractiveRepairWithAutoFallback({
|
|
@@ -1370,7 +1436,10 @@ export async function handleUpstreamInvalidOAuthToken(providerType, auth, upstre
|
|
|
1370
1436
|
return true;
|
|
1371
1437
|
}
|
|
1372
1438
|
catch (error) {
|
|
1373
|
-
|
|
1439
|
+
logOAuthLifecycleNonBlocking('interactiveRepairFlow', error, {
|
|
1440
|
+
providerType,
|
|
1441
|
+
tokenFilePath
|
|
1442
|
+
});
|
|
1374
1443
|
return false;
|
|
1375
1444
|
}
|
|
1376
1445
|
}
|
|
@@ -1383,23 +1452,8 @@ export function shouldTriggerInteractiveOAuthRepair(providerType, upstreamError)
|
|
|
1383
1452
|
: String(upstreamError || '');
|
|
1384
1453
|
const lower = msg.toLowerCase();
|
|
1385
1454
|
const statusCode = extractStatusCode(upstreamError);
|
|
1386
|
-
if (pt === 'iflow' && (statusCode === 434 || isIflowAkBlockedMessage(lower))) {
|
|
1387
|
-
// iFlow 434 是账号级封禁,必须人工恢复,不走自动修复。
|
|
1388
|
-
return false;
|
|
1389
|
-
}
|
|
1390
1455
|
// 基本令牌失效判定:只看典型 OAuth 文案
|
|
1391
1456
|
let looksInvalid = /invalid[_-]?token|invalid[_-]?grant|unauthenticated|unauthorized|token has expired|access token expired/.test(lower);
|
|
1392
|
-
// 对于 iflow / qwen,保留基于 401/403 的宽松判定,避免破坏既有行为。
|
|
1393
|
-
if (!looksInvalid && (pt === 'iflow' || pt === 'qwen')) {
|
|
1394
|
-
if (statusCode === 401 ||
|
|
1395
|
-
statusCode === 403 ||
|
|
1396
|
-
/\b401\b|\b403\b|40308/.test(msg)) {
|
|
1397
|
-
looksInvalid = true;
|
|
1398
|
-
}
|
|
1399
|
-
}
|
|
1400
|
-
if (!looksInvalid && pt === 'iflow' && isIflowRefreshEndpointRejectionMessage(lower)) {
|
|
1401
|
-
looksInvalid = true;
|
|
1402
|
-
}
|
|
1403
1457
|
// 对于 gemini / gemini-cli / antigravity,排除纯服务开关类错误,
|
|
1404
1458
|
// 但如果明确提示缺少 project_id 或需要重新 OAuth,则视为令牌失效。
|
|
1405
1459
|
if (pt === 'gemini' || pt === 'gemini-cli' || pt === 'antigravity') {
|
|
@@ -1420,44 +1474,7 @@ export function shouldTriggerInteractiveOAuthRepair(providerType, upstreamError)
|
|
|
1420
1474
|
}
|
|
1421
1475
|
return looksInvalid;
|
|
1422
1476
|
}
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
const txt = await fs.readFile(file, 'utf-8').catch((error) => {
|
|
1427
|
-
logOAuthDebug(`[OAuth] failed to read iflow oauth log for client creds inference (non-blocking) file=${file}: ${error instanceof Error ? error.message : String(error)}`);
|
|
1428
|
-
return '';
|
|
1429
|
-
});
|
|
1430
|
-
if (!txt) {
|
|
1431
|
-
return null;
|
|
1432
|
-
}
|
|
1433
|
-
const lines = txt.split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
1434
|
-
if (lines.length === 0) {
|
|
1435
|
-
return null;
|
|
1436
|
-
}
|
|
1437
|
-
for (let i = lines.length - 1; i >= 0; i--) {
|
|
1438
|
-
const line = lines[i];
|
|
1439
|
-
try {
|
|
1440
|
-
const obj = JSON.parse(line);
|
|
1441
|
-
const decoded = typeof obj.decoded === 'string' ? obj.decoded : '';
|
|
1442
|
-
if (!decoded.includes(':')) {
|
|
1443
|
-
continue;
|
|
1444
|
-
}
|
|
1445
|
-
const idx = decoded.indexOf(':');
|
|
1446
|
-
const id = decoded.slice(0, idx).trim();
|
|
1447
|
-
const secret = decoded.slice(idx + 1).trim();
|
|
1448
|
-
if (id && secret) {
|
|
1449
|
-
return { clientId: id, clientSecret: secret };
|
|
1450
|
-
}
|
|
1451
|
-
}
|
|
1452
|
-
catch {
|
|
1453
|
-
// skip parse errors
|
|
1454
|
-
}
|
|
1455
|
-
}
|
|
1456
|
-
return null;
|
|
1457
|
-
}
|
|
1458
|
-
catch (error) {
|
|
1459
|
-
logOAuthDebug(`[OAuth] inferIflowClientCredsFromLog failed (non-blocking): ${error instanceof Error ? error.message : String(error)}`);
|
|
1460
|
-
return null;
|
|
1461
|
-
}
|
|
1462
|
-
}
|
|
1477
|
+
export const __oauthLifecycleTestables = {
|
|
1478
|
+
isProcessAlive
|
|
1479
|
+
};
|
|
1463
1480
|
//# sourceMappingURL=oauth-lifecycle.js.map
|