@cursor/bdk 0.2.8 → 0.2.10

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 (581) hide show
  1. package/dist/artifacts.js +3 -5
  2. package/dist/bin/agent-serve.d.ts +1 -0
  3. package/dist/bin/agent-serve.d.ts.map +1 -1
  4. package/dist/bin/agent-serve.js +820 -807
  5. package/dist/channels/bitbucket/api.js +305 -321
  6. package/dist/channels/bitbucket/binding.js +97 -61
  7. package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
  8. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
  9. package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
  10. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
  11. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  12. package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
  13. package/dist/channels/bitbucket/checks.js +9 -21
  14. package/dist/channels/bitbucket/cursor-account.js +1 -1
  15. package/dist/channels/bitbucket/defaults.js +14 -4
  16. package/dist/channels/bitbucket/events.js +1 -2
  17. package/dist/channels/bitbucket/index.d.ts +6 -2
  18. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  19. package/dist/channels/bitbucket/index.js +6 -2
  20. package/dist/channels/bitbucket/replay.js +80 -56
  21. package/dist/channels/bitbucket/state.js +16 -7
  22. package/dist/channels/bitbucket/types.d.ts +11 -2
  23. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  24. package/dist/channels/checks.js +18 -28
  25. package/dist/channels/deployments/deployments-channel.js +26 -34
  26. package/dist/channels/github/api.js +216 -210
  27. package/dist/channels/github/auth.d.ts +5 -1
  28. package/dist/channels/github/auth.d.ts.map +1 -1
  29. package/dist/channels/github/auth.js +157 -174
  30. package/dist/channels/github/binding.js +48 -39
  31. package/dist/channels/github/checks.js +9 -14
  32. package/dist/channels/github/cursor-account.js +6 -11
  33. package/dist/channels/github/defaults.js +105 -130
  34. package/dist/channels/github/forward.js +13 -17
  35. package/dist/channels/github/github-channel.d.ts +43 -2
  36. package/dist/channels/github/github-channel.d.ts.map +1 -1
  37. package/dist/channels/github/github-channel.js +1228 -958
  38. package/dist/channels/github/progress.js +145 -146
  39. package/dist/channels/github/replay.js +30 -39
  40. package/dist/channels/github/state.js +40 -16
  41. package/dist/channels/github/types.d.ts +30 -6
  42. package/dist/channels/github/types.d.ts.map +1 -1
  43. package/dist/channels/gitlab/api.js +100 -114
  44. package/dist/channels/gitlab/binding.js +52 -33
  45. package/dist/channels/gitlab/checks.js +28 -29
  46. package/dist/channels/gitlab/cursor-account.js +1 -1
  47. package/dist/channels/gitlab/defaults.js +9 -3
  48. package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
  49. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
  50. package/dist/channels/gitlab/gitlab-channel.js +95 -42
  51. package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
  52. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
  53. package/dist/channels/gitlab/gitlab-webhook.js +282 -249
  54. package/dist/channels/gitlab/index.d.ts +6 -2
  55. package/dist/channels/gitlab/index.d.ts.map +1 -1
  56. package/dist/channels/gitlab/index.js +6 -2
  57. package/dist/channels/gitlab/replay.js +50 -27
  58. package/dist/channels/gitlab/state.js +14 -6
  59. package/dist/channels/gitlab/types.d.ts +13 -2
  60. package/dist/channels/gitlab/types.d.ts.map +1 -1
  61. package/dist/channels/origin/api.js +100 -116
  62. package/dist/channels/origin/binding.js +15 -16
  63. package/dist/channels/origin/checks.js +30 -28
  64. package/dist/channels/origin/defaults.js +50 -65
  65. package/dist/channels/origin/origin-channel.js +266 -272
  66. package/dist/channels/origin/origin-webhook.js +70 -88
  67. package/dist/channels/origin/reactions.js +9 -21
  68. package/dist/channels/origin/state.js +13 -5
  69. package/dist/channels/slack/agentic-delivery.js +426 -478
  70. package/dist/channels/slack/agentic-posted.js +9 -10
  71. package/dist/channels/slack/agentic-signals.js +2 -3
  72. package/dist/channels/slack/api.js +417 -427
  73. package/dist/channels/slack/approvals.js +1 -1
  74. package/dist/channels/slack/assistant.js +37 -47
  75. package/dist/channels/slack/attachments.js +188 -206
  76. package/dist/channels/slack/auth.js +8 -6
  77. package/dist/channels/slack/bot-mentions.js +31 -45
  78. package/dist/channels/slack/channel-watch.js +42 -48
  79. package/dist/channels/slack/cli-project.js +112 -137
  80. package/dist/channels/slack/code-fences.js +3 -5
  81. package/dist/channels/slack/constants.js +2 -2
  82. package/dist/channels/slack/credentials.js +23 -38
  83. package/dist/channels/slack/defaults.js +292 -331
  84. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  85. package/dist/channels/slack/dispatch.js +533 -460
  86. package/dist/channels/slack/doctor.js +200 -214
  87. package/dist/channels/slack/eval-directive.js +79 -96
  88. package/dist/channels/slack/event-id-dedupe.js +1 -1
  89. package/dist/channels/slack/external-policy.js +26 -39
  90. package/dist/channels/slack/footer.js +28 -41
  91. package/dist/channels/slack/inbound.d.ts +1 -0
  92. package/dist/channels/slack/inbound.d.ts.map +1 -1
  93. package/dist/channels/slack/inbound.js +50 -31
  94. package/dist/channels/slack/init.d.ts +1 -5
  95. package/dist/channels/slack/init.d.ts.map +1 -1
  96. package/dist/channels/slack/init.js +42 -59
  97. package/dist/channels/slack/interactive.d.ts +9 -3
  98. package/dist/channels/slack/interactive.d.ts.map +1 -1
  99. package/dist/channels/slack/interactive.js +160 -162
  100. package/dist/channels/slack/links.js +1 -2
  101. package/dist/channels/slack/live-delivery.js +172 -190
  102. package/dist/channels/slack/manifest.d.ts.map +1 -1
  103. package/dist/channels/slack/manifest.js +44 -23
  104. package/dist/channels/slack/message-body.js +2 -2
  105. package/dist/channels/slack/nudge-carrier.js +30 -42
  106. package/dist/channels/slack/nudge-store.js +164 -191
  107. package/dist/channels/slack/paint-start.js +66 -81
  108. package/dist/channels/slack/placeholder.js +123 -152
  109. package/dist/channels/slack/pr-ref.js +1 -1
  110. package/dist/channels/slack/progress-delivery.js +65 -78
  111. package/dist/channels/slack/reasoning-card.js +36 -49
  112. package/dist/channels/slack/recording-sink.js +12 -24
  113. package/dist/channels/slack/reply-options.js +7 -12
  114. package/dist/channels/slack/self-identity.js +27 -35
  115. package/dist/channels/slack/sender-name.d.ts +12 -3
  116. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  117. package/dist/channels/slack/sender-name.js +57 -61
  118. package/dist/channels/slack/setup.js +2 -4
  119. package/dist/channels/slack/slack-channel.d.ts +6 -4
  120. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  121. package/dist/channels/slack/slack-channel.js +441 -308
  122. package/dist/channels/slack/socket-mode.js +38 -52
  123. package/dist/channels/slack/thread-context.js +143 -160
  124. package/dist/channels/slack/tool-approval-events.js +149 -166
  125. package/dist/channels/slack/tool-cards.js +6 -11
  126. package/dist/channels/slack/tool-chip.js +1 -2
  127. package/dist/channels/slack/types.d.ts +15 -17
  128. package/dist/channels/slack/types.d.ts.map +1 -1
  129. package/dist/channels/slack/upload.js +84 -97
  130. package/dist/channels/slack/user-info.js +27 -41
  131. package/dist/channels.js +9 -20
  132. package/dist/dashboard-session-url.js +3 -4
  133. package/dist/docs/404.html +2 -2
  134. package/dist/docs/assets/{app.oyjtOr3W.js → app.DXI7bwox.js} +4 -4
  135. package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
  136. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
  137. package/dist/docs/assets/chunks/{VPLocalSearchBox.D0P6J_UJ.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
  138. package/dist/docs/assets/chunks/{arc.B0LY1J1h.js → arc.BOG1yms8.js} +1 -1
  139. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.dPduLUxY.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
  140. package/dist/docs/assets/chunks/{baseUniq.B_Ohm21h.js → baseUniq.H044KjKs.js} +1 -1
  141. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.B4zcanaJ.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
  142. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D9Iw21nx.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
  143. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
  144. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DDVwRShI.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
  145. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DsYcdn1i.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
  146. package/dist/docs/assets/chunks/{chunk-55IACEB6.BzzQvcYp.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
  147. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BMiXZ7FX.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
  148. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.D_mBcLoc.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
  149. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMVjWVMx.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
  150. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BG-FrPv9.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
  151. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CkFE1ap3.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
  152. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
  153. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
  154. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
  155. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BVNnCTvY.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
  156. package/dist/docs/assets/chunks/{dagre-KV5264BT.CDN5PR9l.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
  157. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DQRUlT-i.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
  158. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.CoeblYQT.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
  159. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DW3ymjl0.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
  160. package/dist/docs/assets/chunks/{diagram-TYMM5635.BP0uN4Jw.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
  161. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DVFUWEn4.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
  162. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.HU-eHspv.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
  163. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DHNhXijY.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
  164. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DkISXcO3.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
  165. package/dist/docs/assets/chunks/{graph.CCV0fuRR.js → graph.BVqKRmRo.js} +1 -1
  166. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.bgILzOoc.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
  167. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CuryXC0F.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
  168. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BL1Pr-wu.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
  169. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BbGjvk4l.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
  170. package/dist/docs/assets/chunks/{layout.C4PfdldS.js → layout.CGU3gfSf.js} +1 -1
  171. package/dist/docs/assets/chunks/{linear.C3xD1T6X.js → linear.DaihpW_n.js} +1 -1
  172. package/dist/docs/assets/chunks/{min.CzgRAQ9c.js → min.BS-j8kHQ.js} +1 -1
  173. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CA9rSWum.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
  174. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B8MprgJu.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
  175. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DndDwbKT.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
  176. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.Zhfgwlnn.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
  177. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.B6RRm6N5.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
  178. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Bfmz-1PN.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
  179. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.gbrdNqgj.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
  180. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
  181. package/dist/docs/assets/chunks/{theme.gpWjytMh.js → theme.DaplWQhQ.js} +2 -2
  182. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bl1l7M1f.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
  183. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.Dfle4U0d.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
  184. package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +162 -0
  185. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CM_4lmvZ.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
  186. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CHT5X28R.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
  187. package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
  188. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
  189. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
  190. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
  191. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
  192. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
  193. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
  194. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
  195. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
  196. package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
  197. package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
  198. package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
  199. package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
  200. package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
  201. package/dist/docs/building-with-agents.html +37 -37
  202. package/dist/docs/building-with-agents.md +2 -0
  203. package/dist/docs/deployment.html +38 -38
  204. package/dist/docs/deployment.md +7 -0
  205. package/dist/docs/evals.html +36 -36
  206. package/dist/docs/guides/agent-to-agent.html +35 -35
  207. package/dist/docs/guides/bitbucket.html +38 -38
  208. package/dist/docs/guides/bitbucket.md +9 -1
  209. package/dist/docs/guides/cloud-agents.html +35 -35
  210. package/dist/docs/guides/convert-automation.html +35 -35
  211. package/dist/docs/guides/github.html +39 -39
  212. package/dist/docs/guides/github.md +20 -4
  213. package/dist/docs/guides/gitlab.html +38 -38
  214. package/dist/docs/guides/gitlab.md +9 -1
  215. package/dist/docs/guides/grokbot-agents.html +35 -35
  216. package/dist/docs/guides/hooks.html +35 -35
  217. package/dist/docs/guides/improve.html +35 -35
  218. package/dist/docs/guides/jev.html +35 -35
  219. package/dist/docs/guides/mcp-oauth.html +35 -35
  220. package/dist/docs/guides/migrate.html +66 -0
  221. package/dist/docs/guides/migrate.md +122 -0
  222. package/dist/docs/guides/opentelemetry.html +35 -35
  223. package/dist/docs/guides/slack.html +35 -35
  224. package/dist/docs/guides/webhooks.html +35 -35
  225. package/dist/docs/hashmap.json +1 -1
  226. package/dist/docs/hillclimbing.html +35 -35
  227. package/dist/docs/index.html +35 -35
  228. package/dist/docs/llms-full.txt +214 -6
  229. package/dist/docs/llms.txt +1 -0
  230. package/dist/docs/quickstart.html +35 -35
  231. package/dist/docs/reference/agent-config.html +35 -35
  232. package/dist/docs/reference/artifacts.html +35 -35
  233. package/dist/docs/reference/channels.html +35 -35
  234. package/dist/docs/reference/cli.html +39 -38
  235. package/dist/docs/reference/cli.md +39 -0
  236. package/dist/docs/reference/connections.html +35 -35
  237. package/dist/docs/reference/evals.html +35 -35
  238. package/dist/docs/reference/extensions.html +35 -35
  239. package/dist/docs/reference/hooks.html +35 -35
  240. package/dist/docs/reference/http-api.html +35 -35
  241. package/dist/docs/reference/instructions.html +35 -35
  242. package/dist/docs/reference/playground.html +35 -35
  243. package/dist/docs/reference/project-layout.html +35 -35
  244. package/dist/docs/reference/prompt.html +35 -35
  245. package/dist/docs/reference/schedules.html +35 -35
  246. package/dist/docs/reference/sessions.html +35 -35
  247. package/dist/docs/reference/skills.html +38 -38
  248. package/dist/docs/reference/subagents.html +35 -35
  249. package/dist/docs/reference/tools.html +35 -35
  250. package/dist/docs/templates/agentic-owners.html +35 -35
  251. package/dist/docs/templates/grokbot-agents.html +35 -35
  252. package/dist/docs/templates/security-reviewer.html +35 -35
  253. package/dist/docs/templates/thermo-quality-review.html +35 -35
  254. package/dist/docs/templates/thermo-review.html +35 -35
  255. package/dist/docs/templates/triage.html +35 -35
  256. package/dist/docs/troubleshooting.html +36 -36
  257. package/dist/docs/troubleshooting.md +1 -0
  258. package/dist/evals/assertions.js +20 -34
  259. package/dist/evals/expect.js +3 -6
  260. package/dist/evals/judge.js +5 -8
  261. package/dist/evals/loaders.js +45 -62
  262. package/dist/evals/matchers.js +2 -3
  263. package/dist/evals/reporters.js +43 -67
  264. package/dist/evals/results.js +1 -1
  265. package/dist/evals/run-facts.js +5 -6
  266. package/dist/evals.js +27 -15
  267. package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
  268. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +0 -1
  269. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
  270. package/dist/extensions/cursor-cloud-agents/lib/backend.js +101 -130
  271. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
  272. package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
  273. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
  274. package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
  275. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
  276. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
  277. package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
  278. package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
  279. package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
  280. package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -1
  281. package/dist/extensions/cursor-cloud-agents/tools/list.js +9 -20
  282. package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
  283. package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
  284. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  285. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
  286. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
  287. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
  288. package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
  289. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
  290. package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
  291. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
  292. package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
  293. package/dist/extensions/jev/extension.js +3 -3
  294. package/dist/extensions/jev/lib/evaluate.js +43 -60
  295. package/dist/extensions/jev/tools/evaluate.js +6 -17
  296. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  297. package/dist/extensions.js +3 -5
  298. package/dist/files-backends/cursor-hosted.js +504 -523
  299. package/dist/files-backends/local-fs.js +72 -134
  300. package/dist/files.js +3 -3
  301. package/dist/filesystem.js +562 -861
  302. package/dist/index.js +16 -35
  303. package/dist/internal/advertise-tools.js +74 -86
  304. package/dist/internal/artifacts-store.js +298 -361
  305. package/dist/internal/as-of.js +2 -4
  306. package/dist/internal/authored-alias-hooks.js +6 -4
  307. package/dist/internal/authored-loaders.js +37 -52
  308. package/dist/internal/bounded-int.js +1 -2
  309. package/dist/internal/bounded.js +13 -24
  310. package/dist/internal/brand.js +1 -1
  311. package/dist/internal/browser-origin-guard.js +4 -4
  312. package/dist/internal/builtin-tools/artifacts.js +15 -27
  313. package/dist/internal/builtin-tools/index.js +2 -3
  314. package/dist/internal/builtin-tools/reminders.js +33 -52
  315. package/dist/internal/channel-architecture.d.ts +21 -0
  316. package/dist/internal/channel-architecture.d.ts.map +1 -0
  317. package/dist/internal/channel-architecture.js +41 -0
  318. package/dist/internal/channel-dispatch.js +3 -4
  319. package/dist/internal/channel-route-dispatch.js +40 -51
  320. package/dist/internal/channel-state.js +1 -1
  321. package/dist/internal/chat-client.js +319 -340
  322. package/dist/internal/cli-ax.js +1262 -1294
  323. package/dist/internal/cli-bitbucket.js +244 -272
  324. package/dist/internal/cli-convert-automation.js +137 -151
  325. package/dist/internal/cli-cursor.js +126 -147
  326. package/dist/internal/cli-deploy.d.ts.map +1 -1
  327. package/dist/internal/cli-deploy.js +1457 -1507
  328. package/dist/internal/cli-docs.js +130 -147
  329. package/dist/internal/cli-github.js +437 -476
  330. package/dist/internal/cli-gitlab.js +259 -288
  331. package/dist/internal/cli-images.js +266 -334
  332. package/dist/internal/cli-manifest.js +25 -37
  333. package/dist/internal/cli-mcp-oauth.js +228 -247
  334. package/dist/internal/cli-mcp.js +358 -383
  335. package/dist/internal/cli-migrate.d.ts +18 -0
  336. package/dist/internal/cli-migrate.d.ts.map +1 -0
  337. package/dist/internal/cli-migrate.js +136 -0
  338. package/dist/internal/cli-skills.js +35 -47
  339. package/dist/internal/cli-slack-manual.d.ts +0 -1
  340. package/dist/internal/cli-slack-manual.d.ts.map +1 -1
  341. package/dist/internal/cli-slack-manual.js +175 -204
  342. package/dist/internal/cli-slack.d.ts +1 -1
  343. package/dist/internal/cli-slack.d.ts.map +1 -1
  344. package/dist/internal/cli-slack.js +416 -456
  345. package/dist/internal/cloud-merge.js +7 -3
  346. package/dist/internal/cloud-turn-cost.js +8 -1
  347. package/dist/internal/connection-env.js +5 -6
  348. package/dist/internal/continuation-channel.js +10 -7
  349. package/dist/internal/continuation-identity.js +85 -67
  350. package/dist/internal/conversation-mirror.js +112 -131
  351. package/dist/internal/convert-automation/convert-workflow.js +21 -31
  352. package/dist/internal/cron.js +3 -3
  353. package/dist/internal/cursor/account-mcp.js +147 -146
  354. package/dist/internal/cursor/backend-client.js +290 -320
  355. package/dist/internal/cursor/bound-secret-file.js +3 -3
  356. package/dist/internal/cursor/credentials.d.ts +1 -0
  357. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  358. package/dist/internal/cursor/credentials.js +130 -142
  359. package/dist/internal/cursor/cursor-api-transport.js +4 -8
  360. package/dist/internal/cursor/github-credentials.js +91 -108
  361. package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
  362. package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
  363. package/dist/internal/cursor/hosted-store-secrets.js +5 -9
  364. package/dist/internal/cursor/session-token.js +36 -48
  365. package/dist/internal/cursor/store-api-client.js +77 -92
  366. package/dist/internal/cursor-account-mcp-auth.js +132 -149
  367. package/dist/internal/cursor-agent-template.js +1 -1
  368. package/dist/internal/cursor-deployment-relay.js +33 -54
  369. package/dist/internal/cursor-event-relay.js +65 -59
  370. package/dist/internal/cursor-relay-core.js +258 -286
  371. package/dist/internal/deferred-channel-session.js +3 -12
  372. package/dist/internal/deploy-client.js +410 -475
  373. package/dist/internal/deploy-manifest.d.ts +17 -0
  374. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  375. package/dist/internal/deploy-manifest.js +71 -21
  376. package/dist/internal/deploy-source.js +31 -43
  377. package/dist/internal/discovery/agent-config.js +45 -59
  378. package/dist/internal/discovery/agent.js +276 -280
  379. package/dist/internal/discovery/channels.js +67 -80
  380. package/dist/internal/discovery/connections.js +286 -296
  381. package/dist/internal/discovery/context.js +2 -13
  382. package/dist/internal/discovery/cursor-plugin.js +223 -259
  383. package/dist/internal/discovery/extension-overlay.js +104 -131
  384. package/dist/internal/discovery/extensions.js +276 -281
  385. package/dist/internal/discovery/fs.js +56 -79
  386. package/dist/internal/discovery/hooks.js +39 -50
  387. package/dist/internal/discovery/info.js +17 -19
  388. package/dist/internal/discovery/instructions.js +58 -71
  389. package/dist/internal/discovery/modules.js +45 -58
  390. package/dist/internal/discovery/project.d.ts.map +1 -1
  391. package/dist/internal/discovery/project.js +192 -215
  392. package/dist/internal/discovery/reminders.js +41 -52
  393. package/dist/internal/discovery/runtime.js +1 -1
  394. package/dist/internal/discovery/schedules.js +71 -82
  395. package/dist/internal/discovery/seed-files.js +21 -32
  396. package/dist/internal/discovery/services.js +74 -96
  397. package/dist/internal/discovery/skills.js +77 -94
  398. package/dist/internal/discovery/subagent.js +79 -95
  399. package/dist/internal/discovery/tools.js +12 -23
  400. package/dist/internal/distribution.js +2 -2
  401. package/dist/internal/docs-site.js +30 -45
  402. package/dist/internal/duration.js +1 -1
  403. package/dist/internal/env-file.js +48 -64
  404. package/dist/internal/eval-judge-model.js +17 -28
  405. package/dist/internal/eval-run-store.js +265 -254
  406. package/dist/internal/eval-runner.d.ts +8 -0
  407. package/dist/internal/eval-runner.d.ts.map +1 -1
  408. package/dist/internal/eval-runner.js +406 -408
  409. package/dist/internal/eval-transport.d.ts +24 -0
  410. package/dist/internal/eval-transport.d.ts.map +1 -0
  411. package/dist/internal/eval-transport.js +22 -0
  412. package/dist/internal/evals-client.js +242 -246
  413. package/dist/internal/event-log.js +72 -120
  414. package/dist/internal/event-mapper.js +30 -31
  415. package/dist/internal/factory-resource-channel.js +16 -30
  416. package/dist/internal/filesystem/errors.js +6 -6
  417. package/dist/internal/filesystem/format.js +10 -13
  418. package/dist/internal/filesystem/merge.js +52 -94
  419. package/dist/internal/filesystem/nearest.js +15 -27
  420. package/dist/internal/filesystem/scratch.js +65 -85
  421. package/dist/internal/filesystem/tools.js +221 -241
  422. package/dist/internal/filesystem/walk.js +76 -143
  423. package/dist/internal/framework-file-storage.js +118 -139
  424. package/dist/internal/framework-storage-selection.js +21 -13
  425. package/dist/internal/frontmatter.js +4 -6
  426. package/dist/internal/github-fanout.js +50 -64
  427. package/dist/internal/guest-network.js +96 -109
  428. package/dist/internal/handleAgentServeTrigger.js +121 -126
  429. package/dist/internal/host-files.js +73 -88
  430. package/dist/internal/host-kv.js +21 -36
  431. package/dist/internal/host-otel.js +22 -19
  432. package/dist/internal/host-platforms.js +49 -63
  433. package/dist/internal/hosted-catch-protocol.d.ts +1 -0
  434. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  435. package/dist/internal/hosted-catch-protocol.js +1 -0
  436. package/dist/internal/hosted-catch.d.ts +5 -3
  437. package/dist/internal/hosted-catch.d.ts.map +1 -1
  438. package/dist/internal/hosted-catch.js +84 -93
  439. package/dist/internal/hosted-delivery-protocol.js +32 -8
  440. package/dist/internal/hosted-delivery.d.ts +13 -1
  441. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  442. package/dist/internal/hosted-delivery.js +614 -584
  443. package/dist/internal/hosted-eval-cases.d.ts +21 -0
  444. package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
  445. package/dist/internal/hosted-eval-cases.js +162 -0
  446. package/dist/internal/hosted-execution-diag.js +38 -30
  447. package/dist/internal/hosted-execution-flush.js +75 -66
  448. package/dist/internal/hosted-execution-latency.js +16 -8
  449. package/dist/internal/hosted-managed-automation.js +2 -2
  450. package/dist/internal/hosting.js +2 -3
  451. package/dist/internal/http-channel-define.js +4 -1
  452. package/dist/internal/http-channel.js +101 -112
  453. package/dist/internal/http-control-plane-session.d.ts +18 -1
  454. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  455. package/dist/internal/http-control-plane-session.js +66 -32
  456. package/dist/internal/incoming-headers-to-fetch.js +1 -2
  457. package/dist/internal/init-interview.js +73 -93
  458. package/dist/internal/init-project.js +182 -214
  459. package/dist/internal/init-scaffold.js +10 -21
  460. package/dist/internal/inline-stdio-mcp.js +80 -86
  461. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  462. package/dist/internal/install-cursor-skills.js +238 -274
  463. package/dist/internal/legacy-command-guard.js +18 -31
  464. package/dist/internal/listen-port.js +34 -45
  465. package/dist/internal/local-control-plane.js +293 -307
  466. package/dist/internal/local-env.js +1 -1
  467. package/dist/internal/local-ingress.js +15 -9
  468. package/dist/internal/log-ring.js +1 -2
  469. package/dist/internal/logs-client.js +207 -227
  470. package/dist/internal/map-pool.js +24 -38
  471. package/dist/internal/mcp-endpoint.js +204 -180
  472. package/dist/internal/mcp-host.js +165 -168
  473. package/dist/internal/mcp-oauth-on-demand.js +170 -207
  474. package/dist/internal/mcp-oauth-persist.js +15 -29
  475. package/dist/internal/mcp-oauth.js +209 -266
  476. package/dist/internal/named-webhook-secret.d.ts +39 -0
  477. package/dist/internal/named-webhook-secret.d.ts.map +1 -0
  478. package/dist/internal/named-webhook-secret.js +47 -0
  479. package/dist/internal/open-browser.js +2 -3
  480. package/dist/internal/otel/collector.js +104 -68
  481. package/dist/internal/otel/config.js +24 -37
  482. package/dist/internal/otel/http.js +5 -7
  483. package/dist/internal/otel/mcp.js +3 -12
  484. package/dist/internal/otel/runtime.js +69 -83
  485. package/dist/internal/package-inline-stdio.js +57 -65
  486. package/dist/internal/peer-connections.js +9 -5
  487. package/dist/internal/platform-schedule-sync.js +39 -54
  488. package/dist/internal/platform-timers.js +176 -210
  489. package/dist/internal/playground/static.js +1 -2
  490. package/dist/internal/playground/toolchain.js +37 -53
  491. package/dist/internal/playground-proxy.js +230 -270
  492. package/dist/internal/process-memory-telemetry.js +33 -51
  493. package/dist/internal/prompt-context.js +3 -6
  494. package/dist/internal/reminder-control-plane-protocol.js +46 -13
  495. package/dist/internal/reminder-runner.js +770 -785
  496. package/dist/internal/reminder-schedule.js +1 -1
  497. package/dist/internal/reminder-store.js +57 -78
  498. package/dist/internal/request-error-status.js +1 -3
  499. package/dist/internal/request-headers.js +2 -2
  500. package/dist/internal/resolve-prod-target.js +119 -135
  501. package/dist/internal/resolved-connections.js +16 -6
  502. package/dist/internal/run-client.js +221 -229
  503. package/dist/internal/runtime-dispatch-runner.js +18 -43
  504. package/dist/internal/schedule-runner.js +49 -58
  505. package/dist/internal/scm/pr-url.js +7 -6
  506. package/dist/internal/sdk-runner.js +388 -363
  507. package/dist/internal/serve-restart.js +26 -39
  508. package/dist/internal/server.d.ts.map +1 -1
  509. package/dist/internal/server.js +1283 -1244
  510. package/dist/internal/session-cost.js +7 -9
  511. package/dist/internal/session-engine.d.ts +3 -1
  512. package/dist/internal/session-engine.d.ts.map +1 -1
  513. package/dist/internal/session-engine.js +2801 -2777
  514. package/dist/internal/session-links.js +12 -16
  515. package/dist/internal/session-run-log.js +134 -82
  516. package/dist/internal/session-store.js +133 -164
  517. package/dist/internal/sessions-client.js +97 -118
  518. package/dist/internal/skill-catalog.js +18 -23
  519. package/dist/internal/skills-sync.js +16 -30
  520. package/dist/internal/slack-provision-client.js +90 -116
  521. package/dist/internal/start-log-store.js +48 -67
  522. package/dist/internal/steering.js +1 -2
  523. package/dist/internal/storage-coordinator.js +160 -196
  524. package/dist/internal/store-mirror.js +16 -30
  525. package/dist/internal/stream-progress.js +6 -8
  526. package/dist/internal/terminal-style.js +3 -4
  527. package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
  528. package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
  529. package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
  530. package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
  531. package/dist/internal/tool-catalog.js +11 -5
  532. package/dist/internal/tool-result.js +1 -1
  533. package/dist/internal/trajectory.js +19 -22
  534. package/dist/internal/turn-cost.js +52 -62
  535. package/dist/internal/turn-governor.js +5 -8
  536. package/dist/internal/turn-lease-store.js +85 -105
  537. package/dist/internal/turn-outbox.js +28 -43
  538. package/dist/internal/update-check.js +231 -259
  539. package/dist/internal/v2-hosting.js +1 -2
  540. package/dist/internal/workspace-sync.js +25 -41
  541. package/dist/internal/workspace.js +111 -139
  542. package/dist/kv/memory-kv.js +27 -51
  543. package/dist/memory.js +106 -148
  544. package/dist/otel.js +5 -8
  545. package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
  546. package/dist/playground/assets/{index-MijLHTbB.js → index-JekUQERK.js} +45 -45
  547. package/dist/playground/index.html +2 -2
  548. package/dist/prompt.js +2 -4
  549. package/dist/storage-backends/cursor-hosted-v2.js +53 -83
  550. package/dist/storage-backends/cursor-hosted.js +105 -145
  551. package/dist/storage-backends/file-kv.js +100 -128
  552. package/dist/storage-protocol.js +3 -5
  553. package/dist/storage.js +17 -26
  554. package/dist/types.d.ts +68 -0
  555. package/dist/types.d.ts.map +1 -1
  556. package/dist/types.js +20 -18
  557. package/docs/building-with-agents.md +2 -0
  558. package/docs/deployment.md +7 -0
  559. package/docs/guides/bitbucket.md +9 -1
  560. package/docs/guides/github.md +20 -4
  561. package/docs/guides/gitlab.md +9 -1
  562. package/docs/guides/migrate.md +127 -0
  563. package/docs/reference/cli.md +39 -0
  564. package/docs/troubleshooting.md +1 -0
  565. package/package.json +1 -1
  566. package/skills/debug/SKILL.md +1 -0
  567. package/skills/github/SKILL.md +23 -0
  568. package/skills/migrate-v2/SKILL.md +264 -0
  569. package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +0 -1
  570. package/dist/docs/assets/chunks/channel.CRUyWDV-.js +0 -1
  571. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CG_UObcQ.js +0 -1
  572. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CG_UObcQ.js +0 -1
  573. package/dist/docs/assets/chunks/clone.NYSZ9qZN.js +0 -1
  574. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DOOmulfQ.js +0 -1
  575. package/dist/docs/assets/chunks/wardley-RL74JXVD.BJrCW6xc.js +0 -162
  576. package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
  577. package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
  578. package/dist/playground/assets/index-DPKLl4C_.css +0 -1
  579. /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
  580. /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
  581. /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
@@ -13,15 +13,6 @@
13
13
  * a short-lived access token (`POST /auth/exchange_user_api_key`, ~1h),
14
14
  * cached until shortly before expiry and re-exchanged once on a 401.
15
15
  */
16
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
17
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
18
- return new (P || (P = Promise))(function (resolve, reject) {
19
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
20
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
21
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
22
- step((generator = generator.apply(thisArg, _arguments || [])).next());
23
- });
24
- };
25
16
  import { randomUUID } from "node:crypto";
26
17
  import { z } from "zod";
27
18
  import { describeError } from "../describe-error.js";
@@ -30,9 +21,9 @@ import { boundedToolAnnotations } from "../mcp-host.js";
30
21
  import { CURSOR_SESSION_EXCHANGE_PATH, CursorSessionExchangeError, exchangeCursorApiKeyForSession, SESSION_TOKEN_EXPIRY_LEEWAY_MS, } from "./session-token.js";
31
22
  const CLIENT_VERSION = "agent-serve-0.1.0";
32
23
  const DASHBOARD_SERVICE = "DashboardService";
33
- const LIST_TIMEOUT_MS = 60000;
24
+ const LIST_TIMEOUT_MS = 60_000;
34
25
  /** Backend-executed tools call out to third-party servers; be generous. */
35
- const EXECUTE_TIMEOUT_MS = 120000;
26
+ const EXECUTE_TIMEOUT_MS = 120_000;
36
27
  export class CursorBackendError extends Error {
37
28
  constructor(message, status, retryAfterMs) {
38
29
  super(message);
@@ -160,117 +151,113 @@ const executeResponseSchema = z.object({
160
151
  // Shared request machinery (used by the client and the login-time mint)
161
152
  // ============================================================================
162
153
  /** One DashboardService Connect-JSON POST; auth is the caller's bearer. */
163
- function connectRpc(args) {
164
- return __awaiter(this, void 0, void 0, function* () {
165
- var _a;
166
- try {
167
- return yield args.fetchImpl(`${args.backendUrl}/aiserver.v1.${args.service}/${args.method}`, {
168
- method: "POST",
169
- headers: Object.assign({ "content-type": "application/json", authorization: `Bearer ${args.bearer}`, "x-ghost-mode": "true", "x-cursor-client-version": CLIENT_VERSION, "x-cursor-client-type": "agent-serve", "x-request-id": randomUUID() }, args.extraHeaders),
170
- body: JSON.stringify((_a = args.body) !== null && _a !== void 0 ? _a : {}),
171
- signal: AbortSignal.timeout(args.timeoutMs),
172
- });
173
- }
174
- catch (error) {
175
- throw new CursorBackendError(`Cursor backend request ${args.method} failed: ${describeError(error)}`);
176
- }
177
- });
154
+ async function connectRpc(args) {
155
+ try {
156
+ return await args.fetchImpl(`${args.backendUrl}/aiserver.v1.${args.service}/${args.method}`, {
157
+ method: "POST",
158
+ headers: {
159
+ "content-type": "application/json",
160
+ authorization: `Bearer ${args.bearer}`,
161
+ "x-ghost-mode": "true",
162
+ "x-cursor-client-version": CLIENT_VERSION,
163
+ "x-cursor-client-type": "agent-serve",
164
+ "x-request-id": randomUUID(),
165
+ ...args.extraHeaders,
166
+ },
167
+ body: JSON.stringify(args.body ?? {}),
168
+ signal: AbortSignal.timeout(args.timeoutMs),
169
+ });
170
+ }
171
+ catch (error) {
172
+ throw new CursorBackendError(`Cursor backend request ${args.method} failed: ${describeError(error)}`);
173
+ }
178
174
  }
179
175
  /** Drain and parse an RPC response; maps non-2xx to a CursorBackendError. */
180
- function parseRpcResponse(method, response) {
181
- return __awaiter(this, void 0, void 0, function* () {
182
- const text = yield response.text();
183
- if (!response.ok) {
184
- throw new CursorBackendError(`Cursor backend ${method} failed (${response.status}): ${connectErrorMessage(text)}`, response.status);
185
- }
186
- try {
187
- return JSON.parse(text);
188
- }
189
- catch (_a) {
190
- throw new CursorBackendError(`Cursor backend ${method} returned a non-JSON response.`);
191
- }
192
- });
176
+ async function parseRpcResponse(method, response) {
177
+ const text = await response.text();
178
+ if (!response.ok) {
179
+ throw new CursorBackendError(`Cursor backend ${method} failed (${response.status}): ${connectErrorMessage(text)}`, response.status);
180
+ }
181
+ try {
182
+ return JSON.parse(text);
183
+ }
184
+ catch {
185
+ throw new CursorBackendError(`Cursor backend ${method} returned a non-JSON response.`);
186
+ }
193
187
  }
194
188
  export class CursorBackendClient {
195
189
  constructor(options) {
196
- var _a, _b, _c;
197
190
  this.backendUrl = options.backendUrl.endsWith("/")
198
191
  ? options.backendUrl.slice(0, -1)
199
192
  : options.backendUrl;
200
- this.resolveApiKey = (_a = options.getApiKey) !== null && _a !== void 0 ? _a : (() => options.apiKey);
201
- this.logger = (_b = options.logger) !== null && _b !== void 0 ? _b : (() => { });
202
- this.fetchImpl = (_c = options.fetchImpl) !== null && _c !== void 0 ? _c : fetch;
193
+ this.resolveApiKey = options.getApiKey ?? (() => options.apiKey);
194
+ this.logger = options.logger ?? (() => { });
195
+ this.fetchImpl = options.fetchImpl ?? fetch;
203
196
  }
204
197
  currentApiKey() {
205
198
  return this.resolveApiKey().trim();
206
199
  }
207
200
  /** Who this API key acts as. */
208
- getMe() {
209
- return __awaiter(this, void 0, void 0, function* () {
210
- return getMeResponseSchema.parse(yield this.rpc("GetMe", {}));
211
- });
201
+ async getMe() {
202
+ return getMeResponseSchema.parse(await this.rpc("GetMe", {}));
212
203
  }
213
204
  /**
214
205
  * The account's MCP connectors with live status and backend-prefixed tool
215
206
  * definitions. `serverIdentifiers` restricts discovery (empty = all
216
207
  * HTTP/SSE servers on the account).
217
208
  */
218
- listAccountMcpTools(serverIdentifiers) {
219
- return __awaiter(this, void 0, void 0, function* () {
220
- var _a;
221
- const raw = yield this.rpc("ListSandMcpTools", { serverIdentifiers: [...serverIdentifiers] }, LIST_TIMEOUT_MS);
222
- const parsed = listSandMcpToolsResponseSchema.parse(raw);
223
- return ((_a = parsed.servers) !== null && _a !== void 0 ? _a : []).map(server => { var _a; return ({
224
- serverIdentifier: server.serverIdentifier,
225
- status: server.status,
226
- tools: ((_a = server.tools) !== null && _a !== void 0 ? _a : []).map(tool => {
227
- var _a;
228
- const outputSchema = parseOutputSchemaJson(tool.outputSchemaJson);
229
- const annotations = parseAnnotationsJson(tool.annotationsJson);
230
- return Object.assign(Object.assign({ name: tool.name, description: (_a = tool.description) !== null && _a !== void 0 ? _a : "", inputSchema: normalizeInputSchema(tool.inputSchema) }, (outputSchema === undefined ? {} : { outputSchema })), (annotations === undefined ? {} : { annotations }));
231
- }),
232
- }); });
233
- });
209
+ async listAccountMcpTools(serverIdentifiers) {
210
+ const raw = await this.rpc("ListSandMcpTools", { serverIdentifiers: [...serverIdentifiers] }, LIST_TIMEOUT_MS);
211
+ const parsed = listSandMcpToolsResponseSchema.parse(raw);
212
+ return (parsed.servers ?? []).map(server => ({
213
+ serverIdentifier: server.serverIdentifier,
214
+ status: server.status,
215
+ tools: (server.tools ?? []).map(tool => {
216
+ const outputSchema = parseOutputSchemaJson(tool.outputSchemaJson);
217
+ const annotations = parseAnnotationsJson(tool.annotationsJson);
218
+ return {
219
+ name: tool.name,
220
+ description: tool.description ?? "",
221
+ inputSchema: normalizeInputSchema(tool.inputSchema),
222
+ ...(outputSchema === undefined ? {} : { outputSchema }),
223
+ ...(annotations === undefined ? {} : { annotations }),
224
+ };
225
+ }),
226
+ }));
234
227
  }
235
228
  /**
236
229
  * Execute one connector tool **on the Cursor backend** with the account's
237
230
  * stored OAuth credentials. `toolName` is the fully-qualified name from
238
231
  * {@link listAccountMcpTools}.
239
232
  */
240
- executeAccountMcpTool(args) {
241
- return __awaiter(this, void 0, void 0, function* () {
242
- var _a;
243
- const raw = yield this.rpc("ExecuteSandMcpTool", {
244
- serverIdentifier: args.serverIdentifier,
245
- toolName: args.toolName,
246
- args: args.args,
247
- toolCallId: randomUUID(),
248
- }, EXECUTE_TIMEOUT_MS);
249
- const parsed = executeResponseSchema.parse(raw);
250
- return toCallResult((_a = parsed.result) !== null && _a !== void 0 ? _a : {});
251
- });
233
+ async executeAccountMcpTool(args) {
234
+ const raw = await this.rpc("ExecuteSandMcpTool", {
235
+ serverIdentifier: args.serverIdentifier,
236
+ toolName: args.toolName,
237
+ args: args.args,
238
+ toolCallId: randomUUID(),
239
+ }, EXECUTE_TIMEOUT_MS);
240
+ const parsed = executeResponseSchema.parse(raw);
241
+ return toCallResult(parsed.result ?? {});
252
242
  }
253
243
  /**
254
244
  * The account's dashboard MCP connector listing (id + name per server).
255
245
  * `teamId` pins the ambient team so team-scoped connectors resolve for
256
246
  * multi-team accounts.
257
247
  */
258
- getAvailableMcpServers(options) {
259
- return __awaiter(this, void 0, void 0, function* () {
260
- var _a;
261
- const raw = yield this.rpc("GetAvailableMcpServers", {}, LIST_TIMEOUT_MS, {
262
- teamId: options === null || options === void 0 ? void 0 : options.teamId,
263
- });
264
- const parsed = getAvailableMcpServersResponseSchema.parse(raw);
265
- return ((_a = parsed.servers) !== null && _a !== void 0 ? _a : [])
266
- .filter(server => server.id !== undefined && server.id > 0)
267
- .map(server => { var _a; return ({
268
- id: server.id,
269
- name: (_a = server.name) !== null && _a !== void 0 ? _a : "",
270
- isTeamServer: server.isTeamServer === true,
271
- serverIdentifier: server.serverIdentifier,
272
- }); });
248
+ async getAvailableMcpServers(options) {
249
+ const raw = await this.rpc("GetAvailableMcpServers", {}, LIST_TIMEOUT_MS, {
250
+ teamId: options?.teamId,
273
251
  });
252
+ const parsed = getAvailableMcpServersResponseSchema.parse(raw);
253
+ return (parsed.servers ?? [])
254
+ .filter(server => server.id !== undefined && server.id > 0)
255
+ .map(server => ({
256
+ id: server.id,
257
+ name: server.name ?? "",
258
+ isTeamServer: server.isTeamServer === true,
259
+ serverIdentifier: server.serverIdentifier,
260
+ }));
274
261
  }
275
262
  /**
276
263
  * Probe connectors and mint OAuth `authUrl`s where authorization is
@@ -278,56 +265,50 @@ export class CursorBackendClient {
278
265
  * flow for a hosted deployment's service account. Omit it to probe the
279
266
  * signed-in user (local `serve` preflight).
280
267
  */
281
- checkHttpMcpStatus(args) {
282
- return __awaiter(this, void 0, void 0, function* () {
283
- var _a;
284
- const raw = yield this.rpc("CheckHttpMcpStatus", {
285
- serverIds: args.serverIds,
286
- oauthRedirectUri: args.oauthRedirectUri,
287
- serviceAccountId: args.serviceAccountId,
288
- }, LIST_TIMEOUT_MS);
289
- const parsed = checkHttpMcpStatusResponseSchema.parse(raw);
290
- return ((_a = parsed.statuses) !== null && _a !== void 0 ? _a : []).map(status => { var _a; return ({
291
- id: (_a = status.id) !== null && _a !== void 0 ? _a : 0,
292
- requiresAuth: status.requiresAuth === true,
293
- authUrl: status.authUrl,
294
- error: status.error,
295
- }); });
296
- });
268
+ async checkHttpMcpStatus(args) {
269
+ const raw = await this.rpc("CheckHttpMcpStatus", {
270
+ serverIds: args.serverIds,
271
+ oauthRedirectUri: args.oauthRedirectUri,
272
+ serviceAccountId: args.serviceAccountId,
273
+ }, LIST_TIMEOUT_MS);
274
+ const parsed = checkHttpMcpStatusResponseSchema.parse(raw);
275
+ return (parsed.statuses ?? []).map(status => ({
276
+ id: status.id ?? 0,
277
+ requiresAuth: status.requiresAuth === true,
278
+ authUrl: status.authUrl,
279
+ error: status.error,
280
+ }));
297
281
  }
298
282
  /** Mint a short-lived GitHub token scoped to the requested repositories. */
299
- getGithubToken(repos, options) {
300
- return __awaiter(this, void 0, void 0, function* () {
301
- var _a;
302
- const permissions = (_a = options === null || options === void 0 ? void 0 : options.permissions) !== null && _a !== void 0 ? _a : "pr-write";
303
- let response;
304
- try {
305
- response = yield this.fetchImpl(`${this.backendUrl}/v0/scm-events/github-token`, {
306
- method: "POST",
307
- headers: {
308
- "content-type": "application/json",
309
- authorization: `Bearer ${this.currentApiKey()}`,
310
- },
311
- body: JSON.stringify({ repos: [...repos], permissions }),
312
- signal: AbortSignal.timeout(30000),
313
- });
314
- }
315
- catch (error) {
316
- throw new CursorBackendError(`Cursor GitHub credential request failed: ${describeError(error)}`);
317
- }
318
- const text = yield response.text();
319
- if (!response.ok) {
320
- throw new CursorBackendError(describeGithubTokenHttpFailure(response.status, text), response.status, retryAfterMsFromResponse(response));
321
- }
322
- let parsed;
323
- try {
324
- parsed = JSON.parse(text);
325
- }
326
- catch (_b) {
327
- throw new CursorBackendError("Cursor backend returned a non-JSON GitHub credential response.");
328
- }
329
- return githubTokenResponseSchema.parse(parsed);
330
- });
283
+ async getGithubToken(repos, options) {
284
+ const permissions = options?.permissions ?? "pr-write";
285
+ let response;
286
+ try {
287
+ response = await this.fetchImpl(`${this.backendUrl}/v0/scm-events/github-token`, {
288
+ method: "POST",
289
+ headers: {
290
+ "content-type": "application/json",
291
+ authorization: `Bearer ${this.currentApiKey()}`,
292
+ },
293
+ body: JSON.stringify({ repos: [...repos], permissions }),
294
+ signal: AbortSignal.timeout(30_000),
295
+ });
296
+ }
297
+ catch (error) {
298
+ throw new CursorBackendError(`Cursor GitHub credential request failed: ${describeError(error)}`);
299
+ }
300
+ const text = await response.text();
301
+ if (!response.ok) {
302
+ throw new CursorBackendError(describeGithubTokenHttpFailure(response.status, text), response.status, retryAfterMsFromResponse(response));
303
+ }
304
+ let parsed;
305
+ try {
306
+ parsed = JSON.parse(text);
307
+ }
308
+ catch {
309
+ throw new CursorBackendError("Cursor backend returned a non-JSON GitHub credential response.");
310
+ }
311
+ return githubTokenResponseSchema.parse(parsed);
331
312
  }
332
313
  /**
333
314
  * Resolve the proxied clone target for a GitHub (GHES) / GitLab /
@@ -336,44 +317,42 @@ export class CursorBackendClient {
336
317
  * returned remote lives on the backend and takes this client's API key,
337
318
  * never a provider token.
338
319
  */
339
- getScmCloneTarget(provider, repo) {
340
- return __awaiter(this, void 0, void 0, function* () {
341
- const label = SCM_CLONE_PROVIDER_LABELS[provider];
342
- let response;
343
- try {
344
- response = yield this.fetchImpl(`${this.backendUrl}/v0/scm-events/${provider}-clone-target`, {
345
- method: "POST",
346
- headers: {
347
- "content-type": "application/json",
348
- authorization: `Bearer ${this.currentApiKey()}`,
349
- },
350
- body: JSON.stringify({ repo }),
351
- signal: AbortSignal.timeout(30000),
352
- });
353
- }
354
- catch (error) {
355
- throw new CursorBackendError(`Cursor ${label} clone target request failed: ${describeError(error)}`);
356
- }
357
- const text = yield response.text();
358
- if (!response.ok) {
359
- throw new CursorBackendError(describeGithubTokenHttpFailure(response.status, text, label), response.status, retryAfterMsFromResponse(response));
360
- }
361
- let parsed;
362
- try {
363
- parsed = JSON.parse(text);
364
- }
365
- catch (_a) {
366
- throw new CursorBackendError(`Cursor backend returned a non-JSON ${label} clone target response.`);
367
- }
368
- const body = scmCloneTargetResponseSchema.parse(parsed);
369
- return {
370
- remoteUrl: `${this.backendUrl}${body.clone.remotePath}`,
371
- token: this.currentApiKey(),
372
- expiresAt: body.expiresAt,
373
- username: body.clone.username,
374
- authMode: body.clone.authMode,
375
- };
376
- });
320
+ async getScmCloneTarget(provider, repo) {
321
+ const label = SCM_CLONE_PROVIDER_LABELS[provider];
322
+ let response;
323
+ try {
324
+ response = await this.fetchImpl(`${this.backendUrl}/v0/scm-events/${provider}-clone-target`, {
325
+ method: "POST",
326
+ headers: {
327
+ "content-type": "application/json",
328
+ authorization: `Bearer ${this.currentApiKey()}`,
329
+ },
330
+ body: JSON.stringify({ repo }),
331
+ signal: AbortSignal.timeout(30_000),
332
+ });
333
+ }
334
+ catch (error) {
335
+ throw new CursorBackendError(`Cursor ${label} clone target request failed: ${describeError(error)}`);
336
+ }
337
+ const text = await response.text();
338
+ if (!response.ok) {
339
+ throw new CursorBackendError(describeGithubTokenHttpFailure(response.status, text, label), response.status, retryAfterMsFromResponse(response));
340
+ }
341
+ let parsed;
342
+ try {
343
+ parsed = JSON.parse(text);
344
+ }
345
+ catch {
346
+ throw new CursorBackendError(`Cursor backend returned a non-JSON ${label} clone target response.`);
347
+ }
348
+ const body = scmCloneTargetResponseSchema.parse(parsed);
349
+ return {
350
+ remoteUrl: `${this.backendUrl}${body.clone.remotePath}`,
351
+ token: this.currentApiKey(),
352
+ expiresAt: body.expiresAt,
353
+ username: body.clone.username,
354
+ authMode: body.clone.authMode,
355
+ };
377
356
  }
378
357
  /**
379
358
  * One unary Connect-JSON call on `aiserver.v1.<service>` with the same
@@ -383,50 +362,46 @@ export class CursorBackendClient {
383
362
  serviceRpc(service, method, body, timeoutMs = LIST_TIMEOUT_MS) {
384
363
  return this.rpc(method, body, timeoutMs, { service });
385
364
  }
386
- rpc(method_1, body_1) {
387
- return __awaiter(this, arguments, void 0, function* (method, body, timeoutMs = LIST_TIMEOUT_MS, options) {
388
- var _a, _b;
389
- var _c;
390
- const service = (_c = options === null || options === void 0 ? void 0 : options.service) !== null && _c !== void 0 ? _c : DASHBOARD_SERVICE;
391
- const extraHeaders = (options === null || options === void 0 ? void 0 : options.teamId) === undefined ? undefined : { "x-cursor-team-id": String(options.teamId) };
392
- const bearer = yield this.getAccessToken();
393
- const first = yield connectRpc({
394
- fetchImpl: this.fetchImpl,
395
- backendUrl: this.backendUrl,
396
- service,
397
- method,
398
- bearer,
399
- body,
400
- timeoutMs,
401
- extraHeaders,
402
- });
403
- if (first.status !== 401) {
404
- return parseRpcResponse(method, first);
405
- }
406
- // The token aged out server-side. Drain the rejected body (keeps the
407
- // connection reusable), drop the token — unless a concurrent retry
408
- // already minted a newer one — and retry once.
409
- yield drainResponseBody(first);
410
- if (((_a = this.token) === null || _a === void 0 ? void 0 : _a.value) === bearer) {
411
- this.token = undefined;
412
- }
413
- const retryBearer = yield this.getAccessToken();
414
- const second = yield connectRpc({
415
- fetchImpl: this.fetchImpl,
416
- backendUrl: this.backendUrl,
417
- service,
418
- method,
419
- bearer: retryBearer,
420
- body,
421
- timeoutMs,
422
- extraHeaders,
423
- });
424
- if (second.status === 401 && ((_b = this.token) === null || _b === void 0 ? void 0 : _b.value) === retryBearer) {
425
- // The freshly minted token was rejected too; do not keep serving it.
426
- this.token = undefined;
427
- }
428
- return parseRpcResponse(method, second);
365
+ async rpc(method, body, timeoutMs = LIST_TIMEOUT_MS, options) {
366
+ const service = options?.service ?? DASHBOARD_SERVICE;
367
+ const extraHeaders = options?.teamId === undefined ? undefined : { "x-cursor-team-id": String(options.teamId) };
368
+ const bearer = await this.getAccessToken();
369
+ const first = await connectRpc({
370
+ fetchImpl: this.fetchImpl,
371
+ backendUrl: this.backendUrl,
372
+ service,
373
+ method,
374
+ bearer,
375
+ body,
376
+ timeoutMs,
377
+ extraHeaders,
378
+ });
379
+ if (first.status !== 401) {
380
+ return parseRpcResponse(method, first);
381
+ }
382
+ // The token aged out server-side. Drain the rejected body (keeps the
383
+ // connection reusable), drop the token — unless a concurrent retry
384
+ // already minted a newer one — and retry once.
385
+ await drainResponseBody(first);
386
+ if (this.token?.value === bearer) {
387
+ this.token = undefined;
388
+ }
389
+ const retryBearer = await this.getAccessToken();
390
+ const second = await connectRpc({
391
+ fetchImpl: this.fetchImpl,
392
+ backendUrl: this.backendUrl,
393
+ service,
394
+ method,
395
+ bearer: retryBearer,
396
+ body,
397
+ timeoutMs,
398
+ extraHeaders,
429
399
  });
400
+ if (second.status === 401 && this.token?.value === retryBearer) {
401
+ // The freshly minted token was rejected too; do not keep serving it.
402
+ this.token = undefined;
403
+ }
404
+ return parseRpcResponse(method, second);
430
405
  }
431
406
  /**
432
407
  * Serve a cached access token for the account, exchanging the API key
@@ -453,58 +428,53 @@ export class CursorBackendClient {
453
428
  }
454
429
  return this.tokenExchange;
455
430
  }
456
- exchangeApiKey() {
457
- return __awaiter(this, void 0, void 0, function* () {
458
- const apiKey = this.currentApiKey();
459
- let session;
460
- try {
461
- session = yield exchangeCursorApiKeyForSession({
462
- exchangeUrl: `${this.backendUrl}${CURSOR_SESSION_EXCHANGE_PATH}`,
463
- apiKey,
464
- fetchImpl: this.fetchImpl,
465
- });
466
- }
467
- catch (error) {
468
- if (error instanceof CursorSessionExchangeError) {
469
- if (error.status === undefined) {
470
- throw new CursorBackendError(`Could not reach the Cursor backend at ${this.backendUrl}: ${error.message}`);
471
- }
472
- if (error.status >= 200 && error.status < 300) {
473
- // 2xx without a token in the body.
474
- throw new CursorBackendError("Cursor API key exchange returned no access token.");
475
- }
476
- throw new CursorBackendError(error.status === 401
477
- ? `The Cursor API key was rejected. Run \`${CLI} login\` again or update CURSOR_API_KEY.`
478
- : `Cursor API key exchange failed (${error.status}).`, error.status);
431
+ async exchangeApiKey() {
432
+ const apiKey = this.currentApiKey();
433
+ let session;
434
+ try {
435
+ session = await exchangeCursorApiKeyForSession({
436
+ exchangeUrl: `${this.backendUrl}${CURSOR_SESSION_EXCHANGE_PATH}`,
437
+ apiKey,
438
+ fetchImpl: this.fetchImpl,
439
+ });
440
+ }
441
+ catch (error) {
442
+ if (error instanceof CursorSessionExchangeError) {
443
+ if (error.status === undefined) {
444
+ throw new CursorBackendError(`Could not reach the Cursor backend at ${this.backendUrl}: ${error.message}`);
445
+ }
446
+ if (error.status >= 200 && error.status < 300) {
447
+ // 2xx without a token in the body.
448
+ throw new CursorBackendError("Cursor API key exchange returned no access token.");
479
449
  }
480
- throw error;
450
+ throw new CursorBackendError(error.status === 401
451
+ ? `The Cursor API key was rejected. Run \`${CLI} login\` again or update CURSOR_API_KEY.`
452
+ : `Cursor API key exchange failed (${error.status}).`, error.status);
481
453
  }
482
- this.token = { value: session.token, expiresAtMs: session.expiresAtMs };
483
- this.lastExchangedApiKey = apiKey;
484
- this.logger("[bdk] cursor account: minted a fresh access token");
485
- return session.token;
486
- });
454
+ throw error;
455
+ }
456
+ this.token = { value: session.token, expiresAtMs: session.expiresAtMs };
457
+ this.lastExchangedApiKey = apiKey;
458
+ this.logger("[bdk] cursor account: minted a fresh access token");
459
+ return session.token;
487
460
  }
488
461
  }
489
462
  /**
490
463
  * Mint a named user API key from a short-lived login session token. Used
491
464
  * exactly once per `agent-sdk login`; the session token is then discarded.
492
465
  */
493
- export function createUserApiKeyWithSessionToken(args) {
494
- return __awaiter(this, void 0, void 0, function* () {
495
- var _a;
496
- const response = yield connectRpc({
497
- fetchImpl: (_a = args.fetchImpl) !== null && _a !== void 0 ? _a : fetch,
498
- backendUrl: args.backendUrl.endsWith("/") ? args.backendUrl.slice(0, -1) : args.backendUrl,
499
- service: DASHBOARD_SERVICE,
500
- method: "CreateUserApiKey",
501
- bearer: args.sessionToken,
502
- body: { name: args.keyName },
503
- timeoutMs: 30000,
504
- });
505
- const raw = yield parseRpcResponse("CreateUserApiKey", response);
506
- return createUserApiKeyResponseSchema.parse(raw).apiKey;
466
+ export async function createUserApiKeyWithSessionToken(args) {
467
+ const response = await connectRpc({
468
+ fetchImpl: args.fetchImpl ?? fetch,
469
+ backendUrl: args.backendUrl.endsWith("/") ? args.backendUrl.slice(0, -1) : args.backendUrl,
470
+ service: DASHBOARD_SERVICE,
471
+ method: "CreateUserApiKey",
472
+ bearer: args.sessionToken,
473
+ body: { name: args.keyName },
474
+ timeoutMs: 30_000,
507
475
  });
476
+ const raw = await parseRpcResponse("CreateUserApiKey", response);
477
+ return createUserApiKeyResponseSchema.parse(raw).apiKey;
508
478
  }
509
479
  const API_KEY_PREFIX = "crsr_";
510
480
  /** Matches dashboard `maskApiKey` (`crsr_...abcd`). */
@@ -527,39 +497,36 @@ const listUserApiKeysResponseSchema = z.object({
527
497
  * so replica lag after `CreateUserApiKey` can only skip the cleanup, not
528
498
  * revoke an older same-named key.
529
499
  */
530
- export function revokeMintedUserApiKey(args) {
531
- return __awaiter(this, void 0, void 0, function* () {
532
- var _a, _b;
533
- const fetchImpl = (_a = args.fetchImpl) !== null && _a !== void 0 ? _a : fetch;
534
- const backendUrl = args.backendUrl.endsWith("/") ? args.backendUrl.slice(0, -1) : args.backendUrl;
535
- const listResponse = yield connectRpc({
536
- fetchImpl,
537
- backendUrl,
538
- service: DASHBOARD_SERVICE,
539
- method: "ListUserApiKeys",
540
- bearer: args.sessionToken,
541
- body: {},
542
- timeoutMs: 30000,
543
- });
544
- const listed = listUserApiKeysResponseSchema.parse(yield parseRpcResponse("ListUserApiKeys", listResponse));
545
- const masked = maskApiKey(args.apiKey);
546
- const match = ((_b = listed.apiKeys) !== null && _b !== void 0 ? _b : []).find(key => key.name === args.keyName && key.maskedKey === masked);
547
- if (match === undefined) {
548
- // CreateUserApiKey writes the primary while ListUserApiKeys may read a
549
- // lagging replica — skip rather than touch any other key.
550
- return;
551
- }
552
- const revokeResponse = yield connectRpc({
553
- fetchImpl,
554
- backendUrl,
555
- service: DASHBOARD_SERVICE,
556
- method: "RevokeUserApiKey",
557
- bearer: args.sessionToken,
558
- body: { id: match.id },
559
- timeoutMs: 30000,
560
- });
561
- yield drainResponseBody(revokeResponse);
500
+ export async function revokeMintedUserApiKey(args) {
501
+ const fetchImpl = args.fetchImpl ?? fetch;
502
+ const backendUrl = args.backendUrl.endsWith("/") ? args.backendUrl.slice(0, -1) : args.backendUrl;
503
+ const listResponse = await connectRpc({
504
+ fetchImpl,
505
+ backendUrl,
506
+ service: DASHBOARD_SERVICE,
507
+ method: "ListUserApiKeys",
508
+ bearer: args.sessionToken,
509
+ body: {},
510
+ timeoutMs: 30_000,
562
511
  });
512
+ const listed = listUserApiKeysResponseSchema.parse(await parseRpcResponse("ListUserApiKeys", listResponse));
513
+ const masked = maskApiKey(args.apiKey);
514
+ const match = (listed.apiKeys ?? []).find(key => key.name === args.keyName && key.maskedKey === masked);
515
+ if (match === undefined) {
516
+ // CreateUserApiKey writes the primary while ListUserApiKeys may read a
517
+ // lagging replica — skip rather than touch any other key.
518
+ return;
519
+ }
520
+ const revokeResponse = await connectRpc({
521
+ fetchImpl,
522
+ backendUrl,
523
+ service: DASHBOARD_SERVICE,
524
+ method: "RevokeUserApiKey",
525
+ bearer: args.sessionToken,
526
+ body: { id: match.id },
527
+ timeoutMs: 30_000,
528
+ });
529
+ await drainResponseBody(revokeResponse);
563
530
  }
564
531
  // ============================================================================
565
532
  // Helpers
@@ -568,7 +535,7 @@ function safeJsonParse(text) {
568
535
  try {
569
536
  return JSON.parse(text);
570
537
  }
571
- catch (_a) {
538
+ catch {
572
539
  return undefined;
573
540
  }
574
541
  }
@@ -592,7 +559,7 @@ function parseOutputSchemaJson(outputSchemaJson) {
592
559
  try {
593
560
  parsed = JSON.parse(outputSchemaJson);
594
561
  }
595
- catch (_a) {
562
+ catch {
596
563
  return undefined;
597
564
  }
598
565
  return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
@@ -612,26 +579,33 @@ function parseAnnotationsJson(annotationsJson) {
612
579
  try {
613
580
  parsed = JSON.parse(annotationsJson);
614
581
  }
615
- catch (_a) {
582
+ catch {
616
583
  return undefined;
617
584
  }
618
585
  return boundedToolAnnotations(parsed);
619
586
  }
620
587
  function toCallResult(result) {
621
- var _a;
622
588
  if (result.success !== undefined) {
623
589
  const content = [];
624
- for (const item of (_a = result.success.content) !== null && _a !== void 0 ? _a : []) {
590
+ for (const item of result.success.content ?? []) {
625
591
  if (item.text !== undefined) {
626
592
  content.push({ type: "text", text: item.text.text });
627
593
  }
628
594
  else if (item.image !== undefined) {
629
- content.push(Object.assign({ type: "image", data: item.image.data }, (item.image.mimeType === undefined ? {} : { mimeType: item.image.mimeType })));
595
+ content.push({
596
+ type: "image",
597
+ data: item.image.data,
598
+ ...(item.image.mimeType === undefined ? {} : { mimeType: item.image.mimeType }),
599
+ });
630
600
  }
631
601
  }
632
- return Object.assign({ content, isError: result.success.isError === true }, (result.success.structuredContent === undefined
633
- ? {}
634
- : { structuredContent: result.success.structuredContent }));
602
+ return {
603
+ content,
604
+ isError: result.success.isError === true,
605
+ ...(result.success.structuredContent === undefined
606
+ ? {}
607
+ : { structuredContent: result.success.structuredContent }),
608
+ };
635
609
  }
636
610
  return {
637
611
  content: [{ type: "text", text: describeFailure(result) }],
@@ -639,21 +613,20 @@ function toCallResult(result) {
639
613
  };
640
614
  }
641
615
  function describeFailure(result) {
642
- var _a, _b, _c, _d, _e, _f;
643
616
  if (result.error !== undefined) {
644
- return (_a = result.error.error) !== null && _a !== void 0 ? _a : "The tool call failed.";
617
+ return result.error.error ?? "The tool call failed.";
645
618
  }
646
619
  if (result.permissionDenied !== undefined) {
647
- return (_b = result.permissionDenied.error) !== null && _b !== void 0 ? _b : "Permission denied.";
620
+ return result.permissionDenied.error ?? "Permission denied.";
648
621
  }
649
622
  if (result.rejected !== undefined) {
650
623
  return `The tool call was rejected${result.rejected.reason === undefined ? "" : `: ${result.rejected.reason}`}.`;
651
624
  }
652
625
  if (result.toolNotFound !== undefined) {
653
- return `Unknown tool "${(_c = result.toolNotFound.name) !== null && _c !== void 0 ? _c : ""}". Available: ${((_d = result.toolNotFound.availableTools) !== null && _d !== void 0 ? _d : []).join(", ") || "(none)"}.`;
626
+ return `Unknown tool "${result.toolNotFound.name ?? ""}". Available: ${(result.toolNotFound.availableTools ?? []).join(", ") || "(none)"}.`;
654
627
  }
655
628
  if (result.serverNotFound !== undefined) {
656
- return `Unknown MCP server "${(_e = result.serverNotFound.name) !== null && _e !== void 0 ? _e : ""}". Available: ${((_f = result.serverNotFound.availableServers) !== null && _f !== void 0 ? _f : []).join(", ") || "(none)"}.`;
629
+ return `Unknown MCP server "${result.serverNotFound.name ?? ""}". Available: ${(result.serverNotFound.availableServers ?? []).join(", ") || "(none)"}.`;
657
630
  }
658
631
  return "The tool call returned no result.";
659
632
  }
@@ -668,7 +641,7 @@ function connectErrorMessage(bodyText) {
668
641
  }
669
642
  return bodyText.slice(0, 300) || "(empty response body)";
670
643
  }
671
- const MAX_GITHUB_TOKEN_RETRY_AFTER_MS = 60 * 60000;
644
+ const MAX_GITHUB_TOKEN_RETRY_AFTER_MS = 60 * 60_000;
672
645
  /**
673
646
  * Prefer the backend's actionable denial message. Only a true 401 on this
674
647
  * route means the Cursor API key itself was rejected — GitHub-connection
@@ -705,21 +678,18 @@ function githubTokenErrorFromBody(bodyText) {
705
678
  return undefined;
706
679
  }
707
680
  function retryAfterMsFromResponse(response) {
708
- var _a;
709
- const retryAfter = Number((_a = response.headers.get("retry-after")) !== null && _a !== void 0 ? _a : "");
681
+ const retryAfter = Number(response.headers.get("retry-after") ?? "");
710
682
  if (!Number.isFinite(retryAfter) || retryAfter <= 0) {
711
683
  return undefined;
712
684
  }
713
685
  return Math.min(retryAfter * 1000, MAX_GITHUB_TOKEN_RETRY_AFTER_MS);
714
686
  }
715
687
  /** Release undici/fetch connection slots on responses we will not parse. */
716
- function drainResponseBody(response) {
717
- return __awaiter(this, void 0, void 0, function* () {
718
- try {
719
- yield response.arrayBuffer();
720
- }
721
- catch (_a) {
722
- // Best-effort; the socket may already be closed.
723
- }
724
- });
688
+ async function drainResponseBody(response) {
689
+ try {
690
+ await response.arrayBuffer();
691
+ }
692
+ catch {
693
+ // Best-effort; the socket may already be closed.
694
+ }
725
695
  }