@cursor/bdk 0.2.2 → 0.2.4

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 (697) hide show
  1. package/AGENTS.md +1 -1
  2. package/dist/bin/agent-serve.js +32 -8
  3. package/dist/channels/github/auth.d.ts.map +1 -1
  4. package/dist/channels/github/auth.js +36 -5
  5. package/dist/channels/slack/attachments.d.ts +2 -1
  6. package/dist/channels/slack/attachments.d.ts.map +1 -1
  7. package/dist/channels/slack/attachments.js +19 -9
  8. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  9. package/dist/channels/slack/dispatch.js +26 -24
  10. package/dist/channels/slack/thread-context.d.ts +21 -11
  11. package/dist/channels/slack/thread-context.d.ts.map +1 -1
  12. package/dist/channels/slack/thread-context.js +75 -27
  13. package/dist/connections.d.ts +1 -1
  14. package/dist/connections.js +1 -1
  15. package/dist/docs/404.html +2 -2
  16. package/dist/docs/assets/{app.DtYVVVyK.js → app.4kQ8Db_q.js} +4 -4
  17. package/dist/docs/assets/chunks/@localSearchIndexroot.CvuAJ0My.js +1 -0
  18. package/dist/docs/assets/chunks/{VPLocalSearchBox.D47xT7J4.js → VPLocalSearchBox.DY1RwB8Q.js} +1 -1
  19. package/dist/docs/assets/chunks/{arc.CDJ6xzxR.js → arc.CxE_fSPK.js} +1 -1
  20. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.l1Xnjd3N.js → architectureDiagram-Q4EWVU46.CPX426ui.js} +1 -1
  21. package/dist/docs/assets/chunks/{baseUniq.x-finShZ.js → baseUniq.CB52JrKG.js} +1 -1
  22. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.COC3qynH.js → blockDiagram-DXYQGD6D.J0cNaQCL.js} +1 -1
  23. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.DdQO850E.js → c4Diagram-AHTNJAMY.DJn3vEGT.js} +1 -1
  24. package/dist/docs/assets/chunks/channel.BoNycAoN.js +1 -0
  25. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.Dpn8omLk.js → chunk-4BX2VUAB.Dao618F6.js} +1 -1
  26. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.C0XWStUN.js → chunk-4TB4RGXK.QW8Rhjai.js} +1 -1
  27. package/dist/docs/assets/chunks/{chunk-55IACEB6.DsKSZfIM.js → chunk-55IACEB6.DfRLLKF_.js} +1 -1
  28. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.dNU6JDu6.js → chunk-EDXVE4YY.CIV2ApKQ.js} +1 -1
  29. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DN41fxKE.js → chunk-FMBD7UC4.BEheSuxp.js} +1 -1
  30. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.COpKCZus.js → chunk-OYMX7WX6.CUN88ENB.js} +1 -1
  31. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.HDB-azx2.js → chunk-QZHKN3VN.CgqCs8b_.js} +1 -1
  32. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.DEeX_a2j.js → chunk-YZCP3GAM.iCH0nnTJ.js} +1 -1
  33. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C4x07Gkj.js +1 -0
  34. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C4x07Gkj.js +1 -0
  35. package/dist/docs/assets/chunks/clone.Db22cH_-.js +1 -0
  36. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.C3yGL2A8.js → cose-bilkent-S5V4N54A.BLcUxhWE.js} +1 -1
  37. package/dist/docs/assets/chunks/{dagre-KV5264BT.Bpl24en4.js → dagre-KV5264BT.Ep7LofOm.js} +1 -1
  38. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.nFco6seU.js → diagram-5BDNPKRD.Bzf4GSQ4.js} +1 -1
  39. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DXhA6DWR.js → diagram-G4DWMVQ6.DD6Jh-eM.js} +1 -1
  40. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.8GoOYcwk.js → diagram-MMDJMWI5.oOIl8bWd.js} +1 -1
  41. package/dist/docs/assets/chunks/{diagram-TYMM5635.DDBlqvlJ.js → diagram-TYMM5635.DHs85Ade.js} +1 -1
  42. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.vl_N81P4.js → erDiagram-SMLLAGMA.BIb5ghCk.js} +1 -1
  43. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.Cteg8g7I.js → flowDiagram-DWJPFMVM.DV4paY9k.js} +1 -1
  44. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.D4aMhlMM.js → ganttDiagram-T4ZO3ILL.AyEKA6_v.js} +1 -1
  45. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DF_J0D4q.js → gitGraphDiagram-UUTBAWPF.BltiCDFo.js} +1 -1
  46. package/dist/docs/assets/chunks/{graph.DJs0LDCf.js → graph.DzuEYGdC.js} +1 -1
  47. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.Bb-4RQwg.js → infoDiagram-42DDH7IO.BV2l981J.js} +1 -1
  48. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DEtQRSbc.js → ishikawaDiagram-UXIWVN3A.BA4Izf-m.js} +1 -1
  49. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.DhQQ75FA.js → journeyDiagram-VCZTEJTY.DjaFbFS3.js} +1 -1
  50. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.C4gEw3Rk.js → kanban-definition-6JOO6SKY.CfTFieDs.js} +1 -1
  51. package/dist/docs/assets/chunks/{layout.DT-PGlXa.js → layout.DzfWqTBV.js} +1 -1
  52. package/dist/docs/assets/chunks/{linear.BMMe__JW.js → linear.BO6mpulV.js} +1 -1
  53. package/dist/docs/assets/chunks/{min.XyaU9K9Q.js → min.BGgTadgT.js} +1 -1
  54. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CbBM6xZ-.js → mindmap-definition-QFDTVHPH.DPuIXVWY.js} +1 -1
  55. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DFJoIVou.js → pieDiagram-DEJITSTG.BOnl3bBg.js} +1 -1
  56. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CQjkDYqb.js → quadrantDiagram-34T5L4WZ.DNB6Ckdc.js} +1 -1
  57. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.D-mK-JQu.js → requirementDiagram-MS252O5E.D5-Qo7vb.js} +1 -1
  58. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BStQInpd.js → sankeyDiagram-XADWPNL6.8t65cesf.js} +1 -1
  59. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.CA_eooPJ.js → sequenceDiagram-FGHM5R23.CaG07BdS.js} +1 -1
  60. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.BXl-b7ad.js → stateDiagram-FHFEXIEX.TKOweTB6.js} +1 -1
  61. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CuqmyQc4.js +1 -0
  62. package/dist/docs/assets/chunks/{theme.q37tOs4x.js → theme.Dx-JhpTB.js} +2 -2
  63. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.vjuaGOSe.js → timeline-definition-GMOUNBTQ.fE53zQ2s.js} +1 -1
  64. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BxduJl-F.js → vennDiagram-DHZGUBPP.DJsZZaJg.js} +1 -1
  65. package/dist/docs/assets/chunks/wardley-RL74JXVD.844kyrjl.js +162 -0
  66. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D1z3ds0D.js → wardleyDiagram-NUSXRM2D.CMZ-Ru_t.js} +1 -1
  67. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CRU5Ti9b.js → xychartDiagram-5P7HB3ND.XXrhBc7a.js} +1 -1
  68. package/dist/docs/assets/{deployment.md.nGo1yIsa.js → deployment.md.UhnJIMr-.js} +6 -9
  69. package/dist/docs/assets/{deployment.md.nGo1yIsa.lean.js → deployment.md.UhnJIMr-.lean.js} +1 -1
  70. package/dist/docs/assets/{guides_github.md.C2_DSWlE.js → guides_github.md.Bq9kQU9B.js} +9 -3
  71. package/dist/docs/assets/{guides_github.md.C2_DSWlE.lean.js → guides_github.md.Bq9kQU9B.lean.js} +1 -1
  72. package/dist/docs/assets/{guides_jev.md.BNDm14Gy.js → guides_jev.md.CRcgmjDb.js} +2 -2
  73. package/dist/docs/assets/{guides_jev.md.BNDm14Gy.lean.js → guides_jev.md.CRcgmjDb.lean.js} +1 -1
  74. package/dist/docs/assets/{guides_slack.md.ZbHQETOT.js → guides_slack.md.diqqXTTm.js} +2 -2
  75. package/dist/docs/assets/{guides_slack.md.ZbHQETOT.lean.js → guides_slack.md.diqqXTTm.lean.js} +1 -1
  76. package/dist/docs/assets/{quickstart.md.wG4shE1f.js → quickstart.md.CHpHPBUN.js} +5 -3
  77. package/dist/docs/assets/{quickstart.md.wG4shE1f.lean.js → quickstart.md.CHpHPBUN.lean.js} +1 -1
  78. package/dist/docs/assets/{reference_agent-config.md.DzGI777n.js → reference_agent-config.md.Cj5uBKp4.js} +1 -1
  79. package/dist/docs/assets/{reference_artifacts.md.CFMNPreZ.js → reference_artifacts.md.CQfKq8F2.js} +1 -1
  80. package/dist/docs/assets/reference_cli.md.DgeLTO18.js +91 -0
  81. package/dist/docs/assets/reference_cli.md.DgeLTO18.lean.js +1 -0
  82. package/dist/docs/assets/{reference_connections.md._XpKiOaF.js → reference_connections.md.COq--gAm.js} +7 -3
  83. package/dist/docs/assets/{reference_connections.md._XpKiOaF.lean.js → reference_connections.md.COq--gAm.lean.js} +1 -1
  84. package/dist/docs/assets/{reference_evals.md.DqNyHMA6.js → reference_evals.md.CJm3uCUm.js} +4 -4
  85. package/dist/docs/assets/{reference_evals.md.DqNyHMA6.lean.js → reference_evals.md.CJm3uCUm.lean.js} +1 -1
  86. package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.js → reference_extensions.md.pa2tN-e4.js} +4 -3
  87. package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.lean.js → reference_extensions.md.pa2tN-e4.lean.js} +1 -1
  88. package/dist/docs/assets/{reference_skills.md.CRFTxt9M.js → reference_skills.md.Cy00QMKS.js} +3 -3
  89. package/dist/docs/assets/{reference_skills.md.CRFTxt9M.lean.js → reference_skills.md.Cy00QMKS.lean.js} +1 -1
  90. package/dist/docs/assets/troubleshooting.md.Cw5PKa3t.js +1 -0
  91. package/dist/docs/assets/{troubleshooting.md.BzZSu1Gz.lean.js → troubleshooting.md.Cw5PKa3t.lean.js} +1 -1
  92. package/dist/docs/building-with-agents.html +35 -35
  93. package/dist/docs/deployment.html +41 -44
  94. package/dist/docs/deployment.md +49 -16
  95. package/dist/docs/evals.html +35 -35
  96. package/dist/docs/guides/agent-to-agent.html +35 -35
  97. package/dist/docs/guides/bitbucket.html +35 -35
  98. package/dist/docs/guides/cloud-agents.html +35 -35
  99. package/dist/docs/guides/convert-automation.html +35 -35
  100. package/dist/docs/guides/github.html +43 -37
  101. package/dist/docs/guides/github.md +34 -0
  102. package/dist/docs/guides/gitlab.html +35 -35
  103. package/dist/docs/guides/grokbot-agents.html +35 -35
  104. package/dist/docs/guides/hooks.html +35 -35
  105. package/dist/docs/guides/improve.html +35 -35
  106. package/dist/docs/guides/jev.html +37 -37
  107. package/dist/docs/guides/jev.md +7 -0
  108. package/dist/docs/guides/mcp-oauth.html +35 -35
  109. package/dist/docs/guides/opentelemetry.html +35 -35
  110. package/dist/docs/guides/slack.html +37 -37
  111. package/dist/docs/guides/slack.md +5 -0
  112. package/dist/docs/guides/webhooks.html +35 -35
  113. package/dist/docs/hashmap.json +1 -1
  114. package/dist/docs/hillclimbing.html +35 -35
  115. package/dist/docs/index.html +35 -35
  116. package/dist/docs/llms-full.txt +223 -94
  117. package/dist/docs/quickstart.html +40 -38
  118. package/dist/docs/quickstart.md +7 -1
  119. package/dist/docs/reference/agent-config.html +37 -37
  120. package/dist/docs/reference/agent-config.md +1 -1
  121. package/dist/docs/reference/artifacts.html +37 -37
  122. package/dist/docs/reference/artifacts.md +1 -1
  123. package/dist/docs/reference/channels.html +35 -35
  124. package/dist/docs/reference/cli.html +55 -61
  125. package/dist/docs/reference/cli.md +65 -63
  126. package/dist/docs/reference/connections.html +42 -38
  127. package/dist/docs/reference/connections.md +28 -2
  128. package/dist/docs/reference/evals.html +39 -39
  129. package/dist/docs/reference/evals.md +6 -7
  130. package/dist/docs/reference/extensions.html +39 -38
  131. package/dist/docs/reference/extensions.md +13 -0
  132. package/dist/docs/reference/hooks.html +35 -35
  133. package/dist/docs/reference/http-api.html +35 -35
  134. package/dist/docs/reference/instructions.html +35 -35
  135. package/dist/docs/reference/playground.html +35 -35
  136. package/dist/docs/reference/project-layout.html +35 -35
  137. package/dist/docs/reference/prompt.html +35 -35
  138. package/dist/docs/reference/schedules.html +35 -35
  139. package/dist/docs/reference/sessions.html +35 -35
  140. package/dist/docs/reference/skills.html +38 -38
  141. package/dist/docs/reference/subagents.html +35 -35
  142. package/dist/docs/reference/tools.html +35 -35
  143. package/dist/docs/templates/agentic-owners.html +35 -35
  144. package/dist/docs/templates/security-reviewer.html +35 -35
  145. package/dist/docs/templates/thermo-quality-review.html +35 -35
  146. package/dist/docs/templates/thermo-review.html +35 -35
  147. package/dist/docs/templates/triage.html +35 -35
  148. package/dist/docs/troubleshooting.html +36 -36
  149. package/dist/docs/troubleshooting.md +7 -3
  150. package/dist/extensions/cursor-grokbot-agents/extension.d.ts +77 -0
  151. package/dist/extensions/cursor-grokbot-agents/extension.d.ts.map +1 -0
  152. package/dist/extensions/cursor-grokbot-agents/extension.js +63 -0
  153. package/dist/extensions/cursor-grokbot-agents/lib/agents.d.ts +11 -0
  154. package/dist/extensions/cursor-grokbot-agents/lib/agents.d.ts.map +1 -0
  155. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +31 -0
  156. package/dist/extensions/cursor-grokbot-agents/lib/backend.d.ts +56 -0
  157. package/dist/extensions/cursor-grokbot-agents/lib/backend.d.ts.map +1 -0
  158. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +158 -0
  159. package/dist/extensions/cursor-grokbot-agents/lib/contacts.d.ts +28 -0
  160. package/dist/extensions/cursor-grokbot-agents/lib/contacts.d.ts.map +1 -0
  161. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +59 -0
  162. package/dist/extensions/cursor-grokbot-agents/lib/conversation.d.ts +53 -0
  163. package/dist/extensions/cursor-grokbot-agents/lib/conversation.d.ts.map +1 -0
  164. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +206 -0
  165. package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts +4 -0
  166. package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts.map +1 -0
  167. package/dist/extensions/cursor-grokbot-agents/lib/inputs.js +15 -0
  168. package/dist/extensions/cursor-grokbot-agents/lib/lock.d.ts +12 -0
  169. package/dist/extensions/cursor-grokbot-agents/lib/lock.d.ts.map +1 -0
  170. package/dist/extensions/cursor-grokbot-agents/lib/lock.js +25 -0
  171. package/dist/extensions/cursor-grokbot-agents/skills/consult.md +40 -0
  172. package/dist/extensions/cursor-grokbot-agents/tools/ask.d.ts +4 -0
  173. package/dist/extensions/cursor-grokbot-agents/tools/ask.d.ts.map +1 -0
  174. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +37 -0
  175. package/dist/extensions/cursor-grokbot-agents/tools/check.d.ts +4 -0
  176. package/dist/extensions/cursor-grokbot-agents/tools/check.d.ts.map +1 -0
  177. package/dist/extensions/cursor-grokbot-agents/tools/check.js +32 -0
  178. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.d.ts +4 -0
  179. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.d.ts.map +1 -0
  180. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +24 -0
  181. package/dist/extensions/cursor-grokbot-agents/tools/list.d.ts +4 -0
  182. package/dist/extensions/cursor-grokbot-agents/tools/list.d.ts.map +1 -0
  183. package/dist/extensions/cursor-grokbot-agents/tools/list.js +34 -0
  184. package/dist/extensions/jev/extension.d.ts +3 -0
  185. package/dist/extensions/jev/extension.d.ts.map +1 -1
  186. package/dist/extensions/jev/extension.js +10 -1
  187. package/dist/extensions/jev/lib/evaluate.d.ts +4 -0
  188. package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -1
  189. package/dist/extensions/jev/lib/evaluate.js +6 -2
  190. package/dist/extensions.d.ts +4 -2
  191. package/dist/extensions.d.ts.map +1 -1
  192. package/dist/extensions.js +5 -2
  193. package/dist/internal/cli-ax.d.ts +1 -0
  194. package/dist/internal/cli-ax.d.ts.map +1 -1
  195. package/dist/internal/cli-ax.js +43 -10
  196. package/dist/internal/cli-deploy.d.ts +5 -1
  197. package/dist/internal/cli-deploy.d.ts.map +1 -1
  198. package/dist/internal/cli-deploy.js +41 -9
  199. package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
  200. package/dist/internal/cli-mcp-oauth.js +2 -1
  201. package/dist/internal/cli-skills.d.ts +1 -1
  202. package/dist/internal/cli-skills.d.ts.map +1 -1
  203. package/dist/internal/cli-skills.js +5 -5
  204. package/dist/internal/connection-env.d.ts +31 -0
  205. package/dist/internal/connection-env.d.ts.map +1 -0
  206. package/dist/internal/connection-env.js +84 -0
  207. package/dist/internal/cursor/backend-client.js +5 -0
  208. package/dist/internal/deploy-client.d.ts +30 -6
  209. package/dist/internal/deploy-client.d.ts.map +1 -1
  210. package/dist/internal/deploy-client.js +45 -9
  211. package/dist/internal/discovery/agent-config.d.ts +6 -5
  212. package/dist/internal/discovery/agent-config.d.ts.map +1 -1
  213. package/dist/internal/discovery/agent-config.js +29 -28
  214. package/dist/internal/discovery/agent.js +1 -1
  215. package/dist/internal/discovery/connections.d.ts.map +1 -1
  216. package/dist/internal/discovery/connections.js +11 -0
  217. package/dist/internal/discovery/extensions.d.ts.map +1 -1
  218. package/dist/internal/discovery/extensions.js +12 -0
  219. package/dist/internal/hosted-delivery-protocol.d.ts +36 -11
  220. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  221. package/dist/internal/hosted-delivery-protocol.js +31 -8
  222. package/dist/internal/hosted-delivery.d.ts +2 -2
  223. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  224. package/dist/internal/hosted-delivery.js +228 -48
  225. package/dist/internal/hosting.d.ts +10 -2
  226. package/dist/internal/hosting.d.ts.map +1 -1
  227. package/dist/internal/hosting.js +33 -3
  228. package/dist/internal/install-cursor-skills.d.ts +20 -24
  229. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  230. package/dist/internal/install-cursor-skills.js +50 -48
  231. package/dist/internal/legacy-command-guard.d.ts +2 -0
  232. package/dist/internal/legacy-command-guard.d.ts.map +1 -1
  233. package/dist/internal/legacy-command-guard.js +10 -1
  234. package/dist/internal/mcp-host.d.ts +6 -0
  235. package/dist/internal/mcp-host.d.ts.map +1 -1
  236. package/dist/internal/mcp-host.js +35 -16
  237. package/dist/internal/sdk-runner.d.ts +2 -0
  238. package/dist/internal/sdk-runner.d.ts.map +1 -1
  239. package/dist/internal/sdk-runner.js +10 -0
  240. package/dist/internal/server.d.ts.map +1 -1
  241. package/dist/internal/server.js +11 -1
  242. package/dist/internal/session-engine.d.ts.map +1 -1
  243. package/dist/internal/session-engine.js +9 -5
  244. package/dist/types.d.ts +29 -3
  245. package/dist/types.d.ts.map +1 -1
  246. package/docs/deployment.md +49 -16
  247. package/docs/guides/github.md +34 -0
  248. package/docs/guides/jev.md +7 -0
  249. package/docs/guides/slack.md +5 -0
  250. package/docs/quickstart.md +7 -1
  251. package/docs/reference/agent-config.md +1 -1
  252. package/docs/reference/artifacts.md +1 -1
  253. package/docs/reference/cli.md +65 -63
  254. package/docs/reference/connections.md +28 -2
  255. package/docs/reference/evals.md +6 -7
  256. package/docs/reference/extensions.md +13 -0
  257. package/docs/troubleshooting.md +7 -3
  258. package/package.json +1 -11
  259. package/scripts/install-cursor-skills.mjs +1 -1
  260. package/skills/create-agent/SKILL.md +1 -1
  261. package/skills/debug/SKILL.md +1 -1
  262. package/skills/deploy/SKILL.md +1 -1
  263. package/skills/evals/SKILL.md +1 -1
  264. package/skills/framework-map/SKILL.md +1 -1
  265. package/skills/github/SKILL.md +1 -1
  266. package/skills/hillclimb/SKILL.md +1 -1
  267. package/skills/mcp-auth/SKILL.md +1 -1
  268. package/skills/otel/SKILL.md +1 -1
  269. package/skills/setup-slack/SKILL.md +1 -1
  270. package/templates/agents-md/bot/lib/collect.ts +1 -4
  271. package/templates/code-wiki/bot/channels/github.ts +2 -2
  272. package/templates/demo/bot/channels/github.ts +5 -1
  273. package/templates/pr-autofixer/bot/lib/start-drive.ts +4 -4
  274. package/templates/triage/bot/lib/types.ts +6 -6
  275. package/dist/docs/assets/chunks/@localSearchIndexroot.BgTA2tV1.js +0 -1
  276. package/dist/docs/assets/chunks/channel.B2nMEx82.js +0 -1
  277. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D8iCH2ve.js +0 -1
  278. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D8iCH2ve.js +0 -1
  279. package/dist/docs/assets/chunks/clone.5XNLjby0.js +0 -1
  280. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.yGM2uLZQ.js +0 -1
  281. package/dist/docs/assets/chunks/wardley-RL74JXVD.DKfyIejL.js +0 -162
  282. package/dist/docs/assets/reference_cli.md.BK2QUH67.js +0 -97
  283. package/dist/docs/assets/reference_cli.md.BK2QUH67.lean.js +0 -1
  284. package/dist/docs/assets/troubleshooting.md.BzZSu1Gz.js +0 -1
  285. package/src/artifacts.ts +0 -68
  286. package/src/bin/agent-serve.ts +0 -1833
  287. package/src/channels/bitbucket/api.ts +0 -891
  288. package/src/channels/bitbucket/binding.ts +0 -417
  289. package/src/channels/bitbucket/bitbucket-channel.ts +0 -162
  290. package/src/channels/bitbucket/bitbucket-webhook.ts +0 -519
  291. package/src/channels/bitbucket/checks.ts +0 -146
  292. package/src/channels/bitbucket/cursor-account.ts +0 -106
  293. package/src/channels/bitbucket/defaults.ts +0 -100
  294. package/src/channels/bitbucket/events.ts +0 -74
  295. package/src/channels/bitbucket/index.ts +0 -51
  296. package/src/channels/bitbucket/replay.ts +0 -421
  297. package/src/channels/bitbucket/state.ts +0 -59
  298. package/src/channels/bitbucket/types.ts +0 -261
  299. package/src/channels/change-monitors/change-monitors-channel.ts +0 -63
  300. package/src/channels/change-monitors/index.ts +0 -8
  301. package/src/channels/change-monitors/types.ts +0 -42
  302. package/src/channels/checks.ts +0 -185
  303. package/src/channels/deployments/deployments-channel.ts +0 -224
  304. package/src/channels/deployments/index.ts +0 -25
  305. package/src/channels/deployments/types.ts +0 -92
  306. package/src/channels/github/api.ts +0 -526
  307. package/src/channels/github/auth.ts +0 -254
  308. package/src/channels/github/binding.ts +0 -233
  309. package/src/channels/github/checks.ts +0 -145
  310. package/src/channels/github/cursor-account.ts +0 -303
  311. package/src/channels/github/defaults.ts +0 -168
  312. package/src/channels/github/events.ts +0 -67
  313. package/src/channels/github/forward.ts +0 -359
  314. package/src/channels/github/github-channel.ts +0 -2334
  315. package/src/channels/github/index.ts +0 -54
  316. package/src/channels/github/progress.ts +0 -365
  317. package/src/channels/github/replay.ts +0 -372
  318. package/src/channels/github/state.ts +0 -124
  319. package/src/channels/github/types.ts +0 -590
  320. package/src/channels/gitlab/api.ts +0 -329
  321. package/src/channels/gitlab/binding.ts +0 -231
  322. package/src/channels/gitlab/checks.ts +0 -228
  323. package/src/channels/gitlab/cursor-account.ts +0 -105
  324. package/src/channels/gitlab/defaults.ts +0 -80
  325. package/src/channels/gitlab/events.ts +0 -37
  326. package/src/channels/gitlab/gitlab-channel.ts +0 -160
  327. package/src/channels/gitlab/gitlab-webhook.ts +0 -509
  328. package/src/channels/gitlab/index.ts +0 -44
  329. package/src/channels/gitlab/replay.ts +0 -328
  330. package/src/channels/gitlab/state.ts +0 -55
  331. package/src/channels/gitlab/types.ts +0 -247
  332. package/src/channels/issues/index.ts +0 -9
  333. package/src/channels/issues/issues-channel.ts +0 -45
  334. package/src/channels/issues/types.ts +0 -38
  335. package/src/channels/origin/api.ts +0 -507
  336. package/src/channels/origin/binding.ts +0 -114
  337. package/src/channels/origin/checks.ts +0 -250
  338. package/src/channels/origin/cursor-account.ts +0 -58
  339. package/src/channels/origin/defaults.ts +0 -140
  340. package/src/channels/origin/events.ts +0 -35
  341. package/src/channels/origin/index.ts +0 -35
  342. package/src/channels/origin/origin-channel.ts +0 -815
  343. package/src/channels/origin/origin-webhook.ts +0 -296
  344. package/src/channels/origin/reactions.ts +0 -72
  345. package/src/channels/origin/state.ts +0 -54
  346. package/src/channels/origin/types.ts +0 -295
  347. package/src/channels/slack/agentic-delivery.ts +0 -634
  348. package/src/channels/slack/agentic-posted.ts +0 -135
  349. package/src/channels/slack/agentic-signals.ts +0 -231
  350. package/src/channels/slack/api.ts +0 -761
  351. package/src/channels/slack/approvals.ts +0 -279
  352. package/src/channels/slack/assistant.ts +0 -76
  353. package/src/channels/slack/attachments.ts +0 -596
  354. package/src/channels/slack/auth.ts +0 -127
  355. package/src/channels/slack/blocks.ts +0 -131
  356. package/src/channels/slack/bot-mentions.ts +0 -318
  357. package/src/channels/slack/channel-watch.ts +0 -314
  358. package/src/channels/slack/cli-project.ts +0 -249
  359. package/src/channels/slack/code-fences.ts +0 -171
  360. package/src/channels/slack/constants.ts +0 -38
  361. package/src/channels/slack/credentials.ts +0 -88
  362. package/src/channels/slack/defaults.ts +0 -714
  363. package/src/channels/slack/dispatch.ts +0 -1060
  364. package/src/channels/slack/doctor.ts +0 -338
  365. package/src/channels/slack/eval-directive.ts +0 -306
  366. package/src/channels/slack/event-id-dedupe.ts +0 -30
  367. package/src/channels/slack/external-policy.ts +0 -75
  368. package/src/channels/slack/footer.ts +0 -106
  369. package/src/channels/slack/inbound.ts +0 -416
  370. package/src/channels/slack/index.ts +0 -53
  371. package/src/channels/slack/init.ts +0 -169
  372. package/src/channels/slack/interactive.ts +0 -406
  373. package/src/channels/slack/links.ts +0 -23
  374. package/src/channels/slack/live-delivery.ts +0 -489
  375. package/src/channels/slack/log.ts +0 -70
  376. package/src/channels/slack/manifest.ts +0 -240
  377. package/src/channels/slack/message-body.ts +0 -82
  378. package/src/channels/slack/nudge-carrier.ts +0 -224
  379. package/src/channels/slack/nudge-store.ts +0 -334
  380. package/src/channels/slack/paint-start.ts +0 -93
  381. package/src/channels/slack/placeholder.ts +0 -358
  382. package/src/channels/slack/pr-ref.ts +0 -74
  383. package/src/channels/slack/progress-delivery.ts +0 -138
  384. package/src/channels/slack/reasoning-card.ts +0 -125
  385. package/src/channels/slack/reasoning-chip.ts +0 -41
  386. package/src/channels/slack/recording-sink.ts +0 -167
  387. package/src/channels/slack/redact.ts +0 -6
  388. package/src/channels/slack/reply-options.ts +0 -279
  389. package/src/channels/slack/setup.ts +0 -125
  390. package/src/channels/slack/slack-channel.ts +0 -744
  391. package/src/channels/slack/socket-mode.ts +0 -140
  392. package/src/channels/slack/stop.ts +0 -25
  393. package/src/channels/slack/stream.ts +0 -66
  394. package/src/channels/slack/thread-context.ts +0 -485
  395. package/src/channels/slack/tool-approval-events.ts +0 -233
  396. package/src/channels/slack/tool-cards.ts +0 -198
  397. package/src/channels/slack/tool-chip.ts +0 -34
  398. package/src/channels/slack/types.ts +0 -787
  399. package/src/channels/slack/upload.ts +0 -137
  400. package/src/channels.ts +0 -543
  401. package/src/connections.ts +0 -153
  402. package/src/dashboard-session-url.ts +0 -30
  403. package/src/evals/assertions.ts +0 -688
  404. package/src/evals/expect.ts +0 -250
  405. package/src/evals/judge.ts +0 -329
  406. package/src/evals/loaders.ts +0 -111
  407. package/src/evals/matchers.ts +0 -223
  408. package/src/evals/reporters.ts +0 -257
  409. package/src/evals/results.ts +0 -130
  410. package/src/evals/run-facts.ts +0 -306
  411. package/src/evals.ts +0 -709
  412. package/src/extensions/cursor-cloud-agents/extension.ts +0 -131
  413. package/src/extensions/cursor-cloud-agents/lib/backend.ts +0 -386
  414. package/src/extensions/cursor-cloud-agents/lib/channels.ts +0 -11
  415. package/src/extensions/cursor-cloud-agents/lib/fleet.ts +0 -98
  416. package/src/extensions/cursor-cloud-agents/lib/inputs.ts +0 -5
  417. package/src/extensions/cursor-cloud-agents/lib/repos.ts +0 -80
  418. package/src/extensions/cursor-cloud-agents/lib/transcript.ts +0 -19
  419. package/src/extensions/cursor-cloud-agents/skills/handoff.md +0 -37
  420. package/src/extensions/cursor-cloud-agents/tools/cancel.ts +0 -21
  421. package/src/extensions/cursor-cloud-agents/tools/dump.ts +0 -47
  422. package/src/extensions/cursor-cloud-agents/tools/get.ts +0 -18
  423. package/src/extensions/cursor-cloud-agents/tools/launch.ts +0 -62
  424. package/src/extensions/cursor-cloud-agents/tools/list.ts +0 -31
  425. package/src/extensions/cursor-cloud-agents/tools/reply.ts +0 -36
  426. package/src/extensions/improve/extension.ts +0 -69
  427. package/src/extensions/improve/skills/yourself.ts +0 -50
  428. package/src/extensions/jev/extension.ts +0 -95
  429. package/src/extensions/jev/lib/evaluate.ts +0 -266
  430. package/src/extensions/jev/skills/gated-write.md +0 -25
  431. package/src/extensions/jev/skills/questions.md +0 -33
  432. package/src/extensions/jev/tools/evaluate.ts +0 -82
  433. package/src/extensions/slack-communication/evals/harness.ts +0 -705
  434. package/src/extensions/slack-communication/evals/slack-communication.eval.ts +0 -830
  435. package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +0 -172
  436. package/src/extensions/slack-communication/extension.ts +0 -44
  437. package/src/extensions/slack-communication/skills/slack-voice.ts +0 -56
  438. package/src/extensions/slack-communication/tools/delete-message.ts +0 -33
  439. package/src/extensions/slack-communication/tools/edit-message.ts +0 -42
  440. package/src/extensions/slack-communication/tools/post-card.ts +0 -28
  441. package/src/extensions/slack-communication/tools/post-file.ts +0 -82
  442. package/src/extensions/slack-communication/tools/post-update.ts +0 -40
  443. package/src/extensions/slack-communication/tools/react.ts +0 -30
  444. package/src/extensions/slack-communication/tools/set-status.ts +0 -21
  445. package/src/extensions.ts +0 -179
  446. package/src/files-backends/agent-store-presigned-url.ts +0 -11
  447. package/src/files-backends/cursor-hosted.ts +0 -1212
  448. package/src/files-backends/local-fs.ts +0 -163
  449. package/src/files.ts +0 -293
  450. package/src/filesystem.ts +0 -2005
  451. package/src/hooks.ts +0 -30
  452. package/src/index.ts +0 -259
  453. package/src/internal/advertise-tools.ts +0 -370
  454. package/src/internal/approval-gate.ts +0 -103
  455. package/src/internal/artifacts-store.ts +0 -836
  456. package/src/internal/as-of.ts +0 -257
  457. package/src/internal/auth.ts +0 -46
  458. package/src/internal/authored-alias-hooks.ts +0 -138
  459. package/src/internal/authored-loaders.ts +0 -188
  460. package/src/internal/bounded-int.ts +0 -24
  461. package/src/internal/bounded.ts +0 -25
  462. package/src/internal/brand.ts +0 -28
  463. package/src/internal/browser-origin-guard.ts +0 -67
  464. package/src/internal/builtin-tools/artifacts.ts +0 -62
  465. package/src/internal/builtin-tools/index.ts +0 -53
  466. package/src/internal/builtin-tools/reminders.ts +0 -145
  467. package/src/internal/channel-dispatch.ts +0 -129
  468. package/src/internal/channel-route-dispatch.ts +0 -58
  469. package/src/internal/channel-state.ts +0 -83
  470. package/src/internal/chat-client.ts +0 -594
  471. package/src/internal/cli-ax.ts +0 -2273
  472. package/src/internal/cli-bitbucket.ts +0 -438
  473. package/src/internal/cli-convert-automation.ts +0 -335
  474. package/src/internal/cli-cursor.ts +0 -282
  475. package/src/internal/cli-deploy.ts +0 -2486
  476. package/src/internal/cli-docs.ts +0 -192
  477. package/src/internal/cli-github.ts +0 -806
  478. package/src/internal/cli-gitlab.ts +0 -452
  479. package/src/internal/cli-images.ts +0 -672
  480. package/src/internal/cli-manifest.ts +0 -56
  481. package/src/internal/cli-mcp-oauth.ts +0 -395
  482. package/src/internal/cli-mcp.ts +0 -808
  483. package/src/internal/cli-skills.ts +0 -99
  484. package/src/internal/cli-slack-manual.ts +0 -418
  485. package/src/internal/cli-slack.ts +0 -874
  486. package/src/internal/cloud-merge.ts +0 -51
  487. package/src/internal/cloud-turn-cost.ts +0 -159
  488. package/src/internal/continuation-channel.ts +0 -233
  489. package/src/internal/continuation-identity.ts +0 -935
  490. package/src/internal/conversation-mirror.ts +0 -423
  491. package/src/internal/convert-automation/convert-workflow.ts +0 -1377
  492. package/src/internal/convert-automation/slug.ts +0 -29
  493. package/src/internal/convert-automation/types.ts +0 -212
  494. package/src/internal/cron.ts +0 -76
  495. package/src/internal/cursor/account-mcp.ts +0 -692
  496. package/src/internal/cursor/backend-client.ts +0 -978
  497. package/src/internal/cursor/bound-secret-file.ts +0 -101
  498. package/src/internal/cursor/credentials.ts +0 -560
  499. package/src/internal/cursor/cursor-api-transport.ts +0 -65
  500. package/src/internal/cursor/github-credentials.ts +0 -228
  501. package/src/internal/cursor/hosted-bound-secrets.ts +0 -71
  502. package/src/internal/cursor/hosted-deployment-secrets.ts +0 -100
  503. package/src/internal/cursor/hosted-store-secrets.ts +0 -152
  504. package/src/internal/cursor/session-token.ts +0 -111
  505. package/src/internal/cursor/store-api-client.ts +0 -323
  506. package/src/internal/cursor-account-mcp-auth.ts +0 -303
  507. package/src/internal/cursor-agent-template.ts +0 -50
  508. package/src/internal/cursor-deployment-relay.ts +0 -315
  509. package/src/internal/cursor-event-relay.ts +0 -675
  510. package/src/internal/cursor-relay-core.ts +0 -563
  511. package/src/internal/deferred-channel-session.ts +0 -61
  512. package/src/internal/deploy-client.ts +0 -1504
  513. package/src/internal/deploy-manifest.ts +0 -361
  514. package/src/internal/deploy-source.ts +0 -144
  515. package/src/internal/describe-error.ts +0 -32
  516. package/src/internal/dev-mode.ts +0 -20
  517. package/src/internal/discovery/agent-config.ts +0 -288
  518. package/src/internal/discovery/agent.ts +0 -381
  519. package/src/internal/discovery/channels.ts +0 -100
  520. package/src/internal/discovery/connections.ts +0 -505
  521. package/src/internal/discovery/context.ts +0 -38
  522. package/src/internal/discovery/cursor-plugin.ts +0 -628
  523. package/src/internal/discovery/extension-overlay.ts +0 -247
  524. package/src/internal/discovery/extensions.ts +0 -490
  525. package/src/internal/discovery/fs.ts +0 -103
  526. package/src/internal/discovery/hooks.ts +0 -63
  527. package/src/internal/discovery/info.ts +0 -174
  528. package/src/internal/discovery/instructions.ts +0 -98
  529. package/src/internal/discovery/modules.ts +0 -107
  530. package/src/internal/discovery/names.ts +0 -45
  531. package/src/internal/discovery/project.ts +0 -319
  532. package/src/internal/discovery/reminders.ts +0 -65
  533. package/src/internal/discovery/runtime.ts +0 -158
  534. package/src/internal/discovery/schedules.ts +0 -120
  535. package/src/internal/discovery/seed-files.ts +0 -34
  536. package/src/internal/discovery/services.ts +0 -151
  537. package/src/internal/discovery/skills.ts +0 -174
  538. package/src/internal/discovery/subagent.ts +0 -138
  539. package/src/internal/discovery/tools.ts +0 -170
  540. package/src/internal/discovery.ts +0 -27
  541. package/src/internal/distribution.ts +0 -126
  542. package/src/internal/docs-site.ts +0 -248
  543. package/src/internal/duration.ts +0 -37
  544. package/src/internal/env-file.ts +0 -83
  545. package/src/internal/eval-judge-model.ts +0 -142
  546. package/src/internal/eval-run-store.ts +0 -585
  547. package/src/internal/eval-runner.ts +0 -823
  548. package/src/internal/evals-client.ts +0 -475
  549. package/src/internal/event-log.ts +0 -342
  550. package/src/internal/event-mapper.ts +0 -811
  551. package/src/internal/expected-delivery-failure.ts +0 -34
  552. package/src/internal/factory-resource-channel.ts +0 -103
  553. package/src/internal/filesystem/errors.ts +0 -207
  554. package/src/internal/filesystem/format.ts +0 -253
  555. package/src/internal/filesystem/merge.ts +0 -192
  556. package/src/internal/filesystem/nearest.ts +0 -112
  557. package/src/internal/filesystem/scratch.ts +0 -239
  558. package/src/internal/filesystem/sdk-schemas.ts +0 -204
  559. package/src/internal/filesystem/tools.ts +0 -804
  560. package/src/internal/filesystem/walk.ts +0 -366
  561. package/src/internal/fixtures/units-server.ts +0 -52
  562. package/src/internal/framework-file-storage.ts +0 -357
  563. package/src/internal/framework-storage-selection.ts +0 -156
  564. package/src/internal/frontmatter.ts +0 -108
  565. package/src/internal/github-fanout.ts +0 -144
  566. package/src/internal/guest-network.ts +0 -391
  567. package/src/internal/handleAgentServeTrigger.ts +0 -286
  568. package/src/internal/host-files.ts +0 -341
  569. package/src/internal/host-kv.ts +0 -81
  570. package/src/internal/host-otel.ts +0 -231
  571. package/src/internal/host-platforms.ts +0 -170
  572. package/src/internal/hosted-admission-adapter.ts +0 -47
  573. package/src/internal/hosted-admission-context.ts +0 -37
  574. package/src/internal/hosted-catch-protocol.ts +0 -112
  575. package/src/internal/hosted-catch.ts +0 -179
  576. package/src/internal/hosted-delivery-protocol.ts +0 -787
  577. package/src/internal/hosted-delivery.ts +0 -1152
  578. package/src/internal/hosted-execution-diag.ts +0 -291
  579. package/src/internal/hosted-execution-flush.ts +0 -136
  580. package/src/internal/hosted-execution-latency.ts +0 -301
  581. package/src/internal/hosted-managed-automation.ts +0 -116
  582. package/src/internal/hosting.ts +0 -107
  583. package/src/internal/http-channel-define.ts +0 -25
  584. package/src/internal/http-channel.ts +0 -669
  585. package/src/internal/http-control-plane-session.ts +0 -110
  586. package/src/internal/ids.ts +0 -39
  587. package/src/internal/incoming-headers-to-fetch.ts +0 -45
  588. package/src/internal/init-interview.ts +0 -360
  589. package/src/internal/init-project.ts +0 -711
  590. package/src/internal/init-scaffold.ts +0 -182
  591. package/src/internal/inline-stdio-define-stub.ts +0 -4
  592. package/src/internal/inline-stdio-mcp.ts +0 -230
  593. package/src/internal/install-cursor-skills.ts +0 -601
  594. package/src/internal/is-record.ts +0 -3
  595. package/src/internal/json-schema.ts +0 -95
  596. package/src/internal/legacy-command-guard.ts +0 -54
  597. package/src/internal/listen-port.ts +0 -85
  598. package/src/internal/local-control-plane.ts +0 -442
  599. package/src/internal/local-env.ts +0 -59
  600. package/src/internal/local-ingress.ts +0 -90
  601. package/src/internal/log-ring.ts +0 -59
  602. package/src/internal/logs-client.ts +0 -477
  603. package/src/internal/map-pool.ts +0 -39
  604. package/src/internal/mcp-endpoint.ts +0 -747
  605. package/src/internal/mcp-host.ts +0 -481
  606. package/src/internal/mcp-oauth-on-demand.ts +0 -337
  607. package/src/internal/mcp-oauth-persist.ts +0 -118
  608. package/src/internal/mcp-oauth.ts +0 -549
  609. package/src/internal/net.ts +0 -29
  610. package/src/internal/open-browser.ts +0 -41
  611. package/src/internal/otel/attrs.ts +0 -16
  612. package/src/internal/otel/collector.ts +0 -937
  613. package/src/internal/otel/config.ts +0 -287
  614. package/src/internal/otel/http.ts +0 -122
  615. package/src/internal/otel/mcp.ts +0 -56
  616. package/src/internal/otel/propagation.ts +0 -17
  617. package/src/internal/otel/runtime.ts +0 -441
  618. package/src/internal/package-inline-stdio.ts +0 -114
  619. package/src/internal/peer-connections.ts +0 -96
  620. package/src/internal/platform-schedule-sync.ts +0 -75
  621. package/src/internal/platform-timers.ts +0 -365
  622. package/src/internal/playground/static.ts +0 -278
  623. package/src/internal/playground/toolchain.ts +0 -270
  624. package/src/internal/playground-proxy.ts +0 -564
  625. package/src/internal/process-memory-telemetry.ts +0 -334
  626. package/src/internal/project-layout.ts +0 -31
  627. package/src/internal/prompt-context.ts +0 -116
  628. package/src/internal/reminder-control-plane-protocol.ts +0 -482
  629. package/src/internal/reminder-runner.ts +0 -1559
  630. package/src/internal/reminder-schedule.ts +0 -104
  631. package/src/internal/reminder-store.ts +0 -176
  632. package/src/internal/request-error-status.ts +0 -95
  633. package/src/internal/request-headers.ts +0 -21
  634. package/src/internal/resolve-prod-target.ts +0 -334
  635. package/src/internal/resolved-connections.ts +0 -190
  636. package/src/internal/router.ts +0 -143
  637. package/src/internal/run-client.ts +0 -354
  638. package/src/internal/runtime-dispatch-runner.ts +0 -50
  639. package/src/internal/sanitize-mcp-tool-name.ts +0 -31
  640. package/src/internal/schedule-runner.ts +0 -154
  641. package/src/internal/scm/pr-url.ts +0 -245
  642. package/src/internal/sdk-runner.ts +0 -948
  643. package/src/internal/serve-restart.ts +0 -113
  644. package/src/internal/server.ts +0 -3135
  645. package/src/internal/session-cost.ts +0 -208
  646. package/src/internal/session-engine.ts +0 -5618
  647. package/src/internal/session-links.ts +0 -84
  648. package/src/internal/session-run-log.ts +0 -535
  649. package/src/internal/session-store.ts +0 -307
  650. package/src/internal/session-urls.ts +0 -32
  651. package/src/internal/sessions-client.ts +0 -239
  652. package/src/internal/skill-catalog.ts +0 -66
  653. package/src/internal/skills-sync.ts +0 -55
  654. package/src/internal/slack-provision-client.ts +0 -544
  655. package/src/internal/slack-thread-key.ts +0 -11
  656. package/src/internal/sleep.ts +0 -3
  657. package/src/internal/start-log-store.ts +0 -164
  658. package/src/internal/steering.ts +0 -17
  659. package/src/internal/storage-coordinator.ts +0 -800
  660. package/src/internal/storage-roles.ts +0 -86
  661. package/src/internal/storage.ts +0 -1
  662. package/src/internal/store-api-protocol.ts +0 -205
  663. package/src/internal/store-mirror.ts +0 -73
  664. package/src/internal/stream-progress.ts +0 -294
  665. package/src/internal/terminal-style.ts +0 -133
  666. package/src/internal/testing/factory-resource-fixtures.ts +0 -84
  667. package/src/internal/testing/scm-continuation-fixtures.ts +0 -285
  668. package/src/internal/tool-catalog.ts +0 -104
  669. package/src/internal/tool-policy.ts +0 -222
  670. package/src/internal/tool-result.ts +0 -50
  671. package/src/internal/trajectory.ts +0 -418
  672. package/src/internal/turn-cost.ts +0 -136
  673. package/src/internal/turn-governor.ts +0 -145
  674. package/src/internal/turn-lease-store.ts +0 -144
  675. package/src/internal/turn-outbox.ts +0 -77
  676. package/src/internal/update-check.ts +0 -517
  677. package/src/internal/v2-hosting.ts +0 -52
  678. package/src/internal/workspace-sync.ts +0 -114
  679. package/src/internal/workspace.ts +0 -505
  680. package/src/kv/memory-kv.ts +0 -94
  681. package/src/kv.ts +0 -18
  682. package/src/memory.ts +0 -487
  683. package/src/otel-public.ts +0 -24
  684. package/src/otel.ts +0 -320
  685. package/src/prompt.ts +0 -80
  686. package/src/reminders.ts +0 -65
  687. package/src/schedules.ts +0 -31
  688. package/src/skills.ts +0 -27
  689. package/src/storage-backends/cursor-hosted-v2.ts +0 -204
  690. package/src/storage-backends/cursor-hosted.ts +0 -388
  691. package/src/storage-backends/file-kv.ts +0 -276
  692. package/src/storage-protocol.ts +0 -261
  693. package/src/storage.ts +0 -408
  694. package/src/tools.ts +0 -166
  695. package/src/types.ts +0 -3766
  696. /package/dist/docs/assets/{reference_agent-config.md.DzGI777n.lean.js → reference_agent-config.md.Cj5uBKp4.lean.js} +0 -0
  697. /package/dist/docs/assets/{reference_artifacts.md.CFMNPreZ.lean.js → reference_artifacts.md.CQfKq8F2.lean.js} +0 -0
