cartethyia 2.7.4 → 2.7.5
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/.env.example +2 -0
- package/README.md +17 -5
- package/dist/dashboard/assets/{BannedPage-ChG5svFb.js → BannedPage-Cj15GsMp.js} +1 -1
- package/dist/dashboard/assets/BannedPage-Cj15GsMp.js.gz +0 -0
- package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js +1 -0
- package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-BIcWQun7.js → CliToolDetailPage-DZKmVuJN.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-DZKmVuJN.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-Bf2VelDe.js → CliToolsPage-BIccZmeL.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-BIccZmeL.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-DEEKkYD-.js +1 -0
- package/dist/dashboard/assets/CombosPage-DEEKkYD-.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-ggeMSjte.js → CustomizationPage-BKj_r0rp.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-BKj_r0rp.js.gz +0 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js +656 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-U6AKaJcF.js → LoginPage-DkXb6dx-.js} +1 -1
- package/dist/dashboard/assets/LoginPage-DkXb6dx-.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-BMS2t8BA.js → ModelPicker-DnQPSIA8.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-DnQPSIA8.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js +1 -0
- package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js +5 -0
- package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js.gz +0 -0
- package/dist/dashboard/assets/{ProxyPage-lsrx7NYg.js → ProxyPage-5SnUSy3j.js} +1 -1
- package/dist/dashboard/assets/ProxyPage-5SnUSy3j.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js +1 -0
- package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js +1 -0
- package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-f0DE1h0-.js → SetupPage-WTa0sktC.js} +1 -1
- package/dist/dashboard/assets/SetupPage-WTa0sktC.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-Cq5tW7hW.js → StudioPage-BfAb5-o_.js} +3 -3
- package/dist/dashboard/assets/StudioPage-BfAb5-o_.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-BNzeZ2Vk.js +56 -0
- package/dist/dashboard/assets/UsagePage-BNzeZ2Vk.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-l29JROPv.js +1 -0
- package/dist/dashboard/assets/api-keys-l29JROPv.js.gz +0 -0
- package/dist/dashboard/assets/app--PJWq8_C.css +2 -0
- package/dist/dashboard/assets/app--PJWq8_C.css.gz +0 -0
- package/dist/dashboard/assets/assert-C0K-c4eo.js +1 -0
- package/dist/dashboard/assets/assert-C0K-c4eo.js.gz +0 -0
- package/dist/dashboard/assets/{badge-D9CS6dZk.js → badge-DfbhQU4k.js} +1 -1
- package/dist/dashboard/assets/badge-DfbhQU4k.js.gz +0 -0
- package/dist/dashboard/assets/{banner-DympBNq4.js → banner-BllT4LcF.js} +1 -1
- package/dist/dashboard/assets/banner-BllT4LcF.js.gz +0 -0
- package/dist/dashboard/assets/brand/login_register.jpg +0 -0
- package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
- package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
- package/dist/dashboard/assets/brand/og_image.jpg +0 -0
- package/dist/dashboard/assets/{card-ibRWU_uT.js → card-CtkX66Wd.js} +1 -1
- package/dist/dashboard/assets/card-CtkX66Wd.js.gz +0 -0
- package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js +1 -0
- package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-CQXVMn4P.js +1 -0
- package/dist/dashboard/assets/cli-tools-CQXVMn4P.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-DJm-9pz7.js → clipboard-button-BQqBQd2n.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-BQqBQd2n.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-8fiE6tec.js → dialog-BEK7KP0H.js} +1 -1
- package/dist/dashboard/assets/dialog-BEK7KP0H.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-CqGYeOrd.js → drawer-BrTEZ8zu.js} +1 -1
- package/dist/dashboard/assets/drawer-BrTEZ8zu.js.gz +0 -0
- package/dist/dashboard/assets/entry-CHWxbS56.js +1 -0
- package/dist/dashboard/assets/entry-CHWxbS56.js.gz +0 -0
- package/dist/dashboard/assets/{entry-BSAsYsmV.js → entry-EBHJ3DrE.js} +1 -1
- package/dist/dashboard/assets/entry-EBHJ3DrE.js.gz +0 -0
- package/dist/dashboard/assets/entry-LCS85hiq.js +4 -0
- package/dist/dashboard/assets/entry-LCS85hiq.js.gz +0 -0
- package/dist/dashboard/assets/{formatters-D-MTJxMr.js → formatters-BAACA727.js} +1 -1
- package/dist/dashboard/assets/formatters-BAACA727.js.gz +0 -0
- package/dist/dashboard/assets/{github-badge-CPK47xQx.js → github-badge-YSCE4UC2.js} +1 -1
- package/dist/dashboard/assets/github-badge-YSCE4UC2.js.gz +0 -0
- package/dist/dashboard/assets/{index-DBNPOfhV.js → index-FQlj0HUT.js} +2 -2
- package/dist/dashboard/assets/index-FQlj0HUT.js.gz +0 -0
- package/dist/dashboard/assets/{inline-BT0zntEr.js → inline-C4gU5iOL.js} +1 -1
- package/dist/dashboard/assets/inline-C4gU5iOL.js.gz +0 -0
- package/dist/dashboard/assets/{input-Da2ZViWg.js → input-BHHX_Tmm.js} +1 -1
- package/dist/dashboard/assets/input-BHHX_Tmm.js.gz +0 -0
- package/dist/dashboard/assets/{layout-BXNeLw6M.js → layout-CajrYUnD.js} +1 -1
- package/dist/dashboard/assets/layout-CajrYUnD.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-BycOrrIV.js → list-row-Bx2I7XUe.js} +1 -1
- package/dist/dashboard/assets/list-row-Bx2I7XUe.js.gz +0 -0
- package/dist/dashboard/assets/live-DNNqRbj2.js +1 -0
- package/dist/dashboard/assets/live-DNNqRbj2.js.gz +0 -0
- package/dist/dashboard/assets/network-C5UBACrJ.js +1 -0
- package/dist/dashboard/assets/network-C5UBACrJ.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CUWAZK4J.js +2 -0
- package/dist/dashboard/assets/numbers-CUWAZK4J.js.gz +0 -0
- package/dist/dashboard/assets/pagination-Xsi9Qx04.js +1 -0
- package/dist/dashboard/assets/pagination-Xsi9Qx04.js.gz +0 -0
- package/dist/dashboard/assets/quota-DvQbD_sr.js +1 -0
- package/dist/dashboard/assets/quota-DvQbD_sr.js.gz +0 -0
- package/dist/dashboard/assets/routing-in0f_IfK.js +1 -0
- package/dist/dashboard/assets/routing-in0f_IfK.js.gz +0 -0
- package/dist/dashboard/assets/{select-BIYIBkMU.js → select-BLULNqTp.js} +1 -1
- package/dist/dashboard/assets/select-BLULNqTp.js.gz +0 -0
- package/dist/dashboard/assets/settings-CcGczj6I.js +1 -0
- package/dist/dashboard/assets/settings-CcGczj6I.js.gz +0 -0
- package/dist/dashboard/assets/shield-BMQNxORh.js +1 -0
- package/dist/dashboard/assets/shield-BMQNxORh.js.gz +0 -0
- package/dist/dashboard/assets/{stack-DfgnFDWY.js → stack-D2lIR0tg.js} +1 -1
- package/dist/dashboard/assets/stack-D2lIR0tg.js.gz +0 -0
- package/dist/dashboard/assets/{state-CkfdYWel.js → state-DTARjfiW.js} +1 -1
- package/dist/dashboard/assets/state-DTARjfiW.js.gz +0 -0
- package/dist/dashboard/assets/{switch-SYm237HG.js → switch-c0oPSnqW.js} +1 -1
- package/dist/dashboard/assets/switch-c0oPSnqW.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-BQqCRNIi.js → useMutation-m8WGNPrz.js} +1 -1
- package/dist/dashboard/assets/useMutation-m8WGNPrz.js.gz +0 -0
- package/dist/dashboard/console-backgrounds.jpg +0 -0
- package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +56 -55
- package/migrations/full-postgres/0036_system_prompt_presets_refs.sql +10 -0
- package/migrations/full-postgres/0037_share_concurrency_scope.sql +3 -0
- package/migrations/full-postgres/0038_add_accounts_quota_snapshot.sql +7 -0
- package/migrations/full-postgres/0039_add_telemetry_provider_model_indexes.sql +13 -0
- package/migrations/full-postgres/0040_add_models_dialect.sql +3 -0
- package/migrations/full-postgres/0041_add_daily_checkin_ledger_account_fk.sql +7 -0
- package/migrations/lite-sqlite3/0036_system_prompt_presets_refs.sql +14 -0
- package/migrations/lite-sqlite3/0037_share_concurrency_scope.sql +3 -0
- package/migrations/lite-sqlite3/0038_add_accounts_quota_snapshot.sql +4 -0
- package/migrations/lite-sqlite3/0039_add_telemetry_provider_model_indexes.sql +6 -0
- package/migrations/lite-sqlite3/0040_add_models_dialect.sql +3 -0
- package/migrations/lite-sqlite3/0041_add_daily_checkin_ledger_account_fk.sql +26 -0
- package/package.json +4 -6
- package/scripts/cli/update.ts +15 -41
- package/src/boot/app.ts +58 -2
- package/src/boot/dependencies.ts +786 -732
- package/src/boot/lifecycle.ts +11 -12
- package/src/config/cooldowns.ts +34 -55
- package/src/config/network.ts +1 -1
- package/src/config/package-paths.ts +1 -1
- package/src/config/providers.ts +13 -14
- package/src/config/resources.ts +0 -5
- package/src/config/runtime.ts +2 -5
- package/src/config/spec.ts +26 -6
- package/src/console/api-keys/ban-constants.ts +38 -0
- package/src/console/api-keys/contracts.ts +71 -62
- package/src/console/api-keys/routes.ts +48 -12
- package/src/console/auth/access.ts +4 -4
- package/src/console/auth/account-reset.ts +1 -1
- package/src/console/auth/audit-recorder.ts +1 -1
- package/src/console/auth/lockout.ts +7 -3
- package/src/console/auth/row-coercion.ts +57 -12
- package/src/console/auth/session-resolver.ts +1 -1
- package/src/console/auth/session-service.ts +8 -2
- package/src/console/auth/session.ts +37 -31
- package/src/console/auth/setup-service.ts +4 -3
- package/src/console/auth/user-store.ts +1 -1
- package/src/console/backup/9router-map.ts +0 -3
- package/src/console/backup/contracts.ts +9 -9
- package/src/console/backup/export-endpoint.ts +5 -6
- package/src/console/backup/nine-router.ts +1 -7
- package/src/console/backup/routes.ts +29 -33
- package/src/console/backup/service.ts +468 -468
- package/src/console/backup/store.ts +47 -29
- package/src/console/backup/validate.ts +11 -1
- package/src/console/cli-tools/contracts.ts +7 -7
- package/src/console/cli-tools/injectors/cline.ts +110 -110
- package/src/console/cli-tools/injectors/codex.ts +181 -181
- package/src/console/cli-tools/injectors/copilot.ts +108 -108
- package/src/console/cli-tools/injectors/driver.ts +247 -247
- package/src/console/cli-tools/injectors/jcode.ts +115 -115
- package/src/console/cli-tools/injectors/openclaw.ts +161 -161
- package/src/console/cli-tools/injectors/opencode.ts +153 -153
- package/src/console/cli-tools/routes.ts +1 -1
- package/src/console/cli-tools/service.ts +1 -1
- package/src/console/cli-tools/store.ts +2 -2
- package/src/console/console-router.ts +32 -0
- package/src/console/dashboard-assets.ts +9 -9
- package/src/console/domain-registration.ts +16 -2
- package/src/console/inferhub/client.ts +0 -7
- package/src/console/inferhub/key-store.ts +1 -1
- package/src/console/inferhub/normalize.ts +2 -2
- package/src/console/inferhub/routes.ts +1 -1
- package/src/console/inferhub/types.ts +1 -1
- package/src/console/observability/contracts.ts +1 -1
- package/src/console/observability/live.ts +31 -18
- package/src/console/observability/logs.ts +1 -1
- package/src/console/observability/sse.ts +62 -8
- package/src/console/observability/store.ts +20 -4
- package/src/console/providers/catalog/catalog-projections.ts +1 -1
- package/src/console/providers/catalog/contracts.ts +39 -0
- package/src/console/providers/catalog/model-operations.ts +1 -1
- package/src/console/providers/catalog/provider-operations.ts +95 -17
- package/src/console/providers/catalog/public-model-store.ts +0 -0
- package/src/console/providers/catalog/routes.ts +27 -3
- package/src/console/providers/catalog/store.ts +147 -8
- package/src/console/providers/detail/routes.ts +1 -1
- package/src/console/providers/oauth/callback-listener.ts +100 -18
- package/src/console/providers/oauth/routes.ts +92 -13
- package/src/console/quota/account-quota-global.ts +41 -3
- package/src/console/quota/account-quota-shared.ts +10 -3
- package/src/console/quota/account-quota-tenant.ts +259 -66
- package/src/console/quota/daily-growth-job.ts +308 -0
- package/src/console/quota/native-identity.ts +2 -2
- package/src/console/quota/quota-view.ts +1 -1
- package/src/console/remote-support/routes.ts +1 -1
- package/src/console/remote-support/service.ts +2 -2
- package/src/console/routing/model/contracts.ts +1 -1
- package/src/console/routing/pools/contracts.ts +2 -2
- package/src/console/routing/pools/import-parse.ts +3 -3
- package/src/console/routing/pools/relay-deploy.ts +3 -3
- package/src/console/settings/contracts.ts +29 -2
- package/src/console/settings/store.ts +20 -0
- package/src/console/share/share-router.ts +100 -32
- package/src/console/share/share-stats.ts +4 -4
- package/src/console/share/share-usage.ts +1 -1
- package/src/console/shared/errors.ts +2 -2
- package/src/console/shared/object.ts +18 -0
- package/src/console/shared/read-through-cache.ts +4 -4
- package/src/console/shared/transaction.ts +14 -0
- package/src/console/system-prompt/contracts.ts +89 -12
- package/src/console/system-prompt/routes.ts +98 -45
- package/src/console/updates/apply-update.ts +244 -0
- package/src/console/updates/routes.ts +252 -97
- package/src/main.ts +11 -5
- package/src/network/http2-bidi.ts +1 -1
- package/src/network/ip-utils.ts +298 -0
- package/src/network/outbound-fetch.ts +1 -1
- package/src/network/pool/agent.ts +7 -6
- package/src/network/pool/byte-accounting.ts +1 -1
- package/src/network/pool/resolver.ts +16 -12
- package/src/network/pool/selector.ts +150 -136
- package/src/network/pool-health-machine.ts +1 -1
- package/src/network/rate-limit-verdict.ts +1 -1
- package/src/network/retry.ts +1 -1
- package/src/network/ssrf.ts +20 -71
- package/src/observability/event-log.ts +2 -2
- package/src/observability/event-query.ts +59 -291
- package/src/observability/log-sanitize.ts +1 -1
- package/src/observability/metrics.ts +4 -4
- package/src/observability/payload-capture.ts +6 -5
- package/src/observability/payload-store.ts +1 -1
- package/src/observability/runtime-metrics.ts +1 -1
- package/src/observability/telemetry-buffer.ts +12 -3
- package/src/observability/telemetry-reconciliation.ts +3 -3
- package/src/observability/token-speed.ts +1 -1
- package/src/persistence/connection-url.ts +1 -1
- package/src/persistence/db-handle.ts +1 -1
- package/src/persistence/db-pg.ts +2 -2
- package/src/persistence/db-sqlite.ts +3 -3
- package/src/persistence/dialect.ts +5 -1
- package/src/persistence/readiness.ts +1 -1
- package/src/persistence/redis.ts +1 -1
- package/src/persistence/schema.ts +113 -40
- package/src/persistence/shared-cache.ts +2 -2
- package/src/persistence/sort-order.ts +1 -1
- package/src/persistence/stores/api-key-store.ts +10 -1
- package/src/persistence/stores/share-store.ts +20 -8
- package/src/persistence/system-prompt-store.ts +63 -18
- package/src/persistence/tenant-preferences.ts +1 -1
- package/src/persistence/ttl-cache.ts +3 -3
- package/src/persistence/usage-flush.ts +7 -2
- package/src/protocol/canonical-model.ts +1 -1
- package/src/protocol/codecs.ts +6 -10
- package/src/protocol/dsml.ts +3 -49
- package/src/protocol/image-clamp.ts +2 -2
- package/src/protocol/reasoning-text.ts +1 -1
- package/src/protocol/reasoning.ts +7 -52
- package/src/protocol/registry.ts +50 -15
- package/src/protocol/request/chat.ts +46 -19
- package/src/protocol/request/codex.ts +1 -1
- package/src/protocol/request/messages.ts +46 -14
- package/src/protocol/request/responses.ts +19 -10
- package/src/protocol/response/chat.ts +25 -10
- package/src/protocol/response/codex.ts +1 -1
- package/src/protocol/response/messages.ts +1 -1
- package/src/protocol/response/omp-tool-call-markup.ts +1 -1
- package/src/protocol/response/responses.ts +1 -1
- package/src/protocol/sse-decoder.ts +50 -1
- package/src/protocol/stop-reason.ts +2 -2
- package/src/protocol/think-split.ts +347 -0
- package/src/protocol/translation/attachment-integrity.ts +3 -3
- package/src/protocol/translation/cache-controls.ts +8 -20
- package/src/protocol/translation/capabilities.ts +6 -6
- package/src/protocol/translation/dialect/deepseek.ts +10 -0
- package/src/protocol/translation/dialect/inband.ts +39 -0
- package/src/protocol/translation/dialect/model-thinking.ts +89 -0
- package/src/protocol/translation/dialect/qwen.ts +114 -0
- package/src/protocol/translation/dialect/resolver.ts +83 -0
- package/src/protocol/translation/dialect/rules.ts +93 -0
- package/src/protocol/translation/dialect/thinking-ladder.ts +245 -0
- package/src/protocol/translation/dialect/types.ts +58 -0
- package/src/protocol/translation/quirks.ts +18 -4
- package/src/protocol/translation/thinking.ts +12 -252
- package/src/protocol/translation/tool-id.ts +3 -3
- package/src/protocol/translation/tool-repair.ts +1 -1
- package/src/protocol/upstream/post-json.ts +6 -1
- package/src/providers/adapters/compatible-adapter.ts +42 -3
- package/src/providers/authentication/jwt-validator.ts +0 -5
- package/src/providers/authentication/oauth-client.ts +254 -253
- package/src/providers/authentication/oauth-flow-store.ts +42 -7
- package/src/providers/bundled-discovery-providers.ts +6 -30
- package/src/providers/configured-openai-providers.ts +82 -97
- package/src/providers/default-registry.ts +23 -35
- package/src/providers/discovery/catalog/catalog-format.ts +13 -2
- package/src/providers/discovery/discovery-types.ts +0 -1
- package/src/providers/discovery/openai-model-discovery.ts +2 -2
- package/src/providers/discovery/probe-phases.ts +48 -13
- package/src/providers/discovery/probing-service.ts +6 -8
- package/src/providers/integrations/agentrouter/agentrouter.ts +12 -2
- package/src/providers/integrations/antigravity/antigravity-oauth.ts +0 -1
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +0 -14
- package/src/providers/integrations/antigravity/antigravity.ts +2 -2
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +1 -1
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +20 -4
- package/src/providers/integrations/buddy/buddy-cli-headers.ts +19 -52
- package/src/providers/integrations/buddy/buddy-identity.ts +86 -0
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +1 -1
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +1 -2
- package/src/providers/integrations/buddy/codebuddy/provider.ts +4 -15
- package/src/providers/integrations/buddy/codebuddy/shared.ts +30 -9
- package/src/providers/integrations/buddy/workbuddy/provider.ts +5 -9
- package/src/providers/integrations/buddy/workbuddy/shared.ts +21 -3
- package/src/providers/integrations/claude/claude-cch.ts +148 -148
- package/src/providers/integrations/claude/fallback-credit.ts +3 -7
- package/src/providers/integrations/cline/cline.ts +1 -1
- package/src/providers/integrations/codex/codex-device-code.ts +101 -101
- package/src/providers/integrations/codex/codex-oauth.ts +0 -1
- package/src/providers/integrations/commandcode/commandcode.ts +75 -115
- package/src/providers/integrations/commandcode/quota.ts +131 -51
- package/src/providers/integrations/cursor/cursor-http2.ts +0 -3
- package/src/providers/integrations/cursor/cursor-quota.ts +2 -6
- package/src/providers/integrations/cursor/cursor-request.ts +0 -87
- package/src/providers/integrations/cursor/cursor-shared.ts +0 -4
- package/src/providers/integrations/cursor/cursor.ts +38 -5
- package/src/providers/integrations/cursor/protocol/framing.ts +0 -56
- package/src/providers/integrations/cursor/protocol/messages.ts +0 -96
- package/src/providers/integrations/factory/factory.ts +9 -9
- package/src/providers/integrations/github/github-discovery.ts +55 -10
- package/src/providers/integrations/github/github-oauth.ts +6 -5
- package/src/providers/integrations/github/github.ts +41 -14
- package/src/providers/integrations/grok/grok-oauth.ts +261 -261
- package/src/providers/integrations/grok/grok-quota-frame.ts +1 -1
- package/src/providers/integrations/grok/grok-quota.ts +16 -7
- package/src/providers/integrations/grok/grok-ratelimit-store.ts +0 -5
- package/src/providers/integrations/grok/grok-ratelimit.ts +3 -0
- package/src/providers/integrations/grok/grok.ts +86 -36
- package/src/providers/integrations/kilo/kilo-oauth.ts +1 -1
- package/src/providers/integrations/kiro/kiro-cache.ts +31 -0
- package/src/providers/integrations/kiro/kiro-catalog.ts +31 -5
- package/src/providers/integrations/kiro/kiro-discovery.ts +47 -43
- package/src/providers/integrations/kiro/kiro-machine-id.ts +6 -3
- package/src/providers/integrations/kiro/kiro-oauth.ts +523 -255
- package/src/providers/integrations/kiro/kiro-quota.ts +35 -47
- package/src/providers/integrations/kiro/kiro-request.ts +8 -11
- package/src/providers/integrations/kiro/kiro-stream.ts +13 -0
- package/src/providers/integrations/kiro/kiro.ts +81 -68
- package/src/providers/integrations/muse/muse-oauth.ts +0 -1
- package/src/providers/integrations/muse/muse-quota.ts +0 -4
- package/src/providers/integrations/opencode/fingerprint.ts +7 -5
- package/src/providers/integrations/opencode/provider.ts +17 -24
- package/src/providers/integrations/qoder/qoder-catalog.ts +85 -8
- package/src/providers/integrations/qoder/qoder-oauth.ts +165 -25
- package/src/providers/integrations/qoder/qoder-quota.ts +48 -6
- package/src/providers/integrations/qoder/qoder-realm.ts +10 -31
- package/src/providers/integrations/qoder/qoder-sse.ts +159 -0
- package/src/providers/integrations/qoder/qoder-umid.ts +21 -25
- package/src/providers/integrations/qoder/qoder-virtual.ts +12 -0
- package/src/providers/integrations/qoder/qoder.ts +354 -62
- package/src/providers/integrations/shared/connect.ts +0 -54
- package/src/providers/integrations/shared/hash.ts +15 -0
- package/src/providers/integrations/shared/session-cache.ts +136 -0
- package/src/providers/integrations/trae/trae-cache.ts +7 -87
- package/src/providers/integrations/trae/trae-catalog.ts +1 -6
- package/src/providers/integrations/trae/trae-protocol.ts +17 -8
- package/src/providers/integrations/trae/trae-realm.ts +0 -7
- package/src/providers/integrations/trae/trae.ts +53 -10
- package/src/providers/integrations/xai/xai-oauth.ts +5 -5
- package/src/providers/integrations/zcode-start-plan/gifts.ts +265 -0
- package/src/providers/integrations/zcode-start-plan/oauth.ts +154 -0
- package/src/providers/integrations/zcode-start-plan/provider.ts +131 -0
- package/src/providers/integrations/zcode-start-plan/quota.ts +152 -0
- package/src/providers/integrations/zcode-start-plan/zcode_prompt.json +10 -0
- package/src/providers/operations/account-error-classification.ts +131 -116
- package/src/providers/operations/account-health-service.ts +31 -39
- package/src/providers/operations/account-reset-service.ts +58 -1
- package/src/providers/operations/cli-platform.ts +31 -5
- package/src/providers/operations/client-version-resolver.ts +4 -6
- package/src/providers/operations/client-versions.ts +10 -7
- package/src/providers/operations/provider-catalog-seeder.ts +2 -0
- package/src/providers/operations/provider-catalog-service.ts +18 -2
- package/src/providers/operations/provider-credential-service.ts +19 -2
- package/src/providers/provider-contracts.ts +18 -7
- package/src/providers/provider-metadata.ts +17 -2
- package/src/providers/provider-model-definition.ts +22 -1
- package/src/providers/provider-probe.ts +4 -2
- package/src/providers/provider-usage.ts +81 -16
- package/src/providers/quota/cache.ts +29 -0
- package/src/providers/quota/quota-contracts.ts +4 -0
- package/src/providers/quota/refresh.ts +27 -4
- package/src/providers/quota/snapshot.ts +94 -0
- package/src/providers/search/search-provider.ts +1 -3
- package/src/providers/search/search-providers.ts +2 -1
- package/src/security/abuse.ts +4 -4
- package/src/security/admission/service.ts +2 -2
- package/src/security/admission/ttl.ts +61 -61
- package/src/security/api-key-auth.ts +16 -4
- package/src/security/client-router-fingerprint.ts +4 -4
- package/src/security/credential-codec.ts +3 -3
- package/src/security/csrf.ts +2 -2
- package/src/security/ip-boundary.ts +16 -189
- package/src/security/model-access-rule.ts +1 -1
- package/src/security/outbound-headers.ts +18 -0
- package/src/shared/invoke-guard.ts +47 -0
- package/src/transport/contracts.ts +13 -4
- package/src/transport/dispatch/attempt-finalize.ts +1 -1
- package/src/transport/dispatch/capture-policy.ts +34 -37
- package/src/transport/dispatch/empty-stream.ts +23 -20
- package/src/transport/dispatch/generation.ts +25 -45
- package/src/transport/dispatch/native-shared.ts +127 -0
- package/src/transport/dispatch/proxy-request.ts +3 -1
- package/src/transport/dispatch/responses-compact.ts +25 -46
- package/src/transport/dispatch/streaming/encoder.ts +18 -72
- package/src/transport/dispatch/streaming/finalize.ts +2 -2
- package/src/transport/dispatch/streaming/stream.ts +7 -3
- package/src/transport/dispatch/streaming/thinking-loop.ts +1 -1
- package/src/transport/dispatch/systemone.ts +20 -48
- package/src/transport/dispatch/token-count.ts +41 -38
- package/src/transport/dispatch/websearch.ts +19 -45
- package/src/transport/drain-endpoint.ts +1 -1
- package/src/transport/failure-policy.ts +6 -0
- package/src/transport/guards/auth-guard.ts +0 -6
- package/src/transport/guards/body-policy.ts +3 -3
- package/src/transport/guards/headroom-guard.ts +1 -1
- package/src/transport/guards/pipeline.ts +1 -1
- package/src/transport/guards/request-context.ts +12 -17
- package/src/transport/request/preparer.ts +286 -7
- package/src/transport/request/rtk/compress-request.ts +3 -3
- package/src/transport/request/rtk/rtk-constants.ts +2 -2
- package/src/transport/request/rtk/rtk-filters.ts +8 -8
- package/src/transport/request/state.ts +1 -13
- package/src/transport/request/system-prompt-injection.ts +74 -11
- package/src/transport/request/tenant-preferences.ts +22 -0
- package/src/transport/routing/candidate-index.ts +2 -2
- package/src/transport/routing/round-robin.ts +1 -1
- package/src/transport/routing/route-catalog.ts +17 -18
- package/src/transport/routing/route-model.ts +126 -33
- package/src/transport/routing/router.ts +152 -37
- package/src/transport/shutdown-notice.ts +2 -2
- package/src/transport/surface/adapters.ts +3 -3
- package/src/transport/surface/chat/encode.ts +7 -7
- package/src/transport/surface/chat/parse.ts +7 -7
- package/src/transport/surface/completion.ts +2 -2
- package/src/transport/surface/content-parts.ts +1 -1
- package/src/transport/surface/dialects.ts +2 -2
- package/src/transport/surface/messages/parse.ts +3 -3
- package/src/transport/surface/responses/adapter.ts +1 -1
- package/src/transport/surface/responses/errors.ts +0 -9
- package/src/transport/vision-handoff-cache.ts +58 -0
- package/src/transport/vision-handoff.ts +376 -0
- package/src/workers/account-identity-sweep.ts +2 -2
- package/src/workers/buddy-growth-tasks.ts +392 -346
- package/src/workers/daily-checkin.ts +102 -49
- package/src/workers/maintenance-lease.ts +2 -35
- package/src/workers/oauth-refresh-sweep.ts +8 -1
- package/src/workers/quota-refresh-sweep.ts +120 -82
- package/src/workers/scheduler.ts +67 -4
- package/src/workers/sweep-runner.ts +24 -5
- package/src/workers/zcode-gift-claim.ts +108 -0
- package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js +0 -1
- package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js.gz +0 -0
- package/dist/dashboard/assets/BannedPage-ChG5svFb.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-DCgm5g6g.js +0 -1
- package/dist/dashboard/assets/CombosPage-DCgm5g6g.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js +0 -1
- package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-U6AKaJcF.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-BMS2t8BA.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js +0 -1
- package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js +0 -5
- package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js +0 -1
- package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-lsrx7NYg.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-L0skzML8.js +0 -1
- package/dist/dashboard/assets/QuotaPage-L0skzML8.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js +0 -1
- package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-f0DE1h0-.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-ClzpwyET.js +0 -1
- package/dist/dashboard/assets/SortableList-ClzpwyET.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-Cq5tW7hW.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js +0 -56
- package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-C38iXoO4.js +0 -1
- package/dist/dashboard/assets/api-keys-C38iXoO4.js.gz +0 -0
- package/dist/dashboard/assets/app-a159k0ub.css +0 -2
- package/dist/dashboard/assets/app-a159k0ub.css.gz +0 -0
- package/dist/dashboard/assets/assert-DbRA8EG2.js +0 -15
- package/dist/dashboard/assets/assert-DbRA8EG2.js.gz +0 -0
- package/dist/dashboard/assets/badge-D9CS6dZk.js.gz +0 -0
- package/dist/dashboard/assets/banner-DympBNq4.js.gz +0 -0
- package/dist/dashboard/assets/card-ibRWU_uT.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-63qBGaRw.js +0 -1
- package/dist/dashboard/assets/cli-tools-63qBGaRw.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-DJm-9pz7.js.gz +0 -0
- package/dist/dashboard/assets/dialog-8fiE6tec.js.gz +0 -0
- package/dist/dashboard/assets/drawer-CqGYeOrd.js.gz +0 -0
- package/dist/dashboard/assets/entry-BSAsYsmV.js.gz +0 -0
- package/dist/dashboard/assets/entry-CiIQULZD.js +0 -4
- package/dist/dashboard/assets/entry-CiIQULZD.js.gz +0 -0
- package/dist/dashboard/assets/entry-Daz0lJ-W.js +0 -1
- package/dist/dashboard/assets/entry-Daz0lJ-W.js.gz +0 -0
- package/dist/dashboard/assets/formatters-D-MTJxMr.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-CPK47xQx.js.gz +0 -0
- package/dist/dashboard/assets/index-DBNPOfhV.js.gz +0 -0
- package/dist/dashboard/assets/inline-BT0zntEr.js.gz +0 -0
- package/dist/dashboard/assets/input-Da2ZViWg.js.gz +0 -0
- package/dist/dashboard/assets/layout-BXNeLw6M.js.gz +0 -0
- package/dist/dashboard/assets/list-row-BycOrrIV.js.gz +0 -0
- package/dist/dashboard/assets/live-DCQNZpF7.js +0 -1
- package/dist/dashboard/assets/live-DCQNZpF7.js.gz +0 -0
- package/dist/dashboard/assets/network-9Yj2ZyLo.js +0 -1
- package/dist/dashboard/assets/network-9Yj2ZyLo.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CEagj6ZZ.js +0 -2
- package/dist/dashboard/assets/numbers-CEagj6ZZ.js.gz +0 -0
- package/dist/dashboard/assets/quota-Caw7wqci.js +0 -1
- package/dist/dashboard/assets/quota-Caw7wqci.js.gz +0 -0
- package/dist/dashboard/assets/routing-CO9zCUus.js +0 -1
- package/dist/dashboard/assets/routing-CO9zCUus.js.gz +0 -0
- package/dist/dashboard/assets/select-BIYIBkMU.js.gz +0 -0
- package/dist/dashboard/assets/settings-jS3-PNSA.js +0 -1
- package/dist/dashboard/assets/settings-jS3-PNSA.js.gz +0 -0
- package/dist/dashboard/assets/stack-DfgnFDWY.js.gz +0 -0
- package/dist/dashboard/assets/state-CkfdYWel.js.gz +0 -0
- package/dist/dashboard/assets/stream-retry-5QnVuSSo.js +0 -1
- package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
- package/dist/dashboard/assets/switch-SYm237HG.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-BQqCRNIi.js.gz +0 -0
- package/src/network/response-headers.ts +0 -39
- package/src/protocol/response/dsml.ts +0 -38
- package/src/providers/integrations/xiaomi-mimo/think-stream.ts +0 -229
- /package/dist/dashboard/assets/{app-BayTTy01.js → app-Bgd3zANQ.js} +0 -0
- /package/dist/dashboard/assets/{app-BayTTy01.js.gz → app-Bgd3zANQ.js.gz} +0 -0
- /package/dist/dashboard/assets/brand/{og_bansos.webp → og_bansos_initial.webp} +0 -0
- /package/dist/dashboard/assets/brand/{og_image.webp → og_image_initial.webp} +0 -0
|
@@ -1,148 +1,148 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
|
|
3
|
-
const MASK = 0xffffffffffffffffn;
|
|
4
|
-
const PRIME1 = 0x9e3779b185ebca87n;
|
|
5
|
-
const PRIME2 = 0xc2b2ae3d27d4eb4fn;
|
|
6
|
-
const PRIME3 = 0x165667b19e3779f9n;
|
|
7
|
-
const PRIME4 = 0x85ebca77c2b2ae63n;
|
|
8
|
-
const PRIME5 = 0x27d4eb2f165667c5n;
|
|
9
|
-
const CCH_SEED = 0x4d659218e32a3268n;
|
|
10
|
-
const PLACEHOLDER = "cch=00000";
|
|
11
|
-
const encoder = new TextEncoder();
|
|
12
|
-
|
|
13
|
-
function round(acc: bigint, input: bigint): bigint {
|
|
14
|
-
let value = (acc + input * PRIME2) & MASK;
|
|
15
|
-
value = ((value << 31n) | (value >> 33n)) & MASK;
|
|
16
|
-
return (value * PRIME1) & MASK;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function mergeRound(acc: bigint, value: bigint): bigint {
|
|
20
|
-
let result = acc ^ round(0n, value);
|
|
21
|
-
return (result * PRIME1 + PRIME4) & MASK;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function read32(bytes: Uint8Array, offset: number): bigint {
|
|
25
|
-
return (
|
|
26
|
-
BigInt(bytes[offset] ?? 0) |
|
|
27
|
-
(BigInt(bytes[offset + 1] ?? 0) << 8n) |
|
|
28
|
-
(BigInt(bytes[offset + 2] ?? 0) << 16n) |
|
|
29
|
-
(BigInt(bytes[offset + 3] ?? 0) << 24n)
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function read64(bytes: Uint8Array, offset: number): bigint {
|
|
34
|
-
let value = 0n;
|
|
35
|
-
for (let index = 0; index < 8; index += 1)
|
|
36
|
-
value |= BigInt(bytes[offset + index] ?? 0) << BigInt(index * 8);
|
|
37
|
-
return value;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function xxHash64(bytes: Uint8Array, seed: bigint): bigint {
|
|
41
|
-
let offset = 0;
|
|
42
|
-
let hash: bigint;
|
|
43
|
-
if (bytes.length >= 32) {
|
|
44
|
-
let v1 = (seed + PRIME1 + PRIME2) & MASK;
|
|
45
|
-
let v2 = (seed + PRIME2) & MASK;
|
|
46
|
-
let v3 = seed & MASK;
|
|
47
|
-
let v4 = (seed - PRIME1) & MASK;
|
|
48
|
-
while (offset <= bytes.length - 32) {
|
|
49
|
-
v1 = round(v1, read64(bytes, offset));
|
|
50
|
-
v2 = round(v2, read64(bytes, offset + 8));
|
|
51
|
-
v3 = round(v3, read64(bytes, offset + 16));
|
|
52
|
-
v4 = round(v4, read64(bytes, offset + 24));
|
|
53
|
-
offset += 32;
|
|
54
|
-
}
|
|
55
|
-
hash =
|
|
56
|
-
(((v1 << 1n) | (v1 >> 63n)) +
|
|
57
|
-
((v2 << 7n) | (v2 >> 57n)) +
|
|
58
|
-
((v3 << 12n) | (v3 >> 52n)) +
|
|
59
|
-
((v4 << 18n) | (v4 >> 46n))) &
|
|
60
|
-
MASK;
|
|
61
|
-
hash = mergeRound(hash, v1);
|
|
62
|
-
hash = mergeRound(hash, v2);
|
|
63
|
-
hash = mergeRound(hash, v3);
|
|
64
|
-
hash = mergeRound(hash, v4);
|
|
65
|
-
} else hash = (seed + PRIME5) & MASK;
|
|
66
|
-
hash = (hash + BigInt(bytes.length)) & MASK;
|
|
67
|
-
while (offset <= bytes.length - 8) {
|
|
68
|
-
const value = round(0n, read64(bytes, offset));
|
|
69
|
-
hash ^= value;
|
|
70
|
-
hash = (((hash << 27n) | (hash >> 37n)) * PRIME1 + PRIME4) & MASK;
|
|
71
|
-
offset += 8;
|
|
72
|
-
}
|
|
73
|
-
if (offset <= bytes.length - 4) {
|
|
74
|
-
hash ^= (read32(bytes, offset) * PRIME1) & MASK;
|
|
75
|
-
hash = (((hash << 23n) | (hash >> 41n)) * PRIME2 + PRIME3) & MASK;
|
|
76
|
-
offset += 4;
|
|
77
|
-
}
|
|
78
|
-
while (offset < bytes.length) {
|
|
79
|
-
hash ^= (BigInt(bytes[offset] ?? 0) * PRIME5) & MASK;
|
|
80
|
-
hash = (((hash << 11n) | (hash >> 53n)) * PRIME1) & MASK;
|
|
81
|
-
offset += 1;
|
|
82
|
-
}
|
|
83
|
-
hash ^= hash >> 33n;
|
|
84
|
-
hash = (hash * PRIME2) & MASK;
|
|
85
|
-
hash ^= hash >> 29n;
|
|
86
|
-
hash = (hash * PRIME3) & MASK;
|
|
87
|
-
return (hash ^ (hash >> 32n)) & MASK;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** Computes Claude Code's five-hex-digit CCH from the exact outgoing body bytes. */
|
|
91
|
-
export function computeClaudeCch(body: Uint8Array): string {
|
|
92
|
-
return (xxHash64(body, CCH_SEED) & 0xfffffn).toString(16).padStart(5, "0");
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/** Replaces the anchored Claude billing placeholder in a mutable body before sending. */
|
|
96
|
-
export function patchClaudeCch(body: Uint8Array): boolean {
|
|
97
|
-
const marker = encoder.encode('"system":[{"type":"text","text":"x-anthropic-billing-header:');
|
|
98
|
-
const placeholder = encoder.encode(PLACEHOLDER);
|
|
99
|
-
let markerIndex = -1;
|
|
100
|
-
outer: for (let index = 0; index <= body.length - marker.length; index += 1) {
|
|
101
|
-
for (let j = 0; j < marker.length; j += 1) if (body[index + j] !== marker[j]) continue outer;
|
|
102
|
-
markerIndex = index;
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
if (markerIndex < 0) return false;
|
|
106
|
-
const start = markerIndex + marker.length;
|
|
107
|
-
const end = Math.min(body.length - placeholder.length, start + 150);
|
|
108
|
-
for (let index = start; index <= end; index += 1) {
|
|
109
|
-
let found = true;
|
|
110
|
-
for (let j = 0; j < placeholder.length; j += 1)
|
|
111
|
-
if (body[index + j] !== placeholder[j]) {
|
|
112
|
-
found = false;
|
|
113
|
-
break;
|
|
114
|
-
}
|
|
115
|
-
if (!found) continue;
|
|
116
|
-
const cch = encoder.encode(computeClaudeCch(body));
|
|
117
|
-
body.set(cch, index + 4);
|
|
118
|
-
return true;
|
|
119
|
-
}
|
|
120
|
-
return false;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/** Harness identity instruction, sent on OAuth dispatch. */
|
|
124
|
-
export const CLAUDE_CODE_SYSTEM_INSTRUCTION =
|
|
125
|
-
"You are Claude Code, Anthropic's official CLI for Claude.";
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Builds the billing header text with the captured version suffix:
|
|
129
|
-
* `cc_version={ver}.{sha256("59cf53e54c78" + chars + ver)[0:3]}` where
|
|
130
|
-
* chars are the 5th/8th/21st chars of the first user text (or "0" when
|
|
131
|
-
* absent). `cc_entrypoint=cli` matches the harness UA `(external, cli)`;
|
|
132
|
-
* an older snapshot used `claude-desktop`, which is unverified from local
|
|
133
|
-
* evidence, so cli is kept with this note.
|
|
134
|
-
*/
|
|
135
|
-
export function createClaudeBillingText(userText: string, version: string): string {
|
|
136
|
-
const chars = [4, 7, 20].map((index) => userText[index] ?? "0").join("");
|
|
137
|
-
const suffix = createHash("sha256")
|
|
138
|
-
.update(`59cf53e54c78${chars}${version}`)
|
|
139
|
-
.digest("hex")
|
|
140
|
-
.slice(0, 3);
|
|
141
|
-
return `x-anthropic-billing-header: cc_version=${version}.${suffix}; cc_entrypoint=cli; cch=00000;`;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/** Patches a string request body and returns its encoded bytes, or undefined when no billing block exists. */
|
|
145
|
-
export function patchClaudeCchBody(body: string): Uint8Array | undefined {
|
|
146
|
-
const bytes = encoder.encode(body);
|
|
147
|
-
return patchClaudeCch(bytes) ? bytes : undefined;
|
|
148
|
-
}
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
const MASK = 0xffffffffffffffffn;
|
|
4
|
+
const PRIME1 = 0x9e3779b185ebca87n;
|
|
5
|
+
const PRIME2 = 0xc2b2ae3d27d4eb4fn;
|
|
6
|
+
const PRIME3 = 0x165667b19e3779f9n;
|
|
7
|
+
const PRIME4 = 0x85ebca77c2b2ae63n;
|
|
8
|
+
const PRIME5 = 0x27d4eb2f165667c5n;
|
|
9
|
+
const CCH_SEED = 0x4d659218e32a3268n;
|
|
10
|
+
const PLACEHOLDER = "cch=00000";
|
|
11
|
+
const encoder = new TextEncoder();
|
|
12
|
+
|
|
13
|
+
function round(acc: bigint, input: bigint): bigint {
|
|
14
|
+
let value = (acc + input * PRIME2) & MASK;
|
|
15
|
+
value = ((value << 31n) | (value >> 33n)) & MASK;
|
|
16
|
+
return (value * PRIME1) & MASK;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function mergeRound(acc: bigint, value: bigint): bigint {
|
|
20
|
+
let result = acc ^ round(0n, value);
|
|
21
|
+
return (result * PRIME1 + PRIME4) & MASK;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function read32(bytes: Uint8Array, offset: number): bigint {
|
|
25
|
+
return (
|
|
26
|
+
BigInt(bytes[offset] ?? 0) |
|
|
27
|
+
(BigInt(bytes[offset + 1] ?? 0) << 8n) |
|
|
28
|
+
(BigInt(bytes[offset + 2] ?? 0) << 16n) |
|
|
29
|
+
(BigInt(bytes[offset + 3] ?? 0) << 24n)
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function read64(bytes: Uint8Array, offset: number): bigint {
|
|
34
|
+
let value = 0n;
|
|
35
|
+
for (let index = 0; index < 8; index += 1)
|
|
36
|
+
value |= BigInt(bytes[offset + index] ?? 0) << BigInt(index * 8);
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function xxHash64(bytes: Uint8Array, seed: bigint): bigint {
|
|
41
|
+
let offset = 0;
|
|
42
|
+
let hash: bigint;
|
|
43
|
+
if (bytes.length >= 32) {
|
|
44
|
+
let v1 = (seed + PRIME1 + PRIME2) & MASK;
|
|
45
|
+
let v2 = (seed + PRIME2) & MASK;
|
|
46
|
+
let v3 = seed & MASK;
|
|
47
|
+
let v4 = (seed - PRIME1) & MASK;
|
|
48
|
+
while (offset <= bytes.length - 32) {
|
|
49
|
+
v1 = round(v1, read64(bytes, offset));
|
|
50
|
+
v2 = round(v2, read64(bytes, offset + 8));
|
|
51
|
+
v3 = round(v3, read64(bytes, offset + 16));
|
|
52
|
+
v4 = round(v4, read64(bytes, offset + 24));
|
|
53
|
+
offset += 32;
|
|
54
|
+
}
|
|
55
|
+
hash =
|
|
56
|
+
(((v1 << 1n) | (v1 >> 63n)) +
|
|
57
|
+
((v2 << 7n) | (v2 >> 57n)) +
|
|
58
|
+
((v3 << 12n) | (v3 >> 52n)) +
|
|
59
|
+
((v4 << 18n) | (v4 >> 46n))) &
|
|
60
|
+
MASK;
|
|
61
|
+
hash = mergeRound(hash, v1);
|
|
62
|
+
hash = mergeRound(hash, v2);
|
|
63
|
+
hash = mergeRound(hash, v3);
|
|
64
|
+
hash = mergeRound(hash, v4);
|
|
65
|
+
} else hash = (seed + PRIME5) & MASK;
|
|
66
|
+
hash = (hash + BigInt(bytes.length)) & MASK;
|
|
67
|
+
while (offset <= bytes.length - 8) {
|
|
68
|
+
const value = round(0n, read64(bytes, offset));
|
|
69
|
+
hash ^= value;
|
|
70
|
+
hash = (((hash << 27n) | (hash >> 37n)) * PRIME1 + PRIME4) & MASK;
|
|
71
|
+
offset += 8;
|
|
72
|
+
}
|
|
73
|
+
if (offset <= bytes.length - 4) {
|
|
74
|
+
hash ^= (read32(bytes, offset) * PRIME1) & MASK;
|
|
75
|
+
hash = (((hash << 23n) | (hash >> 41n)) * PRIME2 + PRIME3) & MASK;
|
|
76
|
+
offset += 4;
|
|
77
|
+
}
|
|
78
|
+
while (offset < bytes.length) {
|
|
79
|
+
hash ^= (BigInt(bytes[offset] ?? 0) * PRIME5) & MASK;
|
|
80
|
+
hash = (((hash << 11n) | (hash >> 53n)) * PRIME1) & MASK;
|
|
81
|
+
offset += 1;
|
|
82
|
+
}
|
|
83
|
+
hash ^= hash >> 33n;
|
|
84
|
+
hash = (hash * PRIME2) & MASK;
|
|
85
|
+
hash ^= hash >> 29n;
|
|
86
|
+
hash = (hash * PRIME3) & MASK;
|
|
87
|
+
return (hash ^ (hash >> 32n)) & MASK;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Computes Claude Code's five-hex-digit CCH from the exact outgoing body bytes. */
|
|
91
|
+
export function computeClaudeCch(body: Uint8Array): string {
|
|
92
|
+
return (xxHash64(body, CCH_SEED) & 0xfffffn).toString(16).padStart(5, "0");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Replaces the anchored Claude billing placeholder in a mutable body before sending. */
|
|
96
|
+
export function patchClaudeCch(body: Uint8Array): boolean {
|
|
97
|
+
const marker = encoder.encode('"system":[{"type":"text","text":"x-anthropic-billing-header:');
|
|
98
|
+
const placeholder = encoder.encode(PLACEHOLDER);
|
|
99
|
+
let markerIndex = -1;
|
|
100
|
+
outer: for (let index = 0; index <= body.length - marker.length; index += 1) {
|
|
101
|
+
for (let j = 0; j < marker.length; j += 1) if (body[index + j] !== marker[j]) continue outer;
|
|
102
|
+
markerIndex = index;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
if (markerIndex < 0) return false;
|
|
106
|
+
const start = markerIndex + marker.length;
|
|
107
|
+
const end = Math.min(body.length - placeholder.length, start + 150);
|
|
108
|
+
for (let index = start; index <= end; index += 1) {
|
|
109
|
+
let found = true;
|
|
110
|
+
for (let j = 0; j < placeholder.length; j += 1)
|
|
111
|
+
if (body[index + j] !== placeholder[j]) {
|
|
112
|
+
found = false;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
if (!found) continue;
|
|
116
|
+
const cch = encoder.encode(computeClaudeCch(body));
|
|
117
|
+
body.set(cch, index + 4);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Harness identity instruction, sent on OAuth dispatch. */
|
|
124
|
+
export const CLAUDE_CODE_SYSTEM_INSTRUCTION =
|
|
125
|
+
"You are Claude Code, Anthropic's official CLI for Claude.";
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Builds the billing header text with the captured version suffix:
|
|
129
|
+
* `cc_version={ver}.{sha256("59cf53e54c78" + chars + ver)[0:3]}` where
|
|
130
|
+
* chars are the 5th/8th/21st chars of the first user text (or "0" when
|
|
131
|
+
* absent). `cc_entrypoint=cli` matches the harness UA `(external, cli)`;
|
|
132
|
+
* an older snapshot used `claude-desktop`, which is unverified from local
|
|
133
|
+
* evidence, so cli is kept with this note.
|
|
134
|
+
*/
|
|
135
|
+
export function createClaudeBillingText(userText: string, version: string): string {
|
|
136
|
+
const chars = [4, 7, 20].map((index) => userText[index] ?? "0").join("");
|
|
137
|
+
const suffix = createHash("sha256")
|
|
138
|
+
.update(`59cf53e54c78${chars}${version}`)
|
|
139
|
+
.digest("hex")
|
|
140
|
+
.slice(0, 3);
|
|
141
|
+
return `x-anthropic-billing-header: cc_version=${version}.${suffix}; cc_entrypoint=cli; cch=00000;`;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Patches a string request body and returns its encoded bytes, or undefined when no billing block exists. */
|
|
145
|
+
export function patchClaudeCchBody(body: string): Uint8Array | undefined {
|
|
146
|
+
const bytes = encoder.encode(body);
|
|
147
|
+
return patchClaudeCch(bytes) ? bytes : undefined;
|
|
148
|
+
}
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
29
|
import { GatewayError } from "../../../protocol/gateway-error";
|
|
30
|
+
import { fnv1a32 } from "../shared/hash";
|
|
30
31
|
|
|
31
32
|
const CREDIT_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
32
33
|
const MAX_CACHE_SIZE = 64;
|
|
@@ -122,15 +123,10 @@ export class FallbackCreditCache {
|
|
|
122
123
|
|
|
123
124
|
/**
|
|
124
125
|
* Compute a simple hash of the request body for cache keying.
|
|
125
|
-
*
|
|
126
|
+
* FNV-1a — fast, deterministic, sufficient for cache identity.
|
|
126
127
|
*/
|
|
127
128
|
export function hashBody(body: string): string {
|
|
128
|
-
|
|
129
|
-
for (let i = 0; i < body.length; i++) {
|
|
130
|
-
hash ^= body.charCodeAt(i);
|
|
131
|
-
hash = Math.imul(hash, 0x01000193);
|
|
132
|
-
}
|
|
133
|
-
return (hash >>> 0).toString(36);
|
|
129
|
+
return fnv1a32(body).toString(36);
|
|
134
130
|
}
|
|
135
131
|
|
|
136
132
|
// Shared process-wide cache instance
|
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
import type { FetchLike } from "../../authentication/oauth-client";
|
|
2
|
-
|
|
3
|
-
export const CODEX_DEVICE_USERCODE_URL = "https://auth.openai.com/api/accounts/deviceauth/usercode";
|
|
4
|
-
export const CODEX_DEVICE_TOKEN_URL = "https://auth.openai.com/api/accounts/deviceauth/token";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Lifetime of one device authorization, in seconds.
|
|
8
|
-
*
|
|
9
|
-
* The Codex device endpoint states no expiry, so the flow bounds itself: this
|
|
10
|
-
* is both what `startDeviceAuth` reports to the dashboard (its own countdown)
|
|
11
|
-
* and what the poll checks before spending a request on a dead authorization.
|
|
12
|
-
*/
|
|
13
|
-
export const CODEX_DEVICE_TTL_SECONDS = 900;
|
|
14
|
-
|
|
15
|
-
interface CodexDeviceStart {
|
|
16
|
-
readonly deviceAuthId: string;
|
|
17
|
-
readonly userCode: string;
|
|
18
|
-
readonly intervalSeconds: number;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface CodexDeviceAuthorization {
|
|
22
|
-
readonly authorizationCode: string;
|
|
23
|
-
readonly codeVerifier: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** Validates persisted provider-private device state read back from the flow store. */
|
|
27
|
-
export function parseCodexDeviceStart(value: Record<string, unknown>): CodexDeviceStart | undefined {
|
|
28
|
-
const { deviceAuthId, userCode, intervalSeconds } = value;
|
|
29
|
-
if (typeof deviceAuthId !== "string" || typeof userCode !== "string") return undefined;
|
|
30
|
-
if (typeof intervalSeconds !== "number" || !Number.isFinite(intervalSeconds)) return undefined;
|
|
31
|
-
return { deviceAuthId, userCode, intervalSeconds: Math.max(0, intervalSeconds) };
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
interface DeviceUserCodeResponse {
|
|
35
|
-
device_auth_id?: unknown;
|
|
36
|
-
user_code?: unknown;
|
|
37
|
-
interval?: unknown;
|
|
38
|
-
}
|
|
39
|
-
interface DeviceTokenResponse {
|
|
40
|
-
authorization_code?: unknown;
|
|
41
|
-
code_verifier?: unknown;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function jsonHeaders(): HeadersInit {
|
|
45
|
-
return { "content-type": "application/json", accept: "application/json" };
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export async function startCodexDeviceAuth(
|
|
49
|
-
clientId: string,
|
|
50
|
-
fetchFn: FetchLike = globalThis.fetch,
|
|
51
|
-
): Promise<CodexDeviceStart> {
|
|
52
|
-
const response = await fetchFn(CODEX_DEVICE_USERCODE_URL, {
|
|
53
|
-
method: "POST",
|
|
54
|
-
headers: jsonHeaders(),
|
|
55
|
-
body: JSON.stringify({ client_id: clientId }),
|
|
56
|
-
});
|
|
57
|
-
if (!response.ok) throw new Error(`Codex device authorization failed (${response.status})`);
|
|
58
|
-
const body = (await response.json()) as DeviceUserCodeResponse;
|
|
59
|
-
if (typeof body.device_auth_id !== "string" || typeof body.user_code !== "string")
|
|
60
|
-
throw new Error("Codex device authorization returned an invalid response");
|
|
61
|
-
const interval =
|
|
62
|
-
typeof body.interval === "number" && Number.isFinite(body.interval)
|
|
63
|
-
? Math.max(0, body.interval)
|
|
64
|
-
: 5;
|
|
65
|
-
return { deviceAuthId: body.device_auth_id, userCode: body.user_code, intervalSeconds: interval };
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* One device-token poll attempt.
|
|
70
|
-
*
|
|
71
|
-
* Returns `undefined` while the user has not approved yet (the endpoint answers
|
|
72
|
-
* 403/404) and the parsed PKCE pair once it has. Deliberately a single request:
|
|
73
|
-
* the dashboard owns the polling cadence, so the console route returns
|
|
74
|
-
* `pending` between attempts instead of holding one HTTP request open for the
|
|
75
|
-
* whole authorization window. A blocking loop here occupied a console worker
|
|
76
|
-
* for up to the full TTL and made the dialog's own interval meaningless.
|
|
77
|
-
*/
|
|
78
|
-
export async function pollCodexDeviceAuth(
|
|
79
|
-
device: CodexDeviceStart,
|
|
80
|
-
fetchFn: FetchLike = globalThis.fetch,
|
|
81
|
-
): Promise<CodexDeviceAuthorization | undefined> {
|
|
82
|
-
let response: Response;
|
|
83
|
-
try {
|
|
84
|
-
response = await fetchFn(CODEX_DEVICE_TOKEN_URL, {
|
|
85
|
-
method: "POST",
|
|
86
|
-
headers: jsonHeaders(),
|
|
87
|
-
body: JSON.stringify({ device_auth_id: device.deviceAuthId, user_code: device.userCode }),
|
|
88
|
-
});
|
|
89
|
-
} catch (error) {
|
|
90
|
-
// A network failure is not "not approved yet": surface it so the caller
|
|
91
|
-
// can return a failed verdict instead of polling to expiry.
|
|
92
|
-
throw new Error(`Codex device polling failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
93
|
-
}
|
|
94
|
-
// 403/404 are the endpoint's "not approved yet" answers, not failures.
|
|
95
|
-
if (response.status === 403 || response.status === 404) return undefined;
|
|
96
|
-
if (!response.ok) throw new Error(`Codex device polling failed (${response.status})`);
|
|
97
|
-
const body = (await response.json()) as DeviceTokenResponse;
|
|
98
|
-
if (typeof body.authorization_code === "string" && typeof body.code_verifier === "string")
|
|
99
|
-
return { authorizationCode: body.authorization_code, codeVerifier: body.code_verifier };
|
|
100
|
-
return undefined;
|
|
101
|
-
}
|
|
1
|
+
import type { FetchLike } from "../../authentication/oauth-client";
|
|
2
|
+
|
|
3
|
+
export const CODEX_DEVICE_USERCODE_URL = "https://auth.openai.com/api/accounts/deviceauth/usercode";
|
|
4
|
+
export const CODEX_DEVICE_TOKEN_URL = "https://auth.openai.com/api/accounts/deviceauth/token";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Lifetime of one device authorization, in seconds.
|
|
8
|
+
*
|
|
9
|
+
* The Codex device endpoint states no expiry, so the flow bounds itself: this
|
|
10
|
+
* is both what `startDeviceAuth` reports to the dashboard (its own countdown)
|
|
11
|
+
* and what the poll checks before spending a request on a dead authorization.
|
|
12
|
+
*/
|
|
13
|
+
export const CODEX_DEVICE_TTL_SECONDS = 900;
|
|
14
|
+
|
|
15
|
+
interface CodexDeviceStart {
|
|
16
|
+
readonly deviceAuthId: string;
|
|
17
|
+
readonly userCode: string;
|
|
18
|
+
readonly intervalSeconds: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface CodexDeviceAuthorization {
|
|
22
|
+
readonly authorizationCode: string;
|
|
23
|
+
readonly codeVerifier: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Validates persisted provider-private device state read back from the flow store. */
|
|
27
|
+
export function parseCodexDeviceStart(value: Record<string, unknown>): CodexDeviceStart | undefined {
|
|
28
|
+
const { deviceAuthId, userCode, intervalSeconds } = value;
|
|
29
|
+
if (typeof deviceAuthId !== "string" || typeof userCode !== "string") return undefined;
|
|
30
|
+
if (typeof intervalSeconds !== "number" || !Number.isFinite(intervalSeconds)) return undefined;
|
|
31
|
+
return { deviceAuthId, userCode, intervalSeconds: Math.max(0, intervalSeconds) };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface DeviceUserCodeResponse {
|
|
35
|
+
device_auth_id?: unknown;
|
|
36
|
+
user_code?: unknown;
|
|
37
|
+
interval?: unknown;
|
|
38
|
+
}
|
|
39
|
+
interface DeviceTokenResponse {
|
|
40
|
+
authorization_code?: unknown;
|
|
41
|
+
code_verifier?: unknown;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function jsonHeaders(): HeadersInit {
|
|
45
|
+
return { "content-type": "application/json", accept: "application/json" };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export async function startCodexDeviceAuth(
|
|
49
|
+
clientId: string,
|
|
50
|
+
fetchFn: FetchLike = globalThis.fetch,
|
|
51
|
+
): Promise<CodexDeviceStart> {
|
|
52
|
+
const response = await fetchFn(CODEX_DEVICE_USERCODE_URL, {
|
|
53
|
+
method: "POST",
|
|
54
|
+
headers: jsonHeaders(),
|
|
55
|
+
body: JSON.stringify({ client_id: clientId }),
|
|
56
|
+
});
|
|
57
|
+
if (!response.ok) throw new Error(`Codex device authorization failed (${response.status})`);
|
|
58
|
+
const body = (await response.json()) as DeviceUserCodeResponse;
|
|
59
|
+
if (typeof body.device_auth_id !== "string" || typeof body.user_code !== "string")
|
|
60
|
+
throw new Error("Codex device authorization returned an invalid response");
|
|
61
|
+
const interval =
|
|
62
|
+
typeof body.interval === "number" && Number.isFinite(body.interval)
|
|
63
|
+
? Math.max(0, body.interval)
|
|
64
|
+
: 5;
|
|
65
|
+
return { deviceAuthId: body.device_auth_id, userCode: body.user_code, intervalSeconds: interval };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* One device-token poll attempt.
|
|
70
|
+
*
|
|
71
|
+
* Returns `undefined` while the user has not approved yet (the endpoint answers
|
|
72
|
+
* 403/404) and the parsed PKCE pair once it has. Deliberately a single request:
|
|
73
|
+
* the dashboard owns the polling cadence, so the console route returns
|
|
74
|
+
* `pending` between attempts instead of holding one HTTP request open for the
|
|
75
|
+
* whole authorization window. A blocking loop here occupied a console worker
|
|
76
|
+
* for up to the full TTL and made the dialog's own interval meaningless.
|
|
77
|
+
*/
|
|
78
|
+
export async function pollCodexDeviceAuth(
|
|
79
|
+
device: CodexDeviceStart,
|
|
80
|
+
fetchFn: FetchLike = globalThis.fetch,
|
|
81
|
+
): Promise<CodexDeviceAuthorization | undefined> {
|
|
82
|
+
let response: Response;
|
|
83
|
+
try {
|
|
84
|
+
response = await fetchFn(CODEX_DEVICE_TOKEN_URL, {
|
|
85
|
+
method: "POST",
|
|
86
|
+
headers: jsonHeaders(),
|
|
87
|
+
body: JSON.stringify({ device_auth_id: device.deviceAuthId, user_code: device.userCode }),
|
|
88
|
+
});
|
|
89
|
+
} catch (error) {
|
|
90
|
+
// A network failure is not "not approved yet": surface it so the caller
|
|
91
|
+
// can return a failed verdict instead of polling to expiry.
|
|
92
|
+
throw new Error(`Codex device polling failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
93
|
+
}
|
|
94
|
+
// 403/404 are the endpoint's "not approved yet" answers, not failures.
|
|
95
|
+
if (response.status === 403 || response.status === 404) return undefined;
|
|
96
|
+
if (!response.ok) throw new Error(`Codex device polling failed (${response.status})`);
|
|
97
|
+
const body = (await response.json()) as DeviceTokenResponse;
|
|
98
|
+
if (typeof body.authorization_code === "string" && typeof body.code_verifier === "string")
|
|
99
|
+
return { authorizationCode: body.authorization_code, codeVerifier: body.code_verifier };
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|