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
|
@@ -7,14 +7,22 @@
|
|
|
7
7
|
* Header values mirror live captures of the real client (v1.1.83,
|
|
8
8
|
* 2026-11-05): `User-Agent: Bun/1.4.2`, machine identity headers from the
|
|
9
9
|
* UMID (`cosy-machineid/token/type/code/os/hostname`), business headers,
|
|
10
|
-
* and the static `signature` md5 chain.
|
|
10
|
+
* and the static `signature` md5 chain. The business/scene/clienttype values
|
|
11
|
+
* were updated to the desktop-worker capture (2026-11-11, v0.5.7 /
|
|
12
|
+
* 1.1.79-hotfix.19): `cosy-clienttype: 10`, `cosy-business-product: app`,
|
|
13
|
+
* `cosy-scene: app`, plus `traceparent`, `sec-fetch-mode: cors`, and
|
|
14
|
+
* `accept-language: *`. The `profile` switch selects the identity: `app`
|
|
15
|
+
* (default, desktop worker) or `cli` (qodercli).
|
|
11
16
|
*/
|
|
12
|
-
import { constants, createCipheriv, createHash, publicEncrypt, randomUUID } from "node:crypto";
|
|
17
|
+
import { constants, createCipheriv, createHash, publicEncrypt, randomBytes, randomUUID } from "node:crypto";
|
|
13
18
|
import { getQoderVersion } from "../../operations/client-versions";
|
|
14
19
|
import { qoderMachineHostname, qoderMachineOs } from "../../operations/cli-platform";
|
|
15
|
-
import { QODER_UA_CLI } from "./qoder-realm";
|
|
20
|
+
import { QODER_UA_APP, QODER_UA_CLI } from "./qoder-realm";
|
|
16
21
|
import type { QoderAuth } from "./qoder-types";
|
|
17
22
|
|
|
23
|
+
/** Which Qoder client identity a COSY request presents. */
|
|
24
|
+
export type QoderCosyProfile = "app" | "cli";
|
|
25
|
+
|
|
18
26
|
const QODER_APPCODE = "cosy";
|
|
19
27
|
const QODER_SIG_SECRET = "d2FyLCB3YXIgbmV2ZXIgY2hhbmdlcw==";
|
|
20
28
|
const QODER_STANDARD_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
@@ -83,6 +91,7 @@ export function qoderBuildCosyHeaders(
|
|
|
83
91
|
url: string,
|
|
84
92
|
auth: QoderAuth,
|
|
85
93
|
version = getQoderVersion(),
|
|
94
|
+
profile: QoderCosyProfile = "app",
|
|
86
95
|
): Record<string, string> {
|
|
87
96
|
const key = randomUUID().replaceAll("-", "").slice(0, 16);
|
|
88
97
|
const identity = qoderJsonSortedCompact({
|
|
@@ -104,12 +113,17 @@ export function qoderBuildCosyHeaders(
|
|
|
104
113
|
).toString("base64");
|
|
105
114
|
const date = String(Math.floor(Date.now() / 1000));
|
|
106
115
|
const signature = qoderMd5(`${payload}\n${cosyKey}\n${date}\n${Buffer.from(body).toString("latin1")}\n${qoderPathSignature(url)}`);
|
|
116
|
+
const traceId = randomBytes(16).toString("hex");
|
|
117
|
+
const spanId = randomBytes(8).toString("hex");
|
|
118
|
+
const app = profile === "app";
|
|
107
119
|
return {
|
|
108
120
|
authorization: `Bearer COSY.${payload}.${signature}`,
|
|
109
121
|
"cosy-data-policy": "agree",
|
|
110
122
|
"cosy-machinetype": auth.machineType ?? "5",
|
|
111
123
|
"cosy-machineos": qoderMachineOs(),
|
|
112
|
-
|
|
124
|
+
// Desktop-worker capture (2026-11-11): `cosy-clienttype: 10` identifies
|
|
125
|
+
// the app/worker client; the CLI used `5`.
|
|
126
|
+
"cosy-clienttype": app ? "10" : "5",
|
|
113
127
|
"cosy-date": date,
|
|
114
128
|
"cosy-user": auth.userId,
|
|
115
129
|
"cosy-key": cosyKey,
|
|
@@ -123,19 +137,32 @@ export function qoderBuildCosyHeaders(
|
|
|
123
137
|
"cosy-organization-id": "",
|
|
124
138
|
"cosy-organization-tags": "",
|
|
125
139
|
"x-request-id": randomUUID(),
|
|
126
|
-
|
|
140
|
+
...(auth.httpDnsIp !== undefined && auth.httpDnsIp.length > 0
|
|
141
|
+
? { "X-Qoder-HTTPDNS-IP": auth.httpDnsIp }
|
|
142
|
+
: {}),
|
|
143
|
+
// Desktop-worker capture (2026-11-11): `cosy-business-product: app` and
|
|
144
|
+
// `cosy-scene: app` mirror the app/worker surface; the CLI used
|
|
145
|
+
// `cli`/`assistant`.
|
|
146
|
+
"cosy-business-product": app ? "app" : "cli",
|
|
127
147
|
"cosy-business-type": "agent",
|
|
128
148
|
"cosy-business-version": version,
|
|
129
|
-
"cosy-scene": "assistant",
|
|
149
|
+
"cosy-scene": app ? "app" : "assistant",
|
|
130
150
|
"cosy-version": version,
|
|
131
151
|
"login-version": "v2",
|
|
132
152
|
appcode: QODER_APPCODE,
|
|
133
153
|
accept: "application/json",
|
|
134
|
-
|
|
154
|
+
// Desktop-worker capture (2026-11-11): `br, gzip, deflate`. The CLI
|
|
155
|
+
// sends `identity`.
|
|
156
|
+
"accept-encoding": app ? "br, gzip, deflate" : "identity",
|
|
157
|
+
"accept-language": app ? "*" : "",
|
|
158
|
+
"sec-fetch-mode": app ? "cors" : "",
|
|
159
|
+
// W3C trace context, as the worker's undici fetch emits it (capture
|
|
160
|
+
// 2026-11-11): `00-<traceid>-<spanid>-01`.
|
|
161
|
+
...(app ? { traceparent: `00-${traceId}-${spanId}-01` } : {}),
|
|
135
162
|
date: new Date().toUTCString(),
|
|
136
163
|
signature: qoderMd5(`${QODER_APPCODE}&${QODER_SIG_SECRET}&${new Date().toUTCString()}`),
|
|
137
164
|
"content-type": "application/json",
|
|
138
|
-
"user-agent": QODER_UA_CLI,
|
|
165
|
+
"user-agent": app ? QODER_UA_APP : QODER_UA_CLI,
|
|
139
166
|
};
|
|
140
167
|
}
|
|
141
168
|
|
|
@@ -150,9 +177,10 @@ export function qoderBuildCosyHeaders(
|
|
|
150
177
|
export function qoderSignerFor(
|
|
151
178
|
auth: QoderAuth,
|
|
152
179
|
version = getQoderVersion(),
|
|
180
|
+
profile: QoderCosyProfile = "app",
|
|
153
181
|
): (url: string, body: string) => Record<string, string> {
|
|
154
182
|
return (url: string, body: string): Record<string, string> =>
|
|
155
|
-
qoderBuildCosyHeaders(Buffer.from(body, "latin1"), url, auth, version);
|
|
183
|
+
qoderBuildCosyHeaders(Buffer.from(body, "latin1"), url, auth, version, profile);
|
|
156
184
|
}
|
|
157
185
|
|
|
158
186
|
/** Qoder's own base64 alphabet transform, for a request body. */
|
|
@@ -146,6 +146,12 @@ const EXPIRY_FALLBACK_MS = 30 * 24 * 60 * 60 * 1000;
|
|
|
146
146
|
export interface QoderOAuthState {
|
|
147
147
|
readonly userId: string;
|
|
148
148
|
readonly machineId: string;
|
|
149
|
+
/**
|
|
150
|
+
* Resolved egress IP for the HTTPDNS-managed route, when the login stored
|
|
151
|
+
* it. Mirrors the worker's `networkMode=httpdns` state; the request then
|
|
152
|
+
* carries `X-Qoder-HTTPDNS-IP`.
|
|
153
|
+
*/
|
|
154
|
+
readonly httpDnsIp?: string;
|
|
149
155
|
}
|
|
150
156
|
|
|
151
157
|
/** Reads the persisted Qoder identity; `undefined` when the account predates it. */
|
|
@@ -166,7 +172,8 @@ export function parseQoderOAuthState(value: unknown): QoderOAuthState | undefine
|
|
|
166
172
|
const userId = nonEmptyTrimmedString(root.userId);
|
|
167
173
|
const machineId = nonEmptyTrimmedString(root.machineId);
|
|
168
174
|
if (userId === undefined || machineId === undefined) return undefined;
|
|
169
|
-
|
|
175
|
+
const httpDnsIp = nonEmptyTrimmedString(root.httpDnsIp);
|
|
176
|
+
return httpDnsIp === undefined ? { userId, machineId } : { userId, machineId, httpDnsIp };
|
|
170
177
|
}
|
|
171
178
|
|
|
172
179
|
|
|
@@ -382,7 +389,7 @@ export class QoderOAuthClient extends OAuthDeviceFlow {
|
|
|
382
389
|
`&verifier=${encodeURIComponent(state.verifier)}&challenge_method=S256`;
|
|
383
390
|
let response: Response;
|
|
384
391
|
try {
|
|
385
|
-
response = await this.
|
|
392
|
+
response = await this.fetchFor(context)(url, {
|
|
386
393
|
method: "GET",
|
|
387
394
|
headers: { accept: "application/json", "user-agent": QODER_UA_CLI },
|
|
388
395
|
signal: AbortSignal.timeout(POLL_TIMEOUT_MS),
|
|
@@ -53,48 +53,23 @@ export interface QoderRealmConfig {
|
|
|
53
53
|
* - CLI / legacy COSY chat + device flow: `Bun/1.4.2` (flow 218/030, v1.1.83)
|
|
54
54
|
* - IDE surface `/model/v1`: `Bun/1.4.4` (flow 219)
|
|
55
55
|
* - job-token exchange: `qoder/<version>` (capture, e.g. `qoder/1.1.83`)
|
|
56
|
+
*
|
|
57
|
+
* The desktop app (0.5.7) hosts an Electron Node worker
|
|
58
|
+
* (`qoder-worker-runtime.obf.mjs --sdk`) whose fetch stack is undici; its
|
|
59
|
+
* chat/worker requests carry `User-Agent: undici` (capture 2026-11-11).
|
|
60
|
+
* The gateway mirrors the app wire on the COSY chat surface, so chat uses
|
|
61
|
+
* `QODER_UA_APP`; the CLI/device-flow surfaces keep `QODER_UA_CLI`.
|
|
56
62
|
*/
|
|
57
63
|
export const QODER_UA_CLI = "Bun/1.4.2";
|
|
58
64
|
export const QODER_UA_IDE = "Bun/1.4.4";
|
|
65
|
+
export const QODER_UA_APP = "undici";
|
|
59
66
|
|
|
60
67
|
/** Chat + model-list paths, identical across realms. */
|
|
61
68
|
export const QODER_CHAT_PATH =
|
|
62
69
|
"/algo/api/v2/service/pro/sse/agent_chat_generation?FetchKeys=llm_model_result&AgentId=agent_common&Encode=1";
|
|
63
70
|
export const QODER_MODELS_PATH = "/algo/api/v2/model/list?Encode=1";
|
|
64
71
|
|
|
65
|
-
/**
|
|
66
|
-
* The modern model-server surface used by the IDE / QoderWake (OpenAI-shaped
|
|
67
|
-
* chunks, plain bearer auth). This surface streams immediately and echoes the
|
|
68
|
-
* real model key — the legacy `/algo` chat endpoint answers
|
|
69
|
-
* `10605 isQueued` (parking requests in a server-side queue) and echoes a
|
|
70
|
-
* fixed `"auto"` model. Dispatch tries this surface first, and falls back to
|
|
71
|
-
* legacy COSY only when it refuses the account on entitlement grounds (HTTP
|
|
72
|
-
* 402 / `{"code":116}`) AND the dispatched model is a free-tier row — for a
|
|
73
|
-
* billed model the same code is genuine quota exhaustion and must surface.
|
|
74
|
-
*/
|
|
75
|
-
export const QODER_IDE_CHAT_PATH = "/model/v1/chat/completions";
|
|
76
|
-
|
|
77
72
|
/** The model-server host for one realm (intl: `api1`, cn: gateway). */
|
|
78
|
-
export function qoderIdeChatUrl(realm: QoderRealm): string {
|
|
79
|
-
return realm === "cn"
|
|
80
|
-
? `https://gateway.qoder.com.cn${QODER_IDE_CHAT_PATH}`
|
|
81
|
-
: `https://api1.qoder.sh${QODER_IDE_CHAT_PATH}`;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* The gRPC model-server host for one realm.
|
|
86
|
-
*
|
|
87
|
-
* Intl default is `api1.qoder.sh` (first host from `qoderInferenceCandidates`;
|
|
88
|
-
* the old `api2-v2.qoder.sh` has been NXDOMAIN since 2026-11-07 — see
|
|
89
|
-
* `documentation/research/qoder/live/
|
|
90
|
-
* 2026-11-07-qoder-host-inference-fallback.md`). The gRPC service is no
|
|
91
|
-
* longer verified alive on any host that resolves (UNIMPLEMENTED); this host
|
|
92
|
-
* is kept as the target so probes/gRPC still have an address.
|
|
93
|
-
*/
|
|
94
|
-
export function qoderGrpcHost(realm: QoderRealm): string {
|
|
95
|
-
return realm === "cn" ? "gateway.qoder.com.cn" : "api1.qoder.sh";
|
|
96
|
-
}
|
|
97
|
-
|
|
98
73
|
/**
|
|
99
74
|
* Realm → deployment.
|
|
100
75
|
*
|
|
@@ -142,8 +117,9 @@ export function qoderGatewayCandidates(realm: QoderRealm): readonly string[] {
|
|
|
142
117
|
* Inference hosts for one realm, ordered by token kind — mirrors the donor's
|
|
143
118
|
* `qoderInferenceBase` (donor hub): job tokens (`jt-...`) are served by `api2`
|
|
144
119
|
* and get rejected by `api3` with "Login expired" (403), while device tokens
|
|
145
|
-
* (`dt-...`) and everything else use the ordinary gateway set.
|
|
146
|
-
* single gateway and serves
|
|
120
|
+
* (`dt-...`) and everything else use the ordinary gateway set. The job-token
|
|
121
|
+
* set therefore excludes `api3` entirely; CN has a single gateway and serves
|
|
122
|
+
* every token kind.
|
|
147
123
|
*/
|
|
148
124
|
export function qoderInferenceCandidates(
|
|
149
125
|
realm: QoderRealm,
|
|
@@ -152,8 +128,9 @@ export function qoderInferenceCandidates(
|
|
|
152
128
|
const config = QODER_REALMS[realm];
|
|
153
129
|
if (realm === "cn") return [config.gateway];
|
|
154
130
|
if (token !== undefined && token.startsWith("jt-")) {
|
|
155
|
-
|
|
156
|
-
|
|
131
|
+
// api3 rejects job tokens (Login expired, 403); only api2 and api1 can
|
|
132
|
+
// serve them.
|
|
133
|
+
return ["https://api2.qoder.sh", config.gateway];
|
|
157
134
|
}
|
|
158
135
|
return [config.gateway, ...config.gatewayFallbacks];
|
|
159
136
|
}
|