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.
Files changed (372) hide show
  1. package/.env.example +0 -1
  2. package/README.md +29 -59
  3. package/dist/dashboard/assets/BannedPage-BxoG1MrL.js +1 -0
  4. package/dist/dashboard/assets/BannedPage-BxoG1MrL.js.gz +0 -0
  5. package/dist/dashboard/assets/{CliToolDetailPage-CLUhmjUy.js → CliToolDetailPage-ixwgKk53.js} +1 -1
  6. package/dist/dashboard/assets/CliToolDetailPage-ixwgKk53.js.gz +0 -0
  7. package/dist/dashboard/assets/{CliToolsPage-CQmrqqrk.js → CliToolsPage-BmttNV3U.js} +1 -1
  8. package/dist/dashboard/assets/CliToolsPage-BmttNV3U.js.gz +0 -0
  9. package/dist/dashboard/assets/CombosPage-BE3qwwfC.js +1 -0
  10. package/dist/dashboard/assets/CombosPage-BE3qwwfC.js.gz +0 -0
  11. package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js +1 -0
  12. package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js.gz +0 -0
  13. package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js +1 -0
  14. package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js.gz +0 -0
  15. package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js +1 -0
  16. package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js.gz +0 -0
  17. package/dist/dashboard/assets/{InjectSystemPromptPanel-C-e2AMz6.js → InjectSystemPromptPanel-BOoO8rpz.js} +2 -2
  18. package/dist/dashboard/assets/InjectSystemPromptPanel-BOoO8rpz.js.gz +0 -0
  19. package/dist/dashboard/assets/{LoginPage-J8wPbmfT.js → LoginPage-ChJuNNVN.js} +1 -1
  20. package/dist/dashboard/assets/LoginPage-ChJuNNVN.js.gz +0 -0
  21. package/dist/dashboard/assets/{ModelPicker-C6WlpU5E.js → ModelPicker-BZAJtPg1.js} +1 -1
  22. package/dist/dashboard/assets/ModelPicker-BZAJtPg1.js.gz +0 -0
  23. package/dist/dashboard/assets/OverviewPage-BE40s3u5.js +1 -0
  24. package/dist/dashboard/assets/OverviewPage-BE40s3u5.js.gz +0 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js +8 -0
  26. package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js.gz +0 -0
  27. package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js +1 -0
  28. package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js.gz +0 -0
  29. package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js +1 -0
  30. package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js.gz +0 -0
  31. package/dist/dashboard/assets/{ProxyPage-BBTRBAQ3.js → ProxyPage-BJ87Pp0U.js} +1 -1
  32. package/dist/dashboard/assets/ProxyPage-BJ87Pp0U.js.gz +0 -0
  33. package/dist/dashboard/assets/{QuotaPage-B2WqMSG1.js → QuotaPage-gkSyRAKa.js} +1 -1
  34. package/dist/dashboard/assets/QuotaPage-gkSyRAKa.js.gz +0 -0
  35. package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js +1 -0
  36. package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js.gz +0 -0
  37. package/dist/dashboard/assets/{SetupPage-LND6_Ss7.js → SetupPage-CFNcATJJ.js} +1 -1
  38. package/dist/dashboard/assets/SetupPage-CFNcATJJ.js.gz +0 -0
  39. package/dist/dashboard/assets/{StudioPage-BzNnm6Bi.js → StudioPage-YoD4tY5l.js} +1 -1
  40. package/dist/dashboard/assets/StudioPage-YoD4tY5l.js.gz +0 -0
  41. package/dist/dashboard/assets/UsagePage-DxjaAhb_.js +56 -0
  42. package/dist/dashboard/assets/UsagePage-DxjaAhb_.js.gz +0 -0
  43. package/dist/dashboard/assets/api-keys-BTlkq_Uk.js +1 -0
  44. package/dist/dashboard/assets/api-keys-BTlkq_Uk.js.gz +0 -0
  45. package/dist/dashboard/assets/app-BX2nnKqs.css +2 -0
  46. package/dist/dashboard/assets/app-BX2nnKqs.css.gz +0 -0
  47. package/dist/dashboard/assets/assert-CndthXFQ.js +1 -0
  48. package/dist/dashboard/assets/assert-CndthXFQ.js.gz +0 -0
  49. package/dist/dashboard/assets/{badge-BaX2GTrn.js → badge-DdbT_7Am.js} +1 -1
  50. package/dist/dashboard/assets/badge-DdbT_7Am.js.gz +0 -0
  51. package/dist/dashboard/assets/ban-durations-B58FyRxC.js +1 -0
  52. package/dist/dashboard/assets/ban-durations-B58FyRxC.js.gz +0 -0
  53. package/dist/dashboard/assets/{banner-DFH4Bkte.js → banner-CsGN-nbm.js} +1 -1
  54. package/dist/dashboard/assets/banner-CsGN-nbm.js.gz +0 -0
  55. package/dist/dashboard/assets/brand/bansos_page.webp +0 -0
  56. package/dist/dashboard/assets/brand/denia_bansos.webp +0 -0
  57. package/dist/dashboard/assets/brand/favicon.webp +0 -0
  58. package/dist/dashboard/assets/brand/login_register.webp +0 -0
  59. package/dist/dashboard/assets/brand/login_register_initial.webp +0 -0
  60. package/dist/dashboard/assets/brand/og_bansos.webp +0 -0
  61. package/dist/dashboard/assets/brand/og_image.webp +0 -0
  62. package/dist/dashboard/assets/brand/sidebar_ico.webp +0 -0
  63. package/dist/dashboard/assets/{card-CxDw0lK6.js → card-mgZ_TLLZ.js} +1 -1
  64. package/dist/dashboard/assets/card-mgZ_TLLZ.js.gz +0 -0
  65. package/dist/dashboard/assets/cli-tools-A1-v8-03.js +1 -0
  66. package/dist/dashboard/assets/cli-tools-A1-v8-03.js.gz +0 -0
  67. package/dist/dashboard/assets/{clipboard-button-DfS1ntiq.js → clipboard-button-CJ4Zty89.js} +1 -1
  68. package/dist/dashboard/assets/clipboard-button-CJ4Zty89.js.gz +0 -0
  69. package/dist/dashboard/assets/{dialog-BK-NRr5u.js → dialog-B5L2jPQ_.js} +1 -1
  70. package/dist/dashboard/assets/dialog-B5L2jPQ_.js.gz +0 -0
  71. package/dist/dashboard/assets/{drawer-QqPul6sC.js → drawer-DkjUouAj.js} +1 -1
  72. package/dist/dashboard/assets/drawer-DkjUouAj.js.gz +0 -0
  73. package/dist/dashboard/assets/{entry-BMlYJVFj.js → entry-B-LVLV6o.js} +1 -1
  74. package/dist/dashboard/assets/entry-B-LVLV6o.js.gz +0 -0
  75. package/dist/dashboard/assets/entry-CAhdYl3B.js +1 -0
  76. package/dist/dashboard/assets/entry-CAhdYl3B.js.gz +0 -0
  77. package/dist/dashboard/assets/entry-D2xD0Tmd.js +4 -0
  78. package/dist/dashboard/assets/entry-D2xD0Tmd.js.gz +0 -0
  79. package/dist/dashboard/assets/{formatters-DP-5E01-.js → formatters-CrsdLVsn.js} +1 -1
  80. package/dist/dashboard/assets/formatters-CrsdLVsn.js.gz +0 -0
  81. package/dist/dashboard/assets/{index-D36vCZht.js → index-BU64Lqvp.js} +2 -2
  82. package/dist/dashboard/assets/index-BU64Lqvp.js.gz +0 -0
  83. package/dist/dashboard/assets/{inline-CHJQwxLa.js → inline-B2aDLyyg.js} +1 -1
  84. package/dist/dashboard/assets/inline-B2aDLyyg.js.gz +0 -0
  85. package/dist/dashboard/assets/{input-BlmlizVV.js → input-BCVkdR9d.js} +1 -1
  86. package/dist/dashboard/assets/input-BCVkdR9d.js.gz +0 -0
  87. package/dist/dashboard/assets/{layout-Bz93I-yE.js → layout-DNcAdMK-.js} +1 -1
  88. package/dist/dashboard/assets/layout-DNcAdMK-.js.gz +0 -0
  89. package/dist/dashboard/assets/{list-row-Ml16KCfu.js → list-row-DgrIH0hw.js} +1 -1
  90. package/dist/dashboard/assets/list-row-DgrIH0hw.js.gz +0 -0
  91. package/dist/dashboard/assets/{live-7_QpnYGu.js → live-Cae01iu8.js} +1 -1
  92. package/dist/dashboard/assets/live-Cae01iu8.js.gz +0 -0
  93. package/dist/dashboard/assets/{mutation-GU7XdEjz.js → mutation-BQ0ccH_A.js} +1 -1
  94. package/dist/dashboard/assets/mutation-BQ0ccH_A.js.gz +0 -0
  95. package/dist/dashboard/assets/{network-CuMDaTzT.js → network-CRib7H_2.js} +1 -1
  96. package/dist/dashboard/assets/network-CRib7H_2.js.gz +0 -0
  97. package/dist/dashboard/assets/{numbers-CoqpaDMx.js → numbers-BKQE8Xpz.js} +1 -1
  98. package/dist/dashboard/assets/numbers-BKQE8Xpz.js.gz +0 -0
  99. package/dist/dashboard/assets/{pagination-B5aOoweZ.js → pagination-ecPvG_8g.js} +1 -1
  100. package/dist/dashboard/assets/pagination-ecPvG_8g.js.gz +0 -0
  101. package/dist/dashboard/assets/providers/devin.svg +9 -0
  102. package/dist/dashboard/assets/providers/devin.svg.gz +0 -0
  103. package/dist/dashboard/assets/providers/windsurf.svg +10 -0
  104. package/dist/dashboard/assets/providers/windsurf.svg.gz +0 -0
  105. package/dist/dashboard/assets/{query-keys-YSoQOUh6.js → query-keys-IKLh0YFd.js} +1 -1
  106. package/dist/dashboard/assets/query-keys-IKLh0YFd.js.gz +0 -0
  107. package/dist/dashboard/assets/routing-Ckm1UXuC.js +1 -0
  108. package/dist/dashboard/assets/routing-Ckm1UXuC.js.gz +0 -0
  109. package/dist/dashboard/assets/{select-C9Ssle9b.js → select-ChoFWyKz.js} +1 -1
  110. package/dist/dashboard/assets/select-ChoFWyKz.js.gz +0 -0
  111. package/dist/dashboard/assets/settings-CKjFPlKW.js +1 -0
  112. package/dist/dashboard/assets/settings-CKjFPlKW.js.gz +0 -0
  113. package/dist/dashboard/assets/{stack-j7cXjgYX.js → stack-DWCwU3fh.js} +1 -1
  114. package/dist/dashboard/assets/stack-DWCwU3fh.js.gz +0 -0
  115. package/dist/dashboard/assets/{state-DHmEnLa2.js → state-Cg3VL5J_.js} +1 -1
  116. package/dist/dashboard/assets/state-Cg3VL5J_.js.gz +0 -0
  117. package/dist/dashboard/assets/story/25817331.webp +0 -0
  118. package/dist/dashboard/assets/story/Shorekeeper.webp +0 -0
  119. package/dist/dashboard/assets/story/cartethyia-god.webp +0 -0
  120. package/dist/dashboard/assets/story/fleurdelys_plus.webp +0 -0
  121. package/dist/dashboard/assets/story/jinhsi-blossom.webp +0 -0
  122. package/dist/dashboard/assets/story/phrolova-a.webp +0 -0
  123. package/dist/dashboard/assets/story/requestdeniawokkjpg.webp +0 -0
  124. package/dist/dashboard/assets/story/wuthering-waves-hiyuki-aemeath-hiyuki-rover.webp +0 -0
  125. package/dist/dashboard/assets/{switch-DmZcyTIC.js → switch-Db70BMix.js} +1 -1
  126. package/dist/dashboard/assets/switch-Db70BMix.js.gz +0 -0
  127. package/dist/dashboard/assets/{useMutation-CbCP4w1o.js → useMutation-BqdE0LuM.js} +1 -1
  128. package/dist/dashboard/assets/useMutation-BqdE0LuM.js.gz +0 -0
  129. package/dist/dashboard/console-backgrounds.webp +0 -0
  130. package/dist/dashboard/console-backgrounds_initial.webp +0 -0
  131. package/dist/dashboard/donation/qris-risun-marke.webp +0 -0
  132. package/dist/dashboard/index.html +3 -3
  133. package/dist/dashboard/index.html.gz +0 -0
  134. package/dist/dashboard/precompressed-assets.json +57 -55
  135. package/migrations/full-postgres/0044_add_models_warning_metadata.sql +10 -0
  136. package/migrations/full-postgres/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
  137. package/migrations/lite-sqlite3/0044_add_models_warning_metadata.sql +11 -0
  138. package/migrations/lite-sqlite3/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
  139. package/package.json +1 -1
  140. package/src/boot/dependencies.ts +11 -3
  141. package/src/config/cooldowns.ts +1 -1
  142. package/src/config/spec.ts +0 -6
  143. package/src/console/api-keys/routes.ts +11 -4
  144. package/src/console/console-router.ts +7 -0
  145. package/src/console/dashboard-assets.ts +5 -5
  146. package/src/console/domain-registration.ts +27 -0
  147. package/src/console/ip-bans/routes.ts +99 -0
  148. package/src/console/providers/catalog/catalog-projections.ts +5 -2
  149. package/src/console/providers/catalog/contracts.ts +123 -0
  150. package/src/console/providers/catalog/model-operations.ts +122 -10
  151. package/src/console/providers/catalog/provider-operations.ts +116 -8
  152. package/src/console/providers/catalog/public-model-store.ts +0 -0
  153. package/src/console/providers/catalog/routes.ts +64 -4
  154. package/src/console/providers/catalog/store-helpers.ts +30 -1
  155. package/src/console/providers/catalog/store.ts +243 -3
  156. package/src/console/quota/account-quota-global.ts +89 -1
  157. package/src/console/quota/native-identity.ts +2 -0
  158. package/src/console/settings/contracts.ts +18 -0
  159. package/src/console/settings/store.ts +32 -0
  160. package/src/console/system-prompt/contracts.ts +0 -1
  161. package/src/main.ts +1 -0
  162. package/src/observability/event-query.ts +18 -4
  163. package/src/persistence/dialect.ts +12 -0
  164. package/src/persistence/schema.ts +20 -2
  165. package/src/protocol/dsml.ts +1 -1
  166. package/src/protocol/gateway-error.ts +1 -0
  167. package/src/protocol/reasoning.ts +1 -1
  168. package/src/protocol/request/chat.ts +4 -4
  169. package/src/protocol/request/messages.ts +1 -1
  170. package/src/protocol/response/gemini.ts +6 -1
  171. package/src/protocol/sse-decoder.ts +25 -8
  172. package/src/protocol/stream-error-frames.ts +13 -3
  173. package/src/protocol/translation/quirks.ts +1 -1
  174. package/src/protocol/translation/tool-repair.ts +2 -2
  175. package/src/protocol/upstream/send-claude-messages.ts +15 -4
  176. package/src/protocol/upstream-parsing.ts +1 -1
  177. package/src/providers/adapters/compatible-adapter.ts +7 -5
  178. package/src/providers/authentication/oauth-refresh-service.ts +149 -36
  179. package/src/providers/default-registry.ts +68 -3
  180. package/src/providers/discovery/discovery-types.ts +12 -0
  181. package/src/providers/discovery/probe-phases.ts +61 -30
  182. package/src/providers/discovery/probing-service.ts +279 -164
  183. package/src/providers/integrations/antigravity/antigravity-protocol.ts +117 -2
  184. package/src/providers/integrations/antigravity/antigravity.ts +13 -2
  185. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +72 -34
  186. package/src/providers/integrations/buddy/buddy-chat-shared.ts +18 -18
  187. package/src/providers/integrations/buddy/buddy-checkin.ts +17 -39
  188. package/src/providers/integrations/buddy/buddy-conversation-headers.ts +2 -2
  189. package/src/providers/integrations/buddy/buddy-discovery-shared.ts +5 -5
  190. package/src/providers/integrations/buddy/buddy-identity.ts +70 -0
  191. package/src/providers/integrations/buddy/buddy-media.ts +4 -5
  192. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +2 -2
  193. package/src/providers/integrations/buddy/buddy-quota-shared.ts +1 -1
  194. package/src/providers/integrations/buddy/buddy-usage-shared.ts +1 -3
  195. package/src/providers/integrations/buddy/capabilities.ts +4 -41
  196. package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +2 -1
  197. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +20 -1
  198. package/src/providers/integrations/buddy/codebuddy/provider.ts +2 -2
  199. package/src/providers/integrations/buddy/codebuddy/shared.ts +6 -10
  200. package/src/providers/integrations/cursor/cursor-catalog.ts +2 -0
  201. package/src/providers/integrations/cursor/cursor-exec.ts +738 -0
  202. package/src/providers/integrations/cursor/cursor-http2.ts +2 -0
  203. package/src/providers/integrations/cursor/cursor-request.ts +9 -8
  204. package/src/providers/integrations/cursor/cursor-shared.ts +19 -1
  205. package/src/providers/integrations/cursor/cursor.ts +50 -30
  206. package/src/providers/integrations/cursor/protocol/tool-canonical.ts +26 -100
  207. package/src/providers/integrations/devin/devin-auth.ts +353 -0
  208. package/src/providers/integrations/devin/devin-catalog.ts +207 -0
  209. package/src/providers/integrations/devin/devin-http.ts +91 -0
  210. package/src/providers/integrations/devin/devin-quota.ts +214 -0
  211. package/src/providers/integrations/devin/devin-shared.ts +111 -0
  212. package/src/providers/integrations/devin/devin.ts +539 -0
  213. package/src/providers/integrations/devin/protocol/devin-proto.ts +584 -0
  214. package/src/providers/integrations/devin/protocol/framing.ts +124 -0
  215. package/src/providers/integrations/factory/factory.ts +2 -2
  216. package/src/providers/integrations/freepi/freepi-catalog.ts +60 -0
  217. package/src/providers/integrations/freepi/freepi-discovery.ts +82 -0
  218. package/src/providers/integrations/freepi/freepi-headers.ts +21 -0
  219. package/src/providers/integrations/freepi/freepi-oauth.ts +142 -0
  220. package/src/providers/integrations/freepi/freepi-protocol.ts +242 -0
  221. package/src/providers/integrations/freepi/freepi-quota.ts +126 -0
  222. package/src/providers/integrations/freepi/freepi-realm.ts +35 -0
  223. package/src/providers/integrations/freepi/freepi.ts +292 -0
  224. package/src/providers/integrations/gemini.ts +2 -2
  225. package/src/providers/integrations/hermes/hermes-oauth.ts +94 -0
  226. package/src/providers/integrations/hermes.ts +4 -12
  227. package/src/providers/integrations/opencode/fingerprint.ts +1 -1
  228. package/src/providers/integrations/perch/perch-catalog.ts +105 -0
  229. package/src/providers/integrations/perch/perch-oauth.ts +170 -0
  230. package/src/providers/integrations/perch/perch-protocol.ts +211 -0
  231. package/src/providers/integrations/perch/perch-quota.ts +137 -0
  232. package/src/providers/integrations/perch/perch-realm.ts +82 -0
  233. package/src/providers/integrations/perch/perch-system-prompt.ts +13 -0
  234. package/src/providers/integrations/perch/perch.ts +315 -0
  235. package/src/providers/integrations/perch/saffron-system-prompt.txt +8 -0
  236. package/src/providers/integrations/qoder/chat-proto.ts +328 -328
  237. package/src/providers/integrations/qoder/claim-qoder-credits.ts +1 -1
  238. package/src/providers/integrations/qoder/qoder-adapter.ts +89 -28
  239. package/src/providers/integrations/qoder/qoder-cache.ts +32 -0
  240. package/src/providers/integrations/qoder/qoder-catalog.ts +6 -1
  241. package/src/providers/integrations/qoder/qoder-checkin.ts +2 -2
  242. package/src/providers/integrations/qoder/qoder-grpc.ts +209 -5
  243. package/src/providers/integrations/qoder/qoder-ide.ts +5 -1
  244. package/src/providers/integrations/qoder/qoder-identity-cache.ts +184 -0
  245. package/src/providers/integrations/qoder/qoder-native-identity-store.ts +83 -18
  246. package/src/providers/integrations/qoder/qoder-realm.ts +9 -6
  247. package/src/providers/integrations/qoder/qoder-umid.ts +109 -342
  248. package/src/providers/integrations/qoder/qoder-virtual.ts +33 -1
  249. package/src/providers/integrations/qoder/qoder.ts +3 -6
  250. package/src/providers/integrations/trae/trae-catalog.ts +9 -14
  251. package/src/providers/integrations/trae/trae-headers.ts +36 -11
  252. package/src/providers/integrations/trae/trae-oauth.ts +14 -17
  253. package/src/providers/integrations/trae/trae-protocol.ts +3 -6
  254. package/src/providers/integrations/trae/trae-quota.ts +103 -21
  255. package/src/providers/integrations/trae/trae-realm.ts +36 -15
  256. package/src/providers/integrations/trae/trae.ts +97 -7
  257. package/src/providers/operations/account-error-classification.ts +66 -1
  258. package/src/providers/operations/account-health-service.ts +192 -26
  259. package/src/providers/operations/account-refresh-status.ts +284 -0
  260. package/src/providers/operations/account-tier.ts +67 -0
  261. package/src/providers/operations/byok-wire-profile.ts +9 -12
  262. package/src/providers/operations/client-versions.ts +37 -99
  263. package/src/providers/operations/cooldown-rules.ts +61 -0
  264. package/src/providers/operations/provider-catalog-seeder.ts +4 -0
  265. package/src/providers/provider-contracts.ts +29 -0
  266. package/src/providers/provider-metadata.ts +59 -4
  267. package/src/providers/provider-model-definition.ts +36 -0
  268. package/src/providers/quota/refresh.ts +21 -0
  269. package/src/security/abuse.ts +71 -0
  270. package/src/transport/dispatch/proxy-request.ts +1 -0
  271. package/src/transport/dispatch/streaming/stream.ts +1 -0
  272. package/src/transport/dispatch/upstream.ts +4 -1
  273. package/src/transport/failure-policy.ts +113 -7
  274. package/src/transport/routing/router.ts +25 -1
  275. package/src/transport/surface/messages/adapter.ts +2 -1
  276. package/src/transport/surface/responses/encode.ts +12 -1
  277. package/src/workers/daily-checkin.ts +1 -1
  278. package/src/workers/quota-refresh-sweep.ts +1 -1
  279. package/src/workers/scheduler.ts +22 -4
  280. package/dist/dashboard/assets/BannedPage-B05aF8Dg.js +0 -1
  281. package/dist/dashboard/assets/BannedPage-B05aF8Dg.js.gz +0 -0
  282. package/dist/dashboard/assets/CliToolDetailPage-CLUhmjUy.js.gz +0 -0
  283. package/dist/dashboard/assets/CliToolsPage-CQmrqqrk.js.gz +0 -0
  284. package/dist/dashboard/assets/CombosPage-CHG_1Wr3.js +0 -1
  285. package/dist/dashboard/assets/CombosPage-CHG_1Wr3.js.gz +0 -0
  286. package/dist/dashboard/assets/ConsoleLogPage-DPgbklad.js +0 -1
  287. package/dist/dashboard/assets/ConsoleLogPage-DPgbklad.js.gz +0 -0
  288. package/dist/dashboard/assets/CustomizationPage-pnfAqr_-.js +0 -1
  289. package/dist/dashboard/assets/CustomizationPage-pnfAqr_-.js.gz +0 -0
  290. package/dist/dashboard/assets/HealthEventsModal-DGJuU2A6.js +0 -1
  291. package/dist/dashboard/assets/HealthEventsModal-DGJuU2A6.js.gz +0 -0
  292. package/dist/dashboard/assets/InjectSystemPromptPanel-C-e2AMz6.js.gz +0 -0
  293. package/dist/dashboard/assets/LoginPage-J8wPbmfT.js.gz +0 -0
  294. package/dist/dashboard/assets/ModelPicker-C6WlpU5E.js.gz +0 -0
  295. package/dist/dashboard/assets/OverviewPage-BSQnF2Lp.js +0 -1
  296. package/dist/dashboard/assets/OverviewPage-BSQnF2Lp.js.gz +0 -0
  297. package/dist/dashboard/assets/ProviderDetailPage-DK_e0FJz.js +0 -7
  298. package/dist/dashboard/assets/ProviderDetailPage-DK_e0FJz.js.gz +0 -0
  299. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +0 -1
  300. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
  301. package/dist/dashboard/assets/ProvidersPage-D_a3r6Gc.js +0 -1
  302. package/dist/dashboard/assets/ProvidersPage-D_a3r6Gc.js.gz +0 -0
  303. package/dist/dashboard/assets/ProxyPage-BBTRBAQ3.js.gz +0 -0
  304. package/dist/dashboard/assets/QuotaPage-B2WqMSG1.js.gz +0 -0
  305. package/dist/dashboard/assets/SettingsPage-D7xp5Ij_.js +0 -1
  306. package/dist/dashboard/assets/SettingsPage-D7xp5Ij_.js.gz +0 -0
  307. package/dist/dashboard/assets/SetupPage-LND6_Ss7.js.gz +0 -0
  308. package/dist/dashboard/assets/StudioPage-BzNnm6Bi.js.gz +0 -0
  309. package/dist/dashboard/assets/UsagePage-C1TbL24N.js +0 -56
  310. package/dist/dashboard/assets/UsagePage-C1TbL24N.js.gz +0 -0
  311. package/dist/dashboard/assets/api-keys-KvX83mRe.js +0 -1
  312. package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
  313. package/dist/dashboard/assets/app-mweRcsKp.css +0 -2
  314. package/dist/dashboard/assets/app-mweRcsKp.css.gz +0 -0
  315. package/dist/dashboard/assets/assert-CidQVoNo.js +0 -1
  316. package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
  317. package/dist/dashboard/assets/badge-BaX2GTrn.js.gz +0 -0
  318. package/dist/dashboard/assets/banner-DFH4Bkte.js.gz +0 -0
  319. package/dist/dashboard/assets/brand/bansos_page.png +0 -0
  320. package/dist/dashboard/assets/brand/denia_bansos.jpg +0 -0
  321. package/dist/dashboard/assets/brand/favicon.jpg +0 -0
  322. package/dist/dashboard/assets/brand/login_register.jpg +0 -0
  323. package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
  324. package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
  325. package/dist/dashboard/assets/brand/og_image.jpg +0 -0
  326. package/dist/dashboard/assets/brand/sidebar_ico.jpg +0 -0
  327. package/dist/dashboard/assets/card-CxDw0lK6.js.gz +0 -0
  328. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +0 -1
  329. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
  330. package/dist/dashboard/assets/clipboard-button-DfS1ntiq.js.gz +0 -0
  331. package/dist/dashboard/assets/dialog-BK-NRr5u.js.gz +0 -0
  332. package/dist/dashboard/assets/drawer-QqPul6sC.js.gz +0 -0
  333. package/dist/dashboard/assets/entry-BMlYJVFj.js.gz +0 -0
  334. package/dist/dashboard/assets/entry-Dmx7gBiN.js +0 -1
  335. package/dist/dashboard/assets/entry-Dmx7gBiN.js.gz +0 -0
  336. package/dist/dashboard/assets/entry-vqGb8yVz.js +0 -4
  337. package/dist/dashboard/assets/entry-vqGb8yVz.js.gz +0 -0
  338. package/dist/dashboard/assets/formatters-DP-5E01-.js.gz +0 -0
  339. package/dist/dashboard/assets/index-D36vCZht.js.gz +0 -0
  340. package/dist/dashboard/assets/inline-CHJQwxLa.js.gz +0 -0
  341. package/dist/dashboard/assets/input-BlmlizVV.js.gz +0 -0
  342. package/dist/dashboard/assets/layout-Bz93I-yE.js.gz +0 -0
  343. package/dist/dashboard/assets/list-row-Ml16KCfu.js.gz +0 -0
  344. package/dist/dashboard/assets/live-7_QpnYGu.js.gz +0 -0
  345. package/dist/dashboard/assets/minimize-2-BTmMTK4o.js +0 -1
  346. package/dist/dashboard/assets/minimize-2-BTmMTK4o.js.gz +0 -0
  347. package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
  348. package/dist/dashboard/assets/network-CuMDaTzT.js.gz +0 -0
  349. package/dist/dashboard/assets/numbers-CoqpaDMx.js.gz +0 -0
  350. package/dist/dashboard/assets/pagination-B5aOoweZ.js.gz +0 -0
  351. package/dist/dashboard/assets/query-keys-YSoQOUh6.js.gz +0 -0
  352. package/dist/dashboard/assets/routing-fnCsxgNO.js +0 -1
  353. package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
  354. package/dist/dashboard/assets/select-C9Ssle9b.js.gz +0 -0
  355. package/dist/dashboard/assets/settings-BxslsErn.js +0 -1
  356. package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
  357. package/dist/dashboard/assets/stack-j7cXjgYX.js.gz +0 -0
  358. package/dist/dashboard/assets/state-DHmEnLa2.js.gz +0 -0
  359. package/dist/dashboard/assets/switch-DmZcyTIC.js.gz +0 -0
  360. package/dist/dashboard/assets/useMutation-CbCP4w1o.js.gz +0 -0
  361. package/dist/dashboard/console-backgrounds.jpg +0 -0
  362. package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
  363. package/dist/dashboard/donation/qris-risun-marke.png +0 -0
  364. package/src/providers/integrations/buddy/turing-device-token.ts +0 -262
  365. package/src/providers/integrations/buddy/workbuddy/cn-oauth.ts +0 -30
  366. package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +0 -58
  367. package/src/providers/integrations/buddy/workbuddy/oauth.ts +0 -31
  368. package/src/providers/integrations/buddy/workbuddy/provider.ts +0 -209
  369. package/src/providers/integrations/buddy/workbuddy/quota.ts +0 -161
  370. package/src/providers/integrations/buddy/workbuddy/shared.ts +0 -285
  371. /package/dist/dashboard/assets/{app-DRnQLhsc.js → app-B7kIWFm5.js} +0 -0
  372. /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. This gateway executes none of its
