@cursor/bdk 0.2.9 → 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 (570) hide show
  1. package/dist/artifacts.js +3 -5
  2. package/dist/bin/agent-serve.js +803 -812
  3. package/dist/channels/bitbucket/api.js +305 -321
  4. package/dist/channels/bitbucket/binding.js +97 -61
  5. package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
  6. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
  7. package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
  8. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
  9. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  10. package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
  11. package/dist/channels/bitbucket/checks.js +9 -21
  12. package/dist/channels/bitbucket/cursor-account.js +1 -1
  13. package/dist/channels/bitbucket/defaults.js +14 -4
  14. package/dist/channels/bitbucket/events.js +1 -2
  15. package/dist/channels/bitbucket/index.d.ts +6 -2
  16. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  17. package/dist/channels/bitbucket/index.js +6 -2
  18. package/dist/channels/bitbucket/replay.js +80 -56
  19. package/dist/channels/bitbucket/state.js +16 -7
  20. package/dist/channels/bitbucket/types.d.ts +11 -2
  21. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  22. package/dist/channels/checks.js +18 -28
  23. package/dist/channels/deployments/deployments-channel.js +26 -34
  24. package/dist/channels/github/api.js +216 -210
  25. package/dist/channels/github/auth.d.ts +5 -1
  26. package/dist/channels/github/auth.d.ts.map +1 -1
  27. package/dist/channels/github/auth.js +157 -174
  28. package/dist/channels/github/binding.js +48 -39
  29. package/dist/channels/github/checks.js +9 -14
  30. package/dist/channels/github/cursor-account.js +6 -11
  31. package/dist/channels/github/defaults.js +105 -130
  32. package/dist/channels/github/forward.js +13 -17
  33. package/dist/channels/github/github-channel.d.ts +43 -2
  34. package/dist/channels/github/github-channel.d.ts.map +1 -1
  35. package/dist/channels/github/github-channel.js +1228 -958
  36. package/dist/channels/github/progress.js +145 -146
  37. package/dist/channels/github/replay.js +30 -39
  38. package/dist/channels/github/state.js +40 -16
  39. package/dist/channels/github/types.d.ts +30 -6
  40. package/dist/channels/github/types.d.ts.map +1 -1
  41. package/dist/channels/gitlab/api.js +100 -114
  42. package/dist/channels/gitlab/binding.js +52 -33
  43. package/dist/channels/gitlab/checks.js +28 -29
  44. package/dist/channels/gitlab/cursor-account.js +1 -1
  45. package/dist/channels/gitlab/defaults.js +9 -3
  46. package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
  47. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
  48. package/dist/channels/gitlab/gitlab-channel.js +95 -42
  49. package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
  50. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
  51. package/dist/channels/gitlab/gitlab-webhook.js +282 -249
  52. package/dist/channels/gitlab/index.d.ts +6 -2
  53. package/dist/channels/gitlab/index.d.ts.map +1 -1
  54. package/dist/channels/gitlab/index.js +6 -2
  55. package/dist/channels/gitlab/replay.js +50 -27
  56. package/dist/channels/gitlab/state.js +14 -6
  57. package/dist/channels/gitlab/types.d.ts +13 -2
  58. package/dist/channels/gitlab/types.d.ts.map +1 -1
  59. package/dist/channels/origin/api.js +100 -116
  60. package/dist/channels/origin/binding.js +15 -16
  61. package/dist/channels/origin/checks.js +30 -28
  62. package/dist/channels/origin/defaults.js +50 -65
  63. package/dist/channels/origin/origin-channel.js +266 -272
  64. package/dist/channels/origin/origin-webhook.js +70 -88
  65. package/dist/channels/origin/reactions.js +9 -21
  66. package/dist/channels/origin/state.js +13 -5
  67. package/dist/channels/slack/agentic-delivery.js +426 -478
  68. package/dist/channels/slack/agentic-posted.js +9 -10
  69. package/dist/channels/slack/agentic-signals.js +2 -3
  70. package/dist/channels/slack/api.js +417 -427
  71. package/dist/channels/slack/approvals.js +1 -1
  72. package/dist/channels/slack/assistant.js +37 -47
  73. package/dist/channels/slack/attachments.js +188 -206
  74. package/dist/channels/slack/auth.js +8 -6
  75. package/dist/channels/slack/bot-mentions.js +31 -45
  76. package/dist/channels/slack/channel-watch.js +42 -48
  77. package/dist/channels/slack/cli-project.js +112 -137
  78. package/dist/channels/slack/code-fences.js +3 -5
  79. package/dist/channels/slack/constants.js +2 -2
  80. package/dist/channels/slack/credentials.js +23 -38
  81. package/dist/channels/slack/defaults.js +292 -331
  82. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  83. package/dist/channels/slack/dispatch.js +533 -460
  84. package/dist/channels/slack/doctor.js +200 -214
  85. package/dist/channels/slack/eval-directive.js +79 -96
  86. package/dist/channels/slack/event-id-dedupe.js +1 -1
  87. package/dist/channels/slack/external-policy.js +26 -39
  88. package/dist/channels/slack/footer.js +28 -41
  89. package/dist/channels/slack/inbound.d.ts +1 -0
  90. package/dist/channels/slack/inbound.d.ts.map +1 -1
  91. package/dist/channels/slack/inbound.js +50 -31
  92. package/dist/channels/slack/init.d.ts +1 -5
  93. package/dist/channels/slack/init.d.ts.map +1 -1
  94. package/dist/channels/slack/init.js +42 -59
  95. package/dist/channels/slack/interactive.d.ts +9 -3
  96. package/dist/channels/slack/interactive.d.ts.map +1 -1
  97. package/dist/channels/slack/interactive.js +160 -162
  98. package/dist/channels/slack/links.js +1 -2
  99. package/dist/channels/slack/live-delivery.js +172 -190
  100. package/dist/channels/slack/manifest.d.ts.map +1 -1
  101. package/dist/channels/slack/manifest.js +44 -23
  102. package/dist/channels/slack/message-body.js +2 -2
  103. package/dist/channels/slack/nudge-carrier.js +30 -42
  104. package/dist/channels/slack/nudge-store.js +164 -191
  105. package/dist/channels/slack/paint-start.js +66 -81
  106. package/dist/channels/slack/placeholder.js +123 -152
  107. package/dist/channels/slack/pr-ref.js +1 -1
  108. package/dist/channels/slack/progress-delivery.js +65 -78
  109. package/dist/channels/slack/reasoning-card.js +36 -49
  110. package/dist/channels/slack/recording-sink.js +12 -24
  111. package/dist/channels/slack/reply-options.js +7 -12
  112. package/dist/channels/slack/self-identity.js +27 -35
  113. package/dist/channels/slack/sender-name.d.ts +12 -3
  114. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  115. package/dist/channels/slack/sender-name.js +57 -61
  116. package/dist/channels/slack/setup.js +2 -4
  117. package/dist/channels/slack/slack-channel.d.ts +6 -4
  118. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  119. package/dist/channels/slack/slack-channel.js +441 -308
  120. package/dist/channels/slack/socket-mode.js +38 -52
  121. package/dist/channels/slack/thread-context.js +143 -160
  122. package/dist/channels/slack/tool-approval-events.js +149 -166
  123. package/dist/channels/slack/tool-cards.js +6 -11
  124. package/dist/channels/slack/tool-chip.js +1 -2
  125. package/dist/channels/slack/types.d.ts +15 -17
  126. package/dist/channels/slack/types.d.ts.map +1 -1
  127. package/dist/channels/slack/upload.js +84 -97
  128. package/dist/channels/slack/user-info.js +27 -41
  129. package/dist/channels.js +9 -20
  130. package/dist/dashboard-session-url.js +3 -4
  131. package/dist/docs/404.html +2 -2
  132. package/dist/docs/assets/{app.BNhEdGa8.js → app.DXI7bwox.js} +4 -4
  133. package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
  134. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
  135. package/dist/docs/assets/chunks/{VPLocalSearchBox.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
  136. package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
  137. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
  138. package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
  139. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
  140. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
  141. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
  142. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
  143. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
  144. package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
  145. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
  146. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
  147. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
  148. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
  149. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
  150. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
  151. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
  152. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
  153. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
  154. package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
  155. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
  156. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
  157. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
  158. package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
  159. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
  160. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
  161. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
  162. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
  163. package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
  164. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
  165. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
  166. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
  167. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
  168. package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
  169. package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
  170. package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
  171. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
  172. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
  173. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
  174. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
  175. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
  176. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
  177. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
  178. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
  179. package/dist/docs/assets/chunks/{theme.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
  180. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
  181. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
  182. package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
  183. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
  184. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
  185. package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
  186. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
  187. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
  188. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
  189. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
  190. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
  191. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
  192. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
  193. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
  194. package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
  195. package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
  196. package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
  197. package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
  198. package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
  199. package/dist/docs/building-with-agents.html +37 -37
  200. package/dist/docs/building-with-agents.md +2 -0
  201. package/dist/docs/deployment.html +38 -38
  202. package/dist/docs/deployment.md +7 -0
  203. package/dist/docs/evals.html +36 -36
  204. package/dist/docs/guides/agent-to-agent.html +35 -35
  205. package/dist/docs/guides/bitbucket.html +38 -38
  206. package/dist/docs/guides/bitbucket.md +9 -1
  207. package/dist/docs/guides/cloud-agents.html +35 -35
  208. package/dist/docs/guides/convert-automation.html +35 -35
  209. package/dist/docs/guides/github.html +39 -39
  210. package/dist/docs/guides/github.md +20 -4
  211. package/dist/docs/guides/gitlab.html +38 -38
  212. package/dist/docs/guides/gitlab.md +9 -1
  213. package/dist/docs/guides/grokbot-agents.html +35 -35
  214. package/dist/docs/guides/hooks.html +35 -35
  215. package/dist/docs/guides/improve.html +35 -35
  216. package/dist/docs/guides/jev.html +35 -35
  217. package/dist/docs/guides/mcp-oauth.html +35 -35
  218. package/dist/docs/guides/migrate.html +66 -0
  219. package/dist/docs/guides/migrate.md +122 -0
  220. package/dist/docs/guides/opentelemetry.html +35 -35
  221. package/dist/docs/guides/slack.html +35 -35
  222. package/dist/docs/guides/webhooks.html +35 -35
  223. package/dist/docs/hashmap.json +1 -1
  224. package/dist/docs/hillclimbing.html +35 -35
  225. package/dist/docs/index.html +35 -35
  226. package/dist/docs/llms-full.txt +214 -6
  227. package/dist/docs/llms.txt +1 -0
  228. package/dist/docs/quickstart.html +35 -35
  229. package/dist/docs/reference/agent-config.html +35 -35
  230. package/dist/docs/reference/artifacts.html +35 -35
  231. package/dist/docs/reference/channels.html +35 -35
  232. package/dist/docs/reference/cli.html +39 -38
  233. package/dist/docs/reference/cli.md +39 -0
  234. package/dist/docs/reference/connections.html +35 -35
  235. package/dist/docs/reference/evals.html +35 -35
  236. package/dist/docs/reference/extensions.html +35 -35
  237. package/dist/docs/reference/hooks.html +35 -35
  238. package/dist/docs/reference/http-api.html +35 -35
  239. package/dist/docs/reference/instructions.html +35 -35
  240. package/dist/docs/reference/playground.html +35 -35
  241. package/dist/docs/reference/project-layout.html +35 -35
  242. package/dist/docs/reference/prompt.html +35 -35
  243. package/dist/docs/reference/schedules.html +35 -35
  244. package/dist/docs/reference/sessions.html +35 -35
  245. package/dist/docs/reference/skills.html +38 -38
  246. package/dist/docs/reference/subagents.html +35 -35
  247. package/dist/docs/reference/tools.html +35 -35
  248. package/dist/docs/templates/agentic-owners.html +35 -35
  249. package/dist/docs/templates/grokbot-agents.html +35 -35
  250. package/dist/docs/templates/security-reviewer.html +35 -35
  251. package/dist/docs/templates/thermo-quality-review.html +35 -35
  252. package/dist/docs/templates/thermo-review.html +35 -35
  253. package/dist/docs/templates/triage.html +35 -35
  254. package/dist/docs/troubleshooting.html +36 -36
  255. package/dist/docs/troubleshooting.md +1 -0
  256. package/dist/evals/assertions.js +20 -34
  257. package/dist/evals/expect.js +3 -6
  258. package/dist/evals/judge.js +5 -8
  259. package/dist/evals/loaders.js +45 -62
  260. package/dist/evals/matchers.js +2 -3
  261. package/dist/evals/reporters.js +43 -67
  262. package/dist/evals/results.js +1 -1
  263. package/dist/evals/run-facts.js +5 -6
  264. package/dist/evals.js +27 -15
  265. package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
  266. package/dist/extensions/cursor-cloud-agents/lib/backend.js +100 -126
  267. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
  268. package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
  269. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
  270. package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
  271. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
  272. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
  273. package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
  274. package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
  275. package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
  276. package/dist/extensions/cursor-cloud-agents/tools/list.js +8 -19
  277. package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
  278. package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
  279. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  280. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
  281. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
  282. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
  283. package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
  284. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
  285. package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
  286. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
  287. package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
  288. package/dist/extensions/jev/extension.js +3 -3
  289. package/dist/extensions/jev/lib/evaluate.js +43 -60
  290. package/dist/extensions/jev/tools/evaluate.js +6 -17
  291. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  292. package/dist/extensions.js +3 -5
  293. package/dist/files-backends/cursor-hosted.js +504 -523
  294. package/dist/files-backends/local-fs.js +72 -134
  295. package/dist/files.js +3 -3
  296. package/dist/filesystem.js +562 -861
  297. package/dist/index.js +16 -35
  298. package/dist/internal/advertise-tools.js +74 -86
  299. package/dist/internal/artifacts-store.js +298 -361
  300. package/dist/internal/as-of.js +2 -4
  301. package/dist/internal/authored-alias-hooks.js +6 -4
  302. package/dist/internal/authored-loaders.js +37 -52
  303. package/dist/internal/bounded-int.js +1 -2
  304. package/dist/internal/bounded.js +13 -24
  305. package/dist/internal/brand.js +1 -1
  306. package/dist/internal/browser-origin-guard.js +4 -4
  307. package/dist/internal/builtin-tools/artifacts.js +15 -27
  308. package/dist/internal/builtin-tools/index.js +2 -3
  309. package/dist/internal/builtin-tools/reminders.js +33 -52
  310. package/dist/internal/channel-architecture.d.ts +21 -0
  311. package/dist/internal/channel-architecture.d.ts.map +1 -0
  312. package/dist/internal/channel-architecture.js +41 -0
  313. package/dist/internal/channel-dispatch.js +3 -4
  314. package/dist/internal/channel-route-dispatch.js +40 -51
  315. package/dist/internal/channel-state.js +1 -1
  316. package/dist/internal/chat-client.js +319 -340
  317. package/dist/internal/cli-ax.js +1262 -1294
  318. package/dist/internal/cli-bitbucket.js +244 -272
  319. package/dist/internal/cli-convert-automation.js +137 -151
  320. package/dist/internal/cli-cursor.js +126 -147
  321. package/dist/internal/cli-deploy.d.ts.map +1 -1
  322. package/dist/internal/cli-deploy.js +1457 -1507
  323. package/dist/internal/cli-docs.js +130 -147
  324. package/dist/internal/cli-github.js +437 -476
  325. package/dist/internal/cli-gitlab.js +259 -288
  326. package/dist/internal/cli-images.js +266 -334
  327. package/dist/internal/cli-manifest.js +25 -37
  328. package/dist/internal/cli-mcp-oauth.js +228 -247
  329. package/dist/internal/cli-mcp.js +358 -383
  330. package/dist/internal/cli-migrate.js +73 -90
  331. package/dist/internal/cli-skills.js +35 -47
  332. package/dist/internal/cli-slack-manual.d.ts +0 -1
  333. package/dist/internal/cli-slack-manual.d.ts.map +1 -1
  334. package/dist/internal/cli-slack-manual.js +175 -204
  335. package/dist/internal/cli-slack.d.ts +1 -1
  336. package/dist/internal/cli-slack.d.ts.map +1 -1
  337. package/dist/internal/cli-slack.js +416 -456
  338. package/dist/internal/cloud-merge.js +7 -3
  339. package/dist/internal/cloud-turn-cost.js +8 -1
  340. package/dist/internal/connection-env.js +5 -6
  341. package/dist/internal/continuation-channel.js +10 -7
  342. package/dist/internal/continuation-identity.js +85 -67
  343. package/dist/internal/conversation-mirror.js +112 -131
  344. package/dist/internal/convert-automation/convert-workflow.js +21 -31
  345. package/dist/internal/cron.js +3 -3
  346. package/dist/internal/cursor/account-mcp.js +147 -146
  347. package/dist/internal/cursor/backend-client.js +290 -320
  348. package/dist/internal/cursor/bound-secret-file.js +3 -3
  349. package/dist/internal/cursor/credentials.js +127 -142
  350. package/dist/internal/cursor/cursor-api-transport.js +4 -8
  351. package/dist/internal/cursor/github-credentials.js +91 -108
  352. package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
  353. package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
  354. package/dist/internal/cursor/hosted-store-secrets.js +5 -9
  355. package/dist/internal/cursor/session-token.js +36 -48
  356. package/dist/internal/cursor/store-api-client.js +77 -92
  357. package/dist/internal/cursor-account-mcp-auth.js +132 -149
  358. package/dist/internal/cursor-agent-template.js +1 -1
  359. package/dist/internal/cursor-deployment-relay.js +33 -54
  360. package/dist/internal/cursor-event-relay.js +65 -59
  361. package/dist/internal/cursor-relay-core.js +258 -286
  362. package/dist/internal/deferred-channel-session.js +3 -12
  363. package/dist/internal/deploy-client.js +410 -475
  364. package/dist/internal/deploy-manifest.d.ts +17 -0
  365. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  366. package/dist/internal/deploy-manifest.js +71 -21
  367. package/dist/internal/deploy-source.js +31 -43
  368. package/dist/internal/discovery/agent-config.js +45 -59
  369. package/dist/internal/discovery/agent.js +276 -280
  370. package/dist/internal/discovery/channels.js +67 -80
  371. package/dist/internal/discovery/connections.js +286 -296
  372. package/dist/internal/discovery/context.js +2 -13
  373. package/dist/internal/discovery/cursor-plugin.js +223 -259
  374. package/dist/internal/discovery/extension-overlay.js +104 -131
  375. package/dist/internal/discovery/extensions.js +276 -281
  376. package/dist/internal/discovery/fs.js +56 -79
  377. package/dist/internal/discovery/hooks.js +39 -50
  378. package/dist/internal/discovery/info.js +17 -19
  379. package/dist/internal/discovery/instructions.js +58 -71
  380. package/dist/internal/discovery/modules.js +45 -58
  381. package/dist/internal/discovery/project.d.ts.map +1 -1
  382. package/dist/internal/discovery/project.js +192 -215
  383. package/dist/internal/discovery/reminders.js +41 -52
  384. package/dist/internal/discovery/runtime.js +1 -1
  385. package/dist/internal/discovery/schedules.js +71 -82
  386. package/dist/internal/discovery/seed-files.js +21 -32
  387. package/dist/internal/discovery/services.js +74 -96
  388. package/dist/internal/discovery/skills.js +77 -94
  389. package/dist/internal/discovery/subagent.js +79 -95
  390. package/dist/internal/discovery/tools.js +12 -23
  391. package/dist/internal/distribution.js +2 -2
  392. package/dist/internal/docs-site.js +30 -45
  393. package/dist/internal/duration.js +1 -1
  394. package/dist/internal/env-file.js +48 -64
  395. package/dist/internal/eval-judge-model.js +17 -28
  396. package/dist/internal/eval-run-store.js +265 -254
  397. package/dist/internal/eval-runner.d.ts +8 -0
  398. package/dist/internal/eval-runner.d.ts.map +1 -1
  399. package/dist/internal/eval-runner.js +406 -408
  400. package/dist/internal/eval-transport.d.ts +24 -0
  401. package/dist/internal/eval-transport.d.ts.map +1 -0
  402. package/dist/internal/eval-transport.js +22 -0
  403. package/dist/internal/evals-client.js +242 -246
  404. package/dist/internal/event-log.js +72 -120
  405. package/dist/internal/event-mapper.js +30 -31
  406. package/dist/internal/factory-resource-channel.js +16 -30
  407. package/dist/internal/filesystem/errors.js +6 -6
  408. package/dist/internal/filesystem/format.js +10 -13
  409. package/dist/internal/filesystem/merge.js +52 -94
  410. package/dist/internal/filesystem/nearest.js +15 -27
  411. package/dist/internal/filesystem/scratch.js +65 -85
  412. package/dist/internal/filesystem/tools.js +221 -241
  413. package/dist/internal/filesystem/walk.js +76 -143
  414. package/dist/internal/framework-file-storage.js +118 -139
  415. package/dist/internal/framework-storage-selection.js +21 -13
  416. package/dist/internal/frontmatter.js +4 -6
  417. package/dist/internal/github-fanout.js +50 -64
  418. package/dist/internal/guest-network.js +96 -109
  419. package/dist/internal/handleAgentServeTrigger.js +121 -126
  420. package/dist/internal/host-files.js +73 -88
  421. package/dist/internal/host-kv.js +21 -36
  422. package/dist/internal/host-otel.js +22 -19
  423. package/dist/internal/host-platforms.js +49 -63
  424. package/dist/internal/hosted-catch-protocol.d.ts +1 -0
  425. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  426. package/dist/internal/hosted-catch-protocol.js +1 -0
  427. package/dist/internal/hosted-catch.d.ts +5 -3
  428. package/dist/internal/hosted-catch.d.ts.map +1 -1
  429. package/dist/internal/hosted-catch.js +84 -93
  430. package/dist/internal/hosted-delivery-protocol.js +32 -8
  431. package/dist/internal/hosted-delivery.d.ts +13 -1
  432. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  433. package/dist/internal/hosted-delivery.js +614 -584
  434. package/dist/internal/hosted-eval-cases.d.ts +21 -0
  435. package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
  436. package/dist/internal/hosted-eval-cases.js +162 -0
  437. package/dist/internal/hosted-execution-diag.js +38 -30
  438. package/dist/internal/hosted-execution-flush.js +75 -66
  439. package/dist/internal/hosted-execution-latency.js +16 -8
  440. package/dist/internal/hosted-managed-automation.js +2 -2
  441. package/dist/internal/hosting.js +2 -3
  442. package/dist/internal/http-channel-define.js +4 -1
  443. package/dist/internal/http-channel.js +101 -112
  444. package/dist/internal/http-control-plane-session.d.ts +18 -1
  445. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  446. package/dist/internal/http-control-plane-session.js +66 -32
  447. package/dist/internal/incoming-headers-to-fetch.js +1 -2
  448. package/dist/internal/init-interview.js +73 -93
  449. package/dist/internal/init-project.js +182 -214
  450. package/dist/internal/init-scaffold.js +10 -21
  451. package/dist/internal/inline-stdio-mcp.js +80 -86
  452. package/dist/internal/install-cursor-skills.js +231 -273
  453. package/dist/internal/legacy-command-guard.js +18 -31
  454. package/dist/internal/listen-port.js +34 -45
  455. package/dist/internal/local-control-plane.js +293 -307
  456. package/dist/internal/local-env.js +1 -1
  457. package/dist/internal/local-ingress.js +15 -9
  458. package/dist/internal/log-ring.js +1 -2
  459. package/dist/internal/logs-client.js +207 -227
  460. package/dist/internal/map-pool.js +24 -38
  461. package/dist/internal/mcp-endpoint.js +204 -180
  462. package/dist/internal/mcp-host.js +165 -168
  463. package/dist/internal/mcp-oauth-on-demand.js +170 -207
  464. package/dist/internal/mcp-oauth-persist.js +15 -29
  465. package/dist/internal/mcp-oauth.js +209 -266
  466. package/dist/internal/named-webhook-secret.d.ts +39 -0
  467. package/dist/internal/named-webhook-secret.d.ts.map +1 -0
  468. package/dist/internal/named-webhook-secret.js +47 -0
  469. package/dist/internal/open-browser.js +2 -3
  470. package/dist/internal/otel/collector.js +104 -68
  471. package/dist/internal/otel/config.js +24 -37
  472. package/dist/internal/otel/http.js +5 -7
  473. package/dist/internal/otel/mcp.js +3 -12
  474. package/dist/internal/otel/runtime.js +69 -83
  475. package/dist/internal/package-inline-stdio.js +57 -65
  476. package/dist/internal/peer-connections.js +9 -5
  477. package/dist/internal/platform-schedule-sync.js +39 -54
  478. package/dist/internal/platform-timers.js +176 -210
  479. package/dist/internal/playground/static.js +1 -2
  480. package/dist/internal/playground/toolchain.js +37 -53
  481. package/dist/internal/playground-proxy.js +230 -270
  482. package/dist/internal/process-memory-telemetry.js +33 -51
  483. package/dist/internal/prompt-context.js +3 -6
  484. package/dist/internal/reminder-control-plane-protocol.js +46 -13
  485. package/dist/internal/reminder-runner.js +770 -785
  486. package/dist/internal/reminder-schedule.js +1 -1
  487. package/dist/internal/reminder-store.js +57 -78
  488. package/dist/internal/request-error-status.js +1 -3
  489. package/dist/internal/request-headers.js +2 -2
  490. package/dist/internal/resolve-prod-target.js +119 -135
  491. package/dist/internal/resolved-connections.js +16 -6
  492. package/dist/internal/run-client.js +221 -229
  493. package/dist/internal/runtime-dispatch-runner.js +18 -43
  494. package/dist/internal/schedule-runner.js +49 -58
  495. package/dist/internal/scm/pr-url.js +7 -6
  496. package/dist/internal/sdk-runner.js +388 -363
  497. package/dist/internal/serve-restart.js +26 -39
  498. package/dist/internal/server.d.ts.map +1 -1
  499. package/dist/internal/server.js +1283 -1244
  500. package/dist/internal/session-cost.js +7 -9
  501. package/dist/internal/session-engine.d.ts +3 -1
  502. package/dist/internal/session-engine.d.ts.map +1 -1
  503. package/dist/internal/session-engine.js +2801 -2777
  504. package/dist/internal/session-links.js +12 -16
  505. package/dist/internal/session-run-log.js +134 -82
  506. package/dist/internal/session-store.js +133 -164
  507. package/dist/internal/sessions-client.js +97 -118
  508. package/dist/internal/skill-catalog.js +18 -23
  509. package/dist/internal/skills-sync.js +16 -30
  510. package/dist/internal/slack-provision-client.js +90 -116
  511. package/dist/internal/start-log-store.js +48 -67
  512. package/dist/internal/steering.js +1 -2
  513. package/dist/internal/storage-coordinator.js +160 -196
  514. package/dist/internal/store-mirror.js +16 -30
  515. package/dist/internal/stream-progress.js +6 -8
  516. package/dist/internal/terminal-style.js +3 -4
  517. package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
  518. package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
  519. package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
  520. package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
  521. package/dist/internal/tool-catalog.js +11 -5
  522. package/dist/internal/tool-result.js +1 -1
  523. package/dist/internal/trajectory.js +19 -22
  524. package/dist/internal/turn-cost.js +52 -62
  525. package/dist/internal/turn-governor.js +5 -8
  526. package/dist/internal/turn-lease-store.js +85 -105
  527. package/dist/internal/turn-outbox.js +28 -43
  528. package/dist/internal/update-check.js +231 -259
  529. package/dist/internal/v2-hosting.js +1 -2
  530. package/dist/internal/workspace-sync.js +25 -41
  531. package/dist/internal/workspace.js +111 -139
  532. package/dist/kv/memory-kv.js +27 -51
  533. package/dist/memory.js +106 -148
  534. package/dist/otel.js +5 -8
  535. package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
  536. package/dist/playground/assets/{index-Co4CUVTQ.js → index-JekUQERK.js} +45 -45
  537. package/dist/playground/index.html +2 -2
  538. package/dist/prompt.js +2 -4
  539. package/dist/storage-backends/cursor-hosted-v2.js +53 -83
  540. package/dist/storage-backends/cursor-hosted.js +105 -145
  541. package/dist/storage-backends/file-kv.js +100 -128
  542. package/dist/storage-protocol.js +3 -5
  543. package/dist/storage.js +17 -26
  544. package/dist/types.d.ts +68 -0
  545. package/dist/types.d.ts.map +1 -1
  546. package/dist/types.js +20 -18
  547. package/docs/building-with-agents.md +2 -0
  548. package/docs/deployment.md +7 -0
  549. package/docs/guides/bitbucket.md +9 -1
  550. package/docs/guides/github.md +20 -4
  551. package/docs/guides/gitlab.md +9 -1
  552. package/docs/guides/migrate.md +127 -0
  553. package/docs/reference/cli.md +39 -0
  554. package/docs/troubleshooting.md +1 -0
  555. package/package.json +1 -1
  556. package/skills/debug/SKILL.md +1 -0
  557. package/skills/github/SKILL.md +23 -0
  558. package/skills/migrate-v2/SKILL.md +51 -10
  559. package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
  560. package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
  561. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
  562. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
  563. package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
  564. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
  565. package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
  566. package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
  567. package/dist/playground/assets/index-C1g_PTTZ.css +0 -1
  568. /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
  569. /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
  570. /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
  }