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
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
// Cursor Run hardening, adapted end-to-end from oh-my-pi's streamCursorWithWireMode.
|
|
2
|
+
//
|
|
3
|
+
// The wire opens in cursor-http2.ts; the lifecycle lives in the adapter. These
|
|
4
|
+
// are the policies that make a tool loop reliable: classify a transport
|
|
5
|
+
// failure once (a model-not-found is never retried, an HTTP/2 block is never
|
|
6
|
+
// retried as HTTP/2), keep checkpoint/exec accounting across a stream's
|
|
7
|
+
// exits, and drain async handlers on BOTH exits before anything is finalized.
|
|
8
|
+
import { GatewayError } from "../../../protocol/gateway-error";
|
|
9
|
+
|
|
10
|
+
/** One decoded frame's shape — no text, tokens, ids, or arguments. */
|
|
11
|
+
export interface CursorFrameShape {
|
|
12
|
+
readonly at: number;
|
|
13
|
+
readonly kind: string;
|
|
14
|
+
readonly fields: readonly number[];
|
|
15
|
+
readonly size: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** The last checkpoint a Run reported, and the calls it owns. */
|
|
19
|
+
export interface CursorCheckpointState {
|
|
20
|
+
/** Checkpoint number in this Run. */
|
|
21
|
+
index: number;
|
|
22
|
+
/** Checkpoint number within its step. */
|
|
23
|
+
step: number;
|
|
24
|
+
/** Consecutive checkpoints with no semantic frame between them. */
|
|
25
|
+
streak: number;
|
|
26
|
+
/** Shapes of the frames preceding the last checkpoint. */
|
|
27
|
+
kinds: readonly string[];
|
|
28
|
+
/** Opaque bytes to resume from, when the Run must be rebuilt. */
|
|
29
|
+
bytes: Uint8Array | undefined;
|
|
30
|
+
/** Calls the server requested but this client has not answered. */
|
|
31
|
+
pendingCallIds: Set<string>;
|
|
32
|
+
/** Calls the server already counted: never re-submit these. */
|
|
33
|
+
completedCallIds: Set<string>;
|
|
34
|
+
/** Calls Cursor served itself, already in its own tool count. */
|
|
35
|
+
serverOwnedCount: number;
|
|
36
|
+
/** `tool_requests_listed.call_count`, when the edge declared it. */
|
|
37
|
+
expectedCallCount: number | undefined;
|
|
38
|
+
/** Calls this client dispatched to its executor. */
|
|
39
|
+
dispatchedCount: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function createCheckpointState(): CursorCheckpointState {
|
|
43
|
+
return {
|
|
44
|
+
index: 0,
|
|
45
|
+
step: 0,
|
|
46
|
+
streak: 0,
|
|
47
|
+
kinds: [],
|
|
48
|
+
bytes: undefined,
|
|
49
|
+
pendingCallIds: new Set<string>(),
|
|
50
|
+
completedCallIds: new Set<string>(),
|
|
51
|
+
serverOwnedCount: 0,
|
|
52
|
+
expectedCallCount: undefined,
|
|
53
|
+
dispatchedCount: 0,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** The first meaningful key of a decoded AgentServerMessage, for traces. */
|
|
58
|
+
export function frameKindOf(message: Record<string, unknown>): string {
|
|
59
|
+
const keys = Object.keys(message).filter((key) => message[key] !== undefined && key !== "__bytes");
|
|
60
|
+
return keys[0] ?? "unknown";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Shape-only trace entry: sizes and timings, never payload text or ids. */
|
|
64
|
+
export function frameShapeOf(message: Record<string, unknown>, at = Date.now()): CursorFrameShape {
|
|
65
|
+
const bytes = message["__bytes"] instanceof Uint8Array ? (message["__bytes"] as Uint8Array) : undefined;
|
|
66
|
+
return {
|
|
67
|
+
at,
|
|
68
|
+
kind: frameKindOf(message),
|
|
69
|
+
fields: bytes === undefined ? [] : topLevelFieldNumbers(bytes),
|
|
70
|
+
size: bytes?.byteLength ?? 0,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Top-level protobuf field numbers of one decoded frame's raw bytes. */
|
|
75
|
+
export function topLevelFieldNumbers(bytes: Uint8Array): number[] {
|
|
76
|
+
const numbers: number[] = [];
|
|
77
|
+
let at = 0;
|
|
78
|
+
while (at < bytes.byteLength && numbers.length < 64) {
|
|
79
|
+
let tag = 0;
|
|
80
|
+
let shift = 0;
|
|
81
|
+
for (;;) {
|
|
82
|
+
if (at >= bytes.byteLength) return numbers;
|
|
83
|
+
const byte = bytes[at] ?? 0;
|
|
84
|
+
at += 1;
|
|
85
|
+
tag |= (byte & 0x7f) << shift;
|
|
86
|
+
if ((byte & 0x80) === 0) break;
|
|
87
|
+
shift += 7;
|
|
88
|
+
if (shift > 35) return numbers;
|
|
89
|
+
}
|
|
90
|
+
const field = tag >>> 3;
|
|
91
|
+
if (field > 0) numbers.push(field);
|
|
92
|
+
const wire = tag & 7;
|
|
93
|
+
if (wire === 0) {
|
|
94
|
+
while (at < bytes.byteLength && ((bytes[at] ?? 0) & 0x80) !== 0) at += 1;
|
|
95
|
+
at += 1;
|
|
96
|
+
} else if (wire === 1) at += 8;
|
|
97
|
+
else if (wire === 2) {
|
|
98
|
+
let length = 0;
|
|
99
|
+
shift = 0;
|
|
100
|
+
for (;;) {
|
|
101
|
+
if (at >= bytes.byteLength) return numbers;
|
|
102
|
+
const byte = bytes[at] ?? 0;
|
|
103
|
+
at += 1;
|
|
104
|
+
length |= (byte & 0x7f) << shift;
|
|
105
|
+
if ((byte & 0x80) === 0) break;
|
|
106
|
+
shift += 7;
|
|
107
|
+
if (shift > 35) return numbers;
|
|
108
|
+
}
|
|
109
|
+
at += length;
|
|
110
|
+
} else if (wire === 5) at += 4;
|
|
111
|
+
else return numbers;
|
|
112
|
+
}
|
|
113
|
+
return numbers;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Max in-memory shape-only trace entries before a failed Run is flushed. */
|
|
117
|
+
export const CURSOR_WIRE_TRACE_MAX = 256;
|
|
118
|
+
/** Opt-in: `CARTETHYIA_CURSOR_WIRE_TRACE=1`. Shape only; never payload text. */
|
|
119
|
+
export function wireTraceEnabled(): boolean {
|
|
120
|
+
return process.env.CARTETHYIA_CURSOR_WIRE_TRACE === "1";
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** The "went quiet" error, naming the last checkpoint (donor 0.2.34). */
|
|
124
|
+
export function cursorQuietError(checkpoint: CursorCheckpointState | undefined): GatewayError {
|
|
125
|
+
if (checkpoint === undefined || checkpoint.index === 0) {
|
|
126
|
+
return new GatewayError(
|
|
127
|
+
"platform_unavailable",
|
|
128
|
+
502,
|
|
129
|
+
"Cursor Run went quiet before any checkpoint (request {requestId}). The upstream came back empty-handed — retry 🌙",
|
|
130
|
+
{ providerId: "cursor", kind: "quiet" },
|
|
131
|
+
"upstream",
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
return new GatewayError(
|
|
135
|
+
"platform_unavailable",
|
|
136
|
+
502,
|
|
137
|
+
`Cursor Run went quiet at checkpoint ${checkpoint.index} (step checkpoint #${checkpoint.step}, ` +
|
|
138
|
+
`${checkpoint.streak} in a row; preceded by ${checkpoint.kinds.join(", ") || "no frames"}) (request {requestId}). ` +
|
|
139
|
+
"The upstream came back empty-handed — retry 🌙",
|
|
140
|
+
{ providerId: "cursor", kind: "quiet", checkpointIndex: checkpoint.index },
|
|
141
|
+
"upstream",
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Structured failure kinds, mapped once from an upstream error. */
|
|
146
|
+
export type CursorFailureKind =
|
|
147
|
+
| "model_not_found"
|
|
148
|
+
| "conversation_rejected"
|
|
149
|
+
| "resource_exhausted"
|
|
150
|
+
| "not_implemented"
|
|
151
|
+
| "h2_blocked"
|
|
152
|
+
| "quiet"
|
|
153
|
+
| "transport"
|
|
154
|
+
| "authentication"
|
|
155
|
+
| "fatal";
|
|
156
|
+
|
|
157
|
+
export interface CursorFailureClassification {
|
|
158
|
+
readonly kind: CursorFailureKind;
|
|
159
|
+
readonly retryable: boolean;
|
|
160
|
+
readonly fallbackH1: boolean;
|
|
161
|
+
readonly rotateConversation: boolean;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Donor patterns (cursor.ts L381-L405). */
|
|
165
|
+
const MODEL_NOT_FOUND = /^(?:Connect error not_found:|gRPC error 5:)|AI Model Not Found/i;
|
|
166
|
+
const RESOURCE_EXHAUSTED = /resource.?exhausted/i;
|
|
167
|
+
const CONVERSATION_REJECTED = /conversation.*(rejected|conflict|stale|not found)|store conflict/i;
|
|
168
|
+
const NOT_IMPLEMENTED = /not implemented by this client$/i;
|
|
169
|
+
|
|
170
|
+
export function classifyCursorFailure(error: unknown, transport: "http2" | "http1"): CursorFailureClassification {
|
|
171
|
+
if (error instanceof GatewayError) {
|
|
172
|
+
if (error.code === "authentication_failed") {
|
|
173
|
+
return { kind: "authentication", retryable: false, fallbackH1: false, rotateConversation: false };
|
|
174
|
+
}
|
|
175
|
+
if (error.code === "quota_exceeded" || RESOURCE_EXHAUSTED.test(error.message)) {
|
|
176
|
+
return { kind: "resource_exhausted", retryable: false, fallbackH1: false, rotateConversation: false };
|
|
177
|
+
}
|
|
178
|
+
if (MODEL_NOT_FOUND.test(error.message)) {
|
|
179
|
+
return { kind: "model_not_found", retryable: false, fallbackH1: false, rotateConversation: false };
|
|
180
|
+
}
|
|
181
|
+
if (error.code === "invalid_request") {
|
|
182
|
+
return { kind: "fatal", retryable: false, fallbackH1: false, rotateConversation: false };
|
|
183
|
+
}
|
|
184
|
+
if (error.details["kind"] === "quiet") {
|
|
185
|
+
return { kind: "quiet", retryable: true, fallbackH1: false, rotateConversation: false };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
189
|
+
if (MODEL_NOT_FOUND.test(message)) {
|
|
190
|
+
return { kind: "model_not_found", retryable: false, fallbackH1: false, rotateConversation: false };
|
|
191
|
+
}
|
|
192
|
+
if (CONVERSATION_REJECTED.test(message)) {
|
|
193
|
+
return { kind: "conversation_rejected", retryable: true, fallbackH1: false, rotateConversation: true };
|
|
194
|
+
}
|
|
195
|
+
if (RESOURCE_EXHAUSTED.test(message)) {
|
|
196
|
+
return { kind: "resource_exhausted", retryable: false, fallbackH1: false, rotateConversation: false };
|
|
197
|
+
}
|
|
198
|
+
if (NOT_IMPLEMENTED.test(message)) {
|
|
199
|
+
return { kind: "not_implemented", retryable: false, fallbackH1: false, rotateConversation: false };
|
|
200
|
+
}
|
|
201
|
+
if (/http\/?2|nghttp2|alpn|rst_stream|goaway|protocol error/i.test(message) && transport === "http2") {
|
|
202
|
+
return { kind: "h2_blocked", retryable: true, fallbackH1: true, rotateConversation: false };
|
|
203
|
+
}
|
|
204
|
+
if (/quiet|no server message|heartbeat/i.test(message)) {
|
|
205
|
+
return { kind: "quiet", retryable: true, fallbackH1: false, rotateConversation: false };
|
|
206
|
+
}
|
|
207
|
+
return { kind: "transport", retryable: true, fallbackH1: false, rotateConversation: false };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* One settlement for a Run's transport: `end` / `error` / `timeout`,
|
|
212
|
+
* whichever arrives first. Late events are no-ops (donor settleH2).
|
|
213
|
+
*/
|
|
214
|
+
export function createRunCompletion() {
|
|
215
|
+
let settle!: (reason: "end" | "error" | "timeout") => void;
|
|
216
|
+
const promise = new Promise<"end" | "error" | "timeout">((resolve) => {
|
|
217
|
+
settle = resolve;
|
|
218
|
+
});
|
|
219
|
+
let settled = false;
|
|
220
|
+
return {
|
|
221
|
+
promise,
|
|
222
|
+
settle(reason: "end" | "error" | "timeout"): boolean {
|
|
223
|
+
if (settled) return false;
|
|
224
|
+
settled = true;
|
|
225
|
+
settle(reason);
|
|
226
|
+
return true;
|
|
227
|
+
},
|
|
228
|
+
get settled(): boolean {
|
|
229
|
+
return settled;
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Drains dispatched exec handlers on BOTH exits (donor L1198-L1233).
|
|
236
|
+
*
|
|
237
|
+
* A dispatch can spawn another, so the set is re-checked rather than awaited
|
|
238
|
+
* as one snapshot. The wait is bounded by the abort signal: an exec handler
|
|
239
|
+
* has no cancellation contract, and a hung tool must not hold the terminal
|
|
240
|
+
* event hostage after the caller gave up.
|
|
241
|
+
*/
|
|
242
|
+
export async function drainInFlightDispatches(
|
|
243
|
+
dispatches: Set<Promise<void>>,
|
|
244
|
+
signal?: AbortSignal,
|
|
245
|
+
): Promise<void> {
|
|
246
|
+
if (dispatches.size === 0 || signal?.aborted === true) return;
|
|
247
|
+
if (signal === undefined) {
|
|
248
|
+
while (dispatches.size > 0) await Promise.all(dispatches);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
let onAbort: (() => void) | undefined;
|
|
252
|
+
const aborted = new Promise<void>((resolve) => {
|
|
253
|
+
onAbort = resolve;
|
|
254
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
255
|
+
});
|
|
256
|
+
try {
|
|
257
|
+
while (dispatches.size > 0 && !signal.aborted) {
|
|
258
|
+
await Promise.race([Promise.all(dispatches), aborted]);
|
|
259
|
+
}
|
|
260
|
+
} finally {
|
|
261
|
+
if (onAbort !== undefined) signal.removeEventListener("abort", onAbort);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* A step ends when the server's own tool count covers the calls this client
|
|
267
|
+
* dispatched (donor/magpie 0.2.35): waiting out the heartbeats after that is
|
|
268
|
+
* what made a finished tool round look hung. Server-owned calls are already
|
|
269
|
+
* in the count and are never re-sent.
|
|
270
|
+
*/
|
|
271
|
+
export function reconcileToolCount(
|
|
272
|
+
checkpoint: CursorCheckpointState,
|
|
273
|
+
serverToolCount: number,
|
|
274
|
+
): { endStep: boolean; resend: string[] } {
|
|
275
|
+
const resend = [...checkpoint.pendingCallIds].filter((id) => !checkpoint.completedCallIds.has(id));
|
|
276
|
+
const expected = checkpoint.expectedCallCount ?? serverToolCount;
|
|
277
|
+
const counted = serverToolCount + checkpoint.serverOwnedCount;
|
|
278
|
+
return { endStep: counted >= Math.max(checkpoint.dispatchedCount, expected), resend };
|
|
279
|
+
}
|