444
- * own surface, so every precheck is answered `allowlisted: false` — the model
445
- * never learns otherwise than that the tool must be routed through the
446
- * advertised MCP channel it was told about.
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?: string,
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: false } },
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-2026.10.19-6bbf2c4";
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 { cursorVariantForExecArgs } from "./protocol/tool-canonical";
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 — this gateway advertises every executable surface through
1111
- // the MCP channel, so its own host surface is never allowlisted and the
1112
- // typed result frame (not an mcp_result) is what the server waits on.
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
- await handle.write(buildAllowlistPrecheckResult(execId, precheckKind, execIdString));
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 first. A Cursor host-exec frame (`read_args`, `shell_args`,
1125
- // `pi_read_args`, …) is relayed to the client as an ordinary tool call
1126
- // instead of being refused. This is the half the earlier direct-forward
1127
- // attempt got wrong: it built typed result frames by hand per variant and
1128
- // they were not matched by the server. The canonical layer owns that
1129
- // mapping now, keyed by the originating variant, so a result can only ever
1130
- // come back in the arm it arrived on.
1131
- const nativeCall = cursorVariantForExecArgs(execServer);
1132
- // Only a tool the request actually declared may be relayed. A host frame
1133
- // for something the client never advertised is an undeclared tool like any
1134
- // other and keeps the refusal — forwarding it would hand the client a call
1135
- // it has no handler for and nowhere to send the result.
1136
- const declaredNative = nativeCall !== undefined &&
1137
- session.descriptors.some((d) => d.toolName === nativeCall.variant.name);
1138
- if (nativeCall !== undefined && declaredNative) {
1139
- return {
1140
- kind: "tool_call",
1141
- execId,
1142
- execIdString,
1143
- toolName: nativeCall.variant.name,
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 is the fallback, not the first stop: client-declared tools have no
1148
- // native slot in `agent.proto`, so they are the ones that must travel this
1149
- // channel. An arm neither path claims falls through to the refusal below.
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 three
4
- // unrelated generations: the legacy natives (`ReadToolCall` 8, `ShellToolCall`
5
- // 1, `EditToolCall` 12, …), the modern exec family (`PiReadToolCall` 61 …
6
- // `PiLsToolCall` 67), and MCP (`McpToolCall` 15). Each carries its own args
7
- // message and its own `*ToolResult` oneof of `success`/`error`, so handling
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
- // **Variants stay separate.** `ReadToolCall` and `PiReadToolCall` are two tools,
16
- // not one tool seen twice: their args and their result shapes genuinely differ,
17
- // and folding them would mean picking one shape and lying about the other. A
18
- // new variant is one table row, not a new converter.
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`, `pi_read`,
22
- // `shell`, …), so a tool named `read` on Cursor and a `read` on some other
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
- * Deliberately not shared across generations: `read` and `pi_read` are two
45
- * names because they are two tools. A caller that wants both treats them as
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 on purpose: client-declared tools have no native
63
- * slot anywhere in `agent.proto` — `RequestContext.tools` (#7) is
64
- * `repeated McpToolDefinition` and `AgentRunRequest.mcp_tools` (#4) is the only
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` — that is what leaves room for
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
- }