@@ -1,948 +0,0 @@
1
- /**
2
- * Executes turns on the Cursor harness through `@cursor/sdk`.
3
- * Each framework session maps 1:1 to an SDK agent. Local agents use the
4
- * session id as the SDK agent id and materialize a workspace for project
5
- * settings; cloud agents use Cursor cloud (`bc-…` ids) with optional
6
- * `cloud` options from `defineAgent`.
7
- */
8
-
9
- import { mkdir } from "node:fs/promises";
10
- import {
11
- Agent,
12
- type AgentDefinition,
13
- type AgentOptions,
14
- type CloudAgentOptions,
15
- Cursor,
16
- createAgentPlatform,
17
- type LocalAgentStore,
18
- type ModelSelection,
19
- type Run,
20
- type RunResult,
21
- type SDKAgent,
22
- } from "@cursor/sdk";
23
- import { SqliteLocalAgentStore } from "@cursor/sdk/sqlite";
24
- import {
25
- DEFAULT_MODEL,
26
- type ModelSetting,
27
- type RunnerSubagent,
28
- type RunnerTurnRequest,
29
- type TurnOutcome,
30
- type TurnUsage,
31
- } from "../types.js";
32
- import { mapSdkTokenUsage, usageTokenSum } from "./cloud-turn-cost.js";
33
- import type { ConversationMirror } from "./conversation-mirror.js";
34
- import { resolveApiKeySync } from "./cursor/credentials.js";
35
- import { describeError } from "./describe-error.js";
36
- import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
37
- import { sleep } from "./sleep.js";
38
-
39
- /** Mirrors @cursor/sdk's SteerAckOutcome; the published dist may predate it. */
40
- export type SteerAckOutcome = "complete_delivered" | "revert_to_followup";
41
-
42
- /** Internal seam between the session engine and the Cursor SDK harness. */
43
- export interface AgentRunner {
44
- runTurn(request: RunnerTurnRequest): Promise<TurnOutcome>;
45
- steer?(request: { sessionId: string; text: string }): Promise<SteerAckOutcome>;
46
- /**
47
- * Resolve a local workspace before any session needs it, so the first turn
48
- * is not the one that pays for it. Best effort, hence the reported outcome:
49
- * a runner that cannot warm must say so rather than let a caller log
50
- * success over a workspace that was never touched.
51
- */
52
- prewarm?(request: RunnerPrewarmRequest): Promise<PrewarmOutcome>;
53
- dispose?(): Promise<void>;
54
- }
55
-
56
- /**
57
- * The parts of a turn that decide which local executor it runs on. Must stay
58
- * a subset of {@link RunnerTurnRequest} — anything that disagrees warms an
59
- * executor no turn will ask for.
60
- */
61
- export type RunnerPrewarmRequest = Pick<
62
- RunnerTurnRequest,
63
- | "workspaceDir"
64
- | "runnerStateDir"
65
- | "sandbox"
66
- | "tools"
67
- | "disallowedTools"
68
- | "mcpServers"
69
- | "perSendMcpServers"
70
- | "subagents"
71
- | "model"
72
- >;
73
-
74
- /** Whether a workspace was actually resolved, and why not when it wasn't. */
75
- export type PrewarmOutcome =
76
- | { readonly warmed: true }
77
- | { readonly warmed: false; readonly reason: string };
78
-
79
- /**
80
- * How long a non-`--dev` serve holds workspace scans (rules, skills,
81
- * `AGENTS.md`, ignore files). The SDK default is 20s for an editor whose
82
- * files move under it; agent-serve checkouts only change on deploy, so a
83
- * missed mid-process edit is the right trade. `CURSOR_RIPWALK_CACHE_TTL_MS`
84
- * still wins when set. `--dev` leaves the 20s default so skill edits show up.
85
- */
86
- export const SERVE_WORKSPACE_SCAN_CACHE_TTL_MS: number = 24 * 60 * 60 * 1000;
87
-
88
- /**
89
- * Resolve the SDK workspace-scan TTL for this serve. `undefined` means "do
90
- * not call `Cursor.configure`" and leave the SDK at its 20s editor default.
91
- */
92
- export function resolveServeWorkspaceScanCacheTtlMs(args: {
93
- dev: boolean;
94
- env?: NodeJS.ProcessEnv;
95
- }): number | undefined {
96
- const raw = (args.env ?? process.env).CURSOR_RIPWALK_CACHE_TTL_MS?.trim();
97
- if (raw !== undefined && raw !== "") {
98
- const parsed = Number(raw);
99
- if (Number.isFinite(parsed) && parsed > 0) {
100
- return parsed;
101
- }
102
- }
103
- if (args.dev) {
104
- return undefined;
105
- }
106
- return SERVE_WORKSPACE_SCAN_CACHE_TTL_MS;
107
- }
108
-
109
- export interface CursorSdkRunnerOptions {
110
- /** Cursor API key. Defaults to the `CURSOR_API_KEY` environment variable. */
111
- apiKey?: string;
112
- /**
113
- * Conversation store override. Defaults to a JSONL store under the
114
- * engine's state root; install `sqlite3` and pass an SQLite-backed
115
- * `LocalAgentStore` for heavy multi-session concurrency.
116
- */
117
- store?: LocalAgentStore;
118
- /**
119
- * Durable mirror for local conversations (v2 hosted engines). Hydrated
120
- * before `Agent.resume` so a follow-up landing on a fresh pod finds the
121
- * conversation, and persisted — awaited — after each local turn settles,
122
- * because a hosted pod can be parked right after the execution reply.
123
- */
124
- conversationMirror?: ConversationMirror;
125
- /** Diagnostics for degraded paths (resume-miss fallback). */
126
- logger?: (line: string) => void;
127
- /**
128
- * Hold workspace scans this long (ms). Applied via `Cursor.configure` so
129
- * each new local executor reuses the walk. Omit to keep the SDK 20s default.
130
- */
131
- workspaceScanCacheTtlMs?: number;
132
- }
133
-
134
- /**
135
- * How long one SDK agent handle (and the Connect transport inside it) may be
136
- * reused before the runner retires it.
137
- *
138
- * The transport exchanges the account API key for a short-lived access token
139
- * (`SessionType.API_KEY_TOKEN`, 60 minutes) once per handle, and has no
140
- * reliable refresh: an Unauthenticated rejection on the agent's streaming RPC
141
- * surfaces while the stream is being read — outside the transport's
142
- * request-time 401 retry — so an expired token gets replayed on every
143
- * subsequent turn until the handle is rebuilt. Long-lived sessions (watch
144
- * wakes, crons) hit this at the ~60 minute mark and then fail forever.
145
- * Retiring the handle comfortably before the token can expire keeps them
146
- * healthy: `Agent.resume` rehydrates the same conversation from the runner
147
- * store on a fresh transport, so recycling costs only transport warmth.
148
- */
149
- const MAX_AGENT_HANDLE_AGE_MS = 45 * 60 * 1000;
150
-
151
- interface CachedAgentHandle {
152
- agent: Promise<SDKAgent>;
153
- openedAtMs: number;
154
- }
155
-
156
- /**
157
- * The backend's `NotLoggedIn` copy ("Authentication error" title, "try
158
- * logging out and back in." detail) as it surfaces through SDK RunResults.
159
- * Deliberately narrow: this gates a one-shot in-place retry, and matching
160
- * broader error text would retry turns that a fresh transport cannot fix.
161
- */
162
- export function isAuthErrorMessage(message: string | undefined): boolean {
163
- if (message === undefined) {
164
- return false;
165
- }
166
- return /authentication error|try logging out and back in/i.test(message);
167
- }
168
-
169
- /** Cloud `wait()` copy for `stream_expired` / a missing start-state blob. */
170
- function isStreamExpiredErrorMessage(message: string | undefined): boolean {
171
- if (message === undefined) {
172
- return false;
173
- }
174
- return /run stream is no longer available|\[stream_expired\]/i.test(message);
175
- }
176
-
177
- function retryReason(message: string | undefined, isFirstTurn: boolean): string | undefined {
178
- if (isStreamExpiredErrorMessage(message)) {
179
- return "cloud run stream expired";
180
- }
181
- // First-turn auth is the credential; a fresh handle cannot fix it.
182
- if (!isFirstTurn && isAuthErrorMessage(message)) {
183
- return "authentication failure";
184
- }
185
- return undefined;
186
- }
187
-
188
- /**
189
- * The SDK rejects a selection the credential's catalog does not list with
190
- * this copy, thrown from `Agent.create` / `Agent.resume` before the turn
191
- * streams anything. Matched on the message because the SDK uses its generic
192
- * configuration error here.
193
- */
194
- export function isUnavailableModelSelectionMessage(message: string | undefined): boolean {
195
- return message !== undefined && /cannot use this model/i.test(message);
196
- }
197
-
198
- export function isUnavailableModelSelectionError(error: unknown): boolean {
199
- const message = error instanceof Error ? error.message : undefined;
200
- return isUnavailableModelSelectionMessage(message);
201
- }
202
-
203
- /**
204
- * Inference / provider capacity on the selected model. `wait()` stores the
205
- * connect status on `error.code` and strips `[code]` from the message, so
206
- * both must be checked. `[unavailable]` in text is the connect status, not
207
- * a loose "temporarily unavailable" substring.
208
- */
209
- export function isModelCapacityError(
210
- message: string | undefined,
211
- code?: string | undefined,
212
- ): boolean {
213
- if (code !== undefined && /^(resource_exhausted|unavailable)$/i.test(code)) {
214
- return true;
215
- }
216
- return message !== undefined && /resource_exhausted|\[unavailable\]/i.test(message);
217
- }
218
-
219
- export function isModelCapacityErrorMessage(message: string | undefined): boolean {
220
- return isModelCapacityError(message);
221
- }
222
-
223
- /** Catalog refusal or capacity: the authored fallback list can still save the turn. */
224
- export function shouldFallbackToNextModel(
225
- message: string | undefined,
226
- code?: string | undefined,
227
- ): boolean {
228
- return isUnavailableModelSelectionMessage(message) || isModelCapacityError(message, code);
229
- }
230
-
231
- export function shouldFallbackToNextModelOnError(error: unknown): boolean {
232
- const message = error instanceof Error ? error.message : undefined;
233
- return shouldFallbackToNextModel(message, errorCodeOf(error));
234
- }
235
-
236
- function errorCodeOf(error: unknown): string | undefined {
237
- if (typeof error !== "object" || error === null || !("code" in error)) {
238
- return undefined;
239
- }
240
- const code = (error as { code?: unknown }).code;
241
- return typeof code === "string" ? code : undefined;
242
- }
243
-
244
- function modelSettingLabel(model: ModelSetting | undefined): string {
245
- if (model === undefined) {
246
- return "default";
247
- }
248
- return typeof model === "string" ? model : model.id;
249
- }
250
-
251
- /** Primary model, then authored fallbacks. No fallbacks keeps today's single attempt. */
252
- function modelAttemptChain(request: RunnerTurnRequest): Array<ModelSetting | undefined> {
253
- const fallbacks = request.modelFallbacks ?? [];
254
- if (fallbacks.length === 0) {
255
- return [request.model];
256
- }
257
- return [request.model ?? DEFAULT_MODEL, ...fallbacks];
258
- }
259
-
260
- /**
261
- * A rejected create may already have stored the agent id. Later attempts
262
- * resume that id so the next model does not die on "already exists". A
263
- * create that threw before persisting falls through the runner's not-found
264
- * path and creates again. Cloud turns that never received a server id stay
265
- * on create: resuming the framework session id is not a cloud agent.
266
- */
267
- function modelAttemptRequest(
268
- request: RunnerTurnRequest,
269
- model: ModelSetting | undefined,
270
- attempt: number,
271
- ): RunnerTurnRequest {
272
- if (attempt === 0) {
273
- return model === request.model ? request : { ...request, model };
274
- }
275
- const persistedId = request.sdkAgentId ?? request.sessionId;
276
- if (
277
- request.runtime === "cloud" &&
278
- request.isFirstTurn &&
279
- !isServerMintedCloudAgentId(persistedId)
280
- ) {
281
- return { ...request, model };
282
- }
283
- return {
284
- ...request,
285
- model,
286
- isFirstTurn: false,
287
- sdkAgentId: persistedId,
288
- };
289
- }
290
-
291
- export class CursorSdkRunner implements AgentRunner {
292
- private readonly agents = new Map<string, CachedAgentHandle>();
293
- private readonly activeRuns = new Map<string, Run>();
294
- private readonly stores = new Map<string, Promise<LocalAgentStore>>();
295
- private readonly prewarmReleases: Array<() => Promise<void>> = [];
296
-
297
- constructor(private readonly options: CursorSdkRunnerOptions = {}) {
298
- if (options.workspaceScanCacheTtlMs !== undefined) {
299
- Cursor.configure({
300
- local: { workspaceScanCacheTtlMs: options.workspaceScanCacheTtlMs },
301
- });
302
- this.log(`[agent-sdk] workspace scan cache ttl=${options.workspaceScanCacheTtlMs}ms`);
303
- }
304
- }
305
-
306
- async runTurn(request: RunnerTurnRequest): Promise<TurnOutcome> {
307
- // Fail closed: this runner only knows the Cursor SDK's local and cloud
308
- // harnesses. A grokbot turn reaching it means the serve wiring skipped
309
- // the Grok Bot runner — running it on the local harness would silently
310
- // swap the box (and the SendToUser contract) out from under the agent.
311
- if (request.runtime === "grokbot") {
312
- throw new Error(
313
- `Session ${request.sessionId} is a grokbot turn, which the Cursor SDK runner cannot execute. Serve must route grokbot turns to the Grok Bot runner.`,
314
- );
315
- }
316
- const models = modelAttemptChain(request);
317
- let lastError: unknown;
318
- for (let attempt = 0; attempt < models.length; attempt++) {
319
- const model = models[attempt];
320
- let streamed = false;
321
- const attemptRequest = modelAttemptRequest(request, model, attempt);
322
- try {
323
- const outcome = await this.runTurnWithTransportRetry(attemptRequest, () => {
324
- streamed = true;
325
- });
326
- if (
327
- outcome.status !== "error" ||
328
- streamed ||
329
- request.signal?.aborted === true ||
330
- !shouldFallbackToNextModel(outcome.errorMessage, outcome.errorCode) ||
331
- attempt === models.length - 1
332
- ) {
333
- return outcome;
334
- }
335
- this.logModelFallback(request.sessionId, model, models[attempt + 1], outcome.errorMessage);
336
- } catch (error) {
337
- lastError = error;
338
- if (
339
- streamed ||
340
- request.signal?.aborted === true ||
341
- !shouldFallbackToNextModelOnError(error) ||
342
- attempt === models.length - 1
343
- ) {
344
- throw error;
345
- }
346
- const message = error instanceof Error ? error.message : undefined;
347
- this.logModelFallback(request.sessionId, model, models[attempt + 1], message);
348
- }
349
- }
350
- throw lastError;
351
- }
352
-
353
- /**
354
- * One model attempt, plus the existing in-place transport retry (expired
355
- * cloud stream, or a follow-up auth failure) on that same model. Model
356
- * fallback is the caller's job: this returns the error outcome when a
357
- * fresh handle cannot fix it.
358
- */
359
- private async runTurnWithTransportRetry(
360
- request: RunnerTurnRequest,
361
- onStreamed: () => void,
362
- ): Promise<TurnOutcome> {
363
- let sawUpdate = false;
364
- const tracked: RunnerTurnRequest = {
365
- ...request,
366
- onUpdate: update => {
367
- sawUpdate = true;
368
- onStreamed();
369
- return request.onUpdate(update);
370
- },
371
- };
372
- const outcome = await this.runTurnAttempt(tracked);
373
- if (outcome.status !== "error" || sawUpdate || request.signal?.aborted === true) {
374
- return outcome;
375
- }
376
- const reason = retryReason(outcome.errorMessage, request.isFirstTurn);
377
- if (reason === undefined) {
378
- return outcome;
379
- }
380
- // Log the original error even when the retry succeeds so the expiry
381
- // still shows up in Datadog.
382
- this.log(
383
- `[agent-sdk] session ${request.sessionId}: ${reason}: ${outcome.errorMessage}; retrying the turn`,
384
- );
385
- try {
386
- return await this.runTurnAttempt(tracked);
387
- } catch {
388
- return outcome;
389
- }
390
- }
391
-
392
- private logModelFallback(
393
- sessionId: string,
394
- from: ModelSetting | undefined,
395
- to: ModelSetting | undefined,
396
- message: string | undefined,
397
- ): void {
398
- this.log(
399
- `[agent-sdk] session ${sessionId}: cannot use model ${modelSettingLabel(from)}; retrying on ${modelSettingLabel(to)}: ${message ?? "model unavailable"}`,
400
- );
401
- }
402
-
403
- private async runTurnAttempt(request: RunnerTurnRequest): Promise<TurnOutcome> {
404
- const agentPromise = this.getAgent(request);
405
- try {
406
- const agent = await agentPromise;
407
- const sendMessage =
408
- request.images !== undefined && request.images.length > 0
409
- ? {
410
- text: request.prompt,
411
- images: request.images.map(image => ({
412
- data: image.data,
413
- mimeType: image.mimeType,
414
- })),
415
- }
416
- : request.prompt;
417
- const run = await agent.send(sendMessage, {
418
- onDelta: async ({ update }) => {
419
- try {
420
- await request.onUpdate(update);
421
- } catch {
422
- // Stream mapping must never reject into the SDK transport.
423
- }
424
- },
425
- // The SDK builds this send's MCP session from exactly this set, so
426
- // a turn always runs on the headers the engine evaluated for it —
427
- // never on the ones a previous turn opened the cached handle with.
428
- ...(request.runtime === "local" && request.perSendMcpServers === true
429
- ? { mcpServers: request.mcpServers as AgentOptions["mcpServers"] }
430
- : {}),
431
- ...(request.runtime === "local"
432
- ? {
433
- local: {
434
- customTools: request.customTools,
435
- // Follow-up turns expire any run still marked active on the
436
- // agent (a preempted or crash-wedged run) so this send is not
437
- // rejected with "already has active run".
438
- ...(request.forceExpireActiveRun === true ? { force: true } : {}),
439
- },
440
- }
441
- : {}),
442
- });
443
- // A follow-up can preempt this turn: cancelling tears down execution and
444
- // marks the SDK run terminal so the next send is admitted cleanly. The
445
- // signal may already be aborted if the preempt landed while send() was
446
- // still creating the run.
447
- const signal = request.signal;
448
- const onAbort = (): void => {
449
- void run.cancel().catch(() => {});
450
- };
451
- if (signal !== undefined) {
452
- if (signal.aborted) {
453
- onAbort();
454
- } else {
455
- signal.addEventListener("abort", onAbort, { once: true });
456
- }
457
- }
458
- // Cloud + envVars: server mints the real `bc-…` id during createAgent
459
- // inside the first send. Bind only after that so we never persist/print
460
- // the provisional client-seeded id.
461
- if (request.onSdkAgentId !== undefined) {
462
- await request.onSdkAgentId(agent.agentId);
463
- }
464
- // Readable on the handle as soon as send resolves, long before wait().
465
- if (
466
- request.onRequestId !== undefined &&
467
- run.requestId !== undefined &&
468
- run.requestId !== ""
469
- ) {
470
- await request.onRequestId(run.requestId);
471
- }
472
- this.activeRuns.set(request.sessionId, run);
473
- try {
474
- const result = await run.wait();
475
- let outcome = toTurnOutcome(result);
476
- if (outcome.status === "error") {
477
- // An error result usually means the handle's transport is poisoned
478
- // — most often a cached access token that aged past its 60-minute
479
- // lifetime and gets replayed on every request (stream failures
480
- // bypass the transport's 401 retry). Retire the handle so the next
481
- // attempt resumes the conversation from the store on a fresh
482
- // transport instead of failing every turn until a restart.
483
- this.evictAgent(request.sessionId, agentPromise);
484
- } else if (
485
- request.runtime === "cloud" &&
486
- outcome.status === "finished" &&
487
- usageTokenSum(outcome.usage) <= 0 &&
488
- result.id !== ""
489
- ) {
490
- // Cloud `wait()` drops usage after stream reconnect / getRun replay,
491
- // or returns an all-zero stub. `getUsage` still has the run's tokens
492
- // (eventually); without them traces never record an estimated cost.
493
- outcome = await fillMissingCloudUsage(agent, result.id, outcome);
494
- }
495
- return outcome;
496
- } finally {
497
- if (this.activeRuns.get(request.sessionId) === run) {
498
- this.activeRuns.delete(request.sessionId);
499
- }
500
- signal?.removeEventListener("abort", onAbort);
501
- // Mirror the conversation before replying: on hosted v2 the pod can
502
- // be parked as soon as the execution reply lands, so a
503
- // fire-and-forget write would race VM teardown. In the `finally` so
504
- // a `wait()` that THROWS (transport death mid-turn, an abort with
505
- // no follow-up) still persists the checkpoints the turn already
506
- // wrote — the store is local SQLite, safe to read on the throw
507
- // path, and persistConversation swallows its own errors. Guarded
508
- // here (not just inside the helper) so unmirrored turns keep their
509
- // exact post-wait sequencing.
510
- if (request.runtime === "local" && this.options.conversationMirror !== undefined) {
511
- await this.persistConversation(request, agent.agentId);
512
- }
513
- }
514
- } catch (error) {
515
- // Drop the cached agent so a dead Connect/HTTP2 session cannot poison
516
- // the next turn (terminal/shell overflow often kills the transport).
517
- this.evictAgent(request.sessionId, agentPromise);
518
- throw error;
519
- }
520
- }
521
-
522
- async steer(request: { sessionId: string; text: string }): Promise<SteerAckOutcome> {
523
- const run = this.activeRuns.get(request.sessionId) as
524
- | (Run & {
525
- steer?: (text: string) => Promise<SteerAckOutcome>;
526
- })
527
- | undefined;
528
- if (run?.steer === undefined) {
529
- return "revert_to_followup";
530
- }
531
- try {
532
- return await run.steer(request.text);
533
- } catch (error) {
534
- this.log(`[agent-sdk] session ${request.sessionId}: steer failed: ${describeError(error)}`);
535
- return "revert_to_followup";
536
- }
537
- }
538
-
539
- /**
540
- * Build the local executor for a workspace before any session asks for it.
541
- * The warmed executor is reference counted, so the lease is held until
542
- * {@link dispose}; dropping it early would tear the workspace back down.
543
- */
544
- async prewarm(request: RunnerPrewarmRequest): Promise<PrewarmOutcome> {
545
- const platform = await createAgentPlatform();
546
- const release = await platform.prewarmLocalWorkspace(await this.buildLocalOptions(request));
547
- this.prewarmReleases.push(release);
548
- return { warmed: true };
549
- }
550
-
551
- /**
552
- * Drop the cached SDK agent for this session, if one is open.
553
- *
554
- * Hosted v2 parks and hibernates this process as soon as the execution
555
- * reply lands on non-interactive channels. A leftover handle still holds
556
- * the pre-freeze Connect/HTTP2 session; the next wake then reuses it and
557
- * `AgentService/Run` never starts. Call after `waitForCompletion` so the
558
- * hibernate snapshot has an empty cache. Slack's interactive hot-window
559
- * still reuses handles because that path does not go through hosted
560
- * delivery.
561
- */
562
- evictSession(sessionId: string): void {
563
- const cached = this.agents.get(sessionId);
564
- if (cached === undefined) {
565
- return;
566
- }
567
- this.evictAgent(sessionId, cached.agent);
568
- }
569
-
570
- async dispose(): Promise<void> {
571
- const releases = this.prewarmReleases.splice(0);
572
- await Promise.allSettled(releases.map(release => release()));
573
- const agents = await Promise.allSettled([...this.agents.values()].map(handle => handle.agent));
574
- this.agents.clear();
575
- for (const settled of agents) {
576
- if (settled.status === "fulfilled") {
577
- settled.value.close();
578
- }
579
- }
580
- }
581
-
582
- private getAgent(request: RunnerTurnRequest): Promise<SDKAgent> {
583
- const cached = this.agents.get(request.sessionId);
584
- if (cached !== undefined) {
585
- const ageMs = Date.now() - cached.openedAtMs;
586
- if (ageMs < MAX_AGENT_HANDLE_AGE_MS) {
587
- return cached.agent;
588
- }
589
- // Past this age the handle's exchanged access token could expire
590
- // mid-turn. Retire it and reopen below on a fresh transport.
591
- this.log(
592
- `[agent-sdk] session ${request.sessionId}: recycling the SDK agent handle after ${Math.round(ageMs / 60_000)} min so the turn runs on a fresh access token`,
593
- );
594
- this.evictAgent(request.sessionId, cached.agent);
595
- }
596
- const agentPromise = this.openAgent(request).catch(error => {
597
- // Nothing opened, so there is no handle to close — just free the slot.
598
- this.agents.delete(request.sessionId);
599
- throw error;
600
- });
601
- this.agents.set(request.sessionId, {
602
- agent: agentPromise,
603
- openedAtMs: Date.now(),
604
- });
605
- return agentPromise;
606
- }
607
-
608
- /**
609
- * Drop a cached handle and close it best-effort to release its transport
610
- * and executor lease. Identity-checked so a turn that lost a race with a
611
- * newer open cannot evict the replacement handle.
612
- */
613
- private evictAgent(sessionId: string, agent: Promise<SDKAgent>): void {
614
- const cached = this.agents.get(sessionId);
615
- if (cached === undefined || cached.agent !== agent) {
616
- return;
617
- }
618
- this.agents.delete(sessionId);
619
- void cached.agent.then(sdkAgent => sdkAgent.close()).catch(() => {});
620
- }
621
-
622
- private log(line: string): void {
623
- (this.options.logger ?? (() => {}))(line);
624
- }
625
-
626
- /**
627
- * Re-resolve on every turn. Hosted freeze snapshots listen unsigned; the
628
- * binder drops `CURSOR_API_KEY` / `CURSOR_API_KEY_FILE` at task time into
629
- * the already-running process, which must not have closed over `undefined`.
630
- */
631
- private requireApiKey(): string {
632
- const resolved = resolveApiKeySync({ apiKey: this.options.apiKey });
633
- if (resolved === undefined) {
634
- throw new Error(
635
- `The Cursor SDK runner requires a Cursor credential: run \`${CLI} login\`, set CURSOR_API_KEY, CURSOR_SERVICE_ACCOUNT_KEY, or CURSOR_API_KEY_FILE, or pass serve({ apiKey }).`,
636
- );
637
- }
638
- return resolved.apiKey;
639
- }
640
-
641
- private buildSharedOptions(
642
- request: RunnerPrewarmRequest,
643
- ): Pick<AgentOptions, "model" | "apiKey" | "mcpServers" | "agents"> {
644
- const subagents = toAgentDefinitions(request.subagents);
645
- return {
646
- model: toModelSelection(request.model ?? DEFAULT_MODEL),
647
- apiKey: this.requireApiKey(),
648
- // Per-send servers ride each agent.send instead (fresh per-session
649
- // auth headers every turn). Keeping them out of the create/resume
650
- // options also keeps the local executor cache key — which hashes
651
- // these options — stable while credentials rotate.
652
- ...(Object.keys(request.mcpServers).length > 0 && request.perSendMcpServers !== true
653
- ? { mcpServers: request.mcpServers as AgentOptions["mcpServers"] }
654
- : {}),
655
- ...(subagents === undefined ? {} : { agents: subagents }),
656
- };
657
- }
658
-
659
- /**
660
- * The options that decide which local executor a turn runs on. Prewarming
661
- * goes through here too, so a warmed workspace is the one turns land on.
662
- */
663
- private async buildLocalOptions(
664
- request: RunnerPrewarmRequest & Pick<RunnerTurnRequest, "instructions">,
665
- ): Promise<AgentOptions> {
666
- // Not resolveStore: an injected store is used synchronously (no
667
- // microtask, no thenable assimilation), exactly as before the mirror
668
- // existed.
669
- const store = this.options.store ?? (await this.getStore(request.runnerStateDir));
670
- return {
671
- ...this.buildSharedOptions(request),
672
- // The built-in tool allowlist rides AgentOptions, not `local`, and is
673
- // deliberately absent from openCloudAgent's options: the SDK rejects
674
- // tool restrictions on cloud agents. Passed on create *and* resume
675
- // (both flow through here) — the SDK does not persist it across runs.
676
- ...(request.tools === undefined ? {} : { tools: request.tools }),
677
- ...(request.disallowedTools === undefined
678
- ? {}
679
- : { disallowedTools: request.disallowedTools }),
680
- // Same shape: local-only (the SDK rejects it with `cloud`), not
681
- // persisted, so it rides every create/resume. Replaces Cursor's
682
- // built-in system prompt with the agent's composed instructions.
683
- // Prewarm requests carry none, and the SDK's workspace cache key
684
- // ignores it, so a warmed executor is still the one turns land on.
685
- systemPrompt: request.instructions,
686
- local: {
687
- cwd: request.workspaceDir,
688
- settingSources: ["project"],
689
- store,
690
- ...(request.sandbox === true ? { sandboxOptions: { enabled: true } } : {}),
691
- },
692
- };
693
- }
694
-
695
- private async openAgent(request: RunnerTurnRequest): Promise<SDKAgent> {
696
- if (request.runtime === "cloud") {
697
- return this.openCloudAgent(request, this.buildSharedOptions(request));
698
- }
699
- return this.openLocalAgent(request);
700
- }
701
-
702
- private async openLocalAgent(request: RunnerTurnRequest): Promise<SDKAgent> {
703
- const options = await this.buildLocalOptions(request);
704
-
705
- if (request.isFirstTurn || request.sdkAgentId === undefined) {
706
- return Agent.create({
707
- ...options,
708
- agentId: request.sdkAgentId ?? request.sessionId,
709
- });
710
- }
711
-
712
- const agentId = request.sdkAgentId ?? request.sessionId;
713
- const mirror = this.options.conversationMirror;
714
- if (mirror !== undefined) {
715
- // Host replacement: restore the conversation from the durable mirror
716
- // before resuming, so the thread continues instead of starting fresh.
717
- // A sink failure propagates and fails the turn (retryable) — reading
718
- // an outage as "nothing mirrored" would silently fork the thread.
719
- const store = await this.resolveStore(request);
720
- await mirror.hydrate(store, agentId);
721
- }
722
- try {
723
- return await Agent.resume(agentId, options);
724
- } catch (error) {
725
- if (!isLocalAgentNotFoundError(error, agentId)) {
726
- throw error;
727
- }
728
- // Host replacement: the session record survived in durable storage,
729
- // but the conversation store died with the old pod. A fresh
730
- // conversation under the same id beats failing this thread's turns
731
- // forever ("Agent … not found" on every follow-up). The channel's
732
- // warm-turn prompt context re-hydrates the thread history.
733
- this.log(
734
- `[agent-sdk] no stored conversation for ${agentId} on this host; starting a fresh one`,
735
- );
736
- return Agent.create({ ...options, agentId });
737
- }
738
- }
739
-
740
- private async openCloudAgent(
741
- request: RunnerTurnRequest,
742
- shared: Pick<AgentOptions, "model" | "apiKey" | "mcpServers" | "agents">,
743
- ): Promise<SDKAgent> {
744
- const cloud = toCloudAgentOptions(request.cloud, request.agentServeAgent);
745
- const hasEnvVars = cloud.envVars !== undefined && Object.keys(cloud.envVars).length > 0;
746
- const options: AgentOptions = {
747
- ...shared,
748
- cloud,
749
- };
750
-
751
- const sdkAgentId = request.sdkAgentId?.trim();
752
- if (sdkAgentId !== undefined && sdkAgentId !== "") {
753
- // A server-minted `bc-…` id always resumes — including on the first
754
- // framework turn of a session seeded via SendMessageOptions.sdkAgentId
755
- // (PR→bcId affinity across session-store resets). Any persisted id
756
- // resumes on later turns.
757
- if (isServerMintedCloudAgentId(sdkAgentId) || !request.isFirstTurn) {
758
- return Agent.resume(sdkAgentId, options);
759
- }
760
- if (!hasEnvVars) {
761
- // Client-seeded (non bc-…) id on a brand new session: forward it to
762
- // create so the server adopts it. With envVars the server must mint
763
- // the id, so the seed cannot be honored and create() runs below.
764
- return Agent.create({ ...options, agentId: sdkAgentId });
765
- }
766
- }
767
-
768
- if (request.isFirstTurn) {
769
- return Agent.create(options);
770
- }
771
- // A cloud session past its first turn should carry the bound agent id
772
- // (the engine persists it via onSdkAgentId as soon as create() reports
773
- // one). Reaching here means the binding turn failed before the server
774
- // ever minted an agent — e.g. create() rejected its PR attach — so the
775
- // session would otherwise fail every future turn. Mirror the local
776
- // host-replacement path above: a fresh conversation beats failing this
777
- // thread forever, and the new id binds to the session for later resumes.
778
- this.log(
779
- `[agent-sdk] cloud session ${request.sessionId} has no bound cloud agent; creating a fresh one`,
780
- );
781
- return Agent.create(options);
782
- }
783
-
784
- private resolveStore(
785
- request: Pick<RunnerPrewarmRequest, "runnerStateDir">,
786
- ): Promise<LocalAgentStore> {
787
- return this.options.store !== undefined
788
- ? Promise.resolve(this.options.store)
789
- : this.getStore(request.runnerStateDir);
790
- }
791
-
792
- /**
793
- * Mirror the settled turn's conversation. Persist failures are logged and
794
- * dropped — a durable-mirror outage must not fail a turn that already ran.
795
- */
796
- private async persistConversation(request: RunnerTurnRequest, sdkAgentId: string): Promise<void> {
797
- const mirror = this.options.conversationMirror;
798
- if (mirror === undefined) {
799
- return;
800
- }
801
- try {
802
- const store = await this.resolveStore(request);
803
- await mirror.persist(store, sdkAgentId);
804
- } catch (error) {
805
- this.log(
806
- `[agent-sdk] conversation mirror: persist for ${sdkAgentId} failed: ${
807
- error instanceof Error ? error.message : String(error)
808
- }`,
809
- );
810
- }
811
- }
812
-
813
- private getStore(stateDir: string): Promise<LocalAgentStore> {
814
- let storePromise = this.stores.get(stateDir);
815
- if (storePromise === undefined) {
816
- storePromise = mkdir(stateDir, { recursive: true }).then(() =>
817
- SqliteLocalAgentStore.open({
818
- stateRoot: stateDir,
819
- workspaceRef: stateDir,
820
- }),
821
- );
822
- this.stores.set(stateDir, storePromise);
823
- }
824
- return storePromise;
825
- }
826
- }
827
-
828
- /** Cloud agent ids minted by the server are `bc-…`; those always resume. */
829
- export function isServerMintedCloudAgentId(id: string): boolean {
830
- return id.startsWith("bc-");
831
- }
832
-
833
- /**
834
- * `Agent.resume` on a store with no row for the agent ("Agent <id> not
835
- * found", surfaced by every built-in {@link LocalAgentStore} backend).
836
- * Deliberately narrow: transient store/transport failures must propagate
837
- * rather than silently fork the thread onto a fresh conversation.
838
- */
839
- export function isLocalAgentNotFoundError(error: unknown, agentId: string): boolean {
840
- return (
841
- error instanceof Error &&
842
- error.message.includes(agentId) &&
843
- /\bnot found\b/i.test(error.message)
844
- );
845
- }
846
-
847
- export function toModelSelection(model: ModelSetting): ModelSelection {
848
- if (typeof model === "string") {
849
- return { id: model };
850
- }
851
- return {
852
- id: model.id,
853
- ...(model.params === undefined ? {} : { params: model.params }),
854
- };
855
- }
856
-
857
- function toCloudAgentOptions(
858
- cloud: RunnerTurnRequest["cloud"],
859
- agentServeAgent?: string,
860
- ): CloudAgentOptions {
861
- return {
862
- ...(cloud?.env === undefined ? {} : { env: cloud.env }),
863
- ...(cloud?.repos === undefined ? {} : { repos: cloud.repos }),
864
- ...(cloud?.workOnCurrentBranch === undefined
865
- ? {}
866
- : { workOnCurrentBranch: cloud.workOnCurrentBranch }),
867
- ...(cloud?.autoCreatePR === undefined ? {} : { autoCreatePR: cloud.autoCreatePR }),
868
- ...(cloud?.skipReviewerRequest === undefined
869
- ? {}
870
- : { skipReviewerRequest: cloud.skipReviewerRequest }),
871
- ...(cloud?.envVars === undefined ? {} : { envVars: cloud.envVars }),
872
- ...(agentServeAgent === undefined ? {} : { agentServeAgent }),
873
- };
874
- }
875
-
876
- function toAgentDefinitions(
877
- subagents: RunnerSubagent[],
878
- ): Record<string, AgentDefinition> | undefined {
879
- if (subagents.length === 0) {
880
- return undefined;
881
- }
882
- const definitions: Record<string, AgentDefinition> = {};
883
- for (const subagent of subagents) {
884
- definitions[subagent.name] = {
885
- description: subagent.description,
886
- prompt: subagent.prompt,
887
- model: subagent.model === undefined ? "inherit" : toModelSelection(subagent.model),
888
- };
889
- }
890
- return definitions;
891
- }
892
-
893
- function toTurnOutcome(result: RunResult): TurnOutcome {
894
- const usage: TurnUsage | undefined =
895
- result.usage === undefined
896
- ? undefined
897
- : {
898
- inputTokens: result.usage.inputTokens,
899
- outputTokens: result.usage.outputTokens,
900
- cacheReadTokens: result.usage.cacheReadTokens,
901
- cacheWriteTokens: result.usage.cacheWriteTokens,
902
- ...(result.usage.reasoningTokens === undefined
903
- ? {}
904
- : { reasoningTokens: result.usage.reasoningTokens }),
905
- };
906
- return {
907
- status: result.status,
908
- ...(result.result === undefined ? {} : { result: result.result }),
909
- ...(result.status === "error" ? { errorMessage: runErrorMessage(result) } : {}),
910
- errorCode: result.status === "error" ? result.error?.code : undefined,
911
- ...(usage === undefined ? {} : { usage }),
912
- };
913
- }
914
-
915
- /** Billing can lag briefly after `wait()`; retry before giving up on cost. */
916
- const CLOUD_USAGE_RETRY_DELAYS_MS = [0, 400, 1200] as const;
917
-
918
- /**
919
- * Cloud `wait()` often omits usage after a stream drop. Pull the run's
920
- * tokens from the usage API so the engine can still price the turn.
921
- * Failures are ignored: a missing estimate is better than failing the turn.
922
- */
923
- async function fillMissingCloudUsage(
924
- agent: SDKAgent,
925
- runId: string,
926
- outcome: TurnOutcome,
927
- ): Promise<TurnOutcome> {
928
- for (const delayMs of CLOUD_USAGE_RETRY_DELAYS_MS) {
929
- if (delayMs > 0) {
930
- await sleep(delayMs);
931
- }
932
- try {
933
- const billed = await agent.getUsage({ runId });
934
- const mapped = mapSdkTokenUsage(billed.usage);
935
- if (usageTokenSum(mapped) <= 0) {
936
- continue;
937
- }
938
- return { ...outcome, usage: mapped };
939
- } catch {
940
- // Transient usage-API failures should still burn the retry budget.
941
- }
942
- }
943
- return outcome;
944
- }
945
-
946
- export function runErrorMessage(result: Pick<RunResult, "error">): string {
947
- return result.error?.message?.trim() || "The Cursor agent run failed";
948
- }