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
package/src/boot/dependencies.ts
CHANGED
|
@@ -43,12 +43,10 @@ import { InMemoryIpAbuseStore, IpAbuseProtectionService, RedisIpAbuseStore, type
|
|
|
43
43
|
import { checkReadiness } from "../persistence/readiness";
|
|
44
44
|
import { ProxyRequestPreparer } from "../transport/request/preparer";
|
|
45
45
|
import { DrizzleNetworkPoolLoader } from "../network/pool/loader";
|
|
46
|
-
import {
|
|
47
|
-
|
|
48
|
-
ValidatedNetworkBindingFactory,
|
|
49
|
-
} from "../network/pool/resolver";
|
|
46
|
+
import { PoolAgentResolver } from "../network/pool/resolver";
|
|
47
|
+
import { ValidatedNetworkBindingFactory } from "../network/egress/factory";
|
|
50
48
|
import { NetworkPoolSelector } from "../network/pool/selector";
|
|
51
|
-
import { restorePoolProbeVerdicts, restoreProviderCooldownMarkers } from "../network/pool
|
|
49
|
+
import { restorePoolProbeVerdicts, restoreProviderCooldownMarkers } from "../network/pool/cooldown-store";
|
|
52
50
|
import { ScheduledTaskRegistry } from "../workers/scheduler";
|
|
53
51
|
import { quotaRefreshSweep } from "../workers/quota-refresh-sweep";
|
|
54
52
|
import { registerZcodeGiftClaimTask } from "../workers/zcode-gift-claim";
|
|
@@ -67,7 +65,7 @@ import { preferencesReaderFor } from "../persistence/tenant-preferences";
|
|
|
67
65
|
import { sweepExpiredCooldowns } from "../providers/operations/account-health-service";
|
|
68
66
|
import { DrizzleTelemetryStore } from "../persistence/stores/telemetry-store";
|
|
69
67
|
import { TelemetryPayloadCapture } from "../observability/payload-capture";
|
|
70
|
-
import { sweepExpiredPoolCooldowns } from "../network/pool
|
|
68
|
+
import { sweepExpiredPoolCooldowns } from "../network/pool/health";
|
|
71
69
|
import { TelemetryBatchBuffer } from "../observability/telemetry-buffer";
|
|
72
70
|
import { RuntimeMetricsSampler } from "../observability/runtime-metrics";
|
|
73
71
|
import {
|
package/src/config/providers.ts
CHANGED
|
@@ -94,11 +94,12 @@ export function resolveGithubEnterpriseDomain(): string {
|
|
|
94
94
|
export type GithubCopilotMode = "opencode-copilot" | "vscode-client-real";
|
|
95
95
|
|
|
96
96
|
/**
|
|
97
|
-
*
|
|
98
|
-
* `opencode-copilot`
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
97
|
+
* Selects the complete GitHub Copilot profile for OAuth login/refresh,
|
|
98
|
+
* inference, discovery, and quota identity. `opencode-copilot` is the default
|
|
99
|
+
* and uses the raw GitHub OAuth token with OpenCode identity. `vscode-client-real`
|
|
100
|
+
* uses the VS Code OAuth app and a minted Copilot token. Existing accounts must
|
|
101
|
+
* be re-authenticated after changing profiles; the upstream OAuth app binding
|
|
102
|
+
* prevents converting credentials between profiles.
|
|
102
103
|
*/
|
|
103
104
|
export function resolveGithubCopilotMode(): GithubCopilotMode {
|
|
104
105
|
const raw = readText(
|
package/src/config/spec.ts
CHANGED
|
@@ -326,15 +326,15 @@ export const CONFIG_SPEC = {
|
|
|
326
326
|
*/
|
|
327
327
|
CARTETHYIA_GITHUB_ENTERPRISE_DOMAIN: { kind: "text", default: "" },
|
|
328
328
|
/**
|
|
329
|
-
*
|
|
330
|
-
* upstream:
|
|
329
|
+
* Selects the complete GitHub Copilot OAuth and wire profile:
|
|
331
330
|
*
|
|
332
|
-
* - `opencode-copilot` (default):
|
|
333
|
-
* OpenCode
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
*
|
|
331
|
+
* - `opencode-copilot` (default): OpenCode OAuth app, raw GitHub token, and
|
|
332
|
+
* OpenCode identity for login, refresh, inference, discovery, and quota.
|
|
333
|
+
* - `vscode-client-real`: VS Code OAuth app, minted Copilot token, and the
|
|
334
|
+
* VS Code reference identity for those surfaces.
|
|
335
|
+
*
|
|
336
|
+
* Restart after changing this setting and re-authenticate GitHub accounts;
|
|
337
|
+
* OAuth credentials cannot be converted between the two upstream apps.
|
|
338
338
|
*/
|
|
339
339
|
CARTETHYIA_GITHUB_COPILOT_MODE: { kind: "text", default: "opencode-copilot" },
|
|
340
340
|
// Only the literal true opts active ZCode accounts into daily gift claims.
|
|
@@ -23,6 +23,7 @@ import type { BackupPayload, BackupRow } from "./contracts";
|
|
|
23
23
|
import { BACKUP_APP, BACKUP_VERSION } from "./contracts";
|
|
24
24
|
import { isRecord } from "../../protocol/codecs";
|
|
25
25
|
import { hashSecret } from "../../security/crypto";
|
|
26
|
+
import { resolveGithubCopilotMode, resolveGithubEnterpriseDomain } from "../../config/providers";
|
|
26
27
|
import {
|
|
27
28
|
AUTH_STATE_KEYS,
|
|
28
29
|
COMBO_STRATEGIES,
|
|
@@ -100,6 +101,24 @@ interface ResolvedConnectionCredential {
|
|
|
100
101
|
readonly value: string;
|
|
101
102
|
readonly kind: "api_key" | "oauth";
|
|
102
103
|
}
|
|
104
|
+
|
|
105
|
+
/** The provider-specific rebinding a router export may need before it becomes our envelope. */
|
|
106
|
+
export interface ImportedProviderCredential {
|
|
107
|
+
readonly credential: string;
|
|
108
|
+
readonly profile: "opencode-copilot" | "vscode-client-real";
|
|
109
|
+
readonly refreshToken?: string;
|
|
110
|
+
readonly expiresAt: Date;
|
|
111
|
+
readonly requiresRefresh: boolean;
|
|
112
|
+
readonly warnings: readonly string[];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export type ImportedProviderCredentialBinder = (
|
|
116
|
+
value: string,
|
|
117
|
+
refreshValue: string | null | undefined,
|
|
118
|
+
profile: "opencode-copilot" | "vscode-client-real",
|
|
119
|
+
domain: string,
|
|
120
|
+
expiresAt?: Date,
|
|
121
|
+
) => ImportedProviderCredential;
|
|
103
122
|
function credentialOf(entry: Row, provider: string): ResolvedConnectionCredential | null {
|
|
104
123
|
const apiKey = text(entry.apiKey);
|
|
105
124
|
const accessToken = text(entry.accessToken);
|
|
@@ -128,7 +147,7 @@ function credentialOf(entry: Row, provider: string): ResolvedConnectionCredentia
|
|
|
128
147
|
* we have no such provider — a set entry with no provider behind it would
|
|
129
148
|
* classify a row that can never import.
|
|
130
149
|
*/
|
|
131
|
-
const OAUTH_PROVIDERS = new Set(["claude", "codex", "antigravity", "kimi", "cline"]);
|
|
150
|
+
const OAUTH_PROVIDERS = new Set(["claude", "codex", "antigravity", "kimi", "cline", "github"]);
|
|
132
151
|
|
|
133
152
|
/** The non-secret per-account config, as our `auth_state` bag. */
|
|
134
153
|
function authStateOf(entry: Row): Record<string, unknown> {
|
|
@@ -223,7 +242,11 @@ function modelReference(
|
|
|
223
242
|
* leaving them null would make them global, i.e. visible to every tenant, which
|
|
224
243
|
* an import must never do implicitly.
|
|
225
244
|
*/
|
|
226
|
-
export function convert9RouterBackup(
|
|
245
|
+
export function convert9RouterBackup(
|
|
246
|
+
input: unknown,
|
|
247
|
+
tenantId: string,
|
|
248
|
+
importBinders: Readonly<Record<string, ImportedProviderCredentialBinder>> = {},
|
|
249
|
+
): ConversionResult {
|
|
227
250
|
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
228
251
|
throw new Error("router backup must be a JSON object");
|
|
229
252
|
}
|
|
@@ -273,6 +296,32 @@ export function convert9RouterBackup(input: unknown, tenantId: string): Conversi
|
|
|
273
296
|
}
|
|
274
297
|
const accountId = crypto.randomUUID();
|
|
275
298
|
const kind = credential.kind;
|
|
299
|
+
const specific = isRecord(entry.providerSpecificData) ? entry.providerSpecificData : {};
|
|
300
|
+
const importedRefresh = text(entry.refreshToken);
|
|
301
|
+
const sourceExpiry = typeof entry.expiresAt === "string" && Number.isFinite(Date.parse(entry.expiresAt))
|
|
302
|
+
? new Date(entry.expiresAt)
|
|
303
|
+
: undefined;
|
|
304
|
+
const importBinder = provider === "github" && kind === "oauth" ? importBinders.github : undefined;
|
|
305
|
+
let githubBinding: ImportedProviderCredential | undefined;
|
|
306
|
+
if (importBinder !== undefined) {
|
|
307
|
+
try {
|
|
308
|
+
githubBinding = importBinder(
|
|
309
|
+
credential.value,
|
|
310
|
+
importedRefresh,
|
|
311
|
+
resolveGithubCopilotMode(),
|
|
312
|
+
resolveGithubEnterpriseDomain() || "github.com",
|
|
313
|
+
sourceExpiry,
|
|
314
|
+
);
|
|
315
|
+
} catch (error) {
|
|
316
|
+
// One malformed row must not take the rest of the backup down with it.
|
|
317
|
+
// The row is reported and left out; the operator can re-authenticate it.
|
|
318
|
+
skipped.push(`${label}: GitHub Copilot credential could not be bound: ${error instanceof Error ? error.message : String(error)}`);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const storedCredential = githubBinding?.credential ?? credential.value;
|
|
323
|
+
const storedRefresh = githubBinding?.refreshToken ?? importedRefresh;
|
|
324
|
+
const storedAuthState = authStateOf(entry).auth_state;
|
|
276
325
|
accounts.push({
|
|
277
326
|
id: accountId,
|
|
278
327
|
provider_id: provider,
|
|
@@ -282,7 +331,7 @@ export function convert9RouterBackup(input: unknown, tenantId: string): Conversi
|
|
|
282
331
|
// `SEALED_COLUMNS`. The store re-seals it under this instance's key on the
|
|
283
332
|
// way in; sealing it here would put ciphertext in a payload whose only
|
|
284
333
|
// portable form is the plaintext, and the restore would drop it.
|
|
285
|
-
access_token:
|
|
334
|
+
access_token: storedCredential,
|
|
286
335
|
credential_kind: kind,
|
|
287
336
|
status: bool(entry.isActive, true) ? "active" : "disabled",
|
|
288
337
|
consecutive_failures: 0,
|
|
@@ -292,29 +341,41 @@ export function convert9RouterBackup(input: unknown, tenantId: string): Conversi
|
|
|
292
341
|
// rather than invented — a lower number means the operator wants it used
|
|
293
342
|
// first, and the column means the same thing.
|
|
294
343
|
sort_index: typeof entry.priority === "number" && Number.isFinite(entry.priority) ? entry.priority : 0,
|
|
295
|
-
...(
|
|
344
|
+
...(githubBinding === undefined
|
|
345
|
+
? (storedAuthState === undefined ? {} : { auth_state: storedAuthState })
|
|
346
|
+
: {
|
|
347
|
+
auth_state: {
|
|
348
|
+
...(isRecord(storedAuthState) ? storedAuthState : {}),
|
|
349
|
+
github_copilot_profile: githubBinding.profile,
|
|
350
|
+
},
|
|
351
|
+
}),
|
|
296
352
|
...(emailOf(entry)),
|
|
297
353
|
created_at: { __date: isoDate(entry.createdAt, now) },
|
|
298
354
|
});
|
|
299
355
|
connectedProviders.add(provider);
|
|
300
356
|
// The refresh token is a second secret on the same account, so it gets its
|
|
301
357
|
// own sealed row rather than being folded into the credential.
|
|
302
|
-
const specific = isRecord(entry.providerSpecificData) ? entry.providerSpecificData : {};
|
|
303
|
-
const refresh = text(entry.refreshToken);
|
|
304
358
|
const clientSecret = text(specific.clientSecret);
|
|
305
|
-
|
|
359
|
+
for (const warning of githubBinding?.warnings ?? []) {
|
|
360
|
+
warnings.push(`account "${label}": ${warning}`);
|
|
361
|
+
}
|
|
362
|
+
if (storedRefresh !== null || clientSecret !== null || githubBinding?.requiresRefresh === true) {
|
|
306
363
|
// A companion secret authorizes a refresh, so on its own it has nothing to
|
|
307
364
|
// authorize. It is still carried rather than dropped, and the report says
|
|
308
365
|
// why it is inert — a secret lost without a word is how an operator
|
|
309
366
|
// discovers the loss from a failed refresh days later.
|
|
310
|
-
if (clientSecret !== null &&
|
|
367
|
+
if (clientSecret !== null && storedRefresh === null) {
|
|
311
368
|
warnings.push(`account "${label}": carried a client secret with no refresh token; it cannot authorize a refresh`);
|
|
312
369
|
}
|
|
313
370
|
oauthStates.push({
|
|
314
371
|
provider_account_id: accountId,
|
|
315
|
-
...(
|
|
372
|
+
...(storedRefresh === null ? {} : { refresh_token: storedRefresh }),
|
|
316
373
|
...(clientSecret === null ? {} : { client_secret: clientSecret }),
|
|
317
|
-
...(
|
|
374
|
+
...(githubBinding !== undefined
|
|
375
|
+
? { expires_at: { __date: githubBinding.expiresAt.toISOString() } }
|
|
376
|
+
: typeof entry.expiresAt === "string"
|
|
377
|
+
? { expires_at: { __date: isoDate(entry.expiresAt, now) } }
|
|
378
|
+
: {}),
|
|
318
379
|
});
|
|
319
380
|
}
|
|
320
381
|
});
|
|
@@ -311,7 +311,14 @@ export class BackupService {
|
|
|
311
311
|
}
|
|
312
312
|
|
|
313
313
|
if (detected.kind === "nine_router") {
|
|
314
|
-
|
|
314
|
+
// dynamic-import: lazy OAuth graph — pulling the Github OAuth client into
|
|
315
|
+
// the console boot graph would make every console route pay for it.
|
|
316
|
+
const { bindImportedGithubCredential } = await import(
|
|
317
|
+
"../../providers/integrations/github/github-oauth"
|
|
318
|
+
);
|
|
319
|
+
const { payload: converted, report } = convert9RouterBackup(detected.payload, tenantId, {
|
|
320
|
+
github: bindImportedGithubCredential,
|
|
321
|
+
});
|
|
315
322
|
const result = await this.apply(converted, tenantId, selection);
|
|
316
323
|
return { ...result, report, format: "nine_router" };
|
|
317
324
|
}
|
|
@@ -33,7 +33,7 @@ import { DrizzleCliToolSecretSource } from "./cli-tools/secret-source";
|
|
|
33
33
|
import type { ShareLinkStore } from "../persistence/stores/share-store";
|
|
34
34
|
import type { ProviderRegistry } from "../providers/provider-registry";
|
|
35
35
|
import type { BundledProviderCatalog } from "../providers/operations/provider-catalog-service";
|
|
36
|
-
import type { ValidatedNetworkBindingFactory } from "../network/
|
|
36
|
+
import type { ValidatedNetworkBindingFactory } from "../network/egress/factory";
|
|
37
37
|
import type { TrustedProxyBoundary } from "../config/network";
|
|
38
38
|
import type { IpAbuseStore } from "../security/abuse";
|
|
39
39
|
import { gzipResponse } from "./response-compression";
|
|
@@ -65,7 +65,7 @@ import {
|
|
|
65
65
|
} from "../persistence/stores/share-store";
|
|
66
66
|
import { createShareUsagePort } from "./share/share-usage";
|
|
67
67
|
import { resolveSsrfPolicy } from "../config/network";
|
|
68
|
-
import { createValidatedFetch } from "../network/
|
|
68
|
+
import { createValidatedFetch } from "../network/egress/fetch";
|
|
69
69
|
import type { AuditRecorder } from "./auth/audit-recorder";
|
|
70
70
|
import type { CliToolService } from "./cli-tools/service";
|
|
71
71
|
import type { NetworkPoolSelector } from "../network/pool/selector";
|
|
@@ -77,7 +77,7 @@ import { resolveRedisBackend } from "../persistence/redis";
|
|
|
77
77
|
import type { RedisClient } from "../persistence/redis";
|
|
78
78
|
import type { ProviderRegistry } from "../providers/provider-registry";
|
|
79
79
|
import type { BundledProviderCatalog } from "../providers/operations/provider-catalog-service";
|
|
80
|
-
import type { ValidatedNetworkBindingFactory } from "../network/
|
|
80
|
+
import type { ValidatedNetworkBindingFactory } from "../network/egress/factory";
|
|
81
81
|
import type { CartethyiaDatabase } from "../persistence/db-handle";
|
|
82
82
|
import type { ConsoleAccessResolver } from "./auth/access";
|
|
83
83
|
|
|
@@ -434,6 +434,11 @@ export function registerConsoleDomains(
|
|
|
434
434
|
accessResolver: ctx.accessResolver,
|
|
435
435
|
snapshotInvalidator: ctx.routeSnapshotService,
|
|
436
436
|
callbackListener: oauthCallbackListener,
|
|
437
|
+
deviceEgress: {
|
|
438
|
+
db: ctx.db,
|
|
439
|
+
poolSelector: ctx.poolSelector,
|
|
440
|
+
networkBindingFactory: ctx.networkBindingFactory,
|
|
441
|
+
},
|
|
437
442
|
};
|
|
438
443
|
console.use(createOAuthLoginRoutes(oauthConfig));
|
|
439
444
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* and a failure returns `undefined` — never a half-parsed object that a route
|
|
14
14
|
* would render as if it were good.
|
|
15
15
|
*/
|
|
16
|
-
import { createValidatedFetch, type ValidatedFetch } from "../../network/
|
|
16
|
+
import { createValidatedFetch, type ValidatedFetch } from "../../network/egress/fetch";
|
|
17
17
|
|
|
18
18
|
export const INFERHUB_API_BASE = "https://inferhub.dev/api";
|
|
19
19
|
|
|
@@ -29,8 +29,8 @@ import type { NetworkPoolSelector } from "../../network/pool/selector";
|
|
|
29
29
|
import { eq } from "drizzle-orm";
|
|
30
30
|
import type { CartethyiaDatabase } from "../../persistence/db-handle";
|
|
31
31
|
import { networkPools } from "../../persistence/schema";
|
|
32
|
-
import { subscribePoolHealth } from "../../network/pool
|
|
33
|
-
import { poolByteSnapshot } from "../../network/pool/
|
|
32
|
+
import { subscribePoolHealth } from "../../network/pool/health";
|
|
33
|
+
import { poolByteSnapshot } from "../../network/pool/accounting";
|
|
34
34
|
import { consoleSseResponse, createConsoleSseStream } from "./sse";
|
|
35
35
|
import { subscribeRequestCompleted } from "../../observability/request-notify";
|
|
36
36
|
|
|
@@ -83,9 +83,6 @@ export interface ProviderAccountBulkActionResult {
|
|
|
83
83
|
readonly globalSkipped: number;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
/** Cap on one discovery-commit request (D29). Kept pure (no `node:*`) so the dashboard can import it. */
|
|
87
|
-
export { DISCOVER_MODEL_COMMIT_MAX } from "./discover-constants";
|
|
88
|
-
|
|
89
86
|
/**
|
|
90
87
|
* One model the provider's own listing advertised, projected for the Add-Model
|
|
91
88
|
* picker. Read-only: `GET .../models/discover` writes nothing. `models`
|
|
@@ -610,6 +607,9 @@ export interface ProviderAccountResponse {
|
|
|
610
607
|
providerId: string;
|
|
611
608
|
tenantId: string | null;
|
|
612
609
|
label: string;
|
|
610
|
+
/** Structured identity learned from an OAuth login, when the provider exposed one. */
|
|
611
|
+
accountEmail?: string;
|
|
612
|
+
accountName?: string;
|
|
613
613
|
credentialKind: CredentialKind;
|
|
614
614
|
credentialMode?: CredentialMode;
|
|
615
615
|
/**
|
|
@@ -1056,6 +1056,10 @@ export interface ProviderRoutingResponse {
|
|
|
1056
1056
|
* default to skipping because their transport can't route through an HTTP
|
|
1057
1057
|
* CONNECT proxy; it stays a real, per-tenant-overridable setting. */
|
|
1058
1058
|
readonly skipProxy: boolean;
|
|
1059
|
+
/** How device-code OAuth flows choose their egress: `random` (default)
|
|
1060
|
+
* routes start+poll through a randomly selected active network pool so the
|
|
1061
|
+
* upstream sees a rotating IP; `direct` always dials direct egress. */
|
|
1062
|
+
readonly deviceFlowProxy: "random" | "direct";
|
|
1059
1063
|
/** Built-in API-key upstream User-Agent; OAuth and custom providers retain their own identity. */
|
|
1060
1064
|
readonly userAgent: string;
|
|
1061
1065
|
/** Operator-set custom User-Agent override; `null` = no override (native identity is used). */
|
|
@@ -1089,6 +1093,8 @@ export interface UpdateProviderRoutingRequest {
|
|
|
1089
1093
|
readonly enabled?: boolean;
|
|
1090
1094
|
/** When true, this provider's requests always dial direct. */
|
|
1091
1095
|
readonly skipProxy?: boolean;
|
|
1096
|
+
/** How device-code OAuth flows choose their egress; absent = keep current. */
|
|
1097
|
+
readonly deviceFlowProxy?: "random" | "direct";
|
|
1092
1098
|
/** Built-in API-key upstream User-Agent. */
|
|
1093
1099
|
readonly userAgent?: string;
|
|
1094
1100
|
/** Operator-set custom User-Agent override; `null` clears it back to native. */
|
|
@@ -12,7 +12,6 @@ import type { AccessDecision } from "../../../security/access-control";
|
|
|
12
12
|
import { ConsoleDomainError, requireScope, requireTenantAnyScope } from "../../shared/errors";
|
|
13
13
|
import { GatewayError } from "../../../protocol/gateway-error";
|
|
14
14
|
import {
|
|
15
|
-
DISCOVER_MODEL_COMMIT_MAX,
|
|
16
15
|
MODEL_READ_SCOPES,
|
|
17
16
|
MODEL_WRITE_SCOPES,
|
|
18
17
|
} from "./contracts";
|
|
@@ -390,11 +389,11 @@ export function createModelCatalogOperations(config: ProviderCatalogConfig) {
|
|
|
390
389
|
"modelIds must be non-empty model ids",
|
|
391
390
|
);
|
|
392
391
|
}
|
|
393
|
-
if (modelIds.length === 0
|
|
392
|
+
if (modelIds.length === 0) {
|
|
394
393
|
throw new ConsoleDomainError(
|
|
395
394
|
"invalid_request",
|
|
396
395
|
400,
|
|
397
|
-
|
|
396
|
+
"modelIds must contain at least one entry",
|
|
398
397
|
);
|
|
399
398
|
}
|
|
400
399
|
try {
|
|
@@ -892,7 +892,7 @@ export function createProviderCatalogOperations(config: ProviderCatalogConfig) {
|
|
|
892
892
|
// dynamic-import: B-02 lazy graph — buddy device-binding materializer, buddy-family only.
|
|
893
893
|
// The buddy-identity graph is lazy-loaded: the device-binding
|
|
894
894
|
// materializer only runs for buddy-family accounts (B-02).
|
|
895
|
-
? (await import("../../../providers/integrations/buddy/
|
|
895
|
+
? (await import("../../../providers/integrations/buddy/headers"))
|
|
896
896
|
.materializeBuddyDeviceBinding(account.id, authState)
|
|
897
897
|
: undefined;
|
|
898
898
|
const effectiveAuthState = materialized ?? authState;
|
|
@@ -5,7 +5,6 @@ import { SERVICE_KINDS, WIRE_FAMILIES } from "../../../protocol/canonical-model"
|
|
|
5
5
|
import { PROBE_MODES, PROBE_REASONING_EFFORTS } from "../../../providers/discovery/discovery-types";
|
|
6
6
|
import {
|
|
7
7
|
ACCOUNT_STATUSES,
|
|
8
|
-
DISCOVER_MODEL_COMMIT_MAX,
|
|
9
8
|
CREDENTIAL_KINDS,
|
|
10
9
|
CREDENTIAL_MODES,
|
|
11
10
|
} from "./contracts";
|
|
@@ -133,7 +132,7 @@ const registerModelsBody = t.Object({
|
|
|
133
132
|
metadata: t.Optional(modelMetadataOverrideBody),
|
|
134
133
|
});
|
|
135
134
|
const discoverCommitBody = t.Object({
|
|
136
|
-
modelIds: t.Array(t.String(), { minItems: 1
|
|
135
|
+
modelIds: t.Array(t.String(), { minItems: 1 }),
|
|
137
136
|
});
|
|
138
137
|
const probeModelBody = t.Object({
|
|
139
138
|
modelId: t.String(),
|
|
@@ -141,6 +140,7 @@ const probeModelBody = t.Object({
|
|
|
141
140
|
route: t.Optional(t.String()),
|
|
142
141
|
wireFamily: t.Optional(t.String()),
|
|
143
142
|
accountId: t.Optional(t.String()),
|
|
143
|
+
accountIds: t.Optional(t.Array(t.String(), { maxItems: 100 })),
|
|
144
144
|
prompt: t.Optional(t.String()),
|
|
145
145
|
reasoningEffort: t.Optional(literalUnion(PROBE_REASONING_EFFORTS)),
|
|
146
146
|
maxOutputTokens: t.Optional(t.Integer({ minimum: 1, maximum: 131072 })),
|