@cursor/bdk 0.2.25 → 0.2.26

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 (433) hide show
  1. package/AGENTS.md +3 -18
  2. package/CHANGELOG.md +3 -0
  3. package/dist/artifacts.d.ts +1 -1
  4. package/dist/artifacts.js +1 -1
  5. package/dist/bin/agent-serve.js +25 -21
  6. package/dist/channels/bitbucket/api.d.ts +2 -2
  7. package/dist/channels/bitbucket/api.d.ts.map +1 -1
  8. package/dist/channels/bitbucket/bitbucket-channel.js +1 -1
  9. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +2 -2
  10. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  11. package/dist/channels/change-monitors/change-monitors-channel.js +1 -1
  12. package/dist/channels/deployments/deployments-channel.js +1 -1
  13. package/dist/channels/github/cursor-account.d.ts +7 -0
  14. package/dist/channels/github/cursor-account.d.ts.map +1 -1
  15. package/dist/channels/github/cursor-account.js +22 -5
  16. package/dist/channels/github/github-channel.js +1 -1
  17. package/dist/channels/github/replay.d.ts +1 -1
  18. package/dist/channels/github/replay.d.ts.map +1 -1
  19. package/dist/channels/gitlab/api.d.ts +2 -2
  20. package/dist/channels/gitlab/api.d.ts.map +1 -1
  21. package/dist/channels/gitlab/gitlab-channel.js +1 -1
  22. package/dist/channels/issues/issues-channel.js +1 -1
  23. package/dist/channels/origin/api.d.ts +4 -4
  24. package/dist/channels/origin/api.d.ts.map +1 -1
  25. package/dist/channels/origin/origin-channel.js +1 -1
  26. package/dist/channels/origin/origin-webhook.d.ts +3 -3
  27. package/dist/channels/origin/origin-webhook.d.ts.map +1 -1
  28. package/dist/channels/pagerduty/pagerduty-webhook.d.ts +2 -2
  29. package/dist/channels/pagerduty/pagerduty-webhook.d.ts.map +1 -1
  30. package/dist/channels/runs/runs-channel.js +1 -1
  31. package/dist/channels/slack/agentic-delivery.d.ts +2 -1
  32. package/dist/channels/slack/agentic-delivery.d.ts.map +1 -1
  33. package/dist/channels/slack/agentic-delivery.js +6 -10
  34. package/dist/channels/slack/agentic-signals.d.ts +2 -7
  35. package/dist/channels/slack/agentic-signals.d.ts.map +1 -1
  36. package/dist/channels/slack/agentic-signals.js +4 -3
  37. package/dist/channels/slack/api.d.ts +1 -0
  38. package/dist/channels/slack/api.d.ts.map +1 -1
  39. package/dist/channels/slack/api.js +3 -0
  40. package/dist/channels/slack/constants.d.ts +2 -0
  41. package/dist/channels/slack/constants.d.ts.map +1 -1
  42. package/dist/channels/slack/constants.js +2 -0
  43. package/dist/channels/slack/defaults.d.ts.map +1 -1
  44. package/dist/channels/slack/defaults.js +3 -2
  45. package/dist/channels/slack/dispatch.d.ts +9 -0
  46. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  47. package/dist/channels/slack/dispatch.js +3 -0
  48. package/dist/channels/slack/inbound.d.ts.map +1 -1
  49. package/dist/channels/slack/inbound.js +24 -20
  50. package/dist/channels/slack/interactive.d.ts +2 -0
  51. package/dist/channels/slack/interactive.d.ts.map +1 -1
  52. package/dist/channels/slack/interactive.js +1 -0
  53. package/dist/channels/slack/live-delivery.d.ts +3 -0
  54. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  55. package/dist/channels/slack/live-delivery.js +5 -0
  56. package/dist/channels/slack/reply-options.d.ts +9 -0
  57. package/dist/channels/slack/reply-options.d.ts.map +1 -1
  58. package/dist/channels/slack/reply-options.js +31 -1
  59. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  60. package/dist/channels/slack/slack-channel.js +7 -0
  61. package/dist/channels/slack/stream.d.ts +5 -1
  62. package/dist/channels/slack/stream.d.ts.map +1 -1
  63. package/dist/channels/slack/types.d.ts +29 -0
  64. package/dist/channels/slack/types.d.ts.map +1 -1
  65. package/dist/channels.d.ts +1 -1
  66. package/dist/channels.js +1 -1
  67. package/dist/docs/404.html +3 -3
  68. package/dist/docs/assets/{app.BjS1QEI4.js → app.BITbgXMP.js} +4 -4
  69. package/dist/docs/assets/changelog.md.sdD6ctqK.js +1 -0
  70. package/dist/docs/assets/changelog.md.sdD6ctqK.lean.js +1 -0
  71. package/dist/docs/assets/chunks/@localSearchIndexroot.B45uCZp9.js +1 -0
  72. package/dist/docs/assets/chunks/{VPLocalSearchBox.BOuvjb5Y.js → VPLocalSearchBox.3qo4-bX9.js} +2 -2
  73. package/dist/docs/assets/chunks/{arc.3WR6Jf-y.js → arc.CTrZocKU.js} +1 -1
  74. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.Dtb6Dqh6.js → architectureDiagram-Q4EWVU46.BkgIqxrv.js} +1 -1
  75. package/dist/docs/assets/chunks/{baseUniq.BUyrgrZE.js → baseUniq.5w0JfVgo.js} +1 -1
  76. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.BVLV_voZ.js → blockDiagram-DXYQGD6D.BVLtPjQc.js} +1 -1
  77. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.jXJ1q70M.js → c4Diagram-AHTNJAMY.CQ7neZTW.js} +1 -1
  78. package/dist/docs/assets/chunks/channel.Cv2w64wj.js +1 -0
  79. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.zz1SMBvK.js → chunk-4BX2VUAB.D-hJ7uKM.js} +1 -1
  80. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.CzYKuv3I.js → chunk-4TB4RGXK.RBYX5ywX.js} +1 -1
  81. package/dist/docs/assets/chunks/{chunk-55IACEB6.C7_tcJZD.js → chunk-55IACEB6.Br05HoEb.js} +1 -1
  82. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DeTwQPVO.js → chunk-EDXVE4YY.BD_7QS60.js} +1 -1
  83. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DhMTl7ut.js → chunk-FMBD7UC4.BOPnMabX.js} +1 -1
  84. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Me7f5hEp.js → chunk-OYMX7WX6.DmGIdP8i.js} +1 -1
  85. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.D0E0Bb6g.js → chunk-QZHKN3VN.CGHmolCB.js} +1 -1
  86. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CdOOBFYL.js → chunk-YZCP3GAM.C_Uhs25v.js} +1 -1
  87. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CtO2atCr.js +1 -0
  88. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CtO2atCr.js +1 -0
  89. package/dist/docs/assets/chunks/clone.hfsCtgP4.js +1 -0
  90. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BNbGESzN.js → cose-bilkent-S5V4N54A.DsU6xpcZ.js} +1 -1
  91. package/dist/docs/assets/chunks/{dagre-KV5264BT.zU7Lu_xJ.js → dagre-KV5264BT.BqQLDcoU.js} +1 -1
  92. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.B9qOdE5h.js → diagram-5BDNPKRD.Cgv8uUNF.js} +1 -1
  93. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.D8X-sf77.js → diagram-G4DWMVQ6.BXHPSXh_.js} +1 -1
  94. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.CW7MvMlE.js → diagram-MMDJMWI5.CgJzo8f_.js} +1 -1
  95. package/dist/docs/assets/chunks/{diagram-TYMM5635.J489G0Nd.js → diagram-TYMM5635.CfiN6lgT.js} +1 -1
  96. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.BkW7tGfs.js → erDiagram-SMLLAGMA.8n_hHzAd.js} +1 -1
  97. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.jc9iWORD.js → flowDiagram-DWJPFMVM.B2pb1Dv_.js} +1 -1
  98. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.B-UQfd9E.js → ganttDiagram-T4ZO3ILL.BFih4ucI.js} +1 -1
  99. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DFzrTSlJ.js → gitGraphDiagram-UUTBAWPF.CqZ8PTl8.js} +1 -1
  100. package/dist/docs/assets/chunks/{graph.C5IB6_e_.js → graph.0ufsI9gu.js} +1 -1
  101. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.DwF0-c8L.js → infoDiagram-42DDH7IO.BkPRFww4.js} +1 -1
  102. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.fBaTqzE7.js → ishikawaDiagram-UXIWVN3A.DCRK-cVX.js} +1 -1
  103. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CM8gDVJy.js → journeyDiagram-VCZTEJTY.BFyAJo33.js} +1 -1
  104. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.YiD1p0LB.js → kanban-definition-6JOO6SKY.CmA2SoGc.js} +1 -1
  105. package/dist/docs/assets/chunks/{layout.6Um-DVJT.js → layout.CYY-CbMr.js} +1 -1
  106. package/dist/docs/assets/chunks/{linear.DcTeg4Hn.js → linear.DeeDV4Oq.js} +1 -1
  107. package/dist/docs/assets/chunks/{min.CIxkY8Fe.js → min.BL3XTBN2.js} +1 -1
  108. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.D4QM_voR.js → mindmap-definition-QFDTVHPH.BcbY-G6H.js} +1 -1
  109. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.nmB309G1.js → pieDiagram-DEJITSTG.dzDcQnPE.js} +1 -1
  110. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D1HtZR3C.js → quadrantDiagram-34T5L4WZ.RxR0m5iK.js} +1 -1
  111. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CZgQWob-.js → requirementDiagram-MS252O5E.DflaXb6Q.js} +1 -1
  112. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DtiBfU-P.js → sankeyDiagram-XADWPNL6.BteLKQAe.js} +1 -1
  113. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Cld4gDSt.js → sequenceDiagram-FGHM5R23.BD8jM8oz.js} +1 -1
  114. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.DatP823_.js → stateDiagram-FHFEXIEX.C8SBkbPH.js} +1 -1
  115. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BLz7Qyo3.js +1 -0
  116. package/dist/docs/assets/chunks/{theme.D5jbBys7.js → theme.DiViIOLe.js} +2 -2
  117. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.DwQLI2be.js → timeline-definition-GMOUNBTQ.D64XF5dV.js} +1 -1
  118. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.a5yMfnsa.js → vennDiagram-DHZGUBPP.CwmeYan-.js} +1 -1
  119. package/dist/docs/assets/chunks/{wardley-RL74JXVD.B-FXivgT.js → wardley-RL74JXVD.DmAlXlpu.js} +1 -1
  120. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.Dz--Opy3.js → wardleyDiagram-NUSXRM2D.5VJ2-5K0.js} +1 -1
  121. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.Dl8w8TeT.js → xychartDiagram-5P7HB3ND.Cl6_fZVC.js} +1 -1
  122. package/dist/docs/assets/{guides_hooks.md.Bfj0pK91.js → guides_hooks.md.B2XfGX50.js} +7 -3
  123. package/dist/docs/assets/{guides_mcp-oauth.md.BM_eFC0L.js → guides_mcp-oauth.md.Cxq2TxBB.js} +3 -3
  124. package/dist/docs/assets/{guides_mcp-oauth.md.BM_eFC0L.lean.js → guides_mcp-oauth.md.Cxq2TxBB.lean.js} +1 -1
  125. package/dist/docs/assets/guides_opentelemetry.md.D4wO7_8v.js +37 -0
  126. package/dist/docs/assets/guides_opentelemetry.md.D4wO7_8v.lean.js +1 -0
  127. package/dist/docs/assets/{guides_slack.md.Bn-WupSE.js → guides_slack.md.ClIyi7FI.js} +8 -3
  128. package/dist/docs/assets/{guides_slack.md.Bn-WupSE.lean.js → guides_slack.md.ClIyi7FI.lean.js} +1 -1
  129. package/dist/docs/assets/{reference_agent-config.md.IplwL25I.js → reference_agent-config.md.CGSx8COP.js} +6 -2
  130. package/dist/docs/assets/{reference_agent-config.md.IplwL25I.lean.js → reference_agent-config.md.CGSx8COP.lean.js} +1 -1
  131. package/dist/docs/assets/{reference_channels.md.Bxaa020x.js → reference_channels.md.CNNIS6K7.js} +1 -1
  132. package/dist/docs/assets/{reference_hooks.md.B1jq3oGl.js → reference_hooks.md.CROr0QgC.js} +13 -7
  133. package/dist/docs/assets/{reference_hooks.md.B1jq3oGl.lean.js → reference_hooks.md.CROr0QgC.lean.js} +1 -1
  134. package/dist/docs/assets/{reference_schedules.md.03Ryy9ca.js → reference_schedules.md.BqWnJES4.js} +3 -3
  135. package/dist/docs/assets/reference_sessions.md.Bi6lHttM.js +22 -0
  136. package/dist/docs/assets/reference_sessions.md.Bi6lHttM.lean.js +1 -0
  137. package/dist/docs/assets/{reference_skills.md.C2GWh7g8.js → reference_skills.md.Ckddg6KX.js} +3 -3
  138. package/dist/docs/assets/{reference_tools.md.-6pypsWt.js → reference_tools.md.Bo0UfT0a.js} +1 -1
  139. package/dist/docs/assets/{style.nMsabY-V.css → style.B9o0luvp.css} +1 -1
  140. package/dist/docs/building-with-agents.html +37 -37
  141. package/dist/docs/changelog.html +60 -0
  142. package/dist/docs/changelog.md +86 -0
  143. package/dist/docs/deployment.html +37 -37
  144. package/dist/docs/evals.html +37 -37
  145. package/dist/docs/guides/agent-to-agent.html +37 -37
  146. package/dist/docs/guides/bitbucket.html +37 -37
  147. package/dist/docs/guides/cloud-agents.html +37 -37
  148. package/dist/docs/guides/convert-automation.html +37 -37
  149. package/dist/docs/guides/export-grokbot.html +37 -37
  150. package/dist/docs/guides/github.html +37 -37
  151. package/dist/docs/guides/gitlab.html +37 -37
  152. package/dist/docs/guides/grokbot-agents.html +37 -37
  153. package/dist/docs/guides/hooks.html +45 -41
  154. package/dist/docs/guides/hooks.md +7 -3
  155. package/dist/docs/guides/improve.html +37 -37
  156. package/dist/docs/guides/jev.html +37 -37
  157. package/dist/docs/guides/mcp-oauth.html +39 -39
  158. package/dist/docs/guides/mcp-oauth.md +12 -0
  159. package/dist/docs/guides/migrate.html +37 -37
  160. package/dist/docs/guides/opentelemetry.html +62 -70
  161. package/dist/docs/guides/opentelemetry.md +149 -179
  162. package/dist/docs/guides/pagerduty.html +37 -37
  163. package/dist/docs/guides/slack.html +44 -39
  164. package/dist/docs/guides/slack.md +41 -0
  165. package/dist/docs/guides/webhooks.html +37 -37
  166. package/dist/docs/hashmap.json +1 -1
  167. package/dist/docs/hillclimbing.html +37 -37
  168. package/dist/docs/index.html +37 -37
  169. package/dist/docs/llms-full.txt +385 -193
  170. package/dist/docs/llms.txt +2 -1
  171. package/dist/docs/quickstart.html +37 -37
  172. package/dist/docs/reference/agent-config.html +42 -38
  173. package/dist/docs/reference/agent-config.md +21 -1
  174. package/dist/docs/reference/artifacts.html +37 -37
  175. package/dist/docs/reference/channels.html +38 -38
  176. package/dist/docs/reference/channels.md +5 -1
  177. package/dist/docs/reference/cli.html +37 -37
  178. package/dist/docs/reference/connections.html +37 -37
  179. package/dist/docs/reference/evals.html +37 -37
  180. package/dist/docs/reference/extensions.html +37 -37
  181. package/dist/docs/reference/hooks.html +49 -43
  182. package/dist/docs/reference/hooks.md +10 -5
  183. package/dist/docs/reference/http-api.html +37 -37
  184. package/dist/docs/reference/instructions.html +37 -37
  185. package/dist/docs/reference/memory.html +37 -37
  186. package/dist/docs/reference/playground.html +36 -36
  187. package/dist/docs/reference/project-layout.html +37 -37
  188. package/dist/docs/reference/prompt.html +37 -37
  189. package/dist/docs/reference/schedules.html +40 -40
  190. package/dist/docs/reference/sessions.html +58 -37
  191. package/dist/docs/reference/sessions.md +46 -1
  192. package/dist/docs/reference/skills.html +40 -40
  193. package/dist/docs/reference/subagents.html +37 -37
  194. package/dist/docs/reference/tools.html +39 -39
  195. package/dist/docs/reference/tools.md +3 -3
  196. package/dist/docs/templates/agentic-owners.html +37 -37
  197. package/dist/docs/templates/grokbot-agents.html +37 -37
  198. package/dist/docs/templates/security-reviewer.html +37 -37
  199. package/dist/docs/templates/thermo-quality-review.html +37 -37
  200. package/dist/docs/templates/thermo-review.html +37 -37
  201. package/dist/docs/templates/triage.html +37 -37
  202. package/dist/docs/troubleshooting.html +36 -36
  203. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
  204. package/dist/extensions/cursor-cloud-agents/extension.js +15 -15
  205. package/dist/extensions/cursor-cloud-agents/lib/backend.js +1 -1
  206. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
  207. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts +1 -1
  208. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts.map +1 -1
  209. package/dist/extensions/cursor-cloud-agents/lib/inputs.js +1 -1
  210. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +1 -1
  211. package/dist/extensions/cursor-cloud-agents/tools/launch.js +1 -1
  212. package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
  213. package/dist/extensions/cursor-cloud-agents/tools/reply.js +1 -1
  214. package/dist/extensions/cursor-grokbot-agents/extension.d.ts.map +1 -1
  215. package/dist/extensions/cursor-grokbot-agents/extension.js +7 -3
  216. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +1 -1
  217. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +1 -1
  218. package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts +1 -1
  219. package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts.map +1 -1
  220. package/dist/extensions/cursor-grokbot-agents/lib/inputs.js +1 -1
  221. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +1 -1
  222. package/dist/extensions/cursor-grokbot-agents/tools/check.js +1 -1
  223. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +1 -1
  224. package/dist/extensions/cursor-grokbot-agents/tools/list.js +1 -1
  225. package/dist/extensions/improve/extension.js +1 -1
  226. package/dist/extensions/jev/extension.js +2 -2
  227. package/dist/extensions/jev/tools/evaluate.js +3 -3
  228. package/dist/extensions/slack-communication/extension.js +1 -1
  229. package/dist/extensions/slack-communication/tools/delete-message.js +1 -1
  230. package/dist/extensions/slack-communication/tools/edit-message.d.ts.map +1 -1
  231. package/dist/extensions/slack-communication/tools/edit-message.js +3 -6
  232. package/dist/extensions/slack-communication/tools/post-card.js +1 -1
  233. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  234. package/dist/extensions/slack-communication/tools/post-update.d.ts.map +1 -1
  235. package/dist/extensions/slack-communication/tools/post-update.js +3 -6
  236. package/dist/extensions/slack-communication/tools/react.js +1 -1
  237. package/dist/extensions/slack-communication/tools/set-status.js +1 -1
  238. package/dist/extensions.d.ts +1 -1
  239. package/dist/extensions.js +1 -1
  240. package/dist/index.d.ts +14 -11
  241. package/dist/index.d.ts.map +1 -1
  242. package/dist/index.js +8 -4
  243. package/dist/internal/as-of.d.ts +2 -0
  244. package/dist/internal/as-of.d.ts.map +1 -1
  245. package/dist/internal/as-of.js +2 -0
  246. package/dist/internal/builtin-tools/reminders.js +1 -1
  247. package/dist/internal/cli-deploy.d.ts.map +1 -1
  248. package/dist/internal/cli-deploy.js +18 -10
  249. package/dist/internal/continuation.d.ts +3 -0
  250. package/dist/internal/continuation.d.ts.map +1 -0
  251. package/dist/internal/continuation.js +1 -0
  252. package/dist/internal/conversation-mirror.d.ts +5 -0
  253. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  254. package/dist/internal/conversation-mirror.js +12 -1
  255. package/dist/internal/convert-automation/convert-workflow.js +1 -1
  256. package/dist/internal/convert-grokbot/answers.d.ts.map +1 -1
  257. package/dist/internal/convert-grokbot/answers.js +10 -8
  258. package/dist/internal/convert-grokbot/recipe.d.ts +1 -1
  259. package/dist/internal/convert-grokbot/recipe.d.ts.map +1 -1
  260. package/dist/internal/convert-grokbot/recipe.js +1 -1
  261. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  262. package/dist/internal/cursor/account-mcp.js +2 -0
  263. package/dist/internal/cursor/backend-client.d.ts +8 -3
  264. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  265. package/dist/internal/cursor/backend-client.js +8 -3
  266. package/dist/internal/cursor/credentials.d.ts +2 -2
  267. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  268. package/dist/internal/cursor/credentials.js +1 -1
  269. package/dist/internal/cursor-account-mcp-auth.d.ts +6 -2
  270. package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
  271. package/dist/internal/cursor-account-mcp-auth.js +15 -6
  272. package/dist/internal/deferred-channel-session.d.ts +5 -4
  273. package/dist/internal/deferred-channel-session.d.ts.map +1 -1
  274. package/dist/internal/deferred-channel-session.js +6 -4
  275. package/dist/internal/deploy-client.d.ts +5 -0
  276. package/dist/internal/deploy-client.d.ts.map +1 -1
  277. package/dist/internal/deploy-client.js +3 -3
  278. package/dist/internal/deploy-manifest.js +2 -2
  279. package/dist/internal/describe-error.d.ts +2 -0
  280. package/dist/internal/describe-error.d.ts.map +1 -1
  281. package/dist/internal/describe-error.js +2 -0
  282. package/dist/internal/discovery/context.d.ts.map +1 -1
  283. package/dist/internal/discovery/context.js +1 -2
  284. package/dist/internal/discovery/cursor-plugin.js +8 -8
  285. package/dist/internal/discovery/extensions.js +15 -8
  286. package/dist/internal/discovery/info.d.ts +2 -2
  287. package/dist/internal/discovery/info.d.ts.map +1 -1
  288. package/dist/internal/discovery/info.js +6 -9
  289. package/dist/internal/discovery/instrumentation.d.ts +10 -0
  290. package/dist/internal/discovery/instrumentation.d.ts.map +1 -0
  291. package/dist/internal/discovery/instrumentation.js +29 -0
  292. package/dist/internal/discovery/modules.d.ts.map +1 -1
  293. package/dist/internal/discovery/modules.js +4 -4
  294. package/dist/internal/discovery/project-public.d.ts +16 -0
  295. package/dist/internal/discovery/project-public.d.ts.map +1 -0
  296. package/dist/internal/discovery/project-public.js +54 -0
  297. package/dist/internal/discovery/project.d.ts.map +1 -1
  298. package/dist/internal/discovery/project.js +13 -3
  299. package/dist/internal/discovery/services.d.ts +5 -4
  300. package/dist/internal/discovery/services.d.ts.map +1 -1
  301. package/dist/internal/discovery/services.js +12 -6
  302. package/dist/internal/event-mapper.d.ts.map +1 -1
  303. package/dist/internal/event-mapper.js +1 -0
  304. package/dist/internal/factory-resource-channel.d.ts +1 -1
  305. package/dist/internal/factory-resource-channel.d.ts.map +1 -1
  306. package/dist/internal/filesystem/nearest.d.ts +1 -0
  307. package/dist/internal/filesystem/nearest.d.ts.map +1 -1
  308. package/dist/internal/filesystem/nearest.js +1 -0
  309. package/dist/internal/filesystem/tools.d.ts.map +1 -1
  310. package/dist/internal/filesystem/tools.js +1 -1
  311. package/dist/internal/handleAgentServeTrigger.d.ts +10 -0
  312. package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -1
  313. package/dist/internal/handleAgentServeTrigger.js +3 -0
  314. package/dist/internal/hmac-secret-values.d.ts +1 -1
  315. package/dist/internal/hmac-secret-values.d.ts.map +1 -1
  316. package/dist/internal/host-otel.d.ts +1 -1
  317. package/dist/internal/host-otel.d.ts.map +1 -1
  318. package/dist/internal/host-otel.js +5 -0
  319. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  320. package/dist/internal/hosted-delivery.js +6 -2
  321. package/dist/internal/http-channel.d.ts.map +1 -1
  322. package/dist/internal/http-channel.js +1 -0
  323. package/dist/internal/ids.d.ts +8 -0
  324. package/dist/internal/ids.d.ts.map +1 -1
  325. package/dist/internal/ids.js +20 -0
  326. package/dist/internal/init-scaffold.js +1 -1
  327. package/dist/internal/interview/agent-questions.d.ts +1 -1
  328. package/dist/internal/interview/agent-questions.d.ts.map +1 -1
  329. package/dist/internal/interview/agent-questions.js +1 -1
  330. package/dist/internal/interview/question.d.ts +2 -2
  331. package/dist/internal/interview/question.d.ts.map +1 -1
  332. package/dist/internal/interview/question.js +2 -2
  333. package/dist/internal/json-schema.d.ts.map +1 -1
  334. package/dist/internal/json-schema.js +3 -7
  335. package/dist/internal/mcp-endpoint.d.ts +16 -4
  336. package/dist/internal/mcp-endpoint.d.ts.map +1 -1
  337. package/dist/internal/mcp-endpoint.js +18 -6
  338. package/dist/internal/mcp-host.d.ts +9 -0
  339. package/dist/internal/mcp-host.d.ts.map +1 -1
  340. package/dist/internal/mcp-host.js +15 -0
  341. package/dist/internal/otel/collector.d.ts +5 -0
  342. package/dist/internal/otel/collector.d.ts.map +1 -1
  343. package/dist/internal/otel/collector.js +24 -5
  344. package/dist/internal/otel/config.d.ts +31 -21
  345. package/dist/internal/otel/config.d.ts.map +1 -1
  346. package/dist/internal/otel/config.js +121 -140
  347. package/dist/internal/otel/conversation-span-processor.d.ts +9 -0
  348. package/dist/internal/otel/conversation-span-processor.d.ts.map +1 -0
  349. package/dist/internal/otel/conversation-span-processor.js +34 -0
  350. package/dist/internal/otel/customer.d.ts +52 -0
  351. package/dist/internal/otel/customer.d.ts.map +1 -0
  352. package/dist/internal/otel/customer.js +727 -0
  353. package/dist/internal/otel/runtime.d.ts +12 -16
  354. package/dist/internal/otel/runtime.d.ts.map +1 -1
  355. package/dist/internal/otel/runtime.js +30 -234
  356. package/dist/internal/otel-env.d.ts +6 -0
  357. package/dist/internal/otel-env.d.ts.map +1 -0
  358. package/dist/internal/otel-env.js +5 -0
  359. package/dist/internal/reminder-runner.d.ts +9 -4
  360. package/dist/internal/reminder-runner.d.ts.map +1 -1
  361. package/dist/internal/reminder-runner.js +12 -10
  362. package/dist/internal/reminder-schedule.d.ts +1 -0
  363. package/dist/internal/reminder-schedule.d.ts.map +1 -1
  364. package/dist/internal/reminder-schedule.js +1 -0
  365. package/dist/internal/sdk-runner.d.ts +2 -0
  366. package/dist/internal/sdk-runner.d.ts.map +1 -1
  367. package/dist/internal/sdk-runner.js +149 -13
  368. package/dist/internal/server.d.ts +4 -1
  369. package/dist/internal/server.d.ts.map +1 -1
  370. package/dist/internal/server.js +25 -24
  371. package/dist/internal/session-engine.d.ts +27 -0
  372. package/dist/internal/session-engine.d.ts.map +1 -1
  373. package/dist/internal/session-engine.js +149 -21
  374. package/dist/internal/slack-provision-client.js +1 -1
  375. package/dist/internal/store-api-protocol.d.ts +1 -1
  376. package/dist/internal/store-api-protocol.d.ts.map +1 -1
  377. package/dist/internal/store-api-protocol.js +1 -1
  378. package/dist/internal/update-check.d.ts +2 -2
  379. package/dist/internal/update-check.d.ts.map +1 -1
  380. package/dist/internal/update-check.js +3 -3
  381. package/dist/internal/zod3-datetime.d.ts +12 -0
  382. package/dist/internal/zod3-datetime.d.ts.map +1 -0
  383. package/dist/internal/zod3-datetime.js +17 -0
  384. package/dist/otel-public.d.ts +2 -3
  385. package/dist/otel-public.d.ts.map +1 -1
  386. package/dist/otel-public.js +2 -2
  387. package/dist/otel.d.ts +3 -102
  388. package/dist/otel.d.ts.map +1 -1
  389. package/dist/otel.js +61 -97
  390. package/dist/playground/assets/index-CyPkf2y7.css +1 -0
  391. package/dist/playground/assets/{index-CHk6O92d.js → index-DpbzbqFY.js} +38 -38
  392. package/dist/playground/index.html +2 -2
  393. package/dist/public-deprecated.d.ts +36 -0
  394. package/dist/public-deprecated.d.ts.map +1 -0
  395. package/dist/public-deprecated.js +39 -0
  396. package/dist/tools.d.ts +3 -3
  397. package/dist/tools.d.ts.map +1 -1
  398. package/dist/tools.js +1 -1
  399. package/dist/types.d.ts +221 -90
  400. package/dist/types.d.ts.map +1 -1
  401. package/docs/changelog.md +91 -0
  402. package/docs/guides/hooks.md +7 -3
  403. package/docs/guides/mcp-oauth.md +12 -0
  404. package/docs/guides/opentelemetry.md +149 -184
  405. package/docs/guides/slack.md +41 -0
  406. package/docs/reference/agent-config.md +21 -1
  407. package/docs/reference/channels.md +5 -1
  408. package/docs/reference/hooks.md +10 -5
  409. package/docs/reference/sessions.md +46 -1
  410. package/docs/reference/tools.md +3 -3
  411. package/package.json +31 -7
  412. package/schemas/grokbot-answers.schema.json +11 -0
  413. package/skills/framework-map/SKILL.md +2 -1
  414. package/skills/otel/SKILL.md +28 -48
  415. package/templates/code-wiki/evals/wiki.eval.ts +2 -2
  416. package/dist/docs/assets/chunks/@localSearchIndexroot.oGqZumnJ.js +0 -1
  417. package/dist/docs/assets/chunks/channel.Dt4aweTm.js +0 -1
  418. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DGUHZs6j.js +0 -1
  419. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DGUHZs6j.js +0 -1
  420. package/dist/docs/assets/chunks/clone.DWf3k0Z0.js +0 -1
  421. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C0571l4D.js +0 -1
  422. package/dist/docs/assets/guides_opentelemetry.md.DBQtp7_V.js +0 -45
  423. package/dist/docs/assets/guides_opentelemetry.md.DBQtp7_V.lean.js +0 -1
  424. package/dist/docs/assets/reference_sessions.md.C8FXuGwk.js +0 -1
  425. package/dist/docs/assets/reference_sessions.md.C8FXuGwk.lean.js +0 -1
  426. package/dist/playground/assets/index-BdMwybMt.css +0 -1
  427. package/templates/grokbot-agents/.gitignore +0 -4
  428. package/templates/security-help/.gitignore +0 -4
  429. /package/dist/docs/assets/{guides_hooks.md.Bfj0pK91.lean.js → guides_hooks.md.B2XfGX50.lean.js} +0 -0
  430. /package/dist/docs/assets/{reference_channels.md.Bxaa020x.lean.js → reference_channels.md.CNNIS6K7.lean.js} +0 -0
  431. /package/dist/docs/assets/{reference_schedules.md.03Ryy9ca.lean.js → reference_schedules.md.BqWnJES4.lean.js} +0 -0
  432. /package/dist/docs/assets/{reference_skills.md.C2GWh7g8.lean.js → reference_skills.md.Ckddg6KX.lean.js} +0 -0
  433. /package/dist/docs/assets/{reference_tools.md.-6pypsWt.lean.js → reference_tools.md.Bo0UfT0a.lean.js} +0 -0
