cartethyia 2.7.7 → 2.7.9
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 +0 -1
- package/README.md +29 -59
- package/dist/dashboard/assets/BannedPage-BxoG1MrL.js +1 -0
- package/dist/dashboard/assets/BannedPage-BxoG1MrL.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-CLUhmjUy.js → CliToolDetailPage-ixwgKk53.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-ixwgKk53.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-CQmrqqrk.js → CliToolsPage-BmttNV3U.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-BmttNV3U.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-BE3qwwfC.js +1 -0
- package/dist/dashboard/assets/CombosPage-BE3qwwfC.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js +1 -0
- package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js.gz +0 -0
- package/dist/dashboard/assets/{InjectSystemPromptPanel-C-e2AMz6.js → InjectSystemPromptPanel-BOoO8rpz.js} +2 -2
- package/dist/dashboard/assets/InjectSystemPromptPanel-BOoO8rpz.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-J8wPbmfT.js → LoginPage-ChJuNNVN.js} +1 -1
- package/dist/dashboard/assets/LoginPage-ChJuNNVN.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-C6WlpU5E.js → ModelPicker-BZAJtPg1.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-BZAJtPg1.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-BE40s3u5.js +1 -0
- package/dist/dashboard/assets/OverviewPage-BE40s3u5.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js +8 -0
- package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js.gz +0 -0
- package/dist/dashboard/assets/{ProxyPage-BBTRBAQ3.js → ProxyPage-BJ87Pp0U.js} +1 -1
- package/dist/dashboard/assets/ProxyPage-BJ87Pp0U.js.gz +0 -0
- package/dist/dashboard/assets/{QuotaPage-B2WqMSG1.js → QuotaPage-gkSyRAKa.js} +1 -1
- package/dist/dashboard/assets/QuotaPage-gkSyRAKa.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js +1 -0
- package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-LND6_Ss7.js → SetupPage-CFNcATJJ.js} +1 -1
- package/dist/dashboard/assets/SetupPage-CFNcATJJ.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-BzNnm6Bi.js → StudioPage-YoD4tY5l.js} +1 -1
- package/dist/dashboard/assets/StudioPage-YoD4tY5l.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-DxjaAhb_.js +56 -0
- package/dist/dashboard/assets/UsagePage-DxjaAhb_.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-BTlkq_Uk.js +1 -0
- package/dist/dashboard/assets/api-keys-BTlkq_Uk.js.gz +0 -0
- package/dist/dashboard/assets/app-BX2nnKqs.css +2 -0
- package/dist/dashboard/assets/app-BX2nnKqs.css.gz +0 -0
- package/dist/dashboard/assets/assert-CndthXFQ.js +1 -0
- package/dist/dashboard/assets/assert-CndthXFQ.js.gz +0 -0
- package/dist/dashboard/assets/{badge-BaX2GTrn.js → badge-DdbT_7Am.js} +1 -1
- package/dist/dashboard/assets/badge-DdbT_7Am.js.gz +0 -0
- package/dist/dashboard/assets/ban-durations-B58FyRxC.js +1 -0
- package/dist/dashboard/assets/ban-durations-B58FyRxC.js.gz +0 -0
- package/dist/dashboard/assets/{banner-DFH4Bkte.js → banner-CsGN-nbm.js} +1 -1
- package/dist/dashboard/assets/banner-CsGN-nbm.js.gz +0 -0
- package/dist/dashboard/assets/brand/bansos_page.webp +0 -0
- package/dist/dashboard/assets/brand/denia_bansos.webp +0 -0
- package/dist/dashboard/assets/brand/favicon.webp +0 -0
- package/dist/dashboard/assets/brand/login_register.webp +0 -0
- package/dist/dashboard/assets/brand/login_register_initial.webp +0 -0
- package/dist/dashboard/assets/brand/og_bansos.webp +0 -0
- package/dist/dashboard/assets/brand/og_image.webp +0 -0
- package/dist/dashboard/assets/brand/sidebar_ico.webp +0 -0
- package/dist/dashboard/assets/{card-CxDw0lK6.js → card-mgZ_TLLZ.js} +1 -1
- package/dist/dashboard/assets/card-mgZ_TLLZ.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-A1-v8-03.js +1 -0
- package/dist/dashboard/assets/cli-tools-A1-v8-03.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-DfS1ntiq.js → clipboard-button-CJ4Zty89.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-CJ4Zty89.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-BK-NRr5u.js → dialog-B5L2jPQ_.js} +1 -1
- package/dist/dashboard/assets/dialog-B5L2jPQ_.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-QqPul6sC.js → drawer-DkjUouAj.js} +1 -1
- package/dist/dashboard/assets/drawer-DkjUouAj.js.gz +0 -0
- package/dist/dashboard/assets/{entry-BMlYJVFj.js → entry-B-LVLV6o.js} +1 -1
- package/dist/dashboard/assets/entry-B-LVLV6o.js.gz +0 -0
- package/dist/dashboard/assets/entry-CAhdYl3B.js +1 -0
- package/dist/dashboard/assets/entry-CAhdYl3B.js.gz +0 -0
- package/dist/dashboard/assets/entry-D2xD0Tmd.js +4 -0
- package/dist/dashboard/assets/entry-D2xD0Tmd.js.gz +0 -0
- package/dist/dashboard/assets/{formatters-DP-5E01-.js → formatters-CrsdLVsn.js} +1 -1
- package/dist/dashboard/assets/formatters-CrsdLVsn.js.gz +0 -0
- package/dist/dashboard/assets/{index-D36vCZht.js → index-BU64Lqvp.js} +2 -2
- package/dist/dashboard/assets/index-BU64Lqvp.js.gz +0 -0
- package/dist/dashboard/assets/{inline-CHJQwxLa.js → inline-B2aDLyyg.js} +1 -1
- package/dist/dashboard/assets/inline-B2aDLyyg.js.gz +0 -0
- package/dist/dashboard/assets/{input-BlmlizVV.js → input-BCVkdR9d.js} +1 -1
- package/dist/dashboard/assets/input-BCVkdR9d.js.gz +0 -0
- package/dist/dashboard/assets/{layout-Bz93I-yE.js → layout-DNcAdMK-.js} +1 -1
- package/dist/dashboard/assets/layout-DNcAdMK-.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-Ml16KCfu.js → list-row-DgrIH0hw.js} +1 -1
- package/dist/dashboard/assets/list-row-DgrIH0hw.js.gz +0 -0
- package/dist/dashboard/assets/{live-7_QpnYGu.js → live-Cae01iu8.js} +1 -1
- package/dist/dashboard/assets/live-Cae01iu8.js.gz +0 -0
- package/dist/dashboard/assets/{mutation-GU7XdEjz.js → mutation-BQ0ccH_A.js} +1 -1
- package/dist/dashboard/assets/mutation-BQ0ccH_A.js.gz +0 -0
- package/dist/dashboard/assets/{network-CuMDaTzT.js → network-CRib7H_2.js} +1 -1
- package/dist/dashboard/assets/network-CRib7H_2.js.gz +0 -0
- package/dist/dashboard/assets/{numbers-CoqpaDMx.js → numbers-BKQE8Xpz.js} +1 -1
- package/dist/dashboard/assets/numbers-BKQE8Xpz.js.gz +0 -0
- package/dist/dashboard/assets/{pagination-B5aOoweZ.js → pagination-ecPvG_8g.js} +1 -1
- package/dist/dashboard/assets/pagination-ecPvG_8g.js.gz +0 -0
- package/dist/dashboard/assets/providers/devin.svg +9 -0
- package/dist/dashboard/assets/providers/devin.svg.gz +0 -0
- package/dist/dashboard/assets/providers/windsurf.svg +10 -0
- package/dist/dashboard/assets/providers/windsurf.svg.gz +0 -0
- package/dist/dashboard/assets/{query-keys-YSoQOUh6.js → query-keys-IKLh0YFd.js} +1 -1
- package/dist/dashboard/assets/query-keys-IKLh0YFd.js.gz +0 -0
- package/dist/dashboard/assets/routing-Ckm1UXuC.js +1 -0
- package/dist/dashboard/assets/routing-Ckm1UXuC.js.gz +0 -0
- package/dist/dashboard/assets/{select-C9Ssle9b.js → select-ChoFWyKz.js} +1 -1
- package/dist/dashboard/assets/select-ChoFWyKz.js.gz +0 -0
- package/dist/dashboard/assets/settings-CKjFPlKW.js +1 -0
- package/dist/dashboard/assets/settings-CKjFPlKW.js.gz +0 -0
- package/dist/dashboard/assets/{stack-j7cXjgYX.js → stack-DWCwU3fh.js} +1 -1
- package/dist/dashboard/assets/stack-DWCwU3fh.js.gz +0 -0
- package/dist/dashboard/assets/{state-DHmEnLa2.js → state-Cg3VL5J_.js} +1 -1
- package/dist/dashboard/assets/state-Cg3VL5J_.js.gz +0 -0
- package/dist/dashboard/assets/story/25817331.webp +0 -0
- package/dist/dashboard/assets/story/Shorekeeper.webp +0 -0
- package/dist/dashboard/assets/story/cartethyia-god.webp +0 -0
- package/dist/dashboard/assets/story/fleurdelys_plus.webp +0 -0
- package/dist/dashboard/assets/story/jinhsi-blossom.webp +0 -0
- package/dist/dashboard/assets/story/phrolova-a.webp +0 -0
- package/dist/dashboard/assets/story/requestdeniawokkjpg.webp +0 -0
- package/dist/dashboard/assets/story/wuthering-waves-hiyuki-aemeath-hiyuki-rover.webp +0 -0
- package/dist/dashboard/assets/{switch-DmZcyTIC.js → switch-Db70BMix.js} +1 -1
- package/dist/dashboard/assets/switch-Db70BMix.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-CbCP4w1o.js → useMutation-BqdE0LuM.js} +1 -1
- package/dist/dashboard/assets/useMutation-BqdE0LuM.js.gz +0 -0
- package/dist/dashboard/console-backgrounds.webp +0 -0
- package/dist/dashboard/console-backgrounds_initial.webp +0 -0
- package/dist/dashboard/donation/qris-risun-marke.webp +0 -0
- package/dist/dashboard/index.html +3 -3
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +57 -55
- package/migrations/full-postgres/0044_add_models_warning_metadata.sql +10 -0
- package/migrations/full-postgres/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
- package/migrations/lite-sqlite3/0044_add_models_warning_metadata.sql +11 -0
- package/migrations/lite-sqlite3/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
- package/package.json +1 -1
- package/src/boot/dependencies.ts +11 -3
- package/src/config/cooldowns.ts +1 -1
- package/src/config/spec.ts +0 -6
- package/src/console/api-keys/routes.ts +11 -4
- package/src/console/console-router.ts +7 -0
- package/src/console/dashboard-assets.ts +5 -5
- package/src/console/domain-registration.ts +27 -0
- package/src/console/ip-bans/routes.ts +99 -0
- package/src/console/providers/catalog/catalog-projections.ts +5 -2
- package/src/console/providers/catalog/contracts.ts +123 -0
- package/src/console/providers/catalog/model-operations.ts +122 -10
- package/src/console/providers/catalog/provider-operations.ts +116 -8
- package/src/console/providers/catalog/public-model-store.ts +0 -0
- package/src/console/providers/catalog/routes.ts +64 -4
- package/src/console/providers/catalog/store-helpers.ts +30 -1
- package/src/console/providers/catalog/store.ts +243 -3
- package/src/console/quota/account-quota-global.ts +89 -1
- package/src/console/quota/native-identity.ts +2 -0
- package/src/console/settings/contracts.ts +18 -0
- package/src/console/settings/store.ts +32 -0
- package/src/console/system-prompt/contracts.ts +0 -1
- package/src/main.ts +1 -0
- package/src/observability/event-query.ts +18 -4
- package/src/persistence/dialect.ts +12 -0
- package/src/persistence/schema.ts +20 -2
- package/src/protocol/dsml.ts +1 -1
- package/src/protocol/gateway-error.ts +1 -0
- package/src/protocol/reasoning.ts +1 -1
- package/src/protocol/request/chat.ts +4 -4
- package/src/protocol/request/messages.ts +1 -1
- package/src/protocol/response/gemini.ts +6 -1
- package/src/protocol/sse-decoder.ts +25 -8
- package/src/protocol/stream-error-frames.ts +13 -3
- package/src/protocol/translation/quirks.ts +1 -1
- package/src/protocol/translation/tool-repair.ts +2 -2
- package/src/protocol/upstream/send-claude-messages.ts +15 -4
- package/src/protocol/upstream-parsing.ts +1 -1
- package/src/providers/adapters/compatible-adapter.ts +7 -5
- package/src/providers/authentication/oauth-refresh-service.ts +149 -36
- package/src/providers/default-registry.ts +68 -3
- package/src/providers/discovery/discovery-types.ts +12 -0
- package/src/providers/discovery/probe-phases.ts +61 -30
- package/src/providers/discovery/probing-service.ts +279 -164
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +117 -2
- package/src/providers/integrations/antigravity/antigravity.ts +13 -2
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +72 -34
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +18 -18
- package/src/providers/integrations/buddy/buddy-checkin.ts +17 -39
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +2 -2
- package/src/providers/integrations/buddy/buddy-discovery-shared.ts +5 -5
- package/src/providers/integrations/buddy/buddy-identity.ts +70 -0
- package/src/providers/integrations/buddy/buddy-media.ts +4 -5
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +2 -2
- package/src/providers/integrations/buddy/buddy-quota-shared.ts +1 -1
- package/src/providers/integrations/buddy/buddy-usage-shared.ts +1 -3
- package/src/providers/integrations/buddy/capabilities.ts +4 -41
- package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +2 -1
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +20 -1
- package/src/providers/integrations/buddy/codebuddy/provider.ts +2 -2
- package/src/providers/integrations/buddy/codebuddy/shared.ts +6 -10
- package/src/providers/integrations/cursor/cursor-catalog.ts +2 -0
- package/src/providers/integrations/cursor/cursor-exec.ts +738 -0
- package/src/providers/integrations/cursor/cursor-http2.ts +2 -0
- package/src/providers/integrations/cursor/cursor-request.ts +9 -8
- package/src/providers/integrations/cursor/cursor-shared.ts +19 -1
- package/src/providers/integrations/cursor/cursor.ts +50 -30
- package/src/providers/integrations/cursor/protocol/tool-canonical.ts +26 -100
- package/src/providers/integrations/devin/devin-auth.ts +353 -0
- package/src/providers/integrations/devin/devin-catalog.ts +207 -0
- package/src/providers/integrations/devin/devin-http.ts +91 -0
- package/src/providers/integrations/devin/devin-quota.ts +214 -0
- package/src/providers/integrations/devin/devin-shared.ts +111 -0
- package/src/providers/integrations/devin/devin.ts +539 -0
- package/src/providers/integrations/devin/protocol/devin-proto.ts +584 -0
- package/src/providers/integrations/devin/protocol/framing.ts +124 -0
- package/src/providers/integrations/factory/factory.ts +2 -2
- package/src/providers/integrations/freepi/freepi-catalog.ts +60 -0
- package/src/providers/integrations/freepi/freepi-discovery.ts +82 -0
- package/src/providers/integrations/freepi/freepi-headers.ts +21 -0
- package/src/providers/integrations/freepi/freepi-oauth.ts +142 -0
- package/src/providers/integrations/freepi/freepi-protocol.ts +242 -0
- package/src/providers/integrations/freepi/freepi-quota.ts +126 -0
- package/src/providers/integrations/freepi/freepi-realm.ts +35 -0
- package/src/providers/integrations/freepi/freepi.ts +292 -0
- package/src/providers/integrations/gemini.ts +2 -2
- package/src/providers/integrations/hermes/hermes-oauth.ts +94 -0
- package/src/providers/integrations/hermes.ts +4 -12
- package/src/providers/integrations/opencode/fingerprint.ts +1 -1
- package/src/providers/integrations/perch/perch-catalog.ts +105 -0
- package/src/providers/integrations/perch/perch-oauth.ts +170 -0
- package/src/providers/integrations/perch/perch-protocol.ts +211 -0
- package/src/providers/integrations/perch/perch-quota.ts +137 -0
- package/src/providers/integrations/perch/perch-realm.ts +82 -0
- package/src/providers/integrations/perch/perch-system-prompt.ts +13 -0
- package/src/providers/integrations/perch/perch.ts +315 -0
- package/src/providers/integrations/perch/saffron-system-prompt.txt +8 -0
- package/src/providers/integrations/qoder/chat-proto.ts +328 -328
- package/src/providers/integrations/qoder/claim-qoder-credits.ts +1 -1
- package/src/providers/integrations/qoder/qoder-adapter.ts +89 -28
- package/src/providers/integrations/qoder/qoder-cache.ts +32 -0
- package/src/providers/integrations/qoder/qoder-catalog.ts +6 -1
- package/src/providers/integrations/qoder/qoder-checkin.ts +2 -2
- package/src/providers/integrations/qoder/qoder-grpc.ts +209 -5
- package/src/providers/integrations/qoder/qoder-ide.ts +5 -1
- package/src/providers/integrations/qoder/qoder-identity-cache.ts +184 -0
- package/src/providers/integrations/qoder/qoder-native-identity-store.ts +83 -18
- package/src/providers/integrations/qoder/qoder-realm.ts +9 -6
- package/src/providers/integrations/qoder/qoder-umid.ts +109 -342
- package/src/providers/integrations/qoder/qoder-virtual.ts +33 -1
- package/src/providers/integrations/qoder/qoder.ts +3 -6
- package/src/providers/integrations/trae/trae-catalog.ts +9 -14
- package/src/providers/integrations/trae/trae-headers.ts +36 -11
- package/src/providers/integrations/trae/trae-oauth.ts +14 -17
- package/src/providers/integrations/trae/trae-protocol.ts +3 -6
- package/src/providers/integrations/trae/trae-quota.ts +103 -21
- package/src/providers/integrations/trae/trae-realm.ts +36 -15
- package/src/providers/integrations/trae/trae.ts +97 -7
- package/src/providers/operations/account-error-classification.ts +66 -1
- package/src/providers/operations/account-health-service.ts +192 -26
- package/src/providers/operations/account-refresh-status.ts +284 -0
- package/src/providers/operations/account-tier.ts +67 -0
- package/src/providers/operations/byok-wire-profile.ts +9 -12
- package/src/providers/operations/client-versions.ts +37 -99
- package/src/providers/operations/cooldown-rules.ts +61 -0
- package/src/providers/operations/provider-catalog-seeder.ts +4 -0
- package/src/providers/provider-contracts.ts +29 -0
- package/src/providers/provider-metadata.ts +59 -4
- package/src/providers/provider-model-definition.ts +36 -0
- package/src/providers/quota/refresh.ts +21 -0
- package/src/security/abuse.ts +71 -0
- package/src/transport/dispatch/proxy-request.ts +1 -0
- package/src/transport/dispatch/streaming/stream.ts +1 -0
- package/src/transport/dispatch/upstream.ts +4 -1
- package/src/transport/failure-policy.ts +113 -7
- package/src/transport/routing/router.ts +25 -1
- package/src/transport/surface/messages/adapter.ts +2 -1
- package/src/transport/surface/responses/encode.ts +12 -1
- package/src/workers/daily-checkin.ts +1 -1
- package/src/workers/quota-refresh-sweep.ts +1 -1
- package/src/workers/scheduler.ts +22 -4
- package/dist/dashboard/assets/BannedPage-B05aF8Dg.js +0 -1
- package/dist/dashboard/assets/BannedPage-B05aF8Dg.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-CLUhmjUy.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-CQmrqqrk.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-CHG_1Wr3.js +0 -1
- package/dist/dashboard/assets/CombosPage-CHG_1Wr3.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-DPgbklad.js +0 -1
- package/dist/dashboard/assets/ConsoleLogPage-DPgbklad.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-pnfAqr_-.js +0 -1
- package/dist/dashboard/assets/CustomizationPage-pnfAqr_-.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-DGJuU2A6.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-DGJuU2A6.js.gz +0 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-C-e2AMz6.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-J8wPbmfT.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-C6WlpU5E.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-BSQnF2Lp.js +0 -1
- package/dist/dashboard/assets/OverviewPage-BSQnF2Lp.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-DK_e0FJz.js +0 -7
- package/dist/dashboard/assets/ProviderDetailPage-DK_e0FJz.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +0 -1
- package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-D_a3r6Gc.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-D_a3r6Gc.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-BBTRBAQ3.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-B2WqMSG1.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-D7xp5Ij_.js +0 -1
- package/dist/dashboard/assets/SettingsPage-D7xp5Ij_.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-LND6_Ss7.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-BzNnm6Bi.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-C1TbL24N.js +0 -56
- package/dist/dashboard/assets/UsagePage-C1TbL24N.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-KvX83mRe.js +0 -1
- package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
- package/dist/dashboard/assets/app-mweRcsKp.css +0 -2
- package/dist/dashboard/assets/app-mweRcsKp.css.gz +0 -0
- package/dist/dashboard/assets/assert-CidQVoNo.js +0 -1
- package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
- package/dist/dashboard/assets/badge-BaX2GTrn.js.gz +0 -0
- package/dist/dashboard/assets/banner-DFH4Bkte.js.gz +0 -0
- package/dist/dashboard/assets/brand/bansos_page.png +0 -0
- package/dist/dashboard/assets/brand/denia_bansos.jpg +0 -0
- package/dist/dashboard/assets/brand/favicon.jpg +0 -0
- package/dist/dashboard/assets/brand/login_register.jpg +0 -0
- package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
- package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
- package/dist/dashboard/assets/brand/og_image.jpg +0 -0
- package/dist/dashboard/assets/brand/sidebar_ico.jpg +0 -0
- package/dist/dashboard/assets/card-CxDw0lK6.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +0 -1
- package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-DfS1ntiq.js.gz +0 -0
- package/dist/dashboard/assets/dialog-BK-NRr5u.js.gz +0 -0
- package/dist/dashboard/assets/drawer-QqPul6sC.js.gz +0 -0
- package/dist/dashboard/assets/entry-BMlYJVFj.js.gz +0 -0
- package/dist/dashboard/assets/entry-Dmx7gBiN.js +0 -1
- package/dist/dashboard/assets/entry-Dmx7gBiN.js.gz +0 -0
- package/dist/dashboard/assets/entry-vqGb8yVz.js +0 -4
- package/dist/dashboard/assets/entry-vqGb8yVz.js.gz +0 -0
- package/dist/dashboard/assets/formatters-DP-5E01-.js.gz +0 -0
- package/dist/dashboard/assets/index-D36vCZht.js.gz +0 -0
- package/dist/dashboard/assets/inline-CHJQwxLa.js.gz +0 -0
- package/dist/dashboard/assets/input-BlmlizVV.js.gz +0 -0
- package/dist/dashboard/assets/layout-Bz93I-yE.js.gz +0 -0
- package/dist/dashboard/assets/list-row-Ml16KCfu.js.gz +0 -0
- package/dist/dashboard/assets/live-7_QpnYGu.js.gz +0 -0
- package/dist/dashboard/assets/minimize-2-BTmMTK4o.js +0 -1
- package/dist/dashboard/assets/minimize-2-BTmMTK4o.js.gz +0 -0
- package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
- package/dist/dashboard/assets/network-CuMDaTzT.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CoqpaDMx.js.gz +0 -0
- package/dist/dashboard/assets/pagination-B5aOoweZ.js.gz +0 -0
- package/dist/dashboard/assets/query-keys-YSoQOUh6.js.gz +0 -0
- package/dist/dashboard/assets/routing-fnCsxgNO.js +0 -1
- package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
- package/dist/dashboard/assets/select-C9Ssle9b.js.gz +0 -0
- package/dist/dashboard/assets/settings-BxslsErn.js +0 -1
- package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
- package/dist/dashboard/assets/stack-j7cXjgYX.js.gz +0 -0
- package/dist/dashboard/assets/state-DHmEnLa2.js.gz +0 -0
- package/dist/dashboard/assets/switch-DmZcyTIC.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-CbCP4w1o.js.gz +0 -0
- package/dist/dashboard/console-backgrounds.jpg +0 -0
- package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
- package/dist/dashboard/donation/qris-risun-marke.png +0 -0
- package/src/providers/integrations/buddy/turing-device-token.ts +0 -262
- package/src/providers/integrations/buddy/workbuddy/cn-oauth.ts +0 -30
- package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +0 -58
- package/src/providers/integrations/buddy/workbuddy/oauth.ts +0 -31
- package/src/providers/integrations/buddy/workbuddy/provider.ts +0 -209
- package/src/providers/integrations/buddy/workbuddy/quota.ts +0 -161
- package/src/providers/integrations/buddy/workbuddy/shared.ts +0 -285
- /package/dist/dashboard/assets/{app-DRnQLhsc.js → app-B7kIWFm5.js} +0 -0
- /package/dist/dashboard/assets/{app-DRnQLhsc.js.gz → app-B7kIWFm5.js.gz} +0 -0
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
FALLBACK_CLIENT_VERSION,
|
|
17
17
|
RUN_PATH,
|
|
18
18
|
isAllowedAgentHost,
|
|
19
|
+
resolveCursorTimezone,
|
|
19
20
|
} from "./cursor-shared";
|
|
20
21
|
import { createCursorChecksumHeader, resolveCursorDeviceIds } from "./cursor-identity";
|
|
21
22
|
|
|
@@ -102,6 +103,7 @@ async function runHeaders(credential: string, clientVersion: string): Promise<Re
|
|
|
102
103
|
"x-cursor-streaming": "true",
|
|
103
104
|
"x-ghost-mode": "true",
|
|
104
105
|
"x-request-id": crypto.randomUUID(),
|
|
106
|
+
...(resolveCursorTimezone() === "" ? {} : { "x-cursor-timezone": resolveCursorTimezone() }),
|
|
105
107
|
"user-agent": "connect-es/1.6.1",
|
|
106
108
|
};
|
|
107
109
|
}
|
|
@@ -23,8 +23,6 @@ import { encodeJsonAsValue } from "./protocol/struct";
|
|
|
23
23
|
// a caller has to discover separately.
|
|
24
24
|
export {
|
|
25
25
|
CURSOR_TOOL_VARIANTS,
|
|
26
|
-
CursorToolCallProvenance,
|
|
27
|
-
cursorNativeToolDeclaration,
|
|
28
26
|
cursorToolArm,
|
|
29
27
|
decodeCursorNativeToolCall,
|
|
30
28
|
} from "./protocol/tool-canonical";
|
|
@@ -440,15 +438,18 @@ export function buildMcpRejected(
|
|
|
440
438
|
* `ACM#2 exec_client_message{*_allowlist_precheck_result}` for frames 41/42/43.
|
|
441
439
|
*
|
|
442
440
|
* Cursor asks whether a shell command, MCP tool, or web fetch would be
|
|
443
|
-
* permitted *before* it emits the real call.
|
|
444
|
-
*
|
|
445
|
-
*
|
|
446
|
-
*
|
|
441
|
+
* permitted *before* it emits the real call.
|
|
442
|
+
*
|
|
443
|
+
* - `shell` → `true`: the native executor runs shell locally.
|
|
444
|
+
* - `mcp` → `true` only when the tool is client-declared (relayed); the
|
|
445
|
+
* caller decides on the `allowlisted` flag.
|
|
446
|
+
* - `web_fetch` → `false`: web fetch is not executed by this gateway.
|
|
447
447
|
*/
|
|
448
448
|
export function buildAllowlistPrecheckResult(
|
|
449
449
|
execId: number,
|
|
450
450
|
kind: "shell" | "mcp" | "web_fetch",
|
|
451
|
-
execIdString
|
|
451
|
+
execIdString: string | undefined,
|
|
452
|
+
allowlisted: boolean,
|
|
452
453
|
): Uint8Array {
|
|
453
454
|
const frame =
|
|
454
455
|
kind === "shell"
|
|
@@ -457,7 +458,7 @@ export function buildAllowlistPrecheckResult(
|
|
|
457
458
|
? "mcp_allowlist_precheck_result"
|
|
458
459
|
: "web_fetch_allowlist_precheck_result";
|
|
459
460
|
return encodeMessage("AgentClientMessage", {
|
|
460
|
-
exec_client_message: { id: execId, exec_id: execIdString ?? "", [frame]: { allowlisted
|
|
461
|
+
exec_client_message: { id: execId, exec_id: execIdString ?? "", [frame]: { allowlisted } },
|
|
461
462
|
});
|
|
462
463
|
}
|
|
463
464
|
|
|
@@ -33,7 +33,7 @@ export const CURSOR_OAUTH_CLIENT_ID = "KbZUR41cY7W6zRSdpSUJ7I7mLYBKOCmB";
|
|
|
33
33
|
* operator was not what the request carried. Discovery supersedes both on its
|
|
34
34
|
* first successful fetch.
|
|
35
35
|
*/
|
|
36
|
-
export const FALLBACK_CLIENT_VERSION = "cli-
|
|
36
|
+
export const FALLBACK_CLIENT_VERSION = "cli-3.29.9-306d153";
|
|
37
37
|
|
|
38
38
|
/** Connect-RPC paths. Run is served by the discovered agent origin, not the API host. */
|
|
39
39
|
export const RUN_PATH = "/agent.v1.AgentService/Run";
|
|
@@ -44,6 +44,24 @@ export const SERVER_CONFIG_PATH = "/aiserver.v1.ServerConfigService/GetServerCon
|
|
|
44
44
|
export const CONTENT_TYPE_CONNECT_PROTO = "application/connect+proto";
|
|
45
45
|
export const CONNECT_PROTOCOL_VERSION = "1";
|
|
46
46
|
|
|
47
|
+
/**
|
|
48
|
+
* The client's timezone name, as the CLI sends on every request
|
|
49
|
+
* (`Intl.DateTimeFormat().resolvedOptions().timeZone`). Computed once: the
|
|
50
|
+
* value is stable for one process and the call is not cheap enough to repeat
|
|
51
|
+
* per request.
|
|
52
|
+
*/
|
|
53
|
+
let cachedTimezone: string | undefined;
|
|
54
|
+
export function resolveCursorTimezone(): string {
|
|
55
|
+
if (cachedTimezone !== undefined) return cachedTimezone;
|
|
56
|
+
try {
|
|
57
|
+
const zone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
58
|
+
cachedTimezone = typeof zone === "string" && zone.length > 0 ? zone : "";
|
|
59
|
+
} catch {
|
|
60
|
+
cachedTimezone = "";
|
|
61
|
+
}
|
|
62
|
+
return cachedTimezone;
|
|
63
|
+
}
|
|
64
|
+
|
|
47
65
|
/** A raw Cursor API key (as opposed to a JWT already exchanged from one). */
|
|
48
66
|
const CURSOR_API_KEY_PREFIX = "crsr_";
|
|
49
67
|
|
|
@@ -61,7 +61,8 @@ import { fetchCursorRunOrigin } from "./cursor-catalog";
|
|
|
61
61
|
import { defaultParameterValues, fetchCursorModels } from "./cursor-catalog";
|
|
62
62
|
import type { CursorModelInfo } from "./cursor-catalog";
|
|
63
63
|
import { decodeValueToJson, decodeStructEntriesToJson } from "./protocol/struct";
|
|
64
|
-
import {
|
|
64
|
+
import { encodeMessage } from "./protocol/messages";
|
|
65
|
+
import { executeNativeTool, resolveExecFrame } from "./cursor-exec";
|
|
65
66
|
import { fnv1a32 } from "../shared/hash";
|
|
66
67
|
|
|
67
68
|
/**
|
|
@@ -929,6 +930,8 @@ class CursorAdapter implements ProviderAdapter {
|
|
|
929
930
|
if (execServer !== undefined) {
|
|
930
931
|
const handled = await this.#handleExecServerMessage(execServer, session, handle);
|
|
931
932
|
if (handled.kind !== "tool_call") continue;
|
|
933
|
+
// Only MCP arms are relayed to the client for execution (client-
|
|
934
|
+
// declared tools). Native tools are answered in-band by the executor.
|
|
932
935
|
const callId = `call_cursor_${runId}_${handled.execId}`;
|
|
933
936
|
const scope = context.continuation_scope;
|
|
934
937
|
if (scope === undefined) {
|
|
@@ -1107,9 +1110,9 @@ class CursorAdapter implements ProviderAdapter {
|
|
|
1107
1110
|
return { kind: "handled" };
|
|
1108
1111
|
}
|
|
1109
1112
|
// Allowlist prechecks precede the real call. They are approval probes, not
|
|
1110
|
-
// invocations
|
|
1111
|
-
//
|
|
1112
|
-
//
|
|
1113
|
+
// invocations. Shell is allowlisted because the native executor runs it
|
|
1114
|
+
// locally; MCP is allowlisted only when the tool is client-declared
|
|
1115
|
+
// (relayed to the client); web fetch is never executed and stays denied.
|
|
1113
1116
|
const precheckKind = recordOf(execServer["shell_allowlist_precheck_args"]) !== undefined
|
|
1114
1117
|
? "shell"
|
|
1115
1118
|
: recordOf(execServer["mcp_allowlist_precheck_args"]) !== undefined
|
|
@@ -1118,35 +1121,37 @@ class CursorAdapter implements ProviderAdapter {
|
|
|
1118
1121
|
? "web_fetch"
|
|
1119
1122
|
: undefined;
|
|
1120
1123
|
if (precheckKind !== undefined) {
|
|
1121
|
-
|
|
1124
|
+
const allowlisted =
|
|
1125
|
+
precheckKind === "shell" ? true
|
|
1126
|
+
: precheckKind === "web_fetch" ? false
|
|
1127
|
+
: this.mcpArgsAreDeclared(execServer, session.descriptors);
|
|
1128
|
+
await handle.write(buildAllowlistPrecheckResult(execId, precheckKind, execIdString, allowlisted));
|
|
1122
1129
|
return { kind: "handled" };
|
|
1123
1130
|
}
|
|
1124
|
-
// Native
|
|
1125
|
-
//
|
|
1126
|
-
//
|
|
1127
|
-
//
|
|
1128
|
-
//
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
arguments: JSON.stringify(nativeCall.args),
|
|
1145
|
-
};
|
|
1131
|
+
// Native exec frames (`read_args`, `shell_args`, `ct_read_args`, …) are
|
|
1132
|
+
// executed locally by this gateway — not relayed to the client and not
|
|
1133
|
+
// refused. The executor returns the wire result message for the frame's
|
|
1134
|
+
// result oneof, so a reply can only come back in the arm it arrived on.
|
|
1135
|
+
// Frames the executor does not implement fall through to the refusal.
|
|
1136
|
+
const execFrame = resolveExecFrame(execServer);
|
|
1137
|
+
if (execFrame !== undefined) {
|
|
1138
|
+
const executed = await executeNativeTool(execFrame.frameKey, execFrame.args, process.cwd());
|
|
1139
|
+
if (executed !== undefined) {
|
|
1140
|
+
await handle.write(
|
|
1141
|
+
encodeMessage("AgentClientMessage", {
|
|
1142
|
+
exec_client_message: {
|
|
1143
|
+
id: execId,
|
|
1144
|
+
exec_id: execIdString ?? "",
|
|
1145
|
+
[executed.field]: executed.message,
|
|
1146
|
+
},
|
|
1147
|
+
}),
|
|
1148
|
+
);
|
|
1149
|
+
return { kind: "handled" };
|
|
1150
|
+
}
|
|
1146
1151
|
}
|
|
1147
|
-
// MCP
|
|
1148
|
-
//
|
|
1149
|
-
//
|
|
1152
|
+
// MCP remains for client-declared tools: they have no native slot, so a
|
|
1153
|
+
// declared `mcp_args` arm is relayed to the client as an ordinary tool
|
|
1154
|
+
// call. Undeclared MCP is refused.
|
|
1150
1155
|
const mcpArgs = recordOf(execServer["mcp_args"]);
|
|
1151
1156
|
if (mcpArgs !== undefined) {
|
|
1152
1157
|
const call = readExecutableMcpCall(mcpArgs, session.descriptors);
|
|
@@ -1170,6 +1175,21 @@ class CursorAdapter implements ProviderAdapter {
|
|
|
1170
1175
|
return { kind: "handled" };
|
|
1171
1176
|
}
|
|
1172
1177
|
|
|
1178
|
+
/**
|
|
1179
|
+
* True when an MCP allowlist precheck targets a tool the request actually
|
|
1180
|
+
* declared (so it can be relayed to the client). Undeclared MCP is denied.
|
|
1181
|
+
*/
|
|
1182
|
+
mcpArgsAreDeclared(
|
|
1183
|
+
execServer: Record<string, unknown>,
|
|
1184
|
+
descriptors: readonly CursorToolDescriptor[],
|
|
1185
|
+
): boolean {
|
|
1186
|
+
const precheck = recordOf(execServer["mcp_allowlist_precheck_args"]);
|
|
1187
|
+
if (precheck === undefined) return false;
|
|
1188
|
+
const toolName = nonEmptyStringOf(precheck["tool_name"]);
|
|
1189
|
+
if (toolName === undefined) return false;
|
|
1190
|
+
return descriptors.some((d) => d.toolName === toolName);
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1173
1193
|
/**
|
|
1174
1194
|
* Answers one interaction query so the Run RPC can continue.
|
|
1175
1195
|
*
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
// Cursor-native tool calls, unified into one canonical shape.
|
|
2
2
|
//
|
|
3
|
-
// Cursor's `agent.v1.ToolCall` is a oneof of ~30 variants spanning
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// `PiLsToolCall` 67)
|
|
7
|
-
//
|
|
8
|
-
// them individually meant a decoder and a builder per variant — most of them
|
|
9
|
-
// saying the same thing.
|
|
3
|
+
// Cursor's `agent.v1.ToolCall` is a oneof of ~30 variants spanning several
|
|
4
|
+
// generations: the legacy natives (`ReadToolCall` 8, `ShellToolCall` 1,
|
|
5
|
+
// `EditToolCall` 12, …) and the modern exec family (`PiReadToolCall` 61 …
|
|
6
|
+
// `PiLsToolCall` 67). Each carries its own args message and its own
|
|
7
|
+
// `*ToolResult` oneof of `success`/`error`.
|
|
10
8
|
//
|
|
11
9
|
// This module is the single join point. One table maps a wire variant to a
|
|
12
10
|
// canonical tool identity, and the decode/encode paths below are written once
|
|
13
11
|
// against that table rather than once per variant.
|
|
14
12
|
//
|
|
15
|
-
// **
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
13
|
+
// **Generation aliases collapse to one canonical name.** `ReadToolCall` and
|
|
14
|
+
// `PiReadToolCall` are the *same tool* across two wire generations — the pi_
|
|
15
|
+
// family is the modern executor, the legacy family the older surface. They are
|
|
16
|
+
// folded onto one name (`read`, `shell`, `edit`, `write`, `grep`, `find`,
|
|
17
|
+
// `ls`) so callers reason about tools, not about which wire arm carried them.
|
|
18
|
+
// The `field`/`argsType`/`resultType` still differ per row, so encode/decode
|
|
19
|
+
// round-trips preserve the exact arm that arrived.
|
|
19
20
|
//
|
|
20
21
|
// **Cursor-scoped on purpose.** Nothing here is shared with the other provider
|
|
21
|
-
// integrations. The canonical vocabulary is Cursor's own (`read`, `
|
|
22
|
-
// `
|
|
22
|
+
// integrations. The canonical vocabulary is Cursor's own (`read`, `shell`,
|
|
23
|
+
// `edit`, …), so a tool named `read` on Cursor and a `read` on some other
|
|
23
24
|
// provider are unrelated and cannot collide through a shared registry.
|
|
24
|
-
import type { ToolDefinition } from "../../../../protocol/canonical-model";
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* One `ToolCall` oneof arm, as it exists on the wire.
|
|
@@ -41,9 +41,8 @@ export interface CursorToolVariant {
|
|
|
41
41
|
/**
|
|
42
42
|
* Canonical tool name for this variant.
|
|
43
43
|
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* both; a caller that wants one filters on one.
|
|
44
|
+
* Shared across wire generations: `read` is both `ReadToolCall` and
|
|
45
|
+
* `PiReadToolCall`.
|
|
47
46
|
*/
|
|
48
47
|
readonly name: string;
|
|
49
48
|
}
|
|
@@ -59,14 +58,18 @@ const VARIANT = (
|
|
|
59
58
|
/**
|
|
60
59
|
* Every Cursor-native tool variant this layer speaks, keyed by oneof field.
|
|
61
60
|
*
|
|
62
|
-
* `McpToolCall` is absent
|
|
63
|
-
*
|
|
64
|
-
* `
|
|
65
|
-
* other place tools travel — so those stay on the MCP meta-tool path. This
|
|
66
|
-
* table is for the arms Cursor itself owns.
|
|
61
|
+
* MCP (`McpToolCall`) is intentionally absent: the gateway no longer speaks
|
|
62
|
+
* the MCP meta-tool channel. Client-declared tools have no native slot in
|
|
63
|
+
* `agent.proto`; they are not advertised and any inbound MCP arm is refused.
|
|
67
64
|
*/
|
|
68
65
|
export const CURSOR_TOOL_VARIANTS: ReadonlyMap<number, CursorToolVariant> = new Map([
|
|
69
66
|
VARIANT(1, "ShellToolCall", "ShellArgs", "ShellResult", "shell"),
|
|
67
|
+
// Legacy write has no ToolCall oneof arm — it arrives only as
|
|
68
|
+
// `ExecServerMessage.write_args` (field 3). The variant is registered with
|
|
69
|
+
// a dedicated field number so the executor can resolve it without colliding
|
|
70
|
+
// with `DeleteToolCall` (which also owns field 3); the field is otherwise
|
|
71
|
+
// unused by the ToolCall path.
|
|
72
|
+
VARIANT(0, "WriteToolCall", "WriteArgs", "WriteResult", "write"),
|
|
70
73
|
VARIANT(3, "DeleteToolCall", "DeleteArgs", "DeleteResult", "delete"),
|
|
71
74
|
VARIANT(4, "GlobToolCall", "GlobArgs", "GlobResult", "glob"),
|
|
72
75
|
VARIANT(5, "GrepToolCall", "GrepArgs", "GrepResult", "grep"),
|
|
@@ -93,14 +96,6 @@ export const CURSOR_TOOL_VARIANTS: ReadonlyMap<number, CursorToolVariant> = new
|
|
|
93
96
|
VARIANT(32, "ReflectToolCall", "ReflectArgs", "ReflectResult", "reflect"),
|
|
94
97
|
VARIANT(33, "SetupVmEnvironmentToolCall", "SetupVmEnvironmentArgs", "SetupVmEnvironmentResult", "setup_vm_environment"),
|
|
95
98
|
VARIANT(34, "TruncatedToolCall", "TruncatedArgs", "TruncatedResult", "truncated"),
|
|
96
|
-
// The modern exec family. Same join point, separate identities.
|
|
97
|
-
VARIANT(61, "PiReadToolCall", "PiReadToolArgs", "PiReadExecResult", "pi_read"),
|
|
98
|
-
VARIANT(62, "PiBashToolCall", "PiBashToolArgs", "PiBashExecResult", "pi_bash"),
|
|
99
|
-
VARIANT(63, "PiEditToolCall", "PiEditToolArgs", "PiEditExecResult", "pi_edit"),
|
|
100
|
-
VARIANT(64, "PiWriteToolCall", "PiWriteToolArgs", "PiWriteExecResult", "pi_write"),
|
|
101
|
-
VARIANT(65, "PiGrepToolCall", "PiGrepToolArgs", "PiGrepExecResult", "pi_grep"),
|
|
102
|
-
VARIANT(66, "PiFindToolCall", "PiFindToolArgs", "PiFindExecResult", "pi_find"),
|
|
103
|
-
VARIANT(67, "PiLsToolCall", "PiLsToolArgs", "PiLsExecResult", "pi_ls"),
|
|
104
99
|
].map((entry) => [entry.field, entry]));
|
|
105
100
|
|
|
106
101
|
/**
|
|
@@ -126,8 +121,7 @@ type OneofArm = { readonly field: number; readonly payload: Record<string, unkno
|
|
|
126
121
|
*
|
|
127
122
|
* A oneof has exactly one populated field; a message with none is not a tool
|
|
128
123
|
* call at all and is reported as `undefined` rather than guessed at. An arm
|
|
129
|
-
* this layer does not know is also `undefined
|
|
130
|
-
* MCP to claim it.
|
|
124
|
+
* this layer does not know is also `undefined`.
|
|
131
125
|
*/
|
|
132
126
|
export function cursorToolArm(
|
|
133
127
|
toolCall: Record<string, unknown>,
|
|
@@ -205,71 +199,3 @@ function snakeCaseKey(key: string): string {
|
|
|
205
199
|
.replace(/[\s-]+/g, "_")
|
|
206
200
|
.toLowerCase();
|
|
207
201
|
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* The variant whose args a host-exec frame is carrying.
|
|
211
|
-
*
|
|
212
|
-
* Exec frames name their payload after the args message — `read_args`,
|
|
213
|
-
* `shell_args`, `pi_read_args` — not after the `ToolCall` arm, so the lookup
|
|
214
|
-
* runs off `argsType`. Anything not ending in `_args` is not a tool payload
|
|
215
|
-
* (`id`, `exec_id`, `request_context_args`, …) and is reported as `undefined`.
|
|
216
|
-
*/
|
|
217
|
-
export function cursorVariantForExecArgs(
|
|
218
|
-
execServer: Record<string, unknown>,
|
|
219
|
-
): { readonly variant: CursorToolVariant; readonly args: Record<string, unknown> } | undefined {
|
|
220
|
-
for (const [key, value] of Object.entries(execServer)) {
|
|
221
|
-
if (value === null || value === undefined || !key.endsWith("_args")) continue;
|
|
222
|
-
const wanted = key.slice(0, -"_args".length);
|
|
223
|
-
const variant = [...CURSOR_TOOL_VARIANTS.values()].find((entry) =>
|
|
224
|
-
entry.argsType.toLowerCase().startsWith(wanted.toLowerCase()),
|
|
225
|
-
);
|
|
226
|
-
if (variant === undefined) continue;
|
|
227
|
-
return {
|
|
228
|
-
variant,
|
|
229
|
-
args: canonicalToolArguments(value),
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
return undefined;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* The variant an inbound result must be encoded back into.
|
|
237
|
-
*
|
|
238
|
-
* Keyed by `call_id`, which is what the response carries and what the client
|
|
239
|
-
* echoes on the result. Consulted before encoding so a result for a tool this
|
|
240
|
-
* layer never decoded is not invented into some other variant's shape.
|
|
241
|
-
*/
|
|
242
|
-
export class CursorToolCallProvenance {
|
|
243
|
-
readonly #byCallId = new Map<string, CursorToolVariant>();
|
|
244
|
-
|
|
245
|
-
record(callId: string, variant: CursorToolVariant): void {
|
|
246
|
-
this.#byCallId.set(callId, variant);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
lookup(callId: string): CursorToolVariant | undefined {
|
|
250
|
-
return this.#byCallId.get(callId);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/** Drops one call's provenance once its result has been encoded. */
|
|
254
|
-
complete(callId: string): void {
|
|
255
|
-
this.#byCallId.delete(callId);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* A tool declaration the gateway can advertise for Cursor-native tools.
|
|
261
|
-
*
|
|
262
|
-
* Kept separate from `ToolDefinition`'s own name on purpose: the canonical name
|
|
263
|
-
* (`pi_read`) is not the name a client's schema would use, so advertising one
|
|
264
|
-
* under the other would make the call/result round trip undecidable.
|
|
265
|
-
*/
|
|
266
|
-
export function cursorNativeToolDeclaration(
|
|
267
|
-
variant: CursorToolVariant,
|
|
268
|
-
description: string,
|
|
269
|
-
): ToolDefinition {
|
|
270
|
-
return {
|
|
271
|
-
name: variant.name,
|
|
272
|
-
description,
|
|
273
|
-
jsonSchema: { type: "object", properties: {} },
|
|
274
|
-
};
|
|
275
|
-
}
|