cartethyia 2.8.0 → 2.8.1
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 +3 -3
- package/dist/dashboard/assets/{BannedPage-Cc0vKpMG.js → BannedPage-Dq530awD.js} +1 -1
- package/dist/dashboard/assets/BannedPage-Dq530awD.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-Bqj2aa1T.js → CliToolDetailPage-DZzaS-7S.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-DZzaS-7S.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-CXsaOAO2.js → CliToolsPage-DaZZ3cqP.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-DaZZ3cqP.js.gz +0 -0
- package/dist/dashboard/assets/{CombosPage-BeLpJ4ma.js → CombosPage-BlC_xdkX.js} +1 -1
- package/dist/dashboard/assets/CombosPage-BlC_xdkX.js.gz +0 -0
- package/dist/dashboard/assets/{ConsoleLogPage-DnV0uZ3m.js → ConsoleLogPage-D-rqeVtG.js} +1 -1
- package/dist/dashboard/assets/ConsoleLogPage-D-rqeVtG.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-CBxAjo63.js → CustomizationPage-7xT5yg2E.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-7xT5yg2E.js.gz +0 -0
- package/dist/dashboard/assets/{HealthEventsModal-B5yEE0k6.js → HealthEventsModal-Clq8E9cW.js} +1 -1
- package/dist/dashboard/assets/HealthEventsModal-Clq8E9cW.js.gz +0 -0
- package/dist/dashboard/assets/{InjectSystemPromptPanel-BWFLECmz.js → InjectSystemPromptPanel-6Teoq9Se.js} +1 -1
- package/dist/dashboard/assets/InjectSystemPromptPanel-6Teoq9Se.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-CgoPc5B9.js → LoginPage-CZuI0MAR.js} +1 -1
- package/dist/dashboard/assets/LoginPage-CZuI0MAR.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-D9bFQern.js → ModelPicker-C1hNTlkr.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-C1hNTlkr.js.gz +0 -0
- package/dist/dashboard/assets/{OverviewPage-B_p4tL8k.js → OverviewPage-0yfhSI1C.js} +1 -1
- package/dist/dashboard/assets/OverviewPage-0yfhSI1C.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-xqTxdQ4c.js +8 -0
- package/dist/dashboard/assets/ProviderDetailPage-xqTxdQ4c.js.gz +0 -0
- package/dist/dashboard/assets/{ProviderIcon-D_0PiZtg.js → ProviderIcon-Ddhm1InL.js} +1 -1
- package/dist/dashboard/assets/ProviderIcon-Ddhm1InL.js.gz +0 -0
- package/dist/dashboard/assets/{ProvidersPage-CLI2bJTK.js → ProvidersPage-C3fYuu6i.js} +1 -1
- package/dist/dashboard/assets/ProvidersPage-C3fYuu6i.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-CHtJtZ3u.js +9 -0
- package/dist/dashboard/assets/ProxyPage-CHtJtZ3u.js.gz +0 -0
- package/dist/dashboard/assets/{QuotaPage-DA-a1iSN.js → QuotaPage-D1RV_2BX.js} +1 -1
- package/dist/dashboard/assets/QuotaPage-D1RV_2BX.js.gz +0 -0
- package/dist/dashboard/assets/{SettingsPage-CctTga2C.js → SettingsPage-BzZAvYSX.js} +1 -1
- package/dist/dashboard/assets/SettingsPage-BzZAvYSX.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-febLU4r1.js → SetupPage--s-EfEIL.js} +1 -1
- package/dist/dashboard/assets/SetupPage--s-EfEIL.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-M6fvR5Wz.js → StudioPage-BjXFGSK4.js} +1 -1
- package/dist/dashboard/assets/StudioPage-BjXFGSK4.js.gz +0 -0
- package/dist/dashboard/assets/{UsagePage-nyeuRqz9.js → UsagePage-CP8F8BN7.js} +1 -1
- package/dist/dashboard/assets/UsagePage-CP8F8BN7.js.gz +0 -0
- package/dist/dashboard/assets/{api-keys-BFOlvrJC.js → api-keys-2hc12Uz2.js} +1 -1
- package/dist/dashboard/assets/api-keys-2hc12Uz2.js.gz +0 -0
- package/dist/dashboard/assets/app-DGXbNfAR.css +2 -0
- package/dist/dashboard/assets/app-DGXbNfAR.css.gz +0 -0
- package/dist/dashboard/assets/{assert-CqTLw5e7.js → assert-BMcj1xZE.js} +1 -1
- package/dist/dashboard/assets/assert-BMcj1xZE.js.gz +0 -0
- package/dist/dashboard/assets/{badge-C83EqLB0.js → badge-DkRUuVfz.js} +1 -1
- package/dist/dashboard/assets/badge-DkRUuVfz.js.gz +0 -0
- package/dist/dashboard/assets/{banner-D1xn7pIe.js → banner-CDjW841Q.js} +1 -1
- package/dist/dashboard/assets/banner-CDjW841Q.js.gz +0 -0
- package/dist/dashboard/assets/{card-DU3Lq5Lm.js → card-Bto5UlL9.js} +1 -1
- package/dist/dashboard/assets/card-Bto5UlL9.js.gz +0 -0
- package/dist/dashboard/assets/{cli-tools-Dw1U_drK.js → cli-tools-DaH6g9hL.js} +1 -1
- package/dist/dashboard/assets/cli-tools-DaH6g9hL.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-CEL5Sg_J.js → clipboard-button-BYKBCzjk.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-BYKBCzjk.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-BjFR5UHy.js → dialog-DL0Zftwv.js} +1 -1
- package/dist/dashboard/assets/dialog-DL0Zftwv.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-HvBW0AjI.js → drawer-Dpx_UXaS.js} +1 -1
- package/dist/dashboard/assets/drawer-Dpx_UXaS.js.gz +0 -0
- package/dist/dashboard/assets/{entry-CECVELyy.js → entry-BV7-1NoM.js} +1 -1
- package/dist/dashboard/assets/entry-BV7-1NoM.js.gz +0 -0
- package/dist/dashboard/assets/{entry-DYYofQ7W.js → entry-CGvdNU6r.js} +1 -1
- package/dist/dashboard/assets/entry-CGvdNU6r.js.gz +0 -0
- package/dist/dashboard/assets/{entry-BSu3gFlt.js → entry-DScKYvZj.js} +3 -3
- package/dist/dashboard/assets/entry-DScKYvZj.js.gz +0 -0
- package/dist/dashboard/assets/{formatters-DLW4i8zK.js → formatters-BS3DZlZj.js} +1 -1
- package/dist/dashboard/assets/formatters-BS3DZlZj.js.gz +0 -0
- package/dist/dashboard/assets/{index-1-fCqe64.js → index-SQnvvTWX.js} +2 -2
- package/dist/dashboard/assets/index-SQnvvTWX.js.gz +0 -0
- package/dist/dashboard/assets/{inline-DGvU2oLK.js → inline-Dl-cuLK0.js} +1 -1
- package/dist/dashboard/assets/inline-Dl-cuLK0.js.gz +0 -0
- package/dist/dashboard/assets/{input-iNnO1X2K.js → input-Bfx0EzRc.js} +1 -1
- package/dist/dashboard/assets/input-Bfx0EzRc.js.gz +0 -0
- package/dist/dashboard/assets/{layout-0q8UGypb.js → layout-BxhbQ_JS.js} +1 -1
- package/dist/dashboard/assets/layout-BxhbQ_JS.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-C0w2bQjJ.js → list-row-D49Y4ptn.js} +1 -1
- package/dist/dashboard/assets/list-row-D49Y4ptn.js.gz +0 -0
- package/dist/dashboard/assets/{live-M5aJ_xCa.js → live-CbVTdX9V.js} +1 -1
- package/dist/dashboard/assets/live-CbVTdX9V.js.gz +0 -0
- package/dist/dashboard/assets/{network-BKeQGT3K.js → network-JGvDveof.js} +1 -1
- package/dist/dashboard/assets/network-JGvDveof.js.gz +0 -0
- package/dist/dashboard/assets/{numbers-CivAk3da.js → numbers-Dw6kiew-.js} +1 -1
- package/dist/dashboard/assets/numbers-Dw6kiew-.js.gz +0 -0
- package/dist/dashboard/assets/{pagination-CpzvI5ep.js → pagination-iUoI8GeE.js} +1 -1
- package/dist/dashboard/assets/pagination-iUoI8GeE.js.gz +0 -0
- package/dist/dashboard/assets/providers/sensenova-intl.png +0 -0
- package/dist/dashboard/assets/providers/sensenova.png +0 -0
- package/dist/dashboard/assets/{routing-BFQX2VBc.js → routing-8jZr-3WE.js} +1 -1
- package/dist/dashboard/assets/routing-8jZr-3WE.js.gz +0 -0
- package/dist/dashboard/assets/{select-CXbck0jG.js → select-oO1FxMVb.js} +1 -1
- package/dist/dashboard/assets/select-oO1FxMVb.js.gz +0 -0
- package/dist/dashboard/assets/{settings-C_XvMHh9.js → settings-CLr3kdIx.js} +1 -1
- package/dist/dashboard/assets/settings-CLr3kdIx.js.gz +0 -0
- package/dist/dashboard/assets/{stack-DggRiCxE.js → stack-Y3pDteZr.js} +1 -1
- package/dist/dashboard/assets/stack-Y3pDteZr.js.gz +0 -0
- package/dist/dashboard/assets/{state-ClFzfbYp.js → state-CArX_Iak.js} +1 -1
- package/dist/dashboard/assets/state-CArX_Iak.js.gz +0 -0
- package/dist/dashboard/assets/{switch-CTIFxKqS.js → switch-DwlwmDO-.js} +1 -1
- package/dist/dashboard/assets/switch-DwlwmDO-.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-BClG3yWj.js → useMutation-DJ9GYEgf.js} +1 -1
- package/dist/dashboard/assets/useMutation-DJ9GYEgf.js.gz +0 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +51 -51
- package/migrations/full-postgres/0047_add_provider_device_flow_proxy.sql +17 -0
- package/migrations/lite-sqlite3/0047_add_provider_device_flow_proxy.sql +19 -0
- package/package.json +1 -1
- package/src/boot/app.ts +1 -1
- package/src/boot/dependencies.ts +4 -6
- package/src/config/providers.ts +6 -5
- package/src/config/spec.ts +8 -8
- package/src/console/backup/nine-router.ts +71 -10
- package/src/console/backup/service.ts +8 -1
- package/src/console/console-router.ts +1 -1
- package/src/console/domain-registration.ts +7 -2
- package/src/console/inferhub/client.ts +1 -1
- package/src/console/observability/live.ts +2 -2
- package/src/console/providers/catalog/contracts.ts +9 -3
- package/src/console/providers/catalog/model-operations.ts +2 -3
- package/src/console/providers/catalog/provider-operations.ts +1 -1
- package/src/console/providers/catalog/routes.ts +2 -2
- package/src/console/providers/catalog/store.ts +1914 -1907
- package/src/console/providers/detail/routes.ts +1 -0
- package/src/console/providers/detail/store.ts +4 -0
- package/src/console/providers/oauth/callback-listener.ts +30 -11
- package/src/console/providers/oauth/device-egress.ts +123 -0
- package/src/console/providers/oauth/routes.ts +123 -16
- package/src/console/quota/account-quota-tenant.ts +5 -5
- package/src/console/quota/account-test-egress.ts +2 -2
- package/src/console/quota/daily-growth-job.ts +1 -1
- package/src/console/routing/pools/contracts.ts +1 -1
- package/src/console/routing/pools/operations.ts +1 -1
- package/src/console/routing/pools/probe-verdict.ts +2 -2
- package/src/console/routing/pools/relay-deploy.ts +1 -1
- package/src/console/routing/pools/store.ts +4 -4
- package/src/network/client.ts +67 -0
- package/src/network/egress/bidi-session.ts +322 -0
- package/src/network/egress/dial.ts +201 -0
- package/src/network/egress/factory.ts +191 -0
- package/src/network/{outbound-fetch.ts → egress/fetch.ts} +195 -29
- package/src/network/egress/tls-profile.ts +123 -0
- package/src/network/egress/ws.ts +175 -0
- package/src/network/{types.ts → pool/agent-config.ts} +1 -1
- package/src/network/pool/agent.ts +2 -2
- package/src/network/{pool-cooldown-store.ts → pool/cooldown-store.ts} +7 -7
- package/src/network/{pool-health-machine.ts → pool/health.ts} +205 -6
- package/src/network/pool/resolver.ts +10 -849
- package/src/network/pool/selector.ts +2 -2
- package/src/network/ssrf.ts +1 -1
- package/src/network/{retry.ts → util/retry.ts} +1 -1
- package/src/observability/telemetry-buffer.ts +1 -1
- package/src/persistence/schema.ts +9 -0
- package/src/persistence/ttl-cache.ts +1 -1
- package/src/protocol/codecs.ts +58 -1
- package/src/protocol/request/messages.ts +31 -18
- package/src/protocol/response/messages.ts +34 -7
- package/src/protocol/translation/quirks.ts +15 -0
- package/src/protocol/upstream/send-claude-messages.ts +2 -2
- package/src/providers/adapters/compatible-adapter.ts +5 -0
- package/src/providers/authentication/oauth-client.ts +40 -6
- package/src/providers/authentication/oauth-device-flow.ts +7 -3
- package/src/providers/authentication/oauth-flow-store.ts +82 -1
- package/src/providers/authentication/oauth-refresh-service.ts +766 -739
- package/src/providers/default-registry.ts +76 -0
- package/src/providers/discovery/discovery-types.ts +7 -0
- package/src/providers/discovery/probe-phases.ts +6 -2
- package/src/providers/discovery/probing-service.ts +7 -0
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +11 -0
- package/src/providers/integrations/buddy/account.ts +969 -0
- package/src/providers/integrations/buddy/capabilities.ts +10 -10
- package/src/providers/integrations/buddy/{buddy-catalog-shared.ts → catalog.ts} +198 -136
- package/src/providers/integrations/buddy/{buddy-chat-shared.ts → chat.ts} +5 -5
- package/src/providers/integrations/buddy/codebuddy/index.ts +429 -0
- package/src/providers/integrations/buddy/codebuddy/shared.ts +4 -4
- package/src/providers/integrations/buddy/{buddy-identity.ts → headers.ts} +138 -140
- package/src/providers/integrations/buddy/lifecycle.ts +1018 -0
- package/src/providers/integrations/buddy/{buddy-media.ts → media.ts} +1 -1
- package/src/providers/integrations/cline/cline-oauth.ts +10 -5
- package/src/providers/integrations/cline/cline.ts +3 -4
- package/src/providers/integrations/clixad/clixad-oauth.ts +98 -0
- package/src/providers/integrations/clixad/clixad-quota.ts +132 -0
- package/src/providers/integrations/clixad/provider.ts +145 -0
- package/src/providers/integrations/codex/codex-oauth.ts +8 -5
- package/src/providers/integrations/cursor/cursor-auth.ts +1 -1
- package/src/providers/integrations/cursor/cursor-hardening.ts +279 -0
- package/src/providers/integrations/cursor/cursor-http2.ts +605 -6
- package/src/providers/integrations/cursor/cursor-shared.ts +1 -1
- package/src/providers/integrations/cursor/cursor.ts +485 -70
- package/src/providers/integrations/deepai/deepai-catalog.ts +149 -0
- package/src/providers/integrations/deepai/deepai-common.ts +145 -0
- package/src/providers/integrations/deepai/deepai-oauth.ts +129 -0
- package/src/providers/integrations/deepai/deepai-quota.ts +97 -0
- package/src/providers/integrations/deepai/provider.ts +42 -0
- package/src/providers/integrations/devin/devin-auth.ts +7 -0
- package/src/providers/integrations/factory/factory-oauth.ts +16 -7
- package/src/providers/integrations/freebuff/freebuff.ts +2 -2
- package/src/providers/integrations/freepi/freepi-catalog.ts +5 -0
- package/src/providers/integrations/freepi/freepi-discovery.ts +2 -2
- package/src/providers/integrations/freepi/freepi-headers.ts +2 -2
- package/src/providers/integrations/freepi/freepi-protocol.ts +11 -2
- package/src/providers/integrations/freepi/freepi-realm.ts +0 -3
- package/src/providers/integrations/freepi/freepi-session.ts +158 -0
- package/src/providers/integrations/freepi/freepi.ts +80 -54
- package/src/providers/integrations/github/github-discovery.ts +30 -13
- package/src/providers/integrations/github/github-oauth.ts +217 -44
- package/src/providers/integrations/github/github-quota.ts +22 -5
- package/src/providers/integrations/github/github.ts +40 -32
- package/src/providers/integrations/grok/grok-oauth.ts +4 -4
- package/src/providers/integrations/hermes/hermes-oauth.ts +3 -3
- package/src/providers/integrations/hermes/hermes.ts +34 -5
- package/src/providers/integrations/kilo/kilo-oauth.ts +4 -4
- package/src/providers/integrations/kilo/kilo.ts +1 -1
- package/src/providers/integrations/kimi/kimi-oauth.ts +3 -3
- package/src/providers/integrations/kiro/kiro-oauth.ts +2 -2
- package/src/providers/integrations/muse/muse-oauth.ts +5 -5
- package/src/providers/integrations/opencode/fingerprint.ts +1 -1
- package/src/providers/integrations/openrouter/provider.ts +1 -1
- package/src/providers/integrations/perch/perch-protocol.ts +0 -3
- package/src/providers/integrations/perch/perch.ts +3 -3
- package/src/providers/integrations/qoder/claim-qoder-credits.ts +1 -1
- package/src/providers/integrations/qoder/qoder-adapter.ts +19 -113
- package/src/providers/integrations/qoder/qoder-auth.ts +8 -1
- package/src/providers/integrations/qoder/qoder-catalog.ts +1 -1
- package/src/providers/integrations/qoder/qoder-chat.ts +25 -8
- package/src/providers/integrations/qoder/qoder-checkin.ts +1 -1
- package/src/providers/integrations/qoder/qoder-cosy.ts +37 -9
- package/src/providers/integrations/qoder/qoder-oauth.ts +9 -2
- package/src/providers/integrations/qoder/qoder-realm.ts +13 -36
- package/src/providers/integrations/qoder/qoder-sse.ts +447 -68
- package/src/providers/integrations/qoder/qoder-types.ts +9 -0
- package/src/providers/integrations/qoder/qoder.ts +3 -25
- package/src/providers/integrations/sensenova/provider.ts +144 -0
- package/src/providers/integrations/trae/trae-quota.ts +15 -1
- package/src/providers/integrations/vercel/provider.ts +117 -0
- package/src/providers/integrations/vercel/vercel-quota.ts +96 -0
- package/src/providers/integrations/xai/xai-oauth.ts +5 -5
- package/src/providers/integrations/zcode-start-plan/gifts.ts +1 -1
- package/src/providers/integrations/zcode-start-plan/oauth.ts +3 -3
- package/src/providers/integrations/zro/zro.ts +2 -1
- package/src/providers/operations/account-refresh-status.ts +14 -0
- package/src/providers/operations/client-versions.ts +95 -30
- package/src/providers/operations/oauth-refresh-lead.ts +46 -22
- package/src/providers/operations/provider-caches.ts +1 -1
- package/src/providers/operations/provider-credential-service.ts +22 -25
- package/src/providers/operations/session-resolution.ts +17 -1
- package/src/providers/provider-contracts.ts +2 -2
- package/src/providers/provider-metadata.ts +30 -0
- package/src/providers/quota/quota-contracts.ts +2 -0
- package/src/providers/quota/refresh.ts +25 -3
- package/src/security/ip-boundary.ts +1 -1
- package/src/transport/dispatch/attempt-finalize.ts +1 -1
- package/src/transport/dispatch/attempt-loop.ts +3 -3
- package/src/transport/dispatch/handler-deps.ts +1 -1
- package/src/transport/dispatch/leases.ts +1 -1
- package/src/transport/dispatch/retry-policy.ts +1 -1
- package/src/transport/dispatch/streaming/finalize.ts +2 -2
- package/src/transport/dispatch/streaming/stream.ts +1 -1
- package/src/transport/dispatch/upstream.ts +1 -1
- package/src/transport/shutdown-notice.ts +1 -1
- package/src/workers/buddy-growth-tasks.ts +8 -8
- package/src/workers/daily-checkin.ts +4 -4
- package/src/workers/quota-refresh-sweep.ts +1 -1
- package/src/workers/zcode-gift-claim.ts +1 -1
- package/dist/dashboard/assets/BannedPage-Cc0vKpMG.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-Bqj2aa1T.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-CXsaOAO2.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-BeLpJ4ma.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-DnV0uZ3m.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-CBxAjo63.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-B5yEE0k6.js.gz +0 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-BWFLECmz.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-CgoPc5B9.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-D9bFQern.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-B_p4tL8k.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-rs5E2rxv.js +0 -8
- package/dist/dashboard/assets/ProviderDetailPage-rs5E2rxv.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-D_0PiZtg.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-CLI2bJTK.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-BwNC_-Cx.js +0 -9
- package/dist/dashboard/assets/ProxyPage-BwNC_-Cx.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-DA-a1iSN.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-CctTga2C.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-febLU4r1.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-M6fvR5Wz.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-nyeuRqz9.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-BFOlvrJC.js.gz +0 -0
- package/dist/dashboard/assets/app-Dx2QgsNj.css +0 -2
- package/dist/dashboard/assets/app-Dx2QgsNj.css.gz +0 -0
- package/dist/dashboard/assets/assert-CqTLw5e7.js.gz +0 -0
- package/dist/dashboard/assets/badge-C83EqLB0.js.gz +0 -0
- package/dist/dashboard/assets/banner-D1xn7pIe.js.gz +0 -0
- package/dist/dashboard/assets/card-DU3Lq5Lm.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-Dw1U_drK.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-CEL5Sg_J.js.gz +0 -0
- package/dist/dashboard/assets/dialog-BjFR5UHy.js.gz +0 -0
- package/dist/dashboard/assets/drawer-HvBW0AjI.js.gz +0 -0
- package/dist/dashboard/assets/entry-BSu3gFlt.js.gz +0 -0
- package/dist/dashboard/assets/entry-CECVELyy.js.gz +0 -0
- package/dist/dashboard/assets/entry-DYYofQ7W.js.gz +0 -0
- package/dist/dashboard/assets/formatters-DLW4i8zK.js.gz +0 -0
- package/dist/dashboard/assets/index-1-fCqe64.js.gz +0 -0
- package/dist/dashboard/assets/inline-DGvU2oLK.js.gz +0 -0
- package/dist/dashboard/assets/input-iNnO1X2K.js.gz +0 -0
- package/dist/dashboard/assets/layout-0q8UGypb.js.gz +0 -0
- package/dist/dashboard/assets/list-row-C0w2bQjJ.js.gz +0 -0
- package/dist/dashboard/assets/live-M5aJ_xCa.js.gz +0 -0
- package/dist/dashboard/assets/network-BKeQGT3K.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CivAk3da.js.gz +0 -0
- package/dist/dashboard/assets/pagination-CpzvI5ep.js.gz +0 -0
- package/dist/dashboard/assets/routing-BFQX2VBc.js.gz +0 -0
- package/dist/dashboard/assets/select-CXbck0jG.js.gz +0 -0
- package/dist/dashboard/assets/settings-C_XvMHh9.js.gz +0 -0
- package/dist/dashboard/assets/stack-DggRiCxE.js.gz +0 -0
- package/dist/dashboard/assets/state-ClFzfbYp.js.gz +0 -0
- package/dist/dashboard/assets/switch-CTIFxKqS.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-BClG3yWj.js.gz +0 -0
- package/src/console/providers/catalog/discover-constants.ts +0 -6
- package/src/network/pool-health.ts +0 -198
- package/src/providers/integrations/buddy/buddy-checkin.ts +0 -521
- package/src/providers/integrations/buddy/buddy-cli-headers.ts +0 -76
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +0 -130
- package/src/providers/integrations/buddy/buddy-discovery-shared.ts +0 -234
- package/src/providers/integrations/buddy/buddy-growth-shared.ts +0 -496
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +0 -341
- package/src/providers/integrations/buddy/buddy-quota-shared.ts +0 -417
- package/src/providers/integrations/buddy/buddy-server-tools.ts +0 -240
- package/src/providers/integrations/buddy/buddy-usage-shared.ts +0 -221
- package/src/providers/integrations/buddy/buddy-usage-store.ts +0 -181
- package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +0 -37
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +0 -188
- package/src/providers/integrations/buddy/codebuddy/oauth.ts +0 -47
- package/src/providers/integrations/buddy/codebuddy/provider.ts +0 -179
- package/src/providers/integrations/buddy/codebuddy/quota.ts +0 -154
- package/src/providers/integrations/qoder/chat-proto.ts +0 -328
- package/src/providers/integrations/qoder/qoder-grpc.ts +0 -870
- package/src/providers/integrations/qoder/qoder-ide.ts +0 -481
- /package/dist/dashboard/assets/{app-DIXLjojg.js → app-C0gTXEoN.js} +0 -0
- /package/dist/dashboard/assets/{app-DIXLjojg.js.gz → app-C0gTXEoN.js.gz} +0 -0
- /package/src/network/{http2-bidi.ts → bidi.ts} +0 -0
- /package/src/network/pool/{byte-accounting.ts → accounting.ts} +0 -0
- /package/src/network/pool/{pool-scripts.ts → scripts.ts} +0 -0
- /package/src/network/pool/{pool-state.ts → state.ts} +0 -0
- /package/src/network/{backoff.ts → util/backoff.ts} +0 -0
- /package/src/network/{deduplication.ts → util/dedupe.ts} +0 -0
- /package/src/network/{ip-utils.ts → util/ip.ts} +0 -0
- /package/src/network/{rate-limit-verdict.ts → verdict.ts} +0 -0
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The buddy-family device-login mechanism (`cb`, `cbcn`).
|
|
3
|
-
*
|
|
4
|
-
* All three complete device login against the same plugin auth endpoints: a
|
|
5
|
-
* state POST, a token poll that answers the pending code `11217` until the user
|
|
6
|
-
* finishes in the browser, and a refresh POST. They answer one
|
|
7
|
-
* `{ data: { accessToken, refreshToken, tokenType, expiresIn } }` envelope and
|
|
8
|
-
* carry one identity header set, so the envelope accessors, the token
|
|
9
|
-
* projection, the account label, and the flow itself live here. Each provider's
|
|
10
|
-
* `*-oauth.ts` supplies one `BuddyOAuthVariant` — endpoints, domain, platform,
|
|
11
|
-
* user agent, and response-code reading — and nothing else.
|
|
12
|
-
*/
|
|
13
|
-
import {
|
|
14
|
-
decodeJwtPayload,
|
|
15
|
-
expiryFromSeconds,
|
|
16
|
-
nonEmptyTrimmedString,
|
|
17
|
-
readJsonResponse,
|
|
18
|
-
record,
|
|
19
|
-
} from "../../authentication/oauth-flow-store";
|
|
20
|
-
import type {
|
|
21
|
-
OAuthDeviceFlowContext,
|
|
22
|
-
OAuthDevicePollResult,
|
|
23
|
-
OAuthDeviceStartResult,
|
|
24
|
-
OAuthExchangeResult,
|
|
25
|
-
} from "../../authentication/oauth-flow-store";
|
|
26
|
-
import type { OAuthTokenRefreshResult } from "../../authentication/oauth-refresh-service";
|
|
27
|
-
import { OAuthDeviceFlow } from "../../authentication/oauth-device-flow";
|
|
28
|
-
import type { FetchLike } from "../../authentication/oauth-client";
|
|
29
|
-
|
|
30
|
-
/** Token fields the buddy plugin auth endpoints return inside `data`. */
|
|
31
|
-
export interface BuddyTokenData {
|
|
32
|
-
readonly accessToken?: unknown;
|
|
33
|
-
readonly refreshToken?: unknown;
|
|
34
|
-
readonly tokenType?: unknown;
|
|
35
|
-
readonly expiresIn?: unknown;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** The `data` object of a buddy auth response, or `undefined` when absent. */
|
|
39
|
-
export function buddyResponseData(payload: unknown): Record<string, unknown> | undefined {
|
|
40
|
-
return record(record(payload)?.data);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/** Projects one buddy auth response onto the token fields the flow consumes. */
|
|
44
|
-
export function parseBuddyTokenData(payload: unknown): BuddyTokenData {
|
|
45
|
-
const data = buddyResponseData(payload) ?? {};
|
|
46
|
-
return {
|
|
47
|
-
accessToken: data.accessToken,
|
|
48
|
-
refreshToken: data.refreshToken,
|
|
49
|
-
tokenType: data.tokenType,
|
|
50
|
-
expiresIn: data.expiresIn,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Reads the envelope `code` strictly: a finite number, or a string that parses
|
|
56
|
-
* as one. Anything else — a JSON `null` included — is `undefined`, so a
|
|
57
|
-
* malformed response cannot read as success.
|
|
58
|
-
*/
|
|
59
|
-
export function strictResponseCode(payload: unknown): number | undefined {
|
|
60
|
-
const root = record(payload);
|
|
61
|
-
if (typeof root?.code === "number" && Number.isFinite(root.code)) return root.code;
|
|
62
|
-
if (typeof root?.code === "string" && Number.isFinite(Number(root.code))) return Number(root.code);
|
|
63
|
-
return undefined;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Reads the envelope `code` through `Number()`, which is how the buddy
|
|
68
|
-
* gateway is read. Looser than `strictResponseCode` on a malformed payload: a
|
|
69
|
-
* `null` code coerces to `0`, i.e. success, and `true` to `1`. Kept verbatim
|
|
70
|
-
* rather than tightened because nothing here shows what that gateway sends for
|
|
71
|
-
* an absent code, and rejecting a response it accepts would break a login that
|
|
72
|
-
* works today.
|
|
73
|
-
*/
|
|
74
|
-
export function coercingResponseCode(payload: unknown): number | undefined {
|
|
75
|
-
const n = Number(record(payload)?.code);
|
|
76
|
-
return Number.isFinite(n) ? n : undefined;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/** One provider's configuration of the buddy device-login flow. */
|
|
80
|
-
export interface BuddyOAuthVariant {
|
|
81
|
-
readonly providerId: string;
|
|
82
|
-
/** Display name for error messages (`OAuthClient.providerLabel`). */
|
|
83
|
-
readonly providerLabel: string;
|
|
84
|
-
/** Stamped into the `x-domain` header of every auth request. */
|
|
85
|
-
readonly domain: string;
|
|
86
|
-
/** `platform` query parameter of the device-start request. */
|
|
87
|
-
readonly platform: string;
|
|
88
|
-
/** Resolves version metadata, then builds the `User-Agent` of one auth request. */
|
|
89
|
-
readonly userAgent: () => Promise<string>;
|
|
90
|
-
readonly deviceStartUrl: string;
|
|
91
|
-
readonly devicePollUrl: string;
|
|
92
|
-
readonly refreshUrl: string;
|
|
93
|
-
/** Reads the envelope `code`; see `strictResponseCode` / `coercingResponseCode`. */
|
|
94
|
-
readonly responseCode: (payload: unknown) => number | undefined;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const DEVICE_EXPIRY_SECONDS = 900;
|
|
98
|
-
/** Envelope code the token poll answers while the browser step is unfinished. */
|
|
99
|
-
const BUDDY_PENDING_CODE = 11217;
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Resolves the account uid from a buddy OAuth access token for endpoints that
|
|
103
|
-
* score by uid (the growth `/v2/report` event's `userId`, the `X-User-Id`
|
|
104
|
-
* billing header). The JWT `sub` claim is the uid; `uid` is accepted as a
|
|
105
|
-
* forward-compatible alias. Returns `undefined` for opaque API keys, which
|
|
106
|
-
* carry no identity — those callers must fail closed, never report as another
|
|
107
|
-
* account.
|
|
108
|
-
*/
|
|
109
|
-
export function buddyAccountUid(accessToken: string): string | undefined {
|
|
110
|
-
const claims = decodeJwtPayload(accessToken);
|
|
111
|
-
if (!claims) return undefined;
|
|
112
|
-
return nonEmptyTrimmedString(claims.sub) ?? nonEmptyTrimmedString(claims.uid);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* A buddy OAuth access token is a Keycloak JWT that inlines the account
|
|
117
|
-
* identity (`name`, `preferred_username`, `email`, `given_name`/`family_name`).
|
|
118
|
-
* Resolve a human display label from it so the account shows "Borneo usar
|
|
119
|
-
* <borneousar@gmail.com>" instead of the generic `${providerId} account`.
|
|
120
|
-
* Falls back to `undefined` when the token carries no usable identity, letting
|
|
121
|
-
* the console keep the operator-supplied label.
|
|
122
|
-
*/
|
|
123
|
-
function buddyAccountLabel(accessToken: string): string | undefined {
|
|
124
|
-
const claims = decodeJwtPayload(accessToken);
|
|
125
|
-
if (!claims) return undefined;
|
|
126
|
-
const email = nonEmptyTrimmedString(claims.email) ?? nonEmptyTrimmedString(claims.preferred_username);
|
|
127
|
-
const given = nonEmptyTrimmedString(claims.given_name);
|
|
128
|
-
const family = nonEmptyTrimmedString(claims.family_name);
|
|
129
|
-
const full =
|
|
130
|
-
given && family ? `${given} ${family}` : nonEmptyTrimmedString(claims.name) ?? undefined;
|
|
131
|
-
if (email && full) return `${full} <${email}>`;
|
|
132
|
-
return email ?? full ?? nonEmptyTrimmedString(claims.sub);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function tokenResult(
|
|
136
|
-
variant: BuddyOAuthVariant,
|
|
137
|
-
payload: unknown,
|
|
138
|
-
fallbackRefresh?: string,
|
|
139
|
-
): OAuthExchangeResult {
|
|
140
|
-
const data = parseBuddyTokenData(payload);
|
|
141
|
-
const access = nonEmptyTrimmedString(data.accessToken);
|
|
142
|
-
if (!access) throw new Error(`${variant.providerId} token response omitted accessToken`);
|
|
143
|
-
const refresh = nonEmptyTrimmedString(data.refreshToken) ?? fallbackRefresh ?? "";
|
|
144
|
-
const accountLabel = buddyAccountLabel(access);
|
|
145
|
-
return {
|
|
146
|
-
access,
|
|
147
|
-
refresh,
|
|
148
|
-
expiresAt: expiryFromSeconds(data.expiresIn, 86_400),
|
|
149
|
-
...(accountLabel === undefined ? {} : { accountLabel }),
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/** Client identity headers shared by every auth request of one variant. */
|
|
154
|
-
async function authIdentityHeaders(variant: BuddyOAuthVariant): Promise<Record<string, string>> {
|
|
155
|
-
return {
|
|
156
|
-
accept: "application/json",
|
|
157
|
-
"user-agent": await variant.userAgent(),
|
|
158
|
-
"x-requested-with": "XMLHttpRequest",
|
|
159
|
-
"x-domain": variant.domain,
|
|
160
|
-
"x-product": "SaaS",
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
async function deviceStartHeaders(variant: BuddyOAuthVariant): Promise<Record<string, string>> {
|
|
165
|
-
return {
|
|
166
|
-
"content-type": "application/json",
|
|
167
|
-
...(await authIdentityHeaders(variant)),
|
|
168
|
-
"x-no-authorization": "true",
|
|
169
|
-
"x-no-user-id": "true",
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
async function devicePollHeaders(variant: BuddyOAuthVariant): Promise<Record<string, string>> {
|
|
174
|
-
return {
|
|
175
|
-
...(await authIdentityHeaders(variant)),
|
|
176
|
-
"x-no-authorization": "true",
|
|
177
|
-
"x-no-user-id": "true",
|
|
178
|
-
"x-no-enterprise-id": "true",
|
|
179
|
-
"x-no-department-info": "true",
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
async function refreshHeaders(
|
|
184
|
-
variant: BuddyOAuthVariant,
|
|
185
|
-
refreshToken: string,
|
|
186
|
-
): Promise<Record<string, string>> {
|
|
187
|
-
return {
|
|
188
|
-
"content-type": "application/json",
|
|
189
|
-
...(await authIdentityHeaders(variant)),
|
|
190
|
-
"x-refresh-token": refreshToken,
|
|
191
|
-
"x-auth-refresh-source": "plugin",
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/** Buddy state-polling OAuth client for one provider variant. */
|
|
196
|
-
export class BuddyOAuthClient extends OAuthDeviceFlow {
|
|
197
|
-
override readonly supportsDeviceCode = true;
|
|
198
|
-
override readonly supportsBrowserCode = false;
|
|
199
|
-
|
|
200
|
-
protected override readonly providerLabel: string;
|
|
201
|
-
protected override readonly clientId = "";
|
|
202
|
-
protected override readonly tokenUrl = "";
|
|
203
|
-
protected override readonly scopes = "";
|
|
204
|
-
|
|
205
|
-
readonly #variant: BuddyOAuthVariant;
|
|
206
|
-
|
|
207
|
-
constructor(variant: BuddyOAuthVariant, fetchFn: FetchLike = globalThis.fetch) {
|
|
208
|
-
super(fetchFn);
|
|
209
|
-
this.#variant = variant;
|
|
210
|
-
this.providerLabel = variant.providerLabel;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
override async startDeviceAuth(_context?: OAuthDeviceFlowContext): Promise<OAuthDeviceStartResult> {
|
|
214
|
-
const url = `${this.#variant.deviceStartUrl}?platform=${encodeURIComponent(this.#variant.platform)}`;
|
|
215
|
-
const response = await this.fetchFn(url, {
|
|
216
|
-
method: "POST",
|
|
217
|
-
headers: await deviceStartHeaders(this.#variant),
|
|
218
|
-
body: "{}",
|
|
219
|
-
});
|
|
220
|
-
const payload = await readJsonResponse(response, `${this.#variant.providerId} device authorization`);
|
|
221
|
-
if (this.#variant.responseCode(payload) !== 0) {
|
|
222
|
-
throw new Error(
|
|
223
|
-
`${this.#variant.providerId} state error: ${nonEmptyTrimmedString(record(payload)?.msg) ?? "missing state/authUrl"}`,
|
|
224
|
-
);
|
|
225
|
-
}
|
|
226
|
-
const data = buddyResponseData(payload);
|
|
227
|
-
const deviceAuthId = nonEmptyTrimmedString(data?.state);
|
|
228
|
-
const verificationUri = nonEmptyTrimmedString(data?.authUrl);
|
|
229
|
-
if (!deviceAuthId || !verificationUri) {
|
|
230
|
-
throw new Error(`${this.#variant.providerId} device authorization returned an invalid response`);
|
|
231
|
-
}
|
|
232
|
-
return {
|
|
233
|
-
verificationUri,
|
|
234
|
-
userCode: "",
|
|
235
|
-
deviceAuthId,
|
|
236
|
-
intervalSeconds: 5,
|
|
237
|
-
expiresInSeconds: DEVICE_EXPIRY_SECONDS,
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
override async pollDeviceAuth(
|
|
242
|
-
deviceAuthId: string,
|
|
243
|
-
_context?: OAuthDeviceFlowContext,
|
|
244
|
-
): Promise<OAuthDevicePollResult> {
|
|
245
|
-
const url = `${this.#variant.devicePollUrl}?state=${encodeURIComponent(deviceAuthId)}`;
|
|
246
|
-
const response = await this.fetchFn(url, {
|
|
247
|
-
method: "GET",
|
|
248
|
-
headers: await devicePollHeaders(this.#variant),
|
|
249
|
-
});
|
|
250
|
-
const textBody = await response.text();
|
|
251
|
-
let payload: unknown;
|
|
252
|
-
try {
|
|
253
|
-
payload = JSON.parse(textBody) as unknown;
|
|
254
|
-
} catch {
|
|
255
|
-
return {
|
|
256
|
-
status: "failed",
|
|
257
|
-
reason: `${this.#variant.providerId} token endpoint returned invalid JSON`,
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
if (!response.ok) {
|
|
261
|
-
return {
|
|
262
|
-
status: "failed",
|
|
263
|
-
reason: `${this.#variant.providerId} token polling failed (${response.status})`,
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
const code = this.#variant.responseCode(payload);
|
|
267
|
-
if (code === BUDDY_PENDING_CODE) return { status: "pending" };
|
|
268
|
-
if (code !== 0) {
|
|
269
|
-
return {
|
|
270
|
-
status: "failed",
|
|
271
|
-
reason:
|
|
272
|
-
nonEmptyTrimmedString(record(payload)?.msg) ?? `${this.#variant.providerId} token polling failed`,
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
const data = buddyResponseData(payload);
|
|
276
|
-
const access = nonEmptyTrimmedString(data?.accessToken);
|
|
277
|
-
if (!access) {
|
|
278
|
-
return {
|
|
279
|
-
status: "failed",
|
|
280
|
-
reason: `${this.#variant.providerId} token response omitted accessToken`,
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
// The profile nickname is a second, authorized request the reference makes
|
|
284
|
-
// once the token lands — the JWT carries the email but not always a
|
|
285
|
-
// display name. Best-effort by design: a login must not fail because the
|
|
286
|
-
// profile endpoint was unreachable, so every miss falls back to the label
|
|
287
|
-
// the token itself yields.
|
|
288
|
-
const nickname = await this.fetchAccountNickname(deviceAuthId, access);
|
|
289
|
-
if (nickname === undefined) return { status: "complete", result: tokenResult(this.#variant, payload) };
|
|
290
|
-
const result = tokenResult(this.#variant, payload);
|
|
291
|
-
return {
|
|
292
|
-
status: "complete",
|
|
293
|
-
result: { ...result, accountLabel: result.accountLabel ?? nickname },
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
/** Reads the account profile nickname, or `undefined` on any miss. */
|
|
298
|
-
private async fetchAccountNickname(
|
|
299
|
-
deviceAuthId: string,
|
|
300
|
-
accessToken: string,
|
|
301
|
-
): Promise<string | undefined> {
|
|
302
|
-
try {
|
|
303
|
-
// Both references call `/v2/plugin/login/account` with the token after
|
|
304
|
-
// the poll succeeds; the poll URL is the same versioned plugin root, so
|
|
305
|
-
// the profile path is derived from it rather than declared per variant.
|
|
306
|
-
const url = `${this.#variant.devicePollUrl.replace("/plugin/auth/token", "/plugin/login/account")}?state=${encodeURIComponent(deviceAuthId)}`;
|
|
307
|
-
const response = await this.fetchFn(url, {
|
|
308
|
-
method: "GET",
|
|
309
|
-
headers: {
|
|
310
|
-
...(await devicePollHeaders(this.#variant)),
|
|
311
|
-
authorization: `Bearer ${accessToken}`,
|
|
312
|
-
},
|
|
313
|
-
});
|
|
314
|
-
if (!response.ok) return undefined;
|
|
315
|
-
const profile = buddyResponseData((await response.json()) as unknown);
|
|
316
|
-
return nonEmptyTrimmedString(profile?.nickname);
|
|
317
|
-
} catch {
|
|
318
|
-
return undefined;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
override async refresh(refreshToken: string, signal?: AbortSignal): Promise<OAuthTokenRefreshResult> {
|
|
323
|
-
const response = await this.fetchFn(this.#variant.refreshUrl, {
|
|
324
|
-
method: "POST",
|
|
325
|
-
headers: await refreshHeaders(this.#variant, refreshToken),
|
|
326
|
-
body: "{}",
|
|
327
|
-
...(signal === undefined ? {} : { signal }),
|
|
328
|
-
});
|
|
329
|
-
const payload = await readJsonResponse(response, `${this.#variant.providerId} token refresh`);
|
|
330
|
-
if (this.#variant.responseCode(payload) !== 0) {
|
|
331
|
-
const detail = nonEmptyTrimmedString(record(payload)?.msg);
|
|
332
|
-
throw new Error(`${this.#variant.providerId} token refresh failed${detail ? `: ${detail}` : ""}`);
|
|
333
|
-
}
|
|
334
|
-
const result = tokenResult(this.#variant, payload, refreshToken);
|
|
335
|
-
return {
|
|
336
|
-
access: result.access,
|
|
337
|
-
...(result.refresh ? { refresh: result.refresh } : {}),
|
|
338
|
-
expiresAt: result.expiresAt,
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
}
|