@@ -143,6 +143,97 @@ works; a measured climb proves it works better on fixed inputs.
143
143
 
144
144
  ---
145
145
 
146
+ Source: /docs/changelog.md
147
+
148
+ # Changelog
149
+
150
+ ## 0.2.26 (2026-10-16)
151
+
152
+ ### Breaking changes
153
+
154
+ - `serve({ otel })` is removed. Delete `bot/otel.ts`, `agent/otel.ts`, and `bot/instrumentation.ts`. Set `OTEL_*` variables. Read [Migrating from serve({ otel })](/docs/guides/opentelemetry.md#migrating-from-serve-otel).
155
+
156
+ ### Behavior changes
157
+
158
+ - `ctx.host.otel` is deprecated. It still runs for this release. The first call emits one deprecation warning. Set `OTEL_*` variables. Record with `metrics.getMeter` and `trace.getTracer` from `@opentelemetry/api`.
159
+ - A span started during a turn or a tool gets `cursor.conversation.id` from the active context when the span does not set it. A metric does not. Call `currentConversationId` from `@cursor/bdk/otel` and set the attribute yourself. See [OpenTelemetry](/docs/guides/opentelemetry.md#what-you-can-record).
160
+ - A turn waits for MCP OAuth only when a person can connect. That is a playground or HTTP chat turn, or a Slack message on a channel that shows Connect. `toolApprovals: true` shows Connect, and so does `buildToolApprovalEvents` in `events`. A schedule, a reminder, a webhook, an eval, or a Slack channel without Connect does not wait. A required connection fails with `Reconnect <connection>`. An optional connection is skipped.
161
+ - A turn never waits to authorize an `optional` connection, also in the playground.
162
+ - A turn that waits for MCP OAuth stops after 10 minutes with `Reconnect <connection>`. `interrupt()` also stops the wait.
163
+ - `bdk deploy` rejects a source host other than GitHub, gitlab.com, or Origin.
164
+ - A new scaffold imports `zod/v4`. A zod 3 schema and a zod 4 schema both still parse.
165
+ - `bdk deploy` with no terminal lists a connector that needs sign-in as pending.
166
+
167
+ ### New
168
+
169
+ - `bdk deploy` deploys a bot from a gitlab.com repository.
170
+ - When you omit `--cursor-events-repo`, a GitLab deploy watches that project. A nested group is part of the path.
171
+ - When that deploy cannot watch the project, the deploy still finishes. The CLI says the deployment is not watching the project.
172
+ - An agentic Slack reply can set `cards: { display: "plan" }`. Slack shows the `post-card` steps from that turn as one checklist.
173
+ - A `title` names that checklist. A title has at most 256 characters.
174
+ - With no `cards` option, Slack keeps one card for each step.
175
+ - `send()` returns a delivery id. Set `deliveryId` to choose it. `nudge.delivered` and `message.received` include that id.
176
+
177
+ ### Fixes
178
+
179
+ - Public helper signatures use portable types. A webhook body is a `string` or a `Uint8Array`. An environment map is `Record<string, string | undefined>`.
180
+ - `HostFilesApi.read` takes a `HostFileTextEncoding`. A `Buffer` and `process.env` still type-check.
181
+ - OpenTelemetry ends each tool span when that tool finishes.
182
+ - With no OpenTelemetry endpoint, the process holds at most 2048 spans and 2048 log records.
183
+ - A follow-up after a redeploy resumes the same agent. A changed workspace path does not start a new conversation.
184
+ - In a Slack Connect channel, sender checks use the workspace where the app is installed.
185
+ - A `cursorAccount` GitHub GraphQL call includes the repository.
186
+ - A Slack bot with a lapsed MCP connection replies with a reconnect message.
187
+
188
+ ## 0.2.25 (2026-10-14)
189
+
190
+ ### New
191
+
192
+ - `bdk validate --json` writes one JSON object. Each diagnostic has a code.
193
+
194
+ ### Fixes
195
+
196
+ - OpenTelemetry metrics follow `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE`. The default stays delta.
197
+ - `ctx.host.github.getOctokit()` tries again after a failed lookup. A later call can succeed after a GitHub token becomes available.
198
+
199
+ ## 0.2.24 (2026-10-13)
200
+
201
+ ### Breaking changes
202
+
203
+ - Install `zod` in the project. The peer range is `^3.25.0` or `^4.0.0`. A new scaffold imports `zod/v3`.
204
+
205
+ ### Behavior changes
206
+
207
+ - `setContinuationToken(null)` releases the continuation key. The next delivery starts a new session.
208
+ - Model fallback continues when a blocked model sends progress updates and no assistant text. Those updates are `user-message-appended`, `step-started`, and `step-completed`.
209
+ - Read a secret inside a handler, a tool, or a callback. A `process.env` read while the module is still loading returns an empty value on a Cursor-managed deploy.
210
+ - In the Agentic Approver template, a `paths` glob is relative to the policy directory.
211
+ - The package depends on `tsx` 4.23.15.
212
+
213
+ ### New
214
+
215
+ - `hmacSignatureAuth` takes an optional `separator`. One header can then carry several HMAC signatures. PagerDuty uses a comma.
216
+ - `cursorCloudAgents` accepts `cloud.teamMcpServers`. The launch uses the team MCP servers you name.
217
+
218
+ ### Fixes
219
+
220
+ - On Cursor-managed hosting, OpenTelemetry reads the endpoint, the headers, and the resource after secrets load. You can remove a workaround that reads `OTEL_EXPORTER_OTLP_HEADERS` again.
221
+
222
+ ## 0.2.23 (2026-10-09)
223
+
224
+ ### Behavior changes
225
+
226
+ - `bdk migrate` rewrites a URL-secret MCP peer to `defineConnection({ agent })` in the migration pull request.
227
+ - `bdk migrate` prints a checklist after the migration. It says when there is nothing to migrate.
228
+ - `bdk slack create --prod` says the deployment redeploys by itself.
229
+ - `bdk deploy` on a folder of several agents prints one command per agent. You run each command to deploy that agent.
230
+
231
+ ### New
232
+
233
+ - A Slack app can opt in to the `chat:write.customize` scope. A post can then set its username and its icon. An app that leaves the scope off keeps its current scopes.
234
+
235
+ ---
236
+
146
237
  Source: /docs/deployment.md
147
238
 
148
239
  # Deploy a BDK project
@@ -2520,8 +2611,13 @@ so the dashboard reflects live traffic instead of the test suite.
2520
2611
 
2521
2612
  ```ts
2522
2613
  // bot/hooks/usage.ts
2614
+ import { metrics } from "@opentelemetry/api";
2523
2615
  import { defineHook } from "@cursor/bdk/hooks";
2524
2616
 
2617
+ const meter = metrics.getMeter("acme");
2618
+ const inputTokens = meter.createCounter("acme.tokens.input");
2619
+ const outputTokens = meter.createCounter("acme.tokens.output");
2620
+
2525
2621
  export default defineHook({
2526
2622
  events: {
2527
2623
  async "turn.completed"(event, ctx) {
@@ -2532,9 +2628,8 @@ export default defineHook({
2532
2628
  return;
2533
2629
  }
2534
2630
 
2535
- const { inputTokens, outputTokens } = event.data.usage;
2536
- ctx.host.otel.increment("acme.tokens.input", inputTokens);
2537
- ctx.host.otel.increment("acme.tokens.output", outputTokens);
2631
+ inputTokens.add(event.data.usage.inputTokens);
2632
+ outputTokens.add(event.data.usage.outputTokens);
2538
2633
  },
2539
2634
  },
2540
2635
  });
@@ -3106,6 +3201,18 @@ bdk serve --dir . --dev
3106
3201
 
3107
3202
  Connect authorizes the process that is running now.
3108
3203
 
3204
+ A turn waits for Connect only when a person can click it:
3205
+
3206
+ - A playground or HTTP chat turn.
3207
+ - A Slack message, when the channel shows Connect. `slackChannel({ toolApprovals: true })` shows
3208
+ Connect, and so does `buildToolApprovalEvents` in `events`.
3209
+
3210
+ The wait stops after 10 minutes, or when the turn is interrupted. Other
3211
+ turns do not wait. These are schedules, reminders, webhooks, evals, and
3212
+ Slack channels without Connect. A required connection fails the call with
3213
+ `Reconnect <connection>`. An `optional` connection is skipped, also in the
3214
+ playground. Authorize those connections ahead of time with `mcp oauth`.
3215
+
3109
3216
  ## Keep privileged tools behind a wrapper
3110
3217
 
3111
3218
  Put a connection under `bot/host-connections/` when the model should
@@ -3369,21 +3476,14 @@ peer connections, and secrets, then verify a hosted turn. The
3369
3476
 
3370
3477
  Source: /docs/guides/opentelemetry.md
3371
3478
 
3372
- # Observe an agent with OpenTelemetry
3373
-
3374
- OpenTelemetry connects an agent turn to the observability system your
3375
- team already uses. Once you configure an OTLP collector, each request,
3376
- model turn, tool call, and subagent appears alongside token, tool, and
3377
- cost metrics from the serve process.
3479
+ # OpenTelemetry
3378
3480
 
3379
- Export is opt-in. Nothing leaves the process until you configure a
3380
- destination.
3381
-
3382
- ## Connect an OTLP collector
3383
-
3384
- Set the collector endpoint, start the agent, and send it a message. You
3385
- should see an `agent_sdk.http` request span and an `agent_sdk.turn`
3386
- trace, with any tool or subagent work nested under the turn.
3481
+ BDK exports traces, metrics, and logs to an OTLP collector. You
3482
+ configure that with standard `OTEL_*` environment variables. There is
3483
+ no `defineOtel` or `register()` hook. `ctx.host.otel` is deprecated.
3484
+ It still runs for this release and logs one warning per process. Set
3485
+ `OTEL_*` variables and record with `metrics.getMeter` and
3486
+ `trace.getTracer` from `@opentelemetry/api`.
3387
3487
 
3388
3488
  ```bash
3389
3489
  export OTEL_EXPORTER_OTLP_ENDPOINT=https://otel.example.com
@@ -3393,217 +3493,194 @@ export OTEL_SERVICE_NAME=incident-agent
3393
3493
  bdk serve --dir . --dev
3394
3494
  ```
3395
3495
 
3396
- Metrics use delta temporality by default. For Grafana Cloud, set
3496
+ The default protocol is OTLP/HTTP protobuf. Set
3497
+ `OTEL_EXPORTER_OTLP_PROTOCOL=http/json` when the collector only accepts
3498
+ JSON. `grpc` is not supported. BDK logs a warning and uses
3499
+ `http/protobuf`.
3500
+
3501
+ Metrics use delta temporality by default. BDK logs that default when
3502
+ export starts. For Grafana Cloud or Prometheus, set
3397
3503
  `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE` to `cumulative`.
3398
3504
  Grafana Cloud rejects delta metrics.
3399
3505
 
3400
- The default protocol is OTLP/HTTP protobuf. If you already call
3401
- `serve()` from TypeScript, you can configure the same destination in
3402
- code:
3403
-
3404
- ```ts
3405
- import { serve } from "@cursor/bdk";
3406
-
3407
- await serve(".", {
3408
- otel: {
3409
- serviceName: "incident-agent",
3410
- exporters: [
3411
- {
3412
- url: "https://otel.example.com",
3413
- headers: {
3414
- Authorization: `Bearer ${process.env.OTEL_TOKEN ?? ""}`,
3415
- },
3416
- },
3417
- ],
3418
- },
3419
- });
3420
- ```
3506
+ BDK installs trace, metric, and log providers before it imports
3507
+ `bot/agent.ts`. A meter, tracer, or logger created at module scope
3508
+ binds to those providers. Exporters attach when the process has the
3509
+ `OTEL_*` variables. On a hosted agent that is the first request, after
3510
+ secrets are in the environment.
3421
3511
 
3422
- Use environment variables when you start the agent with
3423
- `bdk serve`. Use `serve({ otel })` when your TypeScript
3424
- application starts the server itself. When that application
3425
- already uses OpenTelemetry, BDK sends its traces, metrics, and
3426
- logs to the collector configured here.
3512
+ With no OTLP endpoint, BDK adds no exporters. Outbound `fetch` does
3513
+ not gain a `traceparent` header. The session collector stays disabled.
3427
3514
 
3428
- ## Export from a hosted agent
3515
+ ## Variables
3429
3516
 
3430
- Set the collector endpoint and headers as secrets, and add the
3517
+ | Variable | Effect |
3518
+ | --- | --- |
3519
+ | `OTEL_EXPORTER_OTLP_ENDPOINT` | Base URL. BDK appends `/v1/traces`, `/v1/metrics`, and `/v1/logs`. |
3520
+ | `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | Traces URL, used as written. It wins over the base URL. |
3521
+ | `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` | Metrics URL, used as written. It wins over the base URL. |
3522
+ | `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | Logs URL, used as written. It wins over the base URL. |
3523
+ | `OTEL_EXPORTER_OTLP_HEADERS` | Headers on every export. Values are URL-encoded. Read again on each export. |
3524
+ | `OTEL_EXPORTER_OTLP_PROTOCOL` | `http/protobuf` (default) or `http/json`. gRPC is not supported. |
3525
+ | `OTEL_SERVICE_NAME` | `service.name`. Default is the agent name, then `unknown_service:node`. |
3526
+ | `OTEL_RESOURCE_ATTRIBUTES` | Resource attributes, including `service.namespace`, `service.version`, and `deployment.environment.name`. |
3527
+ | `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE` | `delta` (default), `cumulative`, or `lowmemory`. Use `cumulative` for Grafana Cloud. |
3528
+ | `OTEL_LOGS_EXPORTER` | `otlp` turns logs on. Unset, `none`, and `console` leave OTLP logs off. |
3529
+ | `OTEL_SDK_DISABLED` | `true` turns export off. |
3530
+ | `OTEL_TRACES_EXPORTER` | `none` turns traces off. |
3531
+ | `OTEL_METRICS_EXPORTER` | `none` turns metrics off. |
3532
+ | `OTEL_LOG_USER_PROMPTS` | `1` puts prompt text on log records. |
3533
+ | `OTEL_LOG_TOOL_CONTENT` | `1` puts tool payloads on log records. |
3534
+
3535
+ ## Hosted agents
3536
+
3537
+ Set the endpoint, headers, and service name as secrets. Add the
3431
3538
  collector host to `hosting.egressDomains`. The host is a hostname
3432
- with no scheme and no path. The first request loads the secrets,
3433
- and export starts with those headers.
3539
+ with no scheme and no path.
3434
3540
 
3435
3541
  ```ts
3436
- // bot/agent.ts
3437
- import { defineAgent } from "@cursor/bdk";
3438
-
3439
3542
  export default defineAgent({
3440
3543
  hosting: {
3441
3544
  egressDomains: ["otlp-gateway-prod-us-east-0.grafana.net"],
3442
- secretNames: ["OTEL_EXPORTER_OTLP_ENDPOINT", "OTEL_EXPORTER_OTLP_HEADERS"],
3545
+ secretNames: [
3546
+ "OTEL_EXPORTER_OTLP_ENDPOINT",
3547
+ "OTEL_EXPORTER_OTLP_HEADERS",
3548
+ "OTEL_SERVICE_NAME",
3549
+ ],
3443
3550
  },
3444
3551
  });
3445
3552
  ```
3446
3553
 
3447
- ```bash
3448
- bdk secrets set my-agent OTEL_EXPORTER_OTLP_ENDPOINT OTEL_EXPORTER_OTLP_HEADERS
3449
- ```
3554
+ Secrets arrive with the first request that has an endpoint. That
3555
+ request's export uses those headers and `service.name`. A later
3556
+ `bdk secrets set` updates headers on the next export, including a
3557
+ rotated key. BDK also replaces the exporter when the URL, protocol,
3558
+ or signal list changes. `service.name` is fixed on the first export
3559
+ that attaches. Redeploy to change the service name.
3450
3560
 
3451
- `OTEL_EXPORTER_OTLP_HEADERS` is a comma-separated list of
3452
- `name=value` pairs. Each value is URL-encoded, so a space is
3453
- `%20` (`Authorization=Basic%20...`).
3561
+ ## What you can record
3454
3562
 
3455
- A later `bdk secrets set` changes the headers on the next export.
3456
- You do not redeploy to rotate a token. The URL, service name,
3457
- resource attributes, signals, sample ratio, metric export interval,
3458
- and metrics temporality stay as they were on the first export.
3459
- Redeploy to change one of those. BDK logs a warning when one of them
3460
- changes on a running agent.
3563
+ Create the tracer, meter, and logger at module scope.
3461
3564
 
3462
- When an exporter host is missing from `hosting.egressDomains`, BDK
3463
- logs an error that names the host. Add the host and redeploy.
3565
+ ```ts
3566
+ import { metrics, trace } from "@opentelemetry/api";
3567
+ import { logs } from "@opentelemetry/api-logs";
3464
3568
 
3465
- Spans and metrics from before the first request are not exported,
3466
- including spans from channel `onStart`. If the OpenTelemetry config
3467
- fails, BDK logs the error and the request still completes.
3569
+ const tracer = trace.getTracer("incident-agent");
3570
+ const lookups = metrics.getMeter("incident-agent").createCounter("incident.lookups");
3571
+ const logger = logs.getLogger("incident-agent");
3572
+ ```
3468
3573
 
3469
- Logs stay off until `serve({ otel })` sets `logs`, or until
3470
- `OTEL_LOGS_EXPORTER` is `otlp`. Prompt text and tool payloads stay
3471
- off until you set `OTEL_LOG_USER_PROMPTS` or
3472
- `OTEL_LOG_TOOL_CONTENT`.
3574
+ Record during a request, after secrets have loaded. A span or a log
3575
+ record that ends before the exporters attach is still exported. BDK
3576
+ holds up to 2048 spans and 2048 log records until the exporters
3577
+ attach, then sends them. BDK drops each record past that limit. A
3578
+ metric recorded before the first collect is included in that collect.
3473
3579
 
3474
- ## Follow one conversation
3580
+ BDK also records HTTP spans, token counts, and tool calls on the
3581
+ session. Those spans carry `cursor.conversation.id`. A span you start
3582
+ with `trace.getTracer` during a turn or a tool call gets the same
3583
+ attribute from the active context. A value you set on the span stays.
3584
+ BDK does not overwrite it. The id stays in this process. It is not
3585
+ propagated.
3475
3586
 
3476
- Copy the complete session ID from the playground or session API, then
3477
- filter your observability system on either `agent_sdk.session_id` or
3478
- `cursor.conversation.id`. Every turn in that conversation carries the
3479
- same value, including follow-ups and tool work.
3587
+ A metric does not get `cursor.conversation.id`. Read the id and set
3588
+ the attribute yourself.
3480
3589
 
3481
- The trace shape stays small:
3590
+ ```ts
3591
+ import { metrics } from "@opentelemetry/api";
3592
+ import { currentConversationId } from "@cursor/bdk/otel";
3482
3593
 
3483
- ```text
3484
- request: agent_sdk.http
3594
+ const lookups = metrics.getMeter("incident-agent").createCounter("incident.lookups");
3485
3595
 
3486
- turn: agent_sdk.turn
3487
- |- agent_sdk.tool
3488
- `- agent_sdk.subagent
3489
- `- agent_sdk.tool
3596
+ lookups.add(1, { "cursor.conversation.id": currentConversationId() });
3490
3597
  ```
3491
3598
 
3492
- A conversation can produce several turn traces, so use the session ID
3493
- as the join key instead of expecting one long-lived session span.
3494
-
3495
- ### Subagents
3599
+ Prompt text and tool payloads stay off log records unless logs are on
3600
+ (`OTEL_LOGS_EXPORTER=otlp`) and you set `OTEL_LOG_USER_PROMPTS` or
3601
+ `OTEL_LOG_TOOL_CONTENT`.
3496
3602
 
3497
- A subagent's tool calls are `agent_sdk.tool` spans under its
3498
- `agent_sdk.subagent` span. Its `reasoning.completed` and
3499
- `message.completed` events sit on that span too, so the subagent span
3500
- shows where its time went. Time between two tool spans is the model
3501
- choosing the next step. A subagent that fails or is cancelled ends its
3502
- span with ERROR status when it stops.
3603
+ ## Limits
3503
3604
 
3504
- ### Computer use
3605
+ These are not supported yet.
3505
3606
 
3506
- Each computer use action is an `agent_sdk.tool` span with
3507
- `cursor.tool.name` set to `computerUse`, under the computer use
3508
- subagent's span. A failed action has ERROR status. These attributes
3509
- describe the action without typed text, coordinates, or screenshots:
3607
+ - Custom span processors, samplers, and views.
3608
+ - Bringing your own OpenTelemetry SDK.
3609
+ - Library auto-instrumentation.
3610
+ - A `register()` hook. There is no ticket for it yet.
3611
+ - `OTEL_TRACES_SAMPLER` and `OTEL_METRIC_EXPORT_INTERVAL` that arrive
3612
+ only with hosted secrets. BDK reads them when it builds the provider,
3613
+ which is before that secret load. Set them on the process, then
3614
+ restart. BDK logs a warning when a later value differs.
3510
3615
 
3511
- | Attribute | Value |
3512
- | --- | --- |
3513
- | `agent_sdk.computer.actions` | The action type, such as `click`, `type`, or `screenshot` |
3514
- | `agent_sdk.computer.executor_duration_ms` | Time the desktop took to run the action and capture the screen |
3515
- | `agent_sdk.computer.settle_ms` | Part of that time spent waiting for the screen to settle |
3616
+ Do not import your own SDK providers next to BDK's. BDK logs a warning
3617
+ when a module replaces a provider BDK registered. The global API then
3618
+ uses that module's provider. BDK shuts down a provider it created
3619
+ only when that provider is not the one it registered.
3516
3620
 
3517
- The two durations appear only on actions that succeed.
3621
+ ## Migrating from serve({ otel })
3518
3622
 
3519
- To export the full actions, turn on tool content as shown in
3520
- [Control what leaves the process](#control-what-leaves-the-process).
3521
- Tool content includes the text the agent typed, which can contain
3522
- passwords.
3623
+ `serve({ otel })` is removed. Delete the option. Set the same
3624
+ values with `OTEL_*` variables. Delete `bot/otel.ts`,
3625
+ `agent/otel.ts`, and `bot/instrumentation.ts`. Do not call
3626
+ `defineOtel`.
3523
3627
 
3524
- ## Add domain telemetry
3628
+ BDK sends each signal to one URL. A second exporter for the same
3629
+ signal has no variable.
3525
3630
 
3526
- Use `ctx.host.otel` when your dashboard should answer questions the
3527
- built-in telemetry cannot, such as which incident a turn handled or how
3528
- long approval took. Attributes appear on the active turn and tool
3529
- spans, while counters and histograms give you metrics to graph and
3530
- alert on.
3631
+ | Old option | Set this instead |
3632
+ | --- | --- |
3633
+ | `serviceName` | `OTEL_SERVICE_NAME` |
3634
+ | `serviceVersion` | `service.version` in `OTEL_RESOURCE_ATTRIBUTES` |
3635
+ | `resourceAttributes` | `OTEL_RESOURCE_ATTRIBUTES`. Separate pairs with commas. URL-encode each value. |
3636
+ | `exporters[].url` | `OTEL_EXPORTER_OTLP_ENDPOINT`. BDK appends `/v1/traces`, `/v1/metrics`, and `/v1/logs`. |
3637
+ | `exporters[].url` with `signals` | `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`, `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT`, or `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT`. BDK uses that URL as written. |
3638
+ | `exporters[].headers` | `OTEL_EXPORTER_OTLP_HEADERS`. Separate pairs with commas. URL-encode each value. |
3639
+ | `exporters[].protocol` | `OTEL_EXPORTER_OTLP_PROTOCOL`. Use `http/protobuf` or `http/json`. For one signal, use `OTEL_EXPORTER_OTLP_TRACES_PROTOCOL`, `OTEL_EXPORTER_OTLP_METRICS_PROTOCOL`, or `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL`. |
3640
+ | `exporters[].signals` | Set the signal URL above. Set `OTEL_TRACES_EXPORTER`, `OTEL_METRICS_EXPORTER`, or `OTEL_LOGS_EXPORTER` to `none` to stop that signal. |
3641
+ | `traces: false` | `OTEL_TRACES_EXPORTER=none` |
3642
+ | `traces: true` | Leave `OTEL_TRACES_EXPORTER` unset. Traces start when an endpoint is set. |
3643
+ | `traces.sampleRatio` | `OTEL_TRACES_SAMPLER=parentbased_traceidratio` and `OTEL_TRACES_SAMPLER_ARG` set to the ratio. Set both before the process starts. |
3644
+ | `metrics: false` | `OTEL_METRICS_EXPORTER=none` |
3645
+ | `metrics: true` | Leave `OTEL_METRICS_EXPORTER` unset. Metrics start when a metrics URL is set. |
3646
+ | `metrics.exportIntervalMillis` | `OTEL_METRIC_EXPORT_INTERVAL`, in milliseconds. Set it before the process starts. |
3647
+ | `logs: false` | Leave `OTEL_LOGS_EXPORTER` unset, or set it to `none`. |
3648
+ | `logs: true` | `OTEL_LOGS_EXPORTER=otlp` |
3649
+ | `logs.userPrompts` | `OTEL_LOGS_EXPORTER=otlp` and `OTEL_LOG_USER_PROMPTS=1` |
3650
+ | `logs.toolContent` | `OTEL_LOGS_EXPORTER=otlp` and `OTEL_LOG_TOOL_CONTENT=1` |
3651
+ | `otel: false` | Set no endpoint, or set `OTEL_SDK_DISABLED=true`. |
3652
+
3653
+ Before:
3531
3654
 
3532
3655
  ```ts
3533
- ctx.host.otel.setAttributes({
3534
- "support.ticket_id": "INC-123",
3535
- "support.queue": "p1",
3536
- });
3537
-
3538
- ctx.host.otel.increment("support.ticket.resolved", {
3539
- outcome: "fixed",
3540
- });
3541
-
3542
- ctx.host.otel.record("support.approval.duration_ms", 1420, {
3543
- outcome: "approved",
3656
+ await serve(".", {
3657
+ otel: {
3658
+ serviceName: "incident-agent",
3659
+ exporters: [
3660
+ {
3661
+ url: "https://otel.example.com",
3662
+ headers: { Authorization: `Bearer ${process.env.OTEL_TOKEN ?? ""}` },
3663
+ },
3664
+ ],
3665
+ },
3544
3666
  });
3545
3667
  ```
3546
3668
 
3547
- This API is available in tools, hooks, and channel handlers. A
3548
- session-bound context adds `cursor.conversation.id` and
3549
- `agent_sdk.agent` automatically, so custom measurements join the
3550
- first-party telemetry without extra plumbing.
3551
-
3552
- Prefix custom names with your team or agent. First-party metric names
3553
- and join keys are reserved, and this surface does not create custom
3554
- spans.
3555
-
3556
- ## Choose signals
3557
-
3558
- Once export has a destination, traces and metrics are on by default;
3559
- logs remain off until you opt in.
3560
-
3561
- | Signal | What appears |
3562
- | --- | --- |
3563
- | Traces | HTTP requests, turns, tools, and subagents |
3564
- | Metrics | Token usage, tool calls, cost, and BDK session or turn counts |
3565
- | Logs | Session events, after you enable log export |
3566
-
3567
- The first metrics to look for are `cursor.token.usage`,
3568
- `cursor.tool.calls`, and `cursor.cost.usage`. Configure
3569
- `traces: false`, `metrics: false`, or `logs: true` under
3570
- `serve({ otel })` when you need a different signal mix.
3571
-
3572
- ## Control what leaves the process
3573
-
3574
- Traces include structure, tool names, usage metrics, and span
3575
- status. A failed tool's span status and its `action.result` log
3576
- include a short failure reason.
3577
- A tool or subagent that is still open when the turn ends gets
3578
- ERROR status with the reason `no result`. User prompts, tool
3579
- arguments, and full tool results stay off the wire until you opt in.
3580
-
3581
- Turn on logs first, then opt into prompt or tool content separately:
3669
+ After:
3582
3670
 
3583
3671
  ```bash
3584
- export OTEL_LOGS_EXPORTER=otlp
3585
- export OTEL_LOG_USER_PROMPTS=1
3586
- export OTEL_LOG_TOOL_CONTENT=1
3672
+ export OTEL_SERVICE_NAME=incident-agent
3673
+ export OTEL_EXPORTER_OTLP_ENDPOINT=https://otel.example.com
3674
+ export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer%20$OTEL_TOKEN"
3675
+ bdk serve --dir . --dev
3587
3676
  ```
3588
3677
 
3589
- `OTEL_LOG_USER_PROMPTS` exports user text. `OTEL_LOG_TOOL_CONTENT`
3590
- exports tool inputs, outputs, and failure details. Enable either only
3591
- when the collector's access and retention policies are appropriate for
3592
- that data.
3593
-
3594
- The same controls are available as
3595
- `logs: { userPrompts, toolContent }` under `serve({ otel })`.
3596
-
3597
- ## Related
3678
+ On a hosted agent, put the same names in `hosting.secretNames`. Add
3679
+ the collector host to `hosting.egressDomains`. Then run:
3598
3680
 
3599
- - [`skills/otel/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/otel/SKILL.md): compact
3600
- configuration and custom-metric reference for coding agents
3601
- - [Hooks](/docs/reference/hooks.md): emit domain telemetry from session
3602
- events
3603
- - [Deployment](/docs/deployment.md): declare `hosting.egressDomains`
3604
- and set collector secrets on a hosted agent
3605
- - [Cursor enterprise OpenTelemetry Export](https://cursor.com/docs/enterprise/opentelemetry-export):
3606
- send organization-wide Cursor telemetry to the same collector
3681
+ ```bash
3682
+ bdk secrets set my-agent OTEL_SERVICE_NAME OTEL_EXPORTER_OTLP_ENDPOINT OTEL_EXPORTER_OTLP_HEADERS
3683
+ ```
3607
3684
 
3608
3685
  ---
3609
3686
 
@@ -4046,6 +4123,47 @@ export default slackChannel({
4046
4123
  });
4047
4124
  ```
4048
4125
 
4126
+ ### Show steps as cards or as a checklist
4127
+
4128
+ The agent calls `post-card` to show one step of its work, such as
4129
+ "Scan the repo". Each card has an `id`, a `title`, a `status`, and
4130
+ optional `details`. When the agent calls `post-card` again with the same
4131
+ `id`, Slack updates that card. The agent uses this to move a step from
4132
+ `in_progress` to `complete`.
4133
+
4134
+ `cards` sets how Slack draws these steps:
4135
+
4136
+ | `cards` | What Slack shows | Use it when |
4137
+ | --- | --- | --- |
4138
+ | `{ display: "timeline" }` (default) | Each step is a separate card in the thread. | The turn has one or two short steps. |
4139
+ | `{ display: "plan" }` | All steps from one turn are in one checklist. | The turn has several steps, and readers want to see progress in one place. |
4140
+
4141
+ This bot shows its steps as one checklist with the title "Release check":
4142
+
4143
+ ```ts
4144
+ export default slackChannel({
4145
+ reply: {
4146
+ mode: "agentic",
4147
+ cards: { display: "plan", title: "Release check" },
4148
+ },
4149
+ });
4150
+ ```
4151
+
4152
+ Know these rules for a plan:
4153
+
4154
+ - The `title` is optional. It can have at most 256 characters.
4155
+ - You set the `title` in the channel configuration. The agent cannot
4156
+ change the title.
4157
+ - Each turn starts a new checklist with the same title.
4158
+ - The `pending` status shows a step that has not started. Use `pending`
4159
+ only in a plan.
4160
+ - `slackChannel` stops at startup if `cards` is not valid. For example,
4161
+ a `title` with `display: "timeline"` stops startup.
4162
+
4163
+ `display` is Slack's
4164
+ [`task_display_mode`](https://docs.slack.dev/reference/methods/chat.startStream/),
4165
+ and the channel sends `title` as a `plan_update` chunk.
4166
+
4049
4167
  ## Wake on a channel post
4050
4168
 
4051
4169
  This example watches `#triage-alerts`, so any substantial top-level
@@ -5237,15 +5355,35 @@ const handle = await serve("./my-agent", {
5237
5355
  });
5238
5356
  console.log(`listening on ${handle.url}`);
5239
5357
  // handle.callTool(...), handle.dispatchSchedule("heartbeat"),
5240
- // handle.createReminder(...), handle.project, await handle.close()
5358
+ // handle.createReminder(...), handle.agents, await handle.close()
5241
5359
  ```
5242
5360
 
5361
+ `handle.agents` lists each mount as `slug`, `url`, and `info`. `handle.project` is the first agent's project. It is deprecated.
5362
+
5243
5363
  Host settings match the documented [CLI](/docs/reference/cli.md) `serve` flags.
5244
5364
  `serve()` also accepts `discovery` (project-loading options) and
5245
5365
  `mode: "single" | "multi"`. Pass `apiKey` or use the same Cursor
5246
5366
  credential as the CLI: `CURSOR_API_KEY`, `CURSOR_API_KEY_FILE`,
5247
5367
  `CURSOR_SERVICE_ACCOUNT_KEY`, or `bdk login`.
5248
5368
 
5369
+ ## Inspect a project in tests
5370
+
5371
+ `loadProject(dir)` reads one project and does not serve it. The result is a `Project`. The only field is `info`. That object matches the `GET /v1/info` body for the project. `bdk info --json` on a project directory prints `{ agents: [{ slug, ...info }] }`. It prints the bare object only when the single mount slug is empty.
5372
+
5373
+ ```ts
5374
+ import { loadProject } from "@cursor/bdk";
5375
+
5376
+ const project = await loadProject("./my-agent");
5377
+ console.log(project.info.name);
5378
+ console.log(project.info.tools.map((tool) => tool.name));
5379
+ ```
5380
+
5381
+ `loadProject` throws `ProjectLoadError` when discovery reports an error. Pass `{ strict: true }` to throw on a warning as well. `error.diagnostics` lists the findings. Each `path` is relative to the project directory. A path outside that directory starts with `../`. `loadProject` does not take `importModule`. `serve` still accepts `discovery.importModule` for that override.
5382
+
5383
+ `info.local` is `{ cwd }` when the project sets a cwd. The serve banner reads `agents[].info`.
5384
+
5385
+ `serve` accepts that `Project` or a directory path.
5386
+
5249
5387
  ## Related
5250
5388
 
5251
5389
  - [Instructions](/docs/reference/instructions.md): the required half of a minimal
@@ -5490,11 +5628,15 @@ Each handler receives the Fetch `Request` and a typed arguments object.
5490
5628
  | `purpose` | Use `"eval"` to mark a new session as regression traffic |
5491
5629
  | `dryRun` | Run read tools and stub write tools for a new session |
5492
5630
  | `asOf` | Freeze a new session at an ISO-8601 instant with a timezone |
5631
+ | `deliveryId` | Name this send on the session's events, at most 256 characters. Defaults to a fresh `dlv_…` ID |
5493
5632
 
5494
5633
  `send` returns a `ChannelSession`. Its `id` identifies the session,
5495
5634
  `continuationToken` contains its current channel key, and `isNew` says
5496
5635
  whether this call created it. A coalesced call also returns
5497
- `coalesced: true`.
5636
+ `coalesced: true`. `deliveryId` names this send on the event where the
5637
+ message reaches the agent; see
5638
+ [Track which follow-up reached the agent](/docs/reference/sessions.md#track-which-follow-up-reached-the-agent).
5639
+ A hosted channel's `send` returns the same ID before the session exists.
5498
5640
 
5499
5641
  ## Events
5500
5642
 
@@ -7544,20 +7686,26 @@ Author `bot/hooks/<name>.ts` with `defineHook` from
7544
7686
 
7545
7687
  ```ts
7546
7688
  // bot/hooks/usage.ts
7689
+ import { metrics } from "@opentelemetry/api";
7547
7690
  import { defineHook } from "@cursor/bdk/hooks";
7548
7691
 
7692
+ const meter = metrics.getMeter("acme");
7693
+ const inputTokens = meter.createCounter("acme.tokens.input");
7694
+ const outputTokens = meter.createCounter("acme.tokens.output");
7695
+ const turnFailed = meter.createCounter("acme.turn.failed");
7696
+
7549
7697
  export default defineHook({
7550
7698
  events: {
7551
7699
  async "turn.completed"(event, ctx) {
7552
7700
  if (ctx.session.purpose === "eval" || event.data.usage === undefined) {
7553
7701
  return;
7554
7702
  }
7555
- const { inputTokens, outputTokens } = event.data.usage;
7556
- ctx.host.otel.increment("acme.tokens.input", inputTokens);
7557
- ctx.host.otel.increment("acme.tokens.output", outputTokens);
7703
+ const usage = event.data.usage;
7704
+ inputTokens.add(usage.inputTokens);
7705
+ outputTokens.add(usage.outputTokens);
7558
7706
  },
7559
7707
  async "turn.failed"(_event, ctx) {
7560
- ctx.host.otel.increment("acme.turn.failed", { channel: ctx.channel.id });
7708
+ turnFailed.add(1, { channel: ctx.channel.id });
7561
7709
  },
7562
7710
  },
7563
7711
  });
@@ -7609,7 +7757,6 @@ exported from `@cursor/bdk`.
7609
7757
  | `ctx.channel` | `{ id, continuationToken }`. The token is `null` when the session can't take follow-ups |
7610
7758
  | `ctx.host.kv` | Durable JSON, shared by every session of the agent. Prefix keys with `ctx.session.id` for per-session state |
7611
7759
  | `ctx.host.files` | Durable files, bound to this session. Pass `{ scope: "deployment" }` for agent-wide files |
7612
- | `ctx.host.otel` | Counters, histograms, and tags, attributed to this session |
7613
7760
  | `ctx.host.mcp`, `ctx.host.github`, `ctx.host.slack` | The same shared clients tools get |
7614
7761
  | `ctx.host.reminders` | Per-session [reminders](/docs/reference/schedules.md#reminders), the same API tools get |
7615
7762
  | `ctx.artifacts` | Session-bound [artifacts](/docs/reference/artifacts.md) facade: `tag` fills in `sessionId` and `turnId` |
@@ -8601,6 +8748,51 @@ the session is already busy depends on the channel:
8601
8748
  Pass `admission: "coalesce"` on `send()` to opt into the Slack policy from
8602
8749
  other callers. Omit it (or pass `"preempt"`) to keep interrupt semantics.
8603
8750
 
8751
+ ### Track which follow-up reached the agent
8752
+
8753
+ Every `send()` returns a `deliveryId`. Pass your own as the `deliveryId`
8754
+ option, such as the webhook delivery ID you already hold, or omit it to
8755
+ get a fresh `dlv_…` ID. A coalesced follow-up reaches the agent in one of
8756
+ two ways, and the ID is on the event for that path:
8757
+
8758
+ | Path | Event | Field |
8759
+ | --- | --- | --- |
8760
+ | Steered into the running turn | `nudge.delivered` | `data.deliveryId` |
8761
+ | Fell back to the next turn | That turn's `message.received` | `data.deliveryIds` |
8762
+
8763
+ `message.received` lists every send its prompt carries, in arrival order.
8764
+ Follow-ups queued behind a busy turn drain into one turn, so the list can
8765
+ hold several IDs. A direct send that starts a turn gets a one-item list.
8766
+
8767
+ ```ts
8768
+ // In a route or channel hook: name the steer after the webhook delivery.
8769
+ await send(`Incident ${incident.id} was acknowledged.`, {
8770
+ continuationToken: incident.id,
8771
+ admission: "coalesce",
8772
+ deliveryId: webhookId,
8773
+ });
8774
+
8775
+ // In the channel's `events` map:
8776
+ const steered = new Set<string>();
8777
+ const prompted = new Set<string>();
8778
+ const events: ChannelEventHandlers = {
8779
+ "nudge.delivered": async (event) => {
8780
+ if (event.data.deliveryId !== undefined) {
8781
+ steered.add(event.data.deliveryId);
8782
+ }
8783
+ },
8784
+ "message.received": async (event) => {
8785
+ for (const id of event.data.deliveryIds ?? []) {
8786
+ prompted.add(id);
8787
+ }
8788
+ },
8789
+ };
8790
+ ```
8791
+
8792
+ A local Slack session can also pick up follow-ups at a tool boundary from
8793
+ its own thread store. That `nudge.delivered` has no `deliveryId`, which
8794
+ tells it apart from a steered send.
8795
+
8604
8796
  `POST /v1/session/:id/stop` interrupts a turn without sending a new
8605
8797
  message. The stream records `turn.failed` with `status: "cancelled"`;
8606
8798
  the session stays a chat session and can take another follow-up. A
@@ -8619,7 +8811,7 @@ within one session. The `at` field is an ISO-8601 timestamp.
8619
8811
  | Phase | Events | What they tell you |
8620
8812
  | --- | --- | --- |
8621
8813
  | Session | `session.started`, `session.waiting`, `session.completed`, `session.failed` | Session creation, readiness, and task completion |
8622
- | Input | `message.received` | A user message was accepted |
8814
+ | Input | `message.received`, `nudge.delivered` | A user message was accepted as a turn's prompt, or reached a running turn mid-turn. Both name the [sends they carry](#track-which-follow-up-reached-the-agent) |
8623
8815
  | Turn | `turn.queued`, `turn.started`, `turn.completed`, `turn.failed` | Queue position under a [`maxRunningTurns` cap](/docs/reference/agent-config.md#concurrency), then turn status, final result, and token usage |
8624
8816
  | Steps | `step.started`, `step.completed` | Model step boundaries and duration |
8625
8817
  | Reasoning | `reasoning.appended`, `reasoning.completed` | Streamed reasoning blocks |
@@ -8922,9 +9114,9 @@ export default defineTool({
8922
9114
  `ctx.host` carries the shared host services: `host.mcp` (authored MCP
8923
9115
  connections: `names()`, `listTools(name)`, `callTool(name, tool, args)`),
8924
9116
  `host.github` and `host.slack` (shared platform clients), `host.kv` and
8925
- `host.files` (durable storage), `host.otel` (custom
8926
- metrics and session tags; see [OpenTelemetry](/docs/guides/opentelemetry.md)),
8927
- `host.reminders` (per-session wakes, when attached).
9117
+ `host.files` (durable storage), and `host.reminders` (per-session wakes,
9118
+ when attached). Custom metrics use the
9119
+ [OpenTelemetry](/docs/guides/opentelemetry.md) API.
8928
9120
 
8929
9121
  ### Return values
8930
9122