@cursor/bdk 0.2.3 → 0.2.5

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 (760) hide show
  1. package/README.md +76 -1154
  2. package/dist/bin/agent-serve.js +9 -1
  3. package/dist/channels/slack/attachments.d.ts +2 -1
  4. package/dist/channels/slack/attachments.d.ts.map +1 -1
  5. package/dist/channels/slack/attachments.js +19 -9
  6. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  7. package/dist/channels/slack/dispatch.js +26 -24
  8. package/dist/channels/slack/thread-context.d.ts +21 -11
  9. package/dist/channels/slack/thread-context.d.ts.map +1 -1
  10. package/dist/channels/slack/thread-context.js +75 -27
  11. package/dist/docs/404.html +2 -2
  12. package/dist/docs/assets/{app.BOIHhrKi.js → app.94Iu5dyD.js} +4 -4
  13. package/dist/docs/assets/{building-with-agents.md.-fcjCmJU.js → building-with-agents.md.BPjPFxFg.js} +2 -2
  14. package/dist/docs/assets/{building-with-agents.md.-fcjCmJU.lean.js → building-with-agents.md.BPjPFxFg.lean.js} +1 -1
  15. package/dist/docs/assets/chunks/@localSearchIndexroot.BITLoOQa.js +1 -0
  16. package/dist/docs/assets/chunks/{VPLocalSearchBox.D49zVZqM.js → VPLocalSearchBox.DTKFDlBr.js} +1 -1
  17. package/dist/docs/assets/chunks/{arc.hmjb-sc4.js → arc.DuzwHEeg.js} +1 -1
  18. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CxEI1KqM.js → architectureDiagram-Q4EWVU46.C6lyhLs0.js} +1 -1
  19. package/dist/docs/assets/chunks/{baseUniq.DHHvBWoV.js → baseUniq.DUNEWlY8.js} +1 -1
  20. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DnXW-3bu.js → blockDiagram-DXYQGD6D.CXOQGI0O.js} +1 -1
  21. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.e-47O2jM.js → c4Diagram-AHTNJAMY.BYdPE-Oe.js} +1 -1
  22. package/dist/docs/assets/chunks/channel.B46uXH41.js +1 -0
  23. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.3ry4pYXB.js → chunk-4BX2VUAB.YIV9HeX0.js} +1 -1
  24. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DGIZFRx6.js → chunk-4TB4RGXK.BG80DEOc.js} +1 -1
  25. package/dist/docs/assets/chunks/{chunk-55IACEB6.DKBnqg9U.js → chunk-55IACEB6.BDKJSZQc.js} +1 -1
  26. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BIU8Ue5k.js → chunk-EDXVE4YY.CtYnQqts.js} +1 -1
  27. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DP-TFhjI.js → chunk-FMBD7UC4.CityOth-.js} +1 -1
  28. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Ux0OYj5v.js → chunk-OYMX7WX6.CMD22CQX.js} +1 -1
  29. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BzHMwYox.js → chunk-QZHKN3VN.WWpc3ND0.js} +1 -1
  30. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.D4OGAsSP.js → chunk-YZCP3GAM.BMg-yhj3.js} +1 -1
  31. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.0cmCFsSf.js +1 -0
  32. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.0cmCFsSf.js +1 -0
  33. package/dist/docs/assets/chunks/clone.1vTOFZT1.js +1 -0
  34. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Jq_7BUNx.js → cose-bilkent-S5V4N54A.Buu_LC5q.js} +1 -1
  35. package/dist/docs/assets/chunks/{dagre-KV5264BT.Di-skR2x.js → dagre-KV5264BT.DW7onj6E.js} +1 -1
  36. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DeREHIdH.js → diagram-5BDNPKRD.B3NxIbEV.js} +1 -1
  37. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.C7Kcqxro.js → diagram-G4DWMVQ6.BJvN6Vkv.js} +1 -1
  38. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BK3eohyo.js → diagram-MMDJMWI5.wfRWrexs.js} +1 -1
  39. package/dist/docs/assets/chunks/{diagram-TYMM5635.C6TyymXT.js → diagram-TYMM5635.7QtjSYio.js} +1 -1
  40. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DYGG-gGx.js → erDiagram-SMLLAGMA.jxPgDH1t.js} +1 -1
  41. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.C9nBcSV4.js → flowDiagram-DWJPFMVM.BhDWA-TO.js} +1 -1
  42. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.wAg_ymsp.js → ganttDiagram-T4ZO3ILL.Ijq8iYKv.js} +1 -1
  43. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.B87j9Oeg.js → gitGraphDiagram-UUTBAWPF.DXpfW4YG.js} +1 -1
  44. package/dist/docs/assets/chunks/{graph.CuFMj31w.js → graph.CoPlssRl.js} +1 -1
  45. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.P_mLGumP.js → infoDiagram-42DDH7IO.eJuv_EOz.js} +1 -1
  46. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DyuL_MsT.js → ishikawaDiagram-UXIWVN3A._OEzenCR.js} +1 -1
  47. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CtP09IoJ.js → journeyDiagram-VCZTEJTY.CwlTjirB.js} +1 -1
  48. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BoeSYPZo.js → kanban-definition-6JOO6SKY.DSp_C8cZ.js} +1 -1
  49. package/dist/docs/assets/chunks/{layout.B0lMMtNo.js → layout.Bms9s7uB.js} +1 -1
  50. package/dist/docs/assets/chunks/{linear.HxRBiAFX.js → linear.BjnmB4je.js} +1 -1
  51. package/dist/docs/assets/chunks/{min.BGlFFHwS.js → min.CKkYlMsn.js} +1 -1
  52. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.JyLBD9M8.js → mindmap-definition-QFDTVHPH.T2d0vJ7X.js} +1 -1
  53. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DnSmNZF8.js → pieDiagram-DEJITSTG.DU0RoCvx.js} +1 -1
  54. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CUCnbfCa.js → quadrantDiagram-34T5L4WZ.9QZjM-x0.js} +1 -1
  55. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.py0IVUn5.js → requirementDiagram-MS252O5E.CZpylJMd.js} +1 -1
  56. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.Bkc-HWYp.js → sankeyDiagram-XADWPNL6.CnFdfW95.js} +1 -1
  57. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Dqn8Mlv2.js → sequenceDiagram-FGHM5R23.-jC0PP1t.js} +1 -1
  58. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.JikkoQUU.js → stateDiagram-FHFEXIEX.DG7yBRUU.js} +1 -1
  59. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CbsZcOOu.js +1 -0
  60. package/dist/docs/assets/chunks/{theme.b6HQ6zG_.js → theme.B3O9koXV.js} +2 -2
  61. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BvpSXiBj.js → timeline-definition-GMOUNBTQ.Bf9u4Ebb.js} +1 -1
  62. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CU7MVnZx.js → vennDiagram-DHZGUBPP.BjhbbYE6.js} +1 -1
  63. package/dist/docs/assets/chunks/{wardley-RL74JXVD.BKwC4ctG.js → wardley-RL74JXVD.DEA21akR.js} +1 -1
  64. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.BfaF6Uhe.js → wardleyDiagram-NUSXRM2D.8fRb4Nb5.js} +1 -1
  65. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.Bg5dcpj4.js → xychartDiagram-5P7HB3ND.DoOP3zZM.js} +1 -1
  66. package/dist/docs/assets/{deployment.md.BJ8i7Q6p.js → deployment.md.BdqTiGdc.js} +5 -5
  67. package/dist/docs/assets/{deployment.md.BJ8i7Q6p.lean.js → deployment.md.BdqTiGdc.lean.js} +1 -1
  68. package/dist/docs/assets/{evals.md.CCAtNcuL.js → evals.md.LRCSn6Ik.js} +2 -2
  69. package/dist/docs/assets/{evals.md.CCAtNcuL.lean.js → evals.md.LRCSn6Ik.lean.js} +1 -1
  70. package/dist/docs/assets/{guides_agent-to-agent.md.CGkicXeB.js → guides_agent-to-agent.md.Cps5NiCV.js} +2 -2
  71. package/dist/docs/assets/{guides_agent-to-agent.md.CGkicXeB.lean.js → guides_agent-to-agent.md.Cps5NiCV.lean.js} +1 -1
  72. package/dist/docs/assets/{guides_bitbucket.md.Cb3LPKt3.js → guides_bitbucket.md.BB6fqD-M.js} +2 -2
  73. package/dist/docs/assets/{guides_bitbucket.md.Cb3LPKt3.lean.js → guides_bitbucket.md.BB6fqD-M.lean.js} +1 -1
  74. package/dist/docs/assets/{guides_cloud-agents.md.BuEkDCwo.js → guides_cloud-agents.md.CWJjS9No.js} +2 -2
  75. package/dist/docs/assets/{guides_cloud-agents.md.BuEkDCwo.lean.js → guides_cloud-agents.md.CWJjS9No.lean.js} +1 -1
  76. package/dist/docs/assets/{guides_convert-automation.md.Ci-Y2iD5.js → guides_convert-automation.md.DMEX9nF-.js} +3 -3
  77. package/dist/docs/assets/{guides_convert-automation.md.Ci-Y2iD5.lean.js → guides_convert-automation.md.DMEX9nF-.lean.js} +1 -1
  78. package/dist/docs/assets/{guides_github.md.Bq9kQU9B.js → guides_github.md.Cr1Xlf-m.js} +3 -3
  79. package/dist/docs/assets/{guides_github.md.Bq9kQU9B.lean.js → guides_github.md.Cr1Xlf-m.lean.js} +1 -1
  80. package/dist/docs/assets/{guides_gitlab.md.BM27P43u.js → guides_gitlab.md.CMpmFi4M.js} +2 -2
  81. package/dist/docs/assets/{guides_gitlab.md.BM27P43u.lean.js → guides_gitlab.md.CMpmFi4M.lean.js} +1 -1
  82. package/dist/docs/assets/{guides_grokbot-agents.md.yxVbSlKA.js → guides_grokbot-agents.md.tD1smFhU.js} +2 -2
  83. package/dist/docs/assets/{guides_grokbot-agents.md.yxVbSlKA.lean.js → guides_grokbot-agents.md.tD1smFhU.lean.js} +1 -1
  84. package/dist/docs/assets/{guides_hooks.md.BWoiNaMq.js → guides_hooks.md.5Ce3NXxZ.js} +2 -2
  85. package/dist/docs/assets/{guides_hooks.md.BWoiNaMq.lean.js → guides_hooks.md.5Ce3NXxZ.lean.js} +1 -1
  86. package/dist/docs/assets/{guides_improve.md.COtL-6ft.js → guides_improve.md.CRrYq22s.js} +2 -2
  87. package/dist/docs/assets/{guides_improve.md.COtL-6ft.lean.js → guides_improve.md.CRrYq22s.lean.js} +1 -1
  88. package/dist/docs/assets/{guides_jev.md.BNDm14Gy.js → guides_jev.md.D7XH4JH3.js} +2 -2
  89. package/dist/docs/assets/{guides_mcp-oauth.md.Cu6mhZ_3.js → guides_mcp-oauth.md.DR3zhC9r.js} +2 -2
  90. package/dist/docs/assets/{guides_mcp-oauth.md.Cu6mhZ_3.lean.js → guides_mcp-oauth.md.DR3zhC9r.lean.js} +1 -1
  91. package/dist/docs/assets/{guides_opentelemetry.md.DLlIB5rv.js → guides_opentelemetry.md.jcPNrQbH.js} +8 -6
  92. package/dist/docs/assets/{guides_opentelemetry.md.DLlIB5rv.lean.js → guides_opentelemetry.md.jcPNrQbH.lean.js} +1 -1
  93. package/dist/docs/assets/{guides_slack.md.diqqXTTm.js → guides_slack.md.Bn-WupSE.js} +8 -8
  94. package/dist/docs/assets/{guides_slack.md.diqqXTTm.lean.js → guides_slack.md.Bn-WupSE.lean.js} +1 -1
  95. package/dist/docs/assets/{guides_webhooks.md.D0furjw0.js → guides_webhooks.md.BBvAm_VF.js} +2 -2
  96. package/dist/docs/assets/{guides_webhooks.md.D0furjw0.lean.js → guides_webhooks.md.BBvAm_VF.lean.js} +1 -1
  97. package/dist/docs/assets/{hillclimbing.md.Biy0m-Qb.js → hillclimbing.md.Dxvd-0gT.js} +2 -2
  98. package/dist/docs/assets/{hillclimbing.md.Biy0m-Qb.lean.js → hillclimbing.md.Dxvd-0gT.lean.js} +1 -1
  99. package/dist/docs/assets/index.md.Dxxr7pFa.js +27 -0
  100. package/dist/docs/assets/{index.md.CVc_oOA3.lean.js → index.md.Dxxr7pFa.lean.js} +1 -1
  101. package/dist/docs/assets/{quickstart.md.CHpHPBUN.js → quickstart.md.BK5gjHM2.js} +2 -2
  102. package/dist/docs/assets/{quickstart.md.CHpHPBUN.lean.js → quickstart.md.BK5gjHM2.lean.js} +1 -1
  103. package/dist/docs/assets/{reference_agent-config.md.DzGI777n.js → reference_agent-config.md.DrtLxWgR.js} +4 -4
  104. package/dist/docs/assets/{reference_agent-config.md.DzGI777n.lean.js → reference_agent-config.md.DrtLxWgR.lean.js} +1 -1
  105. package/dist/docs/assets/{reference_artifacts.md.CQfKq8F2.js → reference_artifacts.md.DLV9MZES.js} +2 -2
  106. package/dist/docs/assets/{reference_artifacts.md.CQfKq8F2.lean.js → reference_artifacts.md.DLV9MZES.lean.js} +1 -1
  107. package/dist/docs/assets/{reference_channels.md.mbNtKCiR.js → reference_channels.md.LbNIJBwd.js} +2 -2
  108. package/dist/docs/assets/{reference_channels.md.mbNtKCiR.lean.js → reference_channels.md.LbNIJBwd.lean.js} +1 -1
  109. package/dist/docs/assets/{reference_cli.md.DgeLTO18.js → reference_cli.md.BsgDqYPh.js} +4 -4
  110. package/dist/docs/assets/{reference_cli.md.DgeLTO18.lean.js → reference_cli.md.BsgDqYPh.lean.js} +1 -1
  111. package/dist/docs/assets/{reference_connections.md.COq--gAm.js → reference_connections.md.Bljpve-y.js} +4 -4
  112. package/dist/docs/assets/{reference_connections.md.COq--gAm.lean.js → reference_connections.md.Bljpve-y.lean.js} +1 -1
  113. package/dist/docs/assets/{reference_evals.md.CJm3uCUm.js → reference_evals.md.D5i8PuXJ.js} +2 -2
  114. package/dist/docs/assets/{reference_evals.md.CJm3uCUm.lean.js → reference_evals.md.D5i8PuXJ.lean.js} +1 -1
  115. package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.js → reference_extensions.md.OUacPetl.js} +5 -4
  116. package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.lean.js → reference_extensions.md.OUacPetl.lean.js} +1 -1
  117. package/dist/docs/assets/{reference_hooks.md.DbthhtIR.js → reference_hooks.md.C5LCJ1R3.js} +2 -2
  118. package/dist/docs/assets/{reference_hooks.md.DbthhtIR.lean.js → reference_hooks.md.C5LCJ1R3.lean.js} +1 -1
  119. package/dist/docs/assets/{reference_http-api.md.BZOvhCqY.js → reference_http-api.md.DbFNOubV.js} +1 -1
  120. package/dist/docs/assets/{reference_instructions.md.Bdwscs4G.js → reference_instructions.md.DrcHZXig.js} +2 -2
  121. package/dist/docs/assets/{reference_instructions.md.Bdwscs4G.lean.js → reference_instructions.md.DrcHZXig.lean.js} +1 -1
  122. package/dist/docs/assets/reference_playground.md.1hx0gcIu.js +1 -0
  123. package/dist/docs/assets/{reference_playground.md.BdQzRJc2.lean.js → reference_playground.md.1hx0gcIu.lean.js} +1 -1
  124. package/dist/docs/assets/{reference_project-layout.md.CpLQ9j4K.js → reference_project-layout.md.C2JMRh7p.js} +2 -2
  125. package/dist/docs/assets/{reference_prompt.md.BQZB4eaV.js → reference_prompt.md.DqPh71XN.js} +3 -3
  126. package/dist/docs/assets/{reference_prompt.md.BQZB4eaV.lean.js → reference_prompt.md.DqPh71XN.lean.js} +1 -1
  127. package/dist/docs/assets/{reference_schedules.md.BVU5EFbz.js → reference_schedules.md.BuJ8fgMa.js} +2 -2
  128. package/dist/docs/assets/{reference_schedules.md.BVU5EFbz.lean.js → reference_schedules.md.BuJ8fgMa.lean.js} +1 -1
  129. package/dist/docs/assets/reference_sessions.md.CM5zo3w4.js +1 -0
  130. package/dist/docs/assets/{reference_sessions.md.DeRUItHD.lean.js → reference_sessions.md.CM5zo3w4.lean.js} +1 -1
  131. package/dist/docs/assets/{reference_skills.md.Cy00QMKS.js → reference_skills.md.C0guGcH0.js} +4 -4
  132. package/dist/docs/assets/{reference_skills.md.Cy00QMKS.lean.js → reference_skills.md.C0guGcH0.lean.js} +1 -1
  133. package/dist/docs/assets/{reference_subagents.md.B8oyeXOI.js → reference_subagents.md.gmPt5J-M.js} +2 -2
  134. package/dist/docs/assets/{reference_subagents.md.B8oyeXOI.lean.js → reference_subagents.md.gmPt5J-M.lean.js} +1 -1
  135. package/dist/docs/assets/{reference_tools.md.hg2Wi5Bq.js → reference_tools.md.v3SXVSs_.js} +2 -2
  136. package/dist/docs/assets/{reference_tools.md.hg2Wi5Bq.lean.js → reference_tools.md.v3SXVSs_.lean.js} +1 -1
  137. package/dist/docs/assets/{templates_agentic-owners.md.BykUiZ8j.js → templates_agentic-owners.md.vtjfwxbf.js} +2 -2
  138. package/dist/docs/assets/{templates_agentic-owners.md.BykUiZ8j.lean.js → templates_agentic-owners.md.vtjfwxbf.lean.js} +1 -1
  139. package/dist/docs/assets/templates_grokbot-agents.md.2sydjFiO.js +5 -0
  140. package/dist/docs/assets/templates_grokbot-agents.md.2sydjFiO.lean.js +1 -0
  141. package/dist/docs/assets/{templates_security-reviewer.md.DXMmKl_o.js → templates_security-reviewer.md.CX9l9bcg.js} +2 -2
  142. package/dist/docs/assets/{templates_security-reviewer.md.DXMmKl_o.lean.js → templates_security-reviewer.md.CX9l9bcg.lean.js} +1 -1
  143. package/dist/docs/assets/{templates_thermo-quality-review.md.Dg1p1MsG.js → templates_thermo-quality-review.md.95qmTmr1.js} +2 -2
  144. package/dist/docs/assets/{templates_thermo-quality-review.md.Dg1p1MsG.lean.js → templates_thermo-quality-review.md.95qmTmr1.lean.js} +1 -1
  145. package/dist/docs/assets/{templates_thermo-review.md.Dlylkowj.js → templates_thermo-review.md.DQh6Q0C-.js} +2 -2
  146. package/dist/docs/assets/{templates_thermo-review.md.Dlylkowj.lean.js → templates_thermo-review.md.DQh6Q0C-.lean.js} +1 -1
  147. package/dist/docs/assets/{templates_triage.md.CvJyx81N.js → templates_triage.md.BFlQhWXf.js} +3 -3
  148. package/dist/docs/assets/{templates_triage.md.CvJyx81N.lean.js → templates_triage.md.BFlQhWXf.lean.js} +1 -1
  149. package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +1 -0
  150. package/dist/docs/assets/{troubleshooting.md.Cw5PKa3t.lean.js → troubleshooting.md.Bscj6ODe.lean.js} +1 -1
  151. package/dist/docs/building-with-agents.html +36 -36
  152. package/dist/docs/building-with-agents.md +0 -3
  153. package/dist/docs/deployment.html +39 -39
  154. package/dist/docs/deployment.md +6 -10
  155. package/dist/docs/evals.html +36 -36
  156. package/dist/docs/evals.md +0 -3
  157. package/dist/docs/guides/agent-to-agent.html +36 -36
  158. package/dist/docs/guides/agent-to-agent.md +0 -3
  159. package/dist/docs/guides/bitbucket.html +36 -36
  160. package/dist/docs/guides/bitbucket.md +0 -3
  161. package/dist/docs/guides/cloud-agents.html +36 -36
  162. package/dist/docs/guides/cloud-agents.md +0 -4
  163. package/dist/docs/guides/convert-automation.html +37 -37
  164. package/dist/docs/guides/convert-automation.md +2 -5
  165. package/dist/docs/guides/github.html +37 -37
  166. package/dist/docs/guides/github.md +1 -4
  167. package/dist/docs/guides/gitlab.html +36 -36
  168. package/dist/docs/guides/gitlab.md +0 -3
  169. package/dist/docs/guides/grokbot-agents.html +37 -37
  170. package/dist/docs/guides/grokbot-agents.md +1 -4
  171. package/dist/docs/guides/hooks.html +36 -36
  172. package/dist/docs/guides/hooks.md +0 -3
  173. package/dist/docs/guides/improve.html +36 -36
  174. package/dist/docs/guides/improve.md +0 -3
  175. package/dist/docs/guides/jev.html +37 -37
  176. package/dist/docs/guides/jev.md +7 -3
  177. package/dist/docs/guides/mcp-oauth.html +37 -37
  178. package/dist/docs/guides/mcp-oauth.md +1 -4
  179. package/dist/docs/guides/opentelemetry.html +42 -40
  180. package/dist/docs/guides/opentelemetry.md +4 -5
  181. package/dist/docs/guides/slack.html +43 -43
  182. package/dist/docs/guides/slack.md +14 -24
  183. package/dist/docs/guides/webhooks.html +36 -36
  184. package/dist/docs/guides/webhooks.md +0 -3
  185. package/dist/docs/hashmap.json +1 -1
  186. package/dist/docs/hillclimbing.html +36 -36
  187. package/dist/docs/hillclimbing.md +0 -3
  188. package/dist/docs/index.html +38 -38
  189. package/dist/docs/index.md +9 -16
  190. package/dist/docs/llms-full.txt +156 -220
  191. package/dist/docs/llms.txt +1 -0
  192. package/dist/docs/quickstart.html +36 -36
  193. package/dist/docs/quickstart.md +2 -7
  194. package/dist/docs/reference/agent-config.html +38 -38
  195. package/dist/docs/reference/agent-config.md +4 -7
  196. package/dist/docs/reference/artifacts.html +36 -36
  197. package/dist/docs/reference/artifacts.md +0 -3
  198. package/dist/docs/reference/channels.html +37 -37
  199. package/dist/docs/reference/channels.md +1 -6
  200. package/dist/docs/reference/cli.html +38 -38
  201. package/dist/docs/reference/cli.md +7 -14
  202. package/dist/docs/reference/connections.html +38 -38
  203. package/dist/docs/reference/connections.md +7 -10
  204. package/dist/docs/reference/evals.html +36 -36
  205. package/dist/docs/reference/evals.md +0 -3
  206. package/dist/docs/reference/extensions.html +40 -39
  207. package/dist/docs/reference/extensions.md +15 -5
  208. package/dist/docs/reference/hooks.html +36 -36
  209. package/dist/docs/reference/hooks.md +0 -3
  210. package/dist/docs/reference/http-api.html +37 -37
  211. package/dist/docs/reference/http-api.md +1 -1
  212. package/dist/docs/reference/instructions.html +36 -36
  213. package/dist/docs/reference/instructions.md +0 -3
  214. package/dist/docs/reference/playground.html +36 -36
  215. package/dist/docs/reference/playground.md +0 -3
  216. package/dist/docs/reference/project-layout.html +37 -37
  217. package/dist/docs/reference/project-layout.md +2 -2
  218. package/dist/docs/reference/prompt.html +37 -37
  219. package/dist/docs/reference/prompt.md +0 -3
  220. package/dist/docs/reference/schedules.html +36 -36
  221. package/dist/docs/reference/schedules.md +0 -3
  222. package/dist/docs/reference/sessions.html +36 -36
  223. package/dist/docs/reference/sessions.md +0 -3
  224. package/dist/docs/reference/skills.html +38 -38
  225. package/dist/docs/reference/skills.md +0 -3
  226. package/dist/docs/reference/subagents.html +36 -36
  227. package/dist/docs/reference/subagents.md +0 -3
  228. package/dist/docs/reference/tools.html +36 -36
  229. package/dist/docs/reference/tools.md +1 -5
  230. package/dist/docs/templates/agentic-owners.html +36 -36
  231. package/dist/docs/templates/agentic-owners.md +0 -3
  232. package/dist/docs/templates/grokbot-agents.html +64 -0
  233. package/dist/docs/templates/grokbot-agents.md +55 -0
  234. package/dist/docs/templates/security-reviewer.html +37 -37
  235. package/dist/docs/templates/security-reviewer.md +0 -3
  236. package/dist/docs/templates/thermo-quality-review.html +36 -36
  237. package/dist/docs/templates/thermo-quality-review.md +3 -6
  238. package/dist/docs/templates/thermo-review.html +36 -36
  239. package/dist/docs/templates/thermo-review.md +3 -5
  240. package/dist/docs/templates/triage.html +37 -37
  241. package/dist/docs/templates/triage.md +2 -3
  242. package/dist/docs/troubleshooting.html +36 -36
  243. package/dist/docs/troubleshooting.md +3 -7
  244. package/dist/extensions/jev/extension.d.ts +3 -0
  245. package/dist/extensions/jev/extension.d.ts.map +1 -1
  246. package/dist/extensions/jev/extension.js +10 -1
  247. package/dist/extensions/jev/lib/evaluate.d.ts +4 -0
  248. package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -1
  249. package/dist/extensions/jev/lib/evaluate.js +6 -2
  250. package/dist/extensions.d.ts +4 -2
  251. package/dist/extensions.d.ts.map +1 -1
  252. package/dist/extensions.js +5 -2
  253. package/dist/internal/cli-deploy.d.ts.map +1 -1
  254. package/dist/internal/cli-deploy.js +19 -5
  255. package/dist/internal/discovery/agent-config.d.ts +6 -5
  256. package/dist/internal/discovery/agent-config.d.ts.map +1 -1
  257. package/dist/internal/discovery/agent-config.js +29 -28
  258. package/dist/internal/discovery/agent.js +1 -1
  259. package/dist/internal/discovery/extensions.d.ts.map +1 -1
  260. package/dist/internal/discovery/extensions.js +12 -0
  261. package/dist/internal/hosting.d.ts +8 -0
  262. package/dist/internal/hosting.d.ts.map +1 -1
  263. package/dist/internal/hosting.js +24 -0
  264. package/dist/types.d.ts +18 -2
  265. package/dist/types.d.ts.map +1 -1
  266. package/docs/README.md +9 -16
  267. package/docs/building-with-agents.md +0 -3
  268. package/docs/deployment.md +6 -10
  269. package/docs/evals.md +0 -3
  270. package/docs/guides/agent-to-agent.md +0 -3
  271. package/docs/guides/bitbucket.md +0 -3
  272. package/docs/guides/cloud-agents.md +0 -4
  273. package/docs/guides/convert-automation.md +2 -5
  274. package/docs/guides/github.md +1 -4
  275. package/docs/guides/gitlab.md +0 -3
  276. package/docs/guides/grokbot-agents.md +1 -4
  277. package/docs/guides/hooks.md +0 -3
  278. package/docs/guides/improve.md +0 -3
  279. package/docs/guides/jev.md +7 -3
  280. package/docs/guides/mcp-oauth.md +1 -4
  281. package/docs/guides/opentelemetry.md +4 -5
  282. package/docs/guides/slack.md +14 -24
  283. package/docs/guides/webhooks.md +0 -3
  284. package/docs/hillclimbing.md +0 -3
  285. package/docs/quickstart.md +2 -7
  286. package/docs/reference/agent-config.md +4 -7
  287. package/docs/reference/artifacts.md +0 -3
  288. package/docs/reference/channels.md +1 -6
  289. package/docs/reference/cli.md +7 -14
  290. package/docs/reference/connections.md +7 -10
  291. package/docs/reference/evals.md +0 -3
  292. package/docs/reference/extensions.md +15 -5
  293. package/docs/reference/hooks.md +0 -3
  294. package/docs/reference/http-api.md +1 -1
  295. package/docs/reference/instructions.md +0 -3
  296. package/docs/reference/playground.md +0 -3
  297. package/docs/reference/project-layout.md +2 -2
  298. package/docs/reference/prompt.md +0 -3
  299. package/docs/reference/schedules.md +0 -3
  300. package/docs/reference/sessions.md +0 -3
  301. package/docs/reference/skills.md +0 -3
  302. package/docs/reference/subagents.md +0 -3
  303. package/docs/reference/tools.md +1 -5
  304. package/docs/templates/agentic-owners.md +0 -3
  305. package/docs/templates/grokbot-agents.md +60 -0
  306. package/docs/templates/security-reviewer.md +0 -3
  307. package/docs/templates/thermo-quality-review.md +3 -6
  308. package/docs/templates/thermo-review.md +3 -5
  309. package/docs/templates/triage.md +2 -3
  310. package/docs/troubleshooting.md +3 -7
  311. package/package.json +2 -10
  312. package/templates/agentic-owners/README.md +0 -3
  313. package/templates/agents-md/README.md +4 -3
  314. package/templates/code-wiki/README.md +0 -3
  315. package/templates/demo/README.md +0 -3
  316. package/templates/grokbot-agents/README.md +4 -6
  317. package/templates/security-help/README.md +12 -6
  318. package/templates/security-reviewer/README.md +0 -3
  319. package/templates/thermo-quality-review/README.md +0 -3
  320. package/templates/thermo-review/README.md +0 -3
  321. package/templates/triage/README.md +0 -3
  322. package/templates/triage/overlays/jira/README.md +0 -3
  323. package/templates/triage/overlays/linear/README.md +0 -3
  324. package/dist/docs/assets/chunks/@localSearchIndexroot.D5L-b34G.js +0 -1
  325. package/dist/docs/assets/chunks/channel.BbOGaJQP.js +0 -1
  326. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Db58HCb1.js +0 -1
  327. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Db58HCb1.js +0 -1
  328. package/dist/docs/assets/chunks/clone.Co4MBflG.js +0 -1
  329. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CMsKhrW0.js +0 -1
  330. package/dist/docs/assets/index.md.CVc_oOA3.js +0 -27
  331. package/dist/docs/assets/reference_playground.md.BdQzRJc2.js +0 -1
  332. package/dist/docs/assets/reference_sessions.md.DeRUItHD.js +0 -1
  333. package/dist/docs/assets/troubleshooting.md.Cw5PKa3t.js +0 -1
  334. package/src/artifacts.ts +0 -68
  335. package/src/bin/agent-serve.ts +0 -1854
  336. package/src/channels/bitbucket/api.ts +0 -891
  337. package/src/channels/bitbucket/binding.ts +0 -417
  338. package/src/channels/bitbucket/bitbucket-channel.ts +0 -162
  339. package/src/channels/bitbucket/bitbucket-webhook.ts +0 -519
  340. package/src/channels/bitbucket/checks.ts +0 -146
  341. package/src/channels/bitbucket/cursor-account.ts +0 -106
  342. package/src/channels/bitbucket/defaults.ts +0 -100
  343. package/src/channels/bitbucket/events.ts +0 -74
  344. package/src/channels/bitbucket/index.ts +0 -51
  345. package/src/channels/bitbucket/replay.ts +0 -421
  346. package/src/channels/bitbucket/state.ts +0 -59
  347. package/src/channels/bitbucket/types.ts +0 -261
  348. package/src/channels/change-monitors/change-monitors-channel.ts +0 -63
  349. package/src/channels/change-monitors/index.ts +0 -8
  350. package/src/channels/change-monitors/types.ts +0 -42
  351. package/src/channels/checks.ts +0 -185
  352. package/src/channels/deployments/deployments-channel.ts +0 -224
  353. package/src/channels/deployments/index.ts +0 -25
  354. package/src/channels/deployments/types.ts +0 -92
  355. package/src/channels/github/api.ts +0 -526
  356. package/src/channels/github/auth.ts +0 -293
  357. package/src/channels/github/binding.ts +0 -233
  358. package/src/channels/github/checks.ts +0 -145
  359. package/src/channels/github/cursor-account.ts +0 -303
  360. package/src/channels/github/defaults.ts +0 -168
  361. package/src/channels/github/events.ts +0 -67
  362. package/src/channels/github/forward.ts +0 -359
  363. package/src/channels/github/github-channel.ts +0 -2334
  364. package/src/channels/github/index.ts +0 -54
  365. package/src/channels/github/progress.ts +0 -365
  366. package/src/channels/github/replay.ts +0 -372
  367. package/src/channels/github/state.ts +0 -124
  368. package/src/channels/github/types.ts +0 -590
  369. package/src/channels/gitlab/api.ts +0 -329
  370. package/src/channels/gitlab/binding.ts +0 -231
  371. package/src/channels/gitlab/checks.ts +0 -228
  372. package/src/channels/gitlab/cursor-account.ts +0 -105
  373. package/src/channels/gitlab/defaults.ts +0 -80
  374. package/src/channels/gitlab/events.ts +0 -37
  375. package/src/channels/gitlab/gitlab-channel.ts +0 -160
  376. package/src/channels/gitlab/gitlab-webhook.ts +0 -509
  377. package/src/channels/gitlab/index.ts +0 -44
  378. package/src/channels/gitlab/replay.ts +0 -328
  379. package/src/channels/gitlab/state.ts +0 -55
  380. package/src/channels/gitlab/types.ts +0 -247
  381. package/src/channels/issues/index.ts +0 -9
  382. package/src/channels/issues/issues-channel.ts +0 -45
  383. package/src/channels/issues/types.ts +0 -38
  384. package/src/channels/origin/api.ts +0 -507
  385. package/src/channels/origin/binding.ts +0 -114
  386. package/src/channels/origin/checks.ts +0 -250
  387. package/src/channels/origin/cursor-account.ts +0 -58
  388. package/src/channels/origin/defaults.ts +0 -140
  389. package/src/channels/origin/events.ts +0 -35
  390. package/src/channels/origin/index.ts +0 -35
  391. package/src/channels/origin/origin-channel.ts +0 -815
  392. package/src/channels/origin/origin-webhook.ts +0 -296
  393. package/src/channels/origin/reactions.ts +0 -72
  394. package/src/channels/origin/state.ts +0 -54
  395. package/src/channels/origin/types.ts +0 -295
  396. package/src/channels/slack/agentic-delivery.ts +0 -634
  397. package/src/channels/slack/agentic-posted.ts +0 -135
  398. package/src/channels/slack/agentic-signals.ts +0 -231
  399. package/src/channels/slack/api.ts +0 -761
  400. package/src/channels/slack/approvals.ts +0 -279
  401. package/src/channels/slack/assistant.ts +0 -76
  402. package/src/channels/slack/attachments.ts +0 -596
  403. package/src/channels/slack/auth.ts +0 -127
  404. package/src/channels/slack/blocks.ts +0 -131
  405. package/src/channels/slack/bot-mentions.ts +0 -318
  406. package/src/channels/slack/channel-watch.ts +0 -314
  407. package/src/channels/slack/cli-project.ts +0 -249
  408. package/src/channels/slack/code-fences.ts +0 -171
  409. package/src/channels/slack/constants.ts +0 -38
  410. package/src/channels/slack/credentials.ts +0 -88
  411. package/src/channels/slack/defaults.ts +0 -714
  412. package/src/channels/slack/dispatch.ts +0 -1060
  413. package/src/channels/slack/doctor.ts +0 -338
  414. package/src/channels/slack/eval-directive.ts +0 -306
  415. package/src/channels/slack/event-id-dedupe.ts +0 -30
  416. package/src/channels/slack/external-policy.ts +0 -75
  417. package/src/channels/slack/footer.ts +0 -106
  418. package/src/channels/slack/inbound.ts +0 -416
  419. package/src/channels/slack/index.ts +0 -53
  420. package/src/channels/slack/init.ts +0 -169
  421. package/src/channels/slack/interactive.ts +0 -406
  422. package/src/channels/slack/links.ts +0 -23
  423. package/src/channels/slack/live-delivery.ts +0 -489
  424. package/src/channels/slack/log.ts +0 -70
  425. package/src/channels/slack/manifest.ts +0 -240
  426. package/src/channels/slack/message-body.ts +0 -82
  427. package/src/channels/slack/nudge-carrier.ts +0 -224
  428. package/src/channels/slack/nudge-store.ts +0 -334
  429. package/src/channels/slack/paint-start.ts +0 -93
  430. package/src/channels/slack/placeholder.ts +0 -358
  431. package/src/channels/slack/pr-ref.ts +0 -74
  432. package/src/channels/slack/progress-delivery.ts +0 -138
  433. package/src/channels/slack/reasoning-card.ts +0 -125
  434. package/src/channels/slack/reasoning-chip.ts +0 -41
  435. package/src/channels/slack/recording-sink.ts +0 -167
  436. package/src/channels/slack/redact.ts +0 -6
  437. package/src/channels/slack/reply-options.ts +0 -279
  438. package/src/channels/slack/setup.ts +0 -125
  439. package/src/channels/slack/slack-channel.ts +0 -744
  440. package/src/channels/slack/socket-mode.ts +0 -140
  441. package/src/channels/slack/stop.ts +0 -25
  442. package/src/channels/slack/stream.ts +0 -66
  443. package/src/channels/slack/thread-context.ts +0 -485
  444. package/src/channels/slack/tool-approval-events.ts +0 -233
  445. package/src/channels/slack/tool-cards.ts +0 -198
  446. package/src/channels/slack/tool-chip.ts +0 -34
  447. package/src/channels/slack/types.ts +0 -787
  448. package/src/channels/slack/upload.ts +0 -137
  449. package/src/channels.ts +0 -543
  450. package/src/connections.ts +0 -153
  451. package/src/dashboard-session-url.ts +0 -30
  452. package/src/evals/assertions.ts +0 -688
  453. package/src/evals/expect.ts +0 -250
  454. package/src/evals/judge.ts +0 -329
  455. package/src/evals/loaders.ts +0 -111
  456. package/src/evals/matchers.ts +0 -223
  457. package/src/evals/reporters.ts +0 -257
  458. package/src/evals/results.ts +0 -130
  459. package/src/evals/run-facts.ts +0 -306
  460. package/src/evals.ts +0 -709
  461. package/src/extensions/cursor-cloud-agents/extension.ts +0 -131
  462. package/src/extensions/cursor-cloud-agents/lib/backend.ts +0 -386
  463. package/src/extensions/cursor-cloud-agents/lib/channels.ts +0 -11
  464. package/src/extensions/cursor-cloud-agents/lib/fleet.ts +0 -98
  465. package/src/extensions/cursor-cloud-agents/lib/inputs.ts +0 -5
  466. package/src/extensions/cursor-cloud-agents/lib/repos.ts +0 -80
  467. package/src/extensions/cursor-cloud-agents/lib/transcript.ts +0 -19
  468. package/src/extensions/cursor-cloud-agents/skills/handoff.md +0 -37
  469. package/src/extensions/cursor-cloud-agents/tools/cancel.ts +0 -21
  470. package/src/extensions/cursor-cloud-agents/tools/dump.ts +0 -47
  471. package/src/extensions/cursor-cloud-agents/tools/get.ts +0 -18
  472. package/src/extensions/cursor-cloud-agents/tools/launch.ts +0 -62
  473. package/src/extensions/cursor-cloud-agents/tools/list.ts +0 -31
  474. package/src/extensions/cursor-cloud-agents/tools/reply.ts +0 -36
  475. package/src/extensions/cursor-grokbot-agents/extension.ts +0 -132
  476. package/src/extensions/cursor-grokbot-agents/lib/agents.ts +0 -42
  477. package/src/extensions/cursor-grokbot-agents/lib/backend.ts +0 -208
  478. package/src/extensions/cursor-grokbot-agents/lib/contacts.ts +0 -74
  479. package/src/extensions/cursor-grokbot-agents/lib/conversation.ts +0 -260
  480. package/src/extensions/cursor-grokbot-agents/lib/inputs.ts +0 -21
  481. package/src/extensions/cursor-grokbot-agents/lib/lock.ts +0 -26
  482. package/src/extensions/cursor-grokbot-agents/skills/consult.md +0 -40
  483. package/src/extensions/cursor-grokbot-agents/tools/ask.ts +0 -32
  484. package/src/extensions/cursor-grokbot-agents/tools/check.ts +0 -25
  485. package/src/extensions/cursor-grokbot-agents/tools/interrupt.ts +0 -17
  486. package/src/extensions/cursor-grokbot-agents/tools/list.ts +0 -26
  487. package/src/extensions/improve/extension.ts +0 -69
  488. package/src/extensions/improve/skills/yourself.ts +0 -50
  489. package/src/extensions/jev/extension.ts +0 -95
  490. package/src/extensions/jev/lib/evaluate.ts +0 -266
  491. package/src/extensions/jev/skills/gated-write.md +0 -25
  492. package/src/extensions/jev/skills/questions.md +0 -33
  493. package/src/extensions/jev/tools/evaluate.ts +0 -82
  494. package/src/extensions/slack-communication/evals/harness.ts +0 -705
  495. package/src/extensions/slack-communication/evals/slack-communication.eval.ts +0 -830
  496. package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +0 -172
  497. package/src/extensions/slack-communication/extension.ts +0 -44
  498. package/src/extensions/slack-communication/skills/slack-voice.ts +0 -56
  499. package/src/extensions/slack-communication/tools/delete-message.ts +0 -33
  500. package/src/extensions/slack-communication/tools/edit-message.ts +0 -42
  501. package/src/extensions/slack-communication/tools/post-card.ts +0 -28
  502. package/src/extensions/slack-communication/tools/post-file.ts +0 -82
  503. package/src/extensions/slack-communication/tools/post-update.ts +0 -40
  504. package/src/extensions/slack-communication/tools/react.ts +0 -30
  505. package/src/extensions/slack-communication/tools/set-status.ts +0 -21
  506. package/src/extensions.ts +0 -179
  507. package/src/files-backends/agent-store-presigned-url.ts +0 -11
  508. package/src/files-backends/cursor-hosted.ts +0 -1212
  509. package/src/files-backends/local-fs.ts +0 -163
  510. package/src/files.ts +0 -293
  511. package/src/filesystem.ts +0 -2005
  512. package/src/hooks.ts +0 -30
  513. package/src/index.ts +0 -259
  514. package/src/internal/advertise-tools.ts +0 -370
  515. package/src/internal/approval-gate.ts +0 -103
  516. package/src/internal/artifacts-store.ts +0 -836
  517. package/src/internal/as-of.ts +0 -257
  518. package/src/internal/auth.ts +0 -46
  519. package/src/internal/authored-alias-hooks.ts +0 -138
  520. package/src/internal/authored-loaders.ts +0 -188
  521. package/src/internal/bounded-int.ts +0 -24
  522. package/src/internal/bounded.ts +0 -25
  523. package/src/internal/brand.ts +0 -28
  524. package/src/internal/browser-origin-guard.ts +0 -67
  525. package/src/internal/builtin-tools/artifacts.ts +0 -62
  526. package/src/internal/builtin-tools/index.ts +0 -53
  527. package/src/internal/builtin-tools/reminders.ts +0 -145
  528. package/src/internal/channel-dispatch.ts +0 -129
  529. package/src/internal/channel-route-dispatch.ts +0 -58
  530. package/src/internal/channel-state.ts +0 -83
  531. package/src/internal/chat-client.ts +0 -594
  532. package/src/internal/cli-ax.ts +0 -2318
  533. package/src/internal/cli-bitbucket.ts +0 -438
  534. package/src/internal/cli-convert-automation.ts +0 -335
  535. package/src/internal/cli-cursor.ts +0 -282
  536. package/src/internal/cli-deploy.ts +0 -2519
  537. package/src/internal/cli-docs.ts +0 -192
  538. package/src/internal/cli-github.ts +0 -806
  539. package/src/internal/cli-gitlab.ts +0 -452
  540. package/src/internal/cli-images.ts +0 -672
  541. package/src/internal/cli-manifest.ts +0 -56
  542. package/src/internal/cli-mcp-oauth.ts +0 -396
  543. package/src/internal/cli-mcp.ts +0 -808
  544. package/src/internal/cli-skills.ts +0 -98
  545. package/src/internal/cli-slack-manual.ts +0 -418
  546. package/src/internal/cli-slack.ts +0 -874
  547. package/src/internal/cloud-merge.ts +0 -51
  548. package/src/internal/cloud-turn-cost.ts +0 -159
  549. package/src/internal/connection-env.ts +0 -106
  550. package/src/internal/continuation-channel.ts +0 -233
  551. package/src/internal/continuation-identity.ts +0 -935
  552. package/src/internal/conversation-mirror.ts +0 -423
  553. package/src/internal/convert-automation/convert-workflow.ts +0 -1377
  554. package/src/internal/convert-automation/slug.ts +0 -29
  555. package/src/internal/convert-automation/types.ts +0 -212
  556. package/src/internal/cron.ts +0 -76
  557. package/src/internal/cursor/account-mcp.ts +0 -692
  558. package/src/internal/cursor/backend-client.ts +0 -984
  559. package/src/internal/cursor/bound-secret-file.ts +0 -101
  560. package/src/internal/cursor/credentials.ts +0 -560
  561. package/src/internal/cursor/cursor-api-transport.ts +0 -65
  562. package/src/internal/cursor/github-credentials.ts +0 -228
  563. package/src/internal/cursor/hosted-bound-secrets.ts +0 -71
  564. package/src/internal/cursor/hosted-deployment-secrets.ts +0 -100
  565. package/src/internal/cursor/hosted-store-secrets.ts +0 -152
  566. package/src/internal/cursor/session-token.ts +0 -111
  567. package/src/internal/cursor/store-api-client.ts +0 -323
  568. package/src/internal/cursor-account-mcp-auth.ts +0 -303
  569. package/src/internal/cursor-agent-template.ts +0 -50
  570. package/src/internal/cursor-deployment-relay.ts +0 -315
  571. package/src/internal/cursor-event-relay.ts +0 -675
  572. package/src/internal/cursor-relay-core.ts +0 -563
  573. package/src/internal/deferred-channel-session.ts +0 -61
  574. package/src/internal/deploy-client.ts +0 -1574
  575. package/src/internal/deploy-manifest.ts +0 -361
  576. package/src/internal/deploy-source.ts +0 -144
  577. package/src/internal/describe-error.ts +0 -32
  578. package/src/internal/dev-mode.ts +0 -20
  579. package/src/internal/discovery/agent-config.ts +0 -288
  580. package/src/internal/discovery/agent.ts +0 -381
  581. package/src/internal/discovery/channels.ts +0 -100
  582. package/src/internal/discovery/connections.ts +0 -516
  583. package/src/internal/discovery/context.ts +0 -38
  584. package/src/internal/discovery/cursor-plugin.ts +0 -628
  585. package/src/internal/discovery/extension-overlay.ts +0 -247
  586. package/src/internal/discovery/extensions.ts +0 -490
  587. package/src/internal/discovery/fs.ts +0 -103
  588. package/src/internal/discovery/hooks.ts +0 -63
  589. package/src/internal/discovery/info.ts +0 -174
  590. package/src/internal/discovery/instructions.ts +0 -98
  591. package/src/internal/discovery/modules.ts +0 -107
  592. package/src/internal/discovery/names.ts +0 -45
  593. package/src/internal/discovery/project.ts +0 -319
  594. package/src/internal/discovery/reminders.ts +0 -65
  595. package/src/internal/discovery/runtime.ts +0 -158
  596. package/src/internal/discovery/schedules.ts +0 -120
  597. package/src/internal/discovery/seed-files.ts +0 -34
  598. package/src/internal/discovery/services.ts +0 -151
  599. package/src/internal/discovery/skills.ts +0 -174
  600. package/src/internal/discovery/subagent.ts +0 -138
  601. package/src/internal/discovery/tools.ts +0 -170
  602. package/src/internal/discovery.ts +0 -27
  603. package/src/internal/distribution.ts +0 -126
  604. package/src/internal/docs-site.ts +0 -248
  605. package/src/internal/duration.ts +0 -37
  606. package/src/internal/env-file.ts +0 -83
  607. package/src/internal/eval-judge-model.ts +0 -142
  608. package/src/internal/eval-run-store.ts +0 -585
  609. package/src/internal/eval-runner.ts +0 -823
  610. package/src/internal/evals-client.ts +0 -475
  611. package/src/internal/event-log.ts +0 -342
  612. package/src/internal/event-mapper.ts +0 -811
  613. package/src/internal/expected-delivery-failure.ts +0 -34
  614. package/src/internal/factory-resource-channel.ts +0 -103
  615. package/src/internal/filesystem/errors.ts +0 -207
  616. package/src/internal/filesystem/format.ts +0 -253
  617. package/src/internal/filesystem/merge.ts +0 -192
  618. package/src/internal/filesystem/nearest.ts +0 -112
  619. package/src/internal/filesystem/scratch.ts +0 -239
  620. package/src/internal/filesystem/sdk-schemas.ts +0 -204
  621. package/src/internal/filesystem/tools.ts +0 -804
  622. package/src/internal/filesystem/walk.ts +0 -366
  623. package/src/internal/fixtures/units-server.ts +0 -52
  624. package/src/internal/framework-file-storage.ts +0 -357
  625. package/src/internal/framework-storage-selection.ts +0 -156
  626. package/src/internal/frontmatter.ts +0 -108
  627. package/src/internal/github-fanout.ts +0 -144
  628. package/src/internal/guest-network.ts +0 -391
  629. package/src/internal/handleAgentServeTrigger.ts +0 -286
  630. package/src/internal/host-files.ts +0 -341
  631. package/src/internal/host-kv.ts +0 -81
  632. package/src/internal/host-otel.ts +0 -231
  633. package/src/internal/host-platforms.ts +0 -170
  634. package/src/internal/hosted-admission-adapter.ts +0 -47
  635. package/src/internal/hosted-admission-context.ts +0 -37
  636. package/src/internal/hosted-catch-protocol.ts +0 -112
  637. package/src/internal/hosted-catch.ts +0 -179
  638. package/src/internal/hosted-delivery-protocol.ts +0 -824
  639. package/src/internal/hosted-delivery.ts +0 -1410
  640. package/src/internal/hosted-execution-diag.ts +0 -291
  641. package/src/internal/hosted-execution-flush.ts +0 -136
  642. package/src/internal/hosted-execution-latency.ts +0 -301
  643. package/src/internal/hosted-managed-automation.ts +0 -116
  644. package/src/internal/hosting.ts +0 -114
  645. package/src/internal/http-channel-define.ts +0 -25
  646. package/src/internal/http-channel.ts +0 -669
  647. package/src/internal/http-control-plane-session.ts +0 -110
  648. package/src/internal/ids.ts +0 -39
  649. package/src/internal/incoming-headers-to-fetch.ts +0 -45
  650. package/src/internal/init-interview.ts +0 -360
  651. package/src/internal/init-project.ts +0 -711
  652. package/src/internal/init-scaffold.ts +0 -182
  653. package/src/internal/inline-stdio-define-stub.ts +0 -4
  654. package/src/internal/inline-stdio-mcp.ts +0 -230
  655. package/src/internal/install-cursor-skills.ts +0 -604
  656. package/src/internal/is-record.ts +0 -3
  657. package/src/internal/json-schema.ts +0 -95
  658. package/src/internal/legacy-command-guard.ts +0 -66
  659. package/src/internal/listen-port.ts +0 -85
  660. package/src/internal/local-control-plane.ts +0 -442
  661. package/src/internal/local-env.ts +0 -59
  662. package/src/internal/local-ingress.ts +0 -90
  663. package/src/internal/log-ring.ts +0 -59
  664. package/src/internal/logs-client.ts +0 -477
  665. package/src/internal/map-pool.ts +0 -39
  666. package/src/internal/mcp-endpoint.ts +0 -747
  667. package/src/internal/mcp-host.ts +0 -509
  668. package/src/internal/mcp-oauth-on-demand.ts +0 -337
  669. package/src/internal/mcp-oauth-persist.ts +0 -118
  670. package/src/internal/mcp-oauth.ts +0 -549
  671. package/src/internal/net.ts +0 -29
  672. package/src/internal/open-browser.ts +0 -41
  673. package/src/internal/otel/attrs.ts +0 -16
  674. package/src/internal/otel/collector.ts +0 -937
  675. package/src/internal/otel/config.ts +0 -287
  676. package/src/internal/otel/http.ts +0 -122
  677. package/src/internal/otel/mcp.ts +0 -56
  678. package/src/internal/otel/propagation.ts +0 -17
  679. package/src/internal/otel/runtime.ts +0 -441
  680. package/src/internal/package-inline-stdio.ts +0 -114
  681. package/src/internal/peer-connections.ts +0 -96
  682. package/src/internal/platform-schedule-sync.ts +0 -75
  683. package/src/internal/platform-timers.ts +0 -365
  684. package/src/internal/playground/static.ts +0 -278
  685. package/src/internal/playground/toolchain.ts +0 -270
  686. package/src/internal/playground-proxy.ts +0 -564
  687. package/src/internal/process-memory-telemetry.ts +0 -334
  688. package/src/internal/project-layout.ts +0 -31
  689. package/src/internal/prompt-context.ts +0 -116
  690. package/src/internal/reminder-control-plane-protocol.ts +0 -482
  691. package/src/internal/reminder-runner.ts +0 -1559
  692. package/src/internal/reminder-schedule.ts +0 -104
  693. package/src/internal/reminder-store.ts +0 -176
  694. package/src/internal/request-error-status.ts +0 -95
  695. package/src/internal/request-headers.ts +0 -21
  696. package/src/internal/resolve-prod-target.ts +0 -334
  697. package/src/internal/resolved-connections.ts +0 -190
  698. package/src/internal/router.ts +0 -143
  699. package/src/internal/run-client.ts +0 -354
  700. package/src/internal/runtime-dispatch-runner.ts +0 -50
  701. package/src/internal/sanitize-mcp-tool-name.ts +0 -31
  702. package/src/internal/schedule-runner.ts +0 -154
  703. package/src/internal/scm/pr-url.ts +0 -245
  704. package/src/internal/sdk-runner.ts +0 -959
  705. package/src/internal/serve-restart.ts +0 -113
  706. package/src/internal/server.ts +0 -3147
  707. package/src/internal/session-cost.ts +0 -208
  708. package/src/internal/session-engine.ts +0 -5622
  709. package/src/internal/session-links.ts +0 -84
  710. package/src/internal/session-run-log.ts +0 -535
  711. package/src/internal/session-store.ts +0 -307
  712. package/src/internal/session-urls.ts +0 -32
  713. package/src/internal/sessions-client.ts +0 -239
  714. package/src/internal/skill-catalog.ts +0 -66
  715. package/src/internal/skills-sync.ts +0 -55
  716. package/src/internal/slack-provision-client.ts +0 -544
  717. package/src/internal/slack-thread-key.ts +0 -11
  718. package/src/internal/sleep.ts +0 -3
  719. package/src/internal/start-log-store.ts +0 -164
  720. package/src/internal/steering.ts +0 -17
  721. package/src/internal/storage-coordinator.ts +0 -800
  722. package/src/internal/storage-roles.ts +0 -86
  723. package/src/internal/storage.ts +0 -1
  724. package/src/internal/store-api-protocol.ts +0 -205
  725. package/src/internal/store-mirror.ts +0 -73
  726. package/src/internal/stream-progress.ts +0 -294
  727. package/src/internal/terminal-style.ts +0 -133
  728. package/src/internal/testing/factory-resource-fixtures.ts +0 -84
  729. package/src/internal/testing/scm-continuation-fixtures.ts +0 -285
  730. package/src/internal/tool-catalog.ts +0 -104
  731. package/src/internal/tool-policy.ts +0 -222
  732. package/src/internal/tool-result.ts +0 -50
  733. package/src/internal/trajectory.ts +0 -418
  734. package/src/internal/turn-cost.ts +0 -136
  735. package/src/internal/turn-governor.ts +0 -145
  736. package/src/internal/turn-lease-store.ts +0 -144
  737. package/src/internal/turn-outbox.ts +0 -77
  738. package/src/internal/update-check.ts +0 -517
  739. package/src/internal/v2-hosting.ts +0 -52
  740. package/src/internal/workspace-sync.ts +0 -114
  741. package/src/internal/workspace.ts +0 -505
  742. package/src/kv/memory-kv.ts +0 -94
  743. package/src/kv.ts +0 -18
  744. package/src/memory.ts +0 -487
  745. package/src/otel-public.ts +0 -24
  746. package/src/otel.ts +0 -320
  747. package/src/prompt.ts +0 -80
  748. package/src/reminders.ts +0 -65
  749. package/src/schedules.ts +0 -31
  750. package/src/skills.ts +0 -27
  751. package/src/storage-backends/cursor-hosted-v2.ts +0 -204
  752. package/src/storage-backends/cursor-hosted.ts +0 -388
  753. package/src/storage-backends/file-kv.ts +0 -276
  754. package/src/storage-protocol.ts +0 -261
  755. package/src/storage.ts +0 -408
  756. package/src/tools.ts +0 -166
  757. package/src/types.ts +0 -3776
  758. /package/dist/docs/assets/{guides_jev.md.BNDm14Gy.lean.js → guides_jev.md.D7XH4JH3.lean.js} +0 -0
  759. /package/dist/docs/assets/{reference_http-api.md.BZOvhCqY.lean.js → reference_http-api.md.DbFNOubV.lean.js} +0 -0
  760. /package/dist/docs/assets/{reference_project-layout.md.CpLQ9j4K.lean.js → reference_project-layout.md.C2JMRh7p.lean.js} +0 -0
@@ -1,4 +1,4 @@
1
- import{_ as i,c as a,o as e,a3 as t}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"Host MCP OAuth","description":"Authorize a private MCP server locally, constrain its tools, and carry its credentials onto a hosted agent.","frontmatter":{"title":"Host MCP OAuth","description":"Authorize a private MCP server locally, constrain its tools, and carry its credentials onto a hosted agent."},"headers":[],"relativePath":"guides/mcp-oauth.md","filePath":"guides/mcp-oauth.md"}'),n={name:"guides/mcp-oauth.md"};function h(l,s,p,o,r,k){return e(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="connect-a-private-mcp-server-with-oauth" tabindex="-1">Connect a private MCP server with OAuth <a class="header-anchor" href="#connect-a-private-mcp-server-with-oauth" aria-label="Permalink to &quot;Connect a private MCP server with OAuth&quot;">​</a></h1><p>Host MCP OAuth lets a BDK process authorize a remote MCP server without putting tokens in the agent&#39;s source or workspace. Use it when the server speaks OAuth and its credentials should belong to the serve host instead of a person&#39;s Cursor account.</p><p>The <code>@cursor/bdk</code> imports and <code>bdk</code> commands on this page are docs-ahead until publication; see <a href="/docs/#bdk-package-availability">BDK package availability</a>.</p><h2 id="use-a-private-mcp-tool-locally" tabindex="-1">Use a private MCP tool locally <a class="header-anchor" href="#use-a-private-mcp-tool-locally" aria-label="Permalink to &quot;Use a private MCP tool locally&quot;">​</a></h2><p>Declare the remote server, authorize it once in the browser, and start the agent. The next local turn can call the server&#39;s named tools with the credentials stored on that host.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bot/mcp-connections/inventory.ts</span></span>
1
+ import{_ as i,c as a,o as e,a3 as t}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"Host MCP OAuth","description":"Authorize a private MCP server locally, constrain its tools, and carry its credentials onto a hosted agent.","frontmatter":{"title":"Host MCP OAuth","description":"Authorize a private MCP server locally, constrain its tools, and carry its credentials onto a hosted agent."},"headers":[],"relativePath":"guides/mcp-oauth.md","filePath":"guides/mcp-oauth.md"}'),n={name:"guides/mcp-oauth.md"};function h(l,s,p,o,r,k){return e(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="connect-a-private-mcp-server-with-oauth" tabindex="-1">Connect a private MCP server with OAuth <a class="header-anchor" href="#connect-a-private-mcp-server-with-oauth" aria-label="Permalink to &quot;Connect a private MCP server with OAuth&quot;">​</a></h1><p>Host MCP OAuth lets a BDK process authorize a remote MCP server without putting tokens in the agent&#39;s source or workspace. Use it when the server speaks OAuth and its credentials should belong to the serve host instead of a person&#39;s Cursor account.</p><h2 id="use-a-private-mcp-tool-locally" tabindex="-1">Use a private MCP tool locally <a class="header-anchor" href="#use-a-private-mcp-tool-locally" aria-label="Permalink to &quot;Use a private MCP tool locally&quot;">​</a></h2><p>Declare the remote server, authorize it once in the browser, and start the agent. The next local turn can call the server&#39;s named tools with the credentials stored on that host.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bot/mcp-connections/inventory.ts</span></span>
2
2
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { defineConnection } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;@cursor/bdk/connections&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
3
3
  <span class="line"></span>
4
4
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> defineConnection</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
@@ -47,4 +47,4 @@ import{_ as i,c as a,o as e,a3 as t}from"./chunks/framework.BNw1pucY.js";const c
47
47
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
48
48
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk mcp oauth inventory --store</span></span>
49
49
  <span class="line"><span>bdk secrets list my-agent</span></span>
50
- <span class="line"><span>bdk deploy</span></span></code></pre></div><p><code>--store</code> writes deployment secrets; it does not restart the current engine. Follow the CLI or dashboard prompt to redeploy, then exercise the hosted agent.</p><p>These credentials belong to the deployment, not to the person who clicked Connect. Anyone able to use that agent can reach the MCP capabilities you expose, so keep privileged servers host-only or narrow their tool list.</p><h2 id="choose-where-credentials-live" tabindex="-1">Choose where credentials live <a class="header-anchor" href="#choose-where-credentials-live" aria-label="Permalink to &quot;Choose where credentials live&quot;">​</a></h2><p>Use the credential shape that matches who should own access:</p><ul><li><p>Choose <code>cursorAccount: true</code> for connectors already authorized under MCP in the Cursor dashboard. Their tokens stay on the Cursor backend.</p></li><li><p>Choose <code>url</code> with <code>oauth: true</code> when the serve host or hosted deployment should hold OAuth credentials.</p></li><li><p>Choose <code>url</code> with static <code>headers</code> when the server uses an API key or bearer token instead of OAuth.</p></li></ul><p>Host OAuth and per-session <code>auth</code> are different identity models and cannot be combined on one connection. Use per-session auth when each caller needs a different downstream identity.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./../../skills/mcp-auth/SKILL.html"><code>skills/mcp-auth/SKILL.md</code></a>: the companion setup procedure for coding agents</li><li><a href="./../reference/connections.html">MCP connections</a>: transports, account connectors, per-session auth, and tool filtering</li><li><a href="./../reference/cli.html#mcp-oauth">CLI reference</a>: OAuth command flags and browser callback behavior</li><li><a href="./../deployment.html">Deployment</a>: hosted secrets and egress</li><li><a href="./../troubleshooting.html">Troubleshooting</a>: authorization symptoms and remedies</li></ul>`,29)])])}const E=i(n,[["render",h]]);export{c as __pageData,E as default};
50
+ <span class="line"><span>bdk deploy</span></span></code></pre></div><p><code>--store</code> writes deployment secrets; it does not restart the current process. Follow the CLI or dashboard prompt to redeploy, then exercise the hosted agent.</p><p>These credentials belong to the deployment, not to the person who clicked Connect. Anyone able to use that agent can reach the MCP capabilities you expose, so keep privileged servers host-only or narrow their tool list.</p><h2 id="choose-where-credentials-live" tabindex="-1">Choose where credentials live <a class="header-anchor" href="#choose-where-credentials-live" aria-label="Permalink to &quot;Choose where credentials live&quot;">​</a></h2><p>Use the credential shape that matches who should own access:</p><ul><li><p>Choose <code>cursorAccount: true</code> for connectors already authorized under MCP in the Cursor dashboard. Their tokens stay on the Cursor backend.</p></li><li><p>Choose <code>url</code> with <code>oauth: true</code> when the serve host or hosted deployment should hold OAuth credentials.</p></li><li><p>Choose <code>url</code> with static <code>headers</code> when the server uses an API key or bearer token instead of OAuth.</p></li></ul><p>Host OAuth and per-session <code>auth</code> are different identity models and cannot be combined on one connection. Use per-session auth when each caller needs a different downstream identity.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./../../skills/mcp-auth/SKILL.html"><code>skills/mcp-auth/SKILL.md</code></a>: the companion setup procedure for coding agents</li><li><a href="./../reference/connections.html">MCP connections</a>: transports, account connectors, per-session auth, and tool filtering</li><li><a href="./../reference/cli.html#mcp-oauth">CLI reference</a>: OAuth command flags and browser callback behavior</li><li><a href="./../deployment.html">Deployment</a>: hosted secrets and egress</li><li><a href="./../troubleshooting.html">Troubleshooting</a>: authorization symptoms and remedies</li></ul>`,28)])])}const E=i(n,[["render",h]]);export{c as __pageData,E as default};
@@ -1 +1 @@
1
- import{_ as i,c as a,o as e,a3 as t}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"Host MCP OAuth","description":"Authorize a private MCP server locally, constrain its tools, and carry its credentials onto a hosted agent.","frontmatter":{"title":"Host MCP OAuth","description":"Authorize a private MCP server locally, constrain its tools, and carry its credentials onto a hosted agent."},"headers":[],"relativePath":"guides/mcp-oauth.md","filePath":"guides/mcp-oauth.md"}'),n={name:"guides/mcp-oauth.md"};function h(l,s,p,o,r,k){return e(),a("div",null,[...s[0]||(s[0]=[t("",29)])])}const E=i(n,[["render",h]]);export{c as __pageData,E as default};
1
+ import{_ as i,c as a,o as e,a3 as t}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"Host MCP OAuth","description":"Authorize a private MCP server locally, constrain its tools, and carry its credentials onto a hosted agent.","frontmatter":{"title":"Host MCP OAuth","description":"Authorize a private MCP server locally, constrain its tools, and carry its credentials onto a hosted agent."},"headers":[],"relativePath":"guides/mcp-oauth.md","filePath":"guides/mcp-oauth.md"}'),n={name:"guides/mcp-oauth.md"};function h(l,s,p,o,r,k){return e(),a("div",null,[...s[0]||(s[0]=[t("",28)])])}const E=i(n,[["render",h]]);export{c as __pageData,E as default};
@@ -1,8 +1,10 @@
1
- import{_ as e,c as a,o as t,a3 as i}from"./chunks/framework.BNw1pucY.js";const k=JSON.parse('{"title":"OpenTelemetry","description":"Send agent traces and metrics to an OTLP collector, follow one conversation, and add domain telemetry.","frontmatter":{"title":"OpenTelemetry","description":"Send agent traces and metrics to an OTLP collector, follow one conversation, and add domain telemetry."},"headers":[],"relativePath":"guides/opentelemetry.md","filePath":"guides/opentelemetry.md"}'),n={name:"guides/opentelemetry.md"};function o(l,s,p,r,h,d){return t(),a("div",null,[...s[0]||(s[0]=[i(`<h1 id="observe-an-agent-with-opentelemetry" tabindex="-1">Observe an agent with OpenTelemetry <a class="header-anchor" href="#observe-an-agent-with-opentelemetry" aria-label="Permalink to &quot;Observe an agent with OpenTelemetry&quot;">​</a></h1><p>OpenTelemetry connects an agent turn to the observability system your team already uses. Once you configure an OTLP collector, each request, model turn, tool call, and subagent appears alongside token, tool, and cost metrics from the serve process.</p><p>Export is opt-in. Nothing leaves the process until you configure a destination.</p><p>The <code>bdk</code> commands on this page are docs-ahead until <code>@cursor/bdk</code> is published; see <a href="/docs/#bdk-package-availability">BDK package availability</a>.</p><h2 id="connect-an-otlp-collector" tabindex="-1">Connect an OTLP collector <a class="header-anchor" href="#connect-an-otlp-collector" aria-label="Permalink to &quot;Connect an OTLP collector&quot;">​</a></h2><p>Set the collector endpoint, start the agent, and send it a message. You should see an <code>agent_sdk.http</code> request span and an <code>agent_sdk.turn</code> trace, with any tool or subagent work nested under the turn.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>export OTEL_EXPORTER_OTLP_ENDPOINT=https://otel.example.com</span></span>
2
- <span class="line"><span>export OTEL_EXPORTER_OTLP_HEADERS=&quot;Authorization=Bearer $OTEL_TOKEN&quot;</span></span>
3
- <span class="line"><span>export OTEL_SERVICE_NAME=incident-agent</span></span>
4
- <span class="line"><span></span></span>
5
- <span class="line"><span>bdk serve --dir . --dev</span></span></code></pre></div><p>The default protocol is OTLP/HTTP protobuf. If you already call <code>serve()</code> from TypeScript, you can configure the same destination in code:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> serve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(dir, {</span></span>
1
+ import{_ as a,c as e,o as i,a3 as t}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"OpenTelemetry","description":"Send agent traces and metrics to an OTLP collector, follow one conversation, and add domain telemetry.","frontmatter":{"title":"OpenTelemetry","description":"Send agent traces and metrics to an OTLP collector, follow one conversation, and add domain telemetry."},"headers":[],"relativePath":"guides/opentelemetry.md","filePath":"guides/opentelemetry.md"}'),n={name:"guides/opentelemetry.md"};function l(o,s,p,h,r,d){return i(),e("div",null,[...s[0]||(s[0]=[t(`<h1 id="observe-an-agent-with-opentelemetry" tabindex="-1">Observe an agent with OpenTelemetry <a class="header-anchor" href="#observe-an-agent-with-opentelemetry" aria-label="Permalink to &quot;Observe an agent with OpenTelemetry&quot;">​</a></h1><p>OpenTelemetry connects an agent turn to the observability system your team already uses. Once you configure an OTLP collector, each request, model turn, tool call, and subagent appears alongside token, tool, and cost metrics from the serve process.</p><p>Export is opt-in. Nothing leaves the process until you configure a destination.</p><h2 id="connect-an-otlp-collector" tabindex="-1">Connect an OTLP collector <a class="header-anchor" href="#connect-an-otlp-collector" aria-label="Permalink to &quot;Connect an OTLP collector&quot;">​</a></h2><p>Set the collector endpoint, start the agent, and send it a message. You should see an <code>agent_sdk.http</code> request span and an <code>agent_sdk.turn</code> trace, with any tool or subagent work nested under the turn.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> OTEL_EXPORTER_OTLP_ENDPOINT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">https://otel.example.com</span></span>
2
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> OTEL_EXPORTER_OTLP_HEADERS</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Authorization=Bearer </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">$OTEL_TOKEN</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span></span>
3
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> OTEL_SERVICE_NAME</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">incident-agent</span></span>
4
+ <span class="line"></span>
5
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> serve</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dev</span></span></code></pre></div><p>The default protocol is OTLP/HTTP protobuf. If you already call <code>serve()</code> from TypeScript, you can configure the same destination in code:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { serve } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;@cursor/bdk&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
6
+ <span class="line"></span>
7
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> serve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;.&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, {</span></span>
6
8
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> otel: {</span></span>
7
9
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> serviceName: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;incident-agent&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
8
10
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> exporters: [</span></span>
@@ -32,4 +34,4 @@ import{_ as e,c as a,o as t,a3 as i}from"./chunks/framework.BNw1pucY.js";const k
32
34
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> outcome: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;approved&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
33
35
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>This API is available in tools, hooks, and channel handlers. A session-bound context adds <code>cursor.conversation.id</code> and <code>agent_sdk.agent</code> automatically, so custom measurements join the first-party telemetry without extra plumbing.</p><p>Prefix custom names with your team or agent. First-party metric names and join keys are reserved, and this surface does not create custom spans.</p><h2 id="choose-signals" tabindex="-1">Choose signals <a class="header-anchor" href="#choose-signals" aria-label="Permalink to &quot;Choose signals&quot;">​</a></h2><p>Once export has a destination, traces and metrics are on by default; logs remain off until you opt in.</p><table tabindex="0"><thead><tr><th>Signal</th><th>What appears</th></tr></thead><tbody><tr><td>Traces</td><td>HTTP requests, turns, tools, and subagents</td></tr><tr><td>Metrics</td><td>Token usage, tool calls, cost, and BDK session or turn counts</td></tr><tr><td>Logs</td><td>Session events, after you enable log export</td></tr></tbody></table><p>The first metrics to look for are <code>cursor.token.usage</code>, <code>cursor.tool.calls</code>, and <code>cursor.cost.usage</code>. Configure <code>traces: false</code>, <code>metrics: false</code>, or <code>logs: true</code> under <code>serve({ otel })</code> when you need a different signal mix.</p><h2 id="control-what-leaves-the-process" tabindex="-1">Control what leaves the process <a class="header-anchor" href="#control-what-leaves-the-process" aria-label="Permalink to &quot;Control what leaves the process&quot;">​</a></h2><p>User prompts, tool arguments, tool results, and failure text stay off the wire by default. You still get trace structure, tool names and status, usage metrics, and generic failure status without exporting the underlying content.</p><p>Turn on logs first, then opt into prompt or tool content separately:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> OTEL_LOGS_EXPORTER</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">otlp</span></span>
34
36
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> OTEL_LOG_USER_PROMPTS</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span></span>
35
- <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> OTEL_LOG_TOOL_CONTENT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span></span></code></pre></div><p><code>OTEL_LOG_USER_PROMPTS</code> exports user text. <code>OTEL_LOG_TOOL_CONTENT</code> exports tool inputs, outputs, and failure details. Enable either only when the collector&#39;s access and retention policies are appropriate for that data.</p><p>The same controls are available as <code>logs: { userPrompts, toolContent }</code> under <code>serve({ otel })</code>.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./../../skills/otel/SKILL.html"><code>skills/otel/SKILL.md</code></a>: compact configuration and custom-metric reference for coding agents</li><li><a href="./../reference/hooks.html">Hooks</a>: emit domain telemetry from session events</li><li><a href="./../deployment.html">Deployment</a>: set collector endpoints and secrets on hosted or self-hosted agents</li><li><a href="https://cursor.com/docs/enterprise/opentelemetry-export" target="_blank" rel="noreferrer">Cursor enterprise OpenTelemetry Export</a>: send organization-wide Cursor telemetry to the same collector</li></ul>`,32)])])}const E=e(n,[["render",o]]);export{k as __pageData,E as default};
37
+ <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> OTEL_LOG_TOOL_CONTENT</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span></span></code></pre></div><p><code>OTEL_LOG_USER_PROMPTS</code> exports user text. <code>OTEL_LOG_TOOL_CONTENT</code> exports tool inputs, outputs, and failure details. Enable either only when the collector&#39;s access and retention policies are appropriate for that data.</p><p>The same controls are available as <code>logs: { userPrompts, toolContent }</code> under <code>serve({ otel })</code>.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./../../skills/otel/SKILL.html"><code>skills/otel/SKILL.md</code></a>: compact configuration and custom-metric reference for coding agents</li><li><a href="./../reference/hooks.html">Hooks</a>: emit domain telemetry from session events</li><li><a href="./../deployment.html">Deployment</a>: set collector endpoints and secrets on hosted or self-hosted agents</li><li><a href="https://cursor.com/docs/enterprise/opentelemetry-export" target="_blank" rel="noreferrer">Cursor enterprise OpenTelemetry Export</a>: send organization-wide Cursor telemetry to the same collector</li></ul>`,31)])])}const E=a(n,[["render",l]]);export{c as __pageData,E as default};
@@ -1 +1 @@
1
- import{_ as e,c as a,o as t,a3 as i}from"./chunks/framework.BNw1pucY.js";const k=JSON.parse('{"title":"OpenTelemetry","description":"Send agent traces and metrics to an OTLP collector, follow one conversation, and add domain telemetry.","frontmatter":{"title":"OpenTelemetry","description":"Send agent traces and metrics to an OTLP collector, follow one conversation, and add domain telemetry."},"headers":[],"relativePath":"guides/opentelemetry.md","filePath":"guides/opentelemetry.md"}'),n={name:"guides/opentelemetry.md"};function o(l,s,p,r,h,d){return t(),a("div",null,[...s[0]||(s[0]=[i("",32)])])}const E=e(n,[["render",o]]);export{k as __pageData,E as default};
1
+ import{_ as a,c as e,o as i,a3 as t}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"OpenTelemetry","description":"Send agent traces and metrics to an OTLP collector, follow one conversation, and add domain telemetry.","frontmatter":{"title":"OpenTelemetry","description":"Send agent traces and metrics to an OTLP collector, follow one conversation, and add domain telemetry."},"headers":[],"relativePath":"guides/opentelemetry.md","filePath":"guides/opentelemetry.md"}'),n={name:"guides/opentelemetry.md"};function l(o,s,p,h,r,d){return i(),e("div",null,[...s[0]||(s[0]=[t("",31)])])}const E=a(n,[["render",l]]);export{c as __pageData,E as default};
@@ -1,4 +1,4 @@
1
- import{_ as a,c as i,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"Slack","description":"Wake your agent from mentions, DMs, and watched posts, then reply in the thread.","frontmatter":{"title":"Slack","description":"Wake your agent from mentions, DMs, and watched posts, then reply in the thread."},"headers":[],"relativePath":"guides/slack.md","filePath":"guides/slack.md"}'),t={name:"guides/slack.md"};function l(h,s,p,o,k,r){return e(),i("div",null,[...s[0]||(s[0]=[n(`<h1 id="slack-agents" tabindex="-1">Slack agents <a class="header-anchor" href="#slack-agents" aria-label="Permalink to &quot;Slack agents&quot;">​</a></h1><p>A Slack agent wakes when someone mentions it, sends it a DM, or posts in a channel it watches. From there, it keeps the conversation in one thread and can reply all at once, stream the answer live, or decide for itself when to post updates.</p><p>The <code>@cursor/bdk</code> imports and <code>bdk</code> commands on this page are docs-ahead until publication; see <a href="/docs/#bdk-package-availability">BDK package availability</a>.</p><p>Run <code>bdk slack create --dir .</code>, then <code>bdk slack doctor</code>.</p><h2 id="answer-a-mention-or-dm" tabindex="-1">Answer a mention or DM <a class="header-anchor" href="#answer-a-mention-or-dm" aria-label="Permalink to &quot;Answer a mention or DM&quot;">​</a></h2><p>Mention the bot in a channel or send it a DM, and it will answer in a thread on that message. Any follow-up in the same thread continues the conversation where it left off.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bot/channels/slack.ts</span></span>
1
+ import{_ as a,c as i,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"Slack","description":"Wake your agent from mentions, DMs, and watched posts, then reply in the thread.","frontmatter":{"title":"Slack","description":"Wake your agent from mentions, DMs, and watched posts, then reply in the thread."},"headers":[],"relativePath":"guides/slack.md","filePath":"guides/slack.md"}'),t={name:"guides/slack.md"};function l(h,s,p,k,o,r){return e(),i("div",null,[...s[0]||(s[0]=[n(`<h1 id="slack-agents" tabindex="-1">Slack agents <a class="header-anchor" href="#slack-agents" aria-label="Permalink to &quot;Slack agents&quot;">​</a></h1><p>A Slack agent wakes when someone mentions it, sends it a DM, or posts in a channel it watches. From there, it keeps the conversation in one thread and can reply all at once, stream the answer live, or decide for itself when to post updates.</p><p>Run <code>bdk slack create --dir .</code>, then <code>bdk slack doctor</code>.</p><h2 id="answer-a-mention-or-dm" tabindex="-1">Answer a mention or DM <a class="header-anchor" href="#answer-a-mention-or-dm" aria-label="Permalink to &quot;Answer a mention or DM&quot;">​</a></h2><p>Mention the bot in a channel or send it a DM, and it will answer in a thread on that message. Any follow-up in the same thread continues the conversation where it left off.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bot/channels/slack.ts</span></span>
2
2
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { slackChannel } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;@cursor/bdk/channels/slack&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
3
3
  <span class="line"></span>
4
4
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> slackChannel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
@@ -12,7 +12,7 @@ import{_ as a,c as i,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const c
12
12
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> reasoning: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
13
13
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Tool names as they start (&quot;Running grep, glob...&quot;).</span></span>
14
14
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> tools: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
15
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> idle: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Checking the monorepo...&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Poking Datadog...&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
15
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> idle: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Checking the request...&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Reviewing recent activity...&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
16
16
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
17
17
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
18
18
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><h2 id="stream-a-live-reply" tabindex="-1">Stream a live reply <a class="header-anchor" href="#stream-a-live-reply" aria-label="Permalink to &quot;Stream a live reply&quot;">​</a></h2><p>In stream mode, the reply appears immediately and grows as the model writes. Slack shows its generic &quot;is working...&quot; state until the stream ends, while optional reasoning and tool cards keep progress inside the same message.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> slackChannel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
@@ -32,7 +32,7 @@ import{_ as a,c as i,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const c
32
32
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> slackChannel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
33
33
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // \`post-update\` writes mid-turn progress and the final reply.</span></span>
34
34
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> reply: { mode: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;agentic&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
35
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><h2 id="wake-on-a-channel-post" tabindex="-1">Wake on a channel post <a class="header-anchor" href="#wake-on-a-channel-post" aria-label="Permalink to &quot;Wake on a channel post&quot;">​</a></h2><p>This example watches <code>#triage-alerts</code>, so any substantial top-level message starts a thread even when nobody mentions the bot. The length guard filters out short posts before they can start a turn.</p><p>Mentions are global — the bot answers an @mention in any channel it has joined — but listening without a mention names its channels: <code>allow</code> must include at least one channel id (<code>C…</code>/<code>G…</code>) and at most 10 distinct ids. <code>#name</code> entries may accompany the ids for readability. A lone <code>&quot;*&quot;</code> watches every channel the bot is in, thread replies only (<code>posts: &quot;replies&quot;</code>). Mixing <code>&quot;*&quot;</code> with ids is an error. <code>&quot;*&quot;</code> is the guest watcher: it is not a hosting subscription. A thread reply on Cursor-managed hosting is delivered when a mention already opened that thread, and a top-level post does not match.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> slackChannel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
35
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><h2 id="wake-on-a-channel-post" tabindex="-1">Wake on a channel post <a class="header-anchor" href="#wake-on-a-channel-post" aria-label="Permalink to &quot;Wake on a channel post&quot;">​</a></h2><p>This example watches <code>#triage-alerts</code>, so any substantial top-level message starts a thread even when nobody mentions the bot. The length guard filters out short posts before they can start a turn.</p><p>Mentions work in any channel the bot has joined. Listening without a mention requires an explicit allowlist with at least one channel ID starting with <code>C</code> or <code>G</code> and at most 10 distinct IDs. You can add <code>#name</code> entries for readability. A lone <code>&quot;*&quot;</code> watches replies in every joined channel (<code>posts: &quot;replies&quot;</code>), but it does not wake on top-level posts. Do not mix <code>&quot;*&quot;</code> with channel IDs.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> slackChannel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
36
36
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> engagement: {</span></span>
37
37
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> channelPosts: {</span></span>
38
38
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> allow: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;C0123ABCDEF&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;#triage-alerts&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
@@ -47,7 +47,7 @@ import{_ as a,c as i,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const c
47
47
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // \`{}\` starts a model turn as the sender.</span></span>
48
48
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {};</span></span>
49
49
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
50
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>When you create the app, pass <code>--channel-posts</code> and invite the bot to every channel in the allowlist.</p><p>On Cursor-managed hosting the id entries also define the delivery set: each becomes a channel-scoped subscription, and a channel post outside the allowlist is dropped at ingress before any compute wakes (replies in threads the agent is already part of still arrive). The same watch runs at admission for each delivered event. <code>debounceMs</code> is ignored there: the control plane answers every delivery immediately, and edits arrive as separate deliveries that are dropped at the edge. Channel ids match without any Slack call; <code>#name</code> entries are resolved once per pod with the bot token and need the <code>channels:read</code> scope.</p><h2 id="control-who-can-message" tabindex="-1">Control who can message <a class="header-anchor" href="#control-who-can-message" aria-label="Permalink to &quot;Control who can message&quot;">​</a></h2><p>By default, people outside your workspace get no reply. This matters most in Slack Connect channels, where external collaborators share the channel and can mention or reply to bots installed by your organization. Keeping <code>blockExternals</code> on prevents them from starting or steering an agent session and, through it, directing any tools available to the agent.</p><p>Set <code>blockExternals: false</code> only when external collaborators are intended users of the agent.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> slackChannel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
50
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>When you create the app, pass <code>--channel-posts</code> and invite the bot to every channel in the allowlist.</p><p>On Cursor-managed hosting, the channel IDs in <code>allow</code> define which top-level posts can wake the agent. Replies in threads the agent has already joined still arrive. <code>debounceMs</code> applies only when you self-host. Add the <code>channels:read</code> scope when you include <code>#name</code> labels.</p><h2 id="control-who-can-message" tabindex="-1">Control who can message <a class="header-anchor" href="#control-who-can-message" aria-label="Permalink to &quot;Control who can message&quot;">​</a></h2><p>By default, people outside your workspace get no reply. This matters most in Slack Connect channels, where external collaborators share the channel and can mention or reply to bots installed by your organization. Keeping <code>blockExternals</code> on prevents them from starting or steering an agent session and, through it, directing any tools available to the agent.</p><p>Set <code>blockExternals: false</code> only when external collaborators are intended users of the agent.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> slackChannel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
51
51
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Let external collaborators start and continue agent sessions.</span></span>
52
52
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> policy: { blockExternals: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
53
53
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>Anyone in a thread can continue its session by default. If the conversation should stay between the agent and its original author, set <code>respondTo: &quot;author&quot;</code>.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> slackChannel</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
@@ -64,7 +64,7 @@ import{_ as a,c as i,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const c
64
64
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
65
65
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ctx.thread.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">post</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Looking at this now.&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
66
66
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {};</span></span>
67
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">},</span></span></code></pre></div><p>Use the IDs on the hook <code>ctx</code> when handling an event, and <code>ctx.host.slack.getClient()</code> when a tool needs the Slack Web API.</p><h2 id="connect" tabindex="-1">Connect <a class="header-anchor" href="#connect" aria-label="Permalink to &quot;Connect&quot;">​</a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk login</span></span>
68
- <span class="line"><span>bdk slack create --dir .</span></span>
69
- <span class="line"><span>bdk slack doctor --prefix TRIAGE</span></span></code></pre></div><p>After you sign in, <code>slack create</code> opens <strong>Add Slack to this agent</strong> in the browser and writes the resulting tokens to <code>.env.local</code> without printing them. You can open the same wizard from <strong>Integrations</strong> on <a href="https://cursor.com/dashboard" target="_blank" rel="noreferrer">Deployed Agents</a>.</p><p>If Slack requires workspace-admin approval, keep <code>slack create</code> running and open the <strong>Request approval</strong> link printed by the CLI. Installing from the dashboard doesn&#39;t send that request for you. After an admin approves it, return to the dashboard&#39;s <strong>Add Slack</strong> wizard and select <strong>Retry</strong>.</p><p>If you already own the Slack app, initialize it with <code>bdk slack init --manual --dir . --name &quot;Triage&quot;</code> and follow the <a href="./../../skills/setup-slack/SKILL.html">Slack setup skill</a> for installation and tokens.</p><h2 id="test-locally" tabindex="-1">Test locally <a class="header-anchor" href="#test-locally" aria-label="Permalink to &quot;Test locally&quot;">​</a></h2><p>Run <code>doctor</code> first to catch missing credentials, then start the agent and send it the same mention or DM a teammate would.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk slack doctor --prefix TRIAGE</span></span>
70
- <span class="line"><span>bdk serve --dir . --dev</span></span></code></pre></div><h2 id="practices" tabindex="-1">Practices <a class="header-anchor" href="#practices" aria-label="Permalink to &quot;Practices&quot;">​</a></h2><ul><li><p>If the tokens are missing, the Slack channel stays idle while the rest of <code>serve</code> starts normally.</p></li><li><p>Keep <code>channelPosts.allow</code> narrow because each qualifying post can start a model turn.</p></li><li><p>Set <code>envPrefix</code> when two Slack bots share a host so the token names do not collide.</p></li></ul><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./../reference/cli.html#slack">CLI reference</a>: <code>slack create</code>, <code>doctor</code>, <code>init --manual</code></li><li><a href="./../../skills/setup-slack/SKILL.html"><code>skills/setup-slack/SKILL.md</code></a>: the companion skill for coding agents</li><li><a href="./webhooks.html">Webhooks and custom channels</a>: host prep on mention and DM handlers</li><li><a href="./../evals.html">Evals</a>: freeze a mention as a regression check</li></ul>`,53)])])}const E=a(t,[["render",l]]);export{c as __pageData,E as default};
67
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">},</span></span></code></pre></div><p>Use the IDs on the hook <code>ctx</code> when handling an event, and <code>ctx.host.slack.getClient()</code> when a tool needs the Slack Web API.</p><h2 id="connect" tabindex="-1">Connect <a class="header-anchor" href="#connect" aria-label="Permalink to &quot;Connect&quot;">​</a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> login</span></span>
68
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> slack</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> create</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span></span>
69
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> slack</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> doctor</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --prefix</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> TRIAGE</span></span></code></pre></div><p>After you sign in, <code>slack create</code> opens <strong>Add Slack to this agent</strong> in the browser and writes the resulting tokens to <code>.env.local</code> without printing them. You can open the same wizard from <strong>Integrations</strong> on <a href="https://cursor.com/dashboard" target="_blank" rel="noreferrer">Deployed Agents</a>.</p><p>If Slack requires workspace-admin approval, keep <code>slack create</code> running and open the <strong>Request approval</strong> link printed by the CLI. Installing from the dashboard doesn&#39;t send that request for you. After an admin approves it, return to the dashboard&#39;s <strong>Add Slack</strong> wizard and select <strong>Retry</strong>.</p><p>If you already own the Slack app, initialize it with <code>bdk slack init --manual --dir . --name &quot;Triage&quot;</code> and follow the <a href="./../../skills/setup-slack/SKILL.html">Slack setup skill</a> for installation and tokens.</p><h2 id="test-locally" tabindex="-1">Test locally <a class="header-anchor" href="#test-locally" aria-label="Permalink to &quot;Test locally&quot;">​</a></h2><p>Run <code>doctor</code> first to catch missing credentials, then start the agent and send it the same mention or DM a teammate would.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> slack</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> doctor</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --prefix</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> TRIAGE</span></span>
70
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">bdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> serve</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dev</span></span></code></pre></div><h2 id="practices" tabindex="-1">Practices <a class="header-anchor" href="#practices" aria-label="Permalink to &quot;Practices&quot;">​</a></h2><ul><li><p>If the tokens are missing, the Slack channel stays idle while the rest of <code>serve</code> starts normally.</p></li><li><p>Keep <code>channelPosts.allow</code> narrow because each qualifying post can start a model turn.</p></li><li><p>Set <code>envPrefix</code> when two Slack bots share a host so the token names do not collide.</p></li></ul><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./../reference/cli.html#slack">CLI reference</a>: <code>slack create</code>, <code>doctor</code>, <code>init --manual</code></li><li><a href="./../../skills/setup-slack/SKILL.html"><code>skills/setup-slack/SKILL.md</code></a>: the companion skill for coding agents</li><li><a href="./webhooks.html">Webhooks and custom channels</a>: host prep on mention and DM handlers</li><li><a href="./../evals.html">Evals</a>: freeze a mention as a regression check</li></ul>`,52)])])}const E=a(t,[["render",l]]);export{c as __pageData,E as default};
@@ -1 +1 @@
1
- import{_ as a,c as i,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"Slack","description":"Wake your agent from mentions, DMs, and watched posts, then reply in the thread.","frontmatter":{"title":"Slack","description":"Wake your agent from mentions, DMs, and watched posts, then reply in the thread."},"headers":[],"relativePath":"guides/slack.md","filePath":"guides/slack.md"}'),t={name:"guides/slack.md"};function l(h,s,p,o,k,r){return e(),i("div",null,[...s[0]||(s[0]=[n("",53)])])}const E=a(t,[["render",l]]);export{c as __pageData,E as default};
1
+ import{_ as a,c as i,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const c=JSON.parse('{"title":"Slack","description":"Wake your agent from mentions, DMs, and watched posts, then reply in the thread.","frontmatter":{"title":"Slack","description":"Wake your agent from mentions, DMs, and watched posts, then reply in the thread."},"headers":[],"relativePath":"guides/slack.md","filePath":"guides/slack.md"}'),t={name:"guides/slack.md"};function l(h,s,p,k,o,r){return e(),i("div",null,[...s[0]||(s[0]=[n("",52)])])}const E=a(t,[["render",l]]);export{c as __pageData,E as default};
@@ -1,4 +1,4 @@
1
- import{_ as i,c as a,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const o=JSON.parse('{"title":"Webhooks & custom channels","description":"Receive provider events, keep one conversation per domain object, and deliver agent replies back out.","frontmatter":{"title":"Webhooks & custom channels","description":"Receive provider events, keep one conversation per domain object, and deliver agent replies back out."},"headers":[],"relativePath":"guides/webhooks.md","filePath":"guides/webhooks.md"}'),t={name:"guides/webhooks.md"};function h(l,s,p,k,r,d){return e(),a("div",null,[...s[0]||(s[0]=[n(`<h1 id="webhook-agents" tabindex="-1">Webhook agents <a class="header-anchor" href="#webhook-agents" aria-label="Permalink to &quot;Webhook agents&quot;">​</a></h1><p>A custom channel turns an event from another system into an agent conversation, then sends the result back to the system that started it. Use one when the built-in <a href="./../reference/http-api.html">HTTP API</a> does not match the provider&#39;s payload, conversation key, or reply path.</p><p>The <code>@cursor/bdk</code> imports on this page are docs-ahead until publication; see <a href="/docs/#bdk-package-availability">BDK package availability</a>.</p><p>Author <code>bot/channels/&lt;id&gt;.ts</code>. Its routes mount under <code>/&lt;slug&gt;/v1/channels/&lt;id&gt;</code>.</p><h2 id="receive-a-webhook-and-send-the-answer-back" tabindex="-1">Receive a webhook and send the answer back <a class="header-anchor" href="#receive-a-webhook-and-send-the-answer-back" aria-label="Permalink to &quot;Receive a webhook and send the answer back&quot;">​</a></h2><p>When a ticket system sends a new message, this endpoint responds with <code>202 Accepted</code> right away. The agent keeps working after the HTTP request ends, and its completed answer appears as a comment on the ticket.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bot/channels/tickets.ts</span></span>
1
+ import{_ as i,c as a,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const o=JSON.parse('{"title":"Webhooks & custom channels","description":"Receive provider events, keep one conversation per domain object, and deliver agent replies back out.","frontmatter":{"title":"Webhooks & custom channels","description":"Receive provider events, keep one conversation per domain object, and deliver agent replies back out."},"headers":[],"relativePath":"guides/webhooks.md","filePath":"guides/webhooks.md"}'),t={name:"guides/webhooks.md"};function h(l,s,p,k,r,d){return e(),a("div",null,[...s[0]||(s[0]=[n(`<h1 id="webhook-agents" tabindex="-1">Webhook agents <a class="header-anchor" href="#webhook-agents" aria-label="Permalink to &quot;Webhook agents&quot;">​</a></h1><p>A custom channel turns an event from another system into an agent conversation, then sends the result back to the system that started it. Use one when the built-in <a href="./../reference/http-api.html">HTTP API</a> does not match the provider&#39;s payload, conversation key, or reply path.</p><p>Author <code>bot/channels/&lt;id&gt;.ts</code>. Its routes mount under <code>/&lt;slug&gt;/v1/channels/&lt;id&gt;</code>.</p><h2 id="receive-a-webhook-and-send-the-answer-back" tabindex="-1">Receive a webhook and send the answer back <a class="header-anchor" href="#receive-a-webhook-and-send-the-answer-back" aria-label="Permalink to &quot;Receive a webhook and send the answer back&quot;">​</a></h2><p>When a ticket system sends a new message, this endpoint responds with <code>202 Accepted</code> right away. The agent keeps working after the HTTP request ends, and its completed answer appears as a comment on the ticket.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bot/channels/tickets.ts</span></span>
2
2
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { defineChannel, POST } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;@cursor/bdk/channels&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
3
3
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { z } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;zod&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
4
4
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { postTicketComment } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;../lib/tickets.js&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
@@ -89,4 +89,4 @@ import{_ as i,c as a,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const o
89
89
  <span class="line"><span>curl -sS -X POST \\</span></span>
90
90
  <span class="line"><span> http://127.0.0.1:3000/&lt;slug&gt;/v1/channels/tickets/ticket \\</span></span>
91
91
  <span class="line"><span> -H &#39;content-type: application/json&#39; \\</span></span>
92
- <span class="line"><span> -d &#39;{&quot;ticketId&quot;:&quot;ENG-142&quot;,&quot;message&quot;:&quot;CSV export returns 500&quot;}&#39;</span></span></code></pre></div><p>Keep representative payloads under <code>fixtures/</code> and pass them with <code>--data-binary @fixtures/&lt;event&gt;.json</code>. You can also open the route&#39;s <strong>Try</strong> action in the playground for manual probes.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./../reference/channels.html">Channels reference</a>: route methods, handler arguments, events, state, and auth policies</li><li><a href="./../templates/triage.html">Triage Linear or Jira issues</a>: a complete signed tracker webhook with reply delivery</li><li><a href="./../reference/http-api.html">HTTP API</a>: built-in session, follow-up, stream, and tool routes</li><li><a href="./../deployment.html#use-the-hosted-agent">Deployment</a>: stable hosted URLs and alias-token behavior</li><li><a href="./../evals.html">Evals</a>: turn saved payloads into regression fixtures</li></ul>`,36)])])}const c=i(t,[["render",h]]);export{o as __pageData,c as default};
92
+ <span class="line"><span> -d &#39;{&quot;ticketId&quot;:&quot;ENG-142&quot;,&quot;message&quot;:&quot;CSV export returns 500&quot;}&#39;</span></span></code></pre></div><p>Keep representative payloads under <code>fixtures/</code> and pass them with <code>--data-binary @fixtures/&lt;event&gt;.json</code>. You can also open the route&#39;s <strong>Try</strong> action in the playground for manual probes.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./../reference/channels.html">Channels reference</a>: route methods, handler arguments, events, state, and auth policies</li><li><a href="./../templates/triage.html">Triage Linear or Jira issues</a>: a complete signed tracker webhook with reply delivery</li><li><a href="./../reference/http-api.html">HTTP API</a>: built-in session, follow-up, stream, and tool routes</li><li><a href="./../deployment.html#use-the-hosted-agent">Deployment</a>: stable hosted URLs and alias-token behavior</li><li><a href="./../evals.html">Evals</a>: turn saved payloads into regression fixtures</li></ul>`,35)])])}const c=i(t,[["render",h]]);export{o as __pageData,c as default};
@@ -1 +1 @@
1
- import{_ as i,c as a,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const o=JSON.parse('{"title":"Webhooks & custom channels","description":"Receive provider events, keep one conversation per domain object, and deliver agent replies back out.","frontmatter":{"title":"Webhooks & custom channels","description":"Receive provider events, keep one conversation per domain object, and deliver agent replies back out."},"headers":[],"relativePath":"guides/webhooks.md","filePath":"guides/webhooks.md"}'),t={name:"guides/webhooks.md"};function h(l,s,p,k,r,d){return e(),a("div",null,[...s[0]||(s[0]=[n("",36)])])}const c=i(t,[["render",h]]);export{o as __pageData,c as default};
1
+ import{_ as i,c as a,o as e,a3 as n}from"./chunks/framework.BNw1pucY.js";const o=JSON.parse('{"title":"Webhooks & custom channels","description":"Receive provider events, keep one conversation per domain object, and deliver agent replies back out.","frontmatter":{"title":"Webhooks & custom channels","description":"Receive provider events, keep one conversation per domain object, and deliver agent replies back out."},"headers":[],"relativePath":"guides/webhooks.md","filePath":"guides/webhooks.md"}'),t={name:"guides/webhooks.md"};function h(l,s,p,k,r,d){return e(),a("div",null,[...s[0]||(s[0]=[n("",35)])])}const c=i(t,[["render",h]]);export{o as __pageData,c as default};
@@ -1,7 +1,7 @@
1
- import{_ as a,c as t,o as i,a3 as n}from"./chunks/framework.BNw1pucY.js";const g=JSON.parse('{"title":"Hillclimbing","description":"Improve one agent behavior at a time by measuring fixed inputs, changing one lever, and locking each win with an eval.","frontmatter":{"title":"Hillclimbing","description":"Improve one agent behavior at a time by measuring fixed inputs, changing one lever, and locking each win with an eval."},"headers":[],"relativePath":"hillclimbing.md","filePath":"hillclimbing.md"}'),s={name:"hillclimbing.md"};function o(r,e,l,h,c,d){return i(),t("div",null,[...e[0]||(e[0]=[n(`<h1 id="hillclimbing" tabindex="-1">Hillclimbing <a class="header-anchor" href="#hillclimbing" aria-label="Permalink to &quot;Hillclimbing&quot;">​</a></h1><p>Hillclimbing improves an agent through controlled before-and-after comparisons. Keep the inputs fixed, name one failure, change one lever, and retain the change only when the same run gets better without crossing the freeze line.</p><p>The companion <a href="./../skills/hillclimb/SKILL.html"><code>hillclimb</code> skill</a> can run this loop with you.</p><p>The <code>bdk</code> commands on this page are docs-ahead until <code>@cursor/bdk</code> is published; see <a href="/docs/#bdk-package-availability">BDK package availability</a>.</p><h2 id="correct-a-wrong-tool-choice" tabindex="-1">Correct a wrong tool choice <a class="header-anchor" href="#correct-a-wrong-tool-choice" aria-label="Permalink to &quot;Correct a wrong tool choice&quot;">​</a></h2><p>Suppose a PR reviewer calls <code>approve_pr</code> before <code>inspect_pr</code>. Pin one PR fixture, record the original tool order, then tighten the instruction that owns the decision. The improved run should inspect first and leave approval untouched.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk run --dir . \\</span></span>
1
+ import{_ as a,c as t,o as i,a3 as n}from"./chunks/framework.BNw1pucY.js";const g=JSON.parse('{"title":"Hillclimbing","description":"Improve one agent behavior at a time by measuring fixed inputs, changing one lever, and locking each win with an eval.","frontmatter":{"title":"Hillclimbing","description":"Improve one agent behavior at a time by measuring fixed inputs, changing one lever, and locking each win with an eval."},"headers":[],"relativePath":"hillclimbing.md","filePath":"hillclimbing.md"}'),s={name:"hillclimbing.md"};function o(r,e,l,h,c,p){return i(),t("div",null,[...e[0]||(e[0]=[n(`<h1 id="hillclimbing" tabindex="-1">Hillclimbing <a class="header-anchor" href="#hillclimbing" aria-label="Permalink to &quot;Hillclimbing&quot;">​</a></h1><p>Hillclimbing improves an agent through controlled before-and-after comparisons. Keep the inputs fixed, name one failure, change one lever, and retain the change only when the same run gets better without crossing the freeze line.</p><p>The companion <a href="./../skills/hillclimb/SKILL.html"><code>hillclimb</code> skill</a> can run this loop with you.</p><h2 id="correct-a-wrong-tool-choice" tabindex="-1">Correct a wrong tool choice <a class="header-anchor" href="#correct-a-wrong-tool-choice" aria-label="Permalink to &quot;Correct a wrong tool choice&quot;">​</a></h2><p>Suppose a PR reviewer calls <code>approve_pr</code> before <code>inspect_pr</code>. Pin one PR fixture, record the original tool order, then tighten the instruction that owns the decision. The improved run should inspect first and leave approval untouched.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk run --dir . \\</span></span>
2
2
  <span class="line"><span> --message &quot;Is https://github.com/acme/checkout/pull/42 ready?&quot;</span></span></code></pre></div><p>Lock the result with the intended and tempting-wrong paths:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">t.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">succeeded</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
3
3
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">t.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">calledTool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;inspect_pr&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
4
4
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">t.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">notCalledTool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;approve_pr&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span></code></pre></div><p>Do not change the tool implementation, prompt, and evidence together. If tool choice improves, you should know which edit caused it.</p><h2 id="reduce-wandering-or-latency" tabindex="-1">Reduce wandering or latency <a class="header-anchor" href="#reduce-wandering-or-latency" aria-label="Permalink to &quot;Reduce wandering or latency&quot;">​</a></h2><p>A slow run often repeats reads, searches broad directories, or asks the model to discover evidence the host already has. Compare the trajectory by tool name and wall time, then move deterministic preparation ahead of the turn or trim the evidence shape.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>before: 14 tool calls, 92 seconds, 6 repeated reads</span></span>
5
5
  <span class="line"><span>after: 5 tool calls, 31 seconds, 0 repeated reads</span></span></code></pre></div><p>Keep the change only if the answer still finds the same known issue. Efficiency without a quality check can make an agent fast by making it incomplete.</p><h2 id="improve-quality-without-changing-the-contract" tabindex="-1">Improve quality without changing the contract <a class="header-anchor" href="#improve-quality-without-changing-the-contract" aria-label="Permalink to &quot;Improve quality without changing the contract&quot;">​</a></h2><p>For answer quality, freeze the public shape before editing: required sections, API fields, side effects, and existing evals. Compare both runs against a known-good answer or a small set of gold findings, then change the instructions or skill that owns the missing judgment.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>fixture: saved checkout PR diff</span></span>
6
6
  <span class="line"><span>success: report both gold findings with file paths</span></span>
7
- <span class="line"><span>freeze: findings JSON shape; no review post; existing smoke evals</span></span></code></pre></div><p>A wording change is not a win by itself. Keep it when correctness rises and every frozen behavior remains intact.</p><h2 id="run-one-measured-round" tabindex="-1">Run one measured round <a class="header-anchor" href="#run-one-measured-round" aria-label="Permalink to &quot;Run one measured round&quot;">​</a></h2><p>Agree on four inputs before editing:</p><ol><li><strong>Target:</strong> the agent path or slug.</li><li><strong>Fixtures:</strong> one to three prompts, saved payloads, or pinned PRs.</li><li><strong>Success:</strong> the metric or decision that should improve.</li><li><strong>Freeze line:</strong> behavior that must not move.</li></ol><p>Then run one loop:</p><ol><li>Exercise the agent through the same surface a user would.</li><li>Read the trajectory and name the dominant failure in one sentence.</li><li>Change one lever.</li><li>Rerun the same fixtures.</li><li>Compare correctness, efficiency, and contract fit.</li><li>Keep, revert, or narrow the change.</li></ol><p>Do not replace a fixture mid-round. A moving input makes the comparison meaningless.</p><h2 id="choose-the-smallest-lever" tabindex="-1">Choose the smallest lever <a class="header-anchor" href="#choose-the-smallest-lever" aria-label="Permalink to &quot;Choose the smallest lever&quot;">​</a></h2><p>Start with the earliest place that can remove the failure:</p><ol><li><strong>Host preparation:</strong> fetch deterministic evidence before the turn.</li><li><strong>Evidence shape:</strong> trim, order, or label what the model receives.</li><li><strong>Instructions or skills:</strong> clarify the decision procedure.</li><li><strong>Tool surface:</strong> remove or gate tools that invite wandering.</li><li><strong>Framework:</strong> change it only when the agent cannot express the fix.</li></ol><p>Changing the host or evidence often improves both quality and latency because the model spends less time searching for ground truth.</p><h2 id="lock-every-kept-win" tabindex="-1">Lock every kept win <a class="header-anchor" href="#lock-every-kept-win" aria-label="Permalink to &quot;Lock every kept win&quot;">​</a></h2><p>Each retained change needs an eval that would have failed before it. Use a tool-choice assertion, <code>maxToolCalls</code> bound, output-shape check, or quality score that captures the measured improvement.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk eval --dir . --tag smoke</span></span></code></pre></div><p>Never weaken an existing gate to make the round pass. The eval is the record that the improvement survived after the fixture and source change leave your working memory.</p><h2 id="run-the-loop-with-a-coding-agent" tabindex="-1">Run the loop with a coding agent <a class="header-anchor" href="#run-the-loop-with-a-coding-agent" aria-label="Permalink to &quot;Run the loop with a coding agent&quot;">​</a></h2><p>Ask the coding agent to read <a href="./../skills/hillclimb/SKILL.html"><code>skills/hillclimb/SKILL.md</code></a>, then give it the target, fixtures, success criterion, and freeze line. It will measure the current run, propose one change, remeasure, and ask before starting another round.</p><p>Use saved or local surfaces during a climb. Do not deploy or post to a real external channel unless that side effect is part of an explicitly approved fixture.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./evals.html">Evals</a>: author the regression check for a kept win</li><li><a href="./reference/evals.html">Evals reference</a>: trajectory assertions and scores</li><li><a href="./building-with-agents.html">Building agents with agents</a>: delegate creation and verification to a coding agent</li><li><a href="./troubleshooting.html">Fix common agent problems</a>: diagnose a run that is broken instead of underperforming</li></ul>`,37)])])}const u=a(s,[["render",o]]);export{g as __pageData,u as default};
7
+ <span class="line"><span>freeze: findings JSON shape; no review post; existing smoke evals</span></span></code></pre></div><p>A wording change is not a win by itself. Keep it when correctness rises and every frozen behavior remains intact.</p><h2 id="run-one-measured-round" tabindex="-1">Run one measured round <a class="header-anchor" href="#run-one-measured-round" aria-label="Permalink to &quot;Run one measured round&quot;">​</a></h2><p>Agree on four inputs before editing:</p><ol><li><strong>Target:</strong> the agent path or slug.</li><li><strong>Fixtures:</strong> one to three prompts, saved payloads, or pinned PRs.</li><li><strong>Success:</strong> the metric or decision that should improve.</li><li><strong>Freeze line:</strong> behavior that must not move.</li></ol><p>Then run one loop:</p><ol><li>Exercise the agent through the same surface a user would.</li><li>Read the trajectory and name the dominant failure in one sentence.</li><li>Change one lever.</li><li>Rerun the same fixtures.</li><li>Compare correctness, efficiency, and contract fit.</li><li>Keep, revert, or narrow the change.</li></ol><p>Do not replace a fixture mid-round. A moving input makes the comparison meaningless.</p><h2 id="choose-the-smallest-lever" tabindex="-1">Choose the smallest lever <a class="header-anchor" href="#choose-the-smallest-lever" aria-label="Permalink to &quot;Choose the smallest lever&quot;">​</a></h2><p>Start with the earliest place that can remove the failure:</p><ol><li><strong>Host preparation:</strong> fetch deterministic evidence before the turn.</li><li><strong>Evidence shape:</strong> trim, order, or label what the model receives.</li><li><strong>Instructions or skills:</strong> clarify the decision procedure.</li><li><strong>Tool surface:</strong> remove or gate tools that invite wandering.</li><li><strong>Framework:</strong> change it only when the agent cannot express the fix.</li></ol><p>Changing the host or evidence often improves both quality and latency because the model spends less time searching for ground truth.</p><h2 id="lock-every-kept-win" tabindex="-1">Lock every kept win <a class="header-anchor" href="#lock-every-kept-win" aria-label="Permalink to &quot;Lock every kept win&quot;">​</a></h2><p>Each retained change needs an eval that would have failed before it. Use a tool-choice assertion, <code>maxToolCalls</code> bound, output-shape check, or quality score that captures the measured improvement.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk eval --dir . --tag smoke</span></span></code></pre></div><p>Never weaken an existing gate to make the round pass. The eval is the record that the improvement survived after the fixture and source change leave your working memory.</p><h2 id="run-the-loop-with-a-coding-agent" tabindex="-1">Run the loop with a coding agent <a class="header-anchor" href="#run-the-loop-with-a-coding-agent" aria-label="Permalink to &quot;Run the loop with a coding agent&quot;">​</a></h2><p>Ask the coding agent to read <a href="./../skills/hillclimb/SKILL.html"><code>skills/hillclimb/SKILL.md</code></a>, then give it the target, fixtures, success criterion, and freeze line. It will measure the current run, propose one change, remeasure, and ask before starting another round.</p><p>Use saved or local surfaces during a climb. Do not deploy or post to a real external channel unless that side effect is part of an explicitly approved fixture.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./evals.html">Evals</a>: author the regression check for a kept win</li><li><a href="./reference/evals.html">Evals reference</a>: trajectory assertions and scores</li><li><a href="./building-with-agents.html">Building agents with agents</a>: delegate creation and verification to a coding agent</li><li><a href="./troubleshooting.html">Fix common agent problems</a>: diagnose a run that is broken instead of underperforming</li></ul>`,36)])])}const u=a(s,[["render",o]]);export{g as __pageData,u as default};
@@ -1 +1 @@
1
- import{_ as a,c as t,o as i,a3 as n}from"./chunks/framework.BNw1pucY.js";const g=JSON.parse('{"title":"Hillclimbing","description":"Improve one agent behavior at a time by measuring fixed inputs, changing one lever, and locking each win with an eval.","frontmatter":{"title":"Hillclimbing","description":"Improve one agent behavior at a time by measuring fixed inputs, changing one lever, and locking each win with an eval."},"headers":[],"relativePath":"hillclimbing.md","filePath":"hillclimbing.md"}'),s={name:"hillclimbing.md"};function o(r,e,l,h,c,d){return i(),t("div",null,[...e[0]||(e[0]=[n("",37)])])}const u=a(s,[["render",o]]);export{g as __pageData,u as default};
1
+ import{_ as a,c as t,o as i,a3 as n}from"./chunks/framework.BNw1pucY.js";const g=JSON.parse('{"title":"Hillclimbing","description":"Improve one agent behavior at a time by measuring fixed inputs, changing one lever, and locking each win with an eval.","frontmatter":{"title":"Hillclimbing","description":"Improve one agent behavior at a time by measuring fixed inputs, changing one lever, and locking each win with an eval."},"headers":[],"relativePath":"hillclimbing.md","filePath":"hillclimbing.md"}'),s={name:"hillclimbing.md"};function o(r,e,l,h,c,p){return i(),t("div",null,[...e[0]||(e[0]=[n("",36)])])}const u=a(s,[["render",o]]);export{g as __pageData,u as default};
@@ -0,0 +1,27 @@
1
+ import{_ as t,c as s,o as a,a3 as n}from"./chunks/framework.BNw1pucY.js";const o="/docs/architecture.svg",g=JSON.parse(`{"title":"Grok Bot Development Kit (BDK)","description":"Build, test, and deploy BDK bots and agents as code on Cursor's agent harness.","frontmatter":{"title":"Grok Bot Development Kit (BDK)","description":"Build, test, and deploy BDK bots and agents as code on Cursor's agent harness."},"headers":[],"relativePath":"index.md","filePath":"README.md"}`),r={name:"index.md"};function i(p,e,l,d,c,h){return a(),s("div",null,[...e[0]||(e[0]=[n('<h1 id="grok-bot-development-kit-bdk" tabindex="-1">Grok Bot Development Kit (BDK) <a class="header-anchor" href="#grok-bot-development-kit-bdk" aria-label="Permalink to &quot;Grok Bot Development Kit (BDK)&quot;">​</a></h1><p>The Grok Bot Development Kit (BDK) lets you define, test, and deploy agents as code. It uses the Cursor SDK harness that powers Bugbot, Security Review, and Approval Bot.</p><p>A BDK project is a folder of Markdown and TypeScript. Combine deterministic code with model judgment, then make the bot or agent available in source control, Slack, issue trackers, and Cursor.</p><h2 id="why-use-it" tabindex="-1">Why use it <a class="header-anchor" href="#why-use-it" aria-label="Permalink to &quot;Why use it&quot;">​</a></h2><ul><li><p><strong>Bots and agents live in your repo.</strong> Instructions, tools, and evals are files you review, version, and ship like the rest of your code.</p></li><li><p><strong>Cursor runs the loop.</strong> You write the instructions and tools. Your agent gets Cursor&#39;s models, tool calling, skills, MCP, and subagents. Each turn runs on your host.</p></li><li><p><strong>Use it where you work.</strong> Trigger a project from source-control events, Slack threads, custom webhooks, or schedules.</p></li><li><p><strong>Test normal TypeScript.</strong> Add evals and unit tests without a separate configuration language.</p></li><li><p><strong>Choose where it runs.</strong> Deploy to Cursor-managed hosting or run the process on your infrastructure.</p></li></ul><h2 id="when-to-use-bdk" tabindex="-1">When to use BDK <a class="header-anchor" href="#when-to-use-bdk" aria-label="Permalink to &quot;When to use BDK&quot;">​</a></h2><table tabindex="0"><thead><tr><th></th><th>Cursor Automations</th><th>Grok Bot</th><th>BDK</th></tr></thead><tbody><tr><td><strong>Use for</strong></td><td>Repeatable jobs driven by a prompt and a trigger</td><td>Interactive agents that work with you in Cursor</td><td>Agents that need custom code, integrations, tests, or deployment choices</td></tr><tr><td><strong>You define</strong></td><td>A prompt, model, and trigger in the dashboard</td><td>Instructions, skills, and connected tools in the app</td><td>A versioned Markdown and TypeScript project</td></tr><tr><td><strong>Where it runs</strong></td><td>Cursor-managed</td><td>Cursor-managed</td><td>Cursor-managed hosting or your infrastructure</td></tr><tr><td><strong>Choose it when</strong></td><td>The job fits a schedule or event trigger</td><td>You want an agent you can configure and talk to without creating a software project</td><td>You want deterministic code around model judgment and a project your team can review and test</td></tr></tbody></table><h2 id="architecture" tabindex="-1">Architecture <a class="header-anchor" href="#architecture" aria-label="Permalink to &quot;Architecture&quot;">​</a></h2><p>Define the project in source control. Run execution, inference, and sandboxing on Cursor infrastructure or on your own host.</p><p><img src="'+o+`" alt="BDK architecture: you bring the agent as code, and the platform provides triggers, runtime, integrations, and operations"></p><h2 id="get-started" tabindex="-1">Get started <a class="header-anchor" href="#get-started" aria-label="Permalink to &quot;Get started&quot;">​</a></h2><p>Install <code>@cursor/bdk</code>, then start with <code>bdk init</code> and <code>bdk dev</code>.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>npm install --global @cursor/bdk</span></span>
2
+ <span class="line"><span>bdk init ./my-bot</span></span>
3
+ <span class="line"><span>cd my-bot</span></span>
4
+ <span class="line"><span>bdk dev</span></span></code></pre></div><p>Open the project in Cursor. BDK projects use <code>bot/</code>.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>my-bot/</span></span>
5
+ <span class="line"><span>├── package.json</span></span>
6
+ <span class="line"><span>├── bot/</span></span>
7
+ <span class="line"><span>│ ├── agent.ts # model and local harness config</span></span>
8
+ <span class="line"><span>│ ├── instructions.md # the system prompt</span></span>
9
+ <span class="line"><span>│ ├── tools/</span></span>
10
+ <span class="line"><span>│ │ └── approve_pr.ts # one typed tool per file</span></span>
11
+ <span class="line"><span>│ ├── skills/</span></span>
12
+ <span class="line"><span>│ │ └── pr-review/</span></span>
13
+ <span class="line"><span>│ │ └── SKILL.md # procedures the model loads on demand</span></span>
14
+ <span class="line"><span>│ ├── mcp-connections/</span></span>
15
+ <span class="line"><span>│ │ └── linear.ts # tools from an MCP server</span></span>
16
+ <span class="line"><span>│ ├── host-connections/</span></span>
17
+ <span class="line"><span>│ │ └── inventory.ts # host-only MCP tools</span></span>
18
+ <span class="line"><span>│ ├── subagents/</span></span>
19
+ <span class="line"><span>│ │ └── verifier/</span></span>
20
+ <span class="line"><span>│ │ ├── agent.ts</span></span>
21
+ <span class="line"><span>│ │ └── instructions.md</span></span>
22
+ <span class="line"><span>│ ├── channels/</span></span>
23
+ <span class="line"><span>│ │ └── github.ts # wake on pull requests, CI, and comments</span></span>
24
+ <span class="line"><span>│ └── hooks/</span></span>
25
+ <span class="line"><span>│ └── audit.ts # observe session events</span></span>
26
+ <span class="line"><span>└── evals/</span></span>
27
+ <span class="line"><span> └── readiness.eval.ts # regression checks</span></span></code></pre></div><p>Describe your bot or agent in Cursor, or edit the files yourself.</p><h2 id="next-steps" tabindex="-1">Next steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to &quot;Next steps&quot;">​</a></h2><ul><li><p><a href="./quickstart.html">Build your first PR reviewer</a>: a working GitHub reviewer, one step at a time.</p></li><li><p>Start from a template: <a href="./templates/grokbot-agents.html">Grok Bot agents</a>, <a href="./templates/security-reviewer.html">security reviewer</a>, <a href="./templates/thermo-review.html">Thermo review</a>, <a href="./templates/thermo-quality-review.html">Thermo quality review</a>, <a href="./templates/agentic-owners.html">owners-policy approver</a>, <a href="./templates/triage.html">issue triager</a>.</p></li><li><p><a href="./guides/convert-automation.html">Convert a Cursor Automation</a>: export an Automation from the dashboard into a project you own.</p></li><li><p><a href="./building-with-agents.html">Build agents with agents</a>: hand the build to a coding agent with the package&#39;s bundled skills.</p></li><li><p><a href="./reference/project-layout.html">Project layout</a> and <a href="./reference/cli.html">CLI</a>: every folder and every command.</p></li></ul>`,18)])])}const m=t(r,[["render",i]]);export{g as __pageData,m as default};
@@ -1 +1 @@
1
- import{_ as t,c as a,o as s,a3 as n}from"./chunks/framework.BNw1pucY.js";const o="/docs/architecture.svg",g=JSON.parse(`{"title":"Grok Bot Development Kit (BDK)","description":"Build, test, and deploy BDK bots and agents as code on Cursor's agent harness.","frontmatter":{"title":"Grok Bot Development Kit (BDK)","description":"Build, test, and deploy BDK bots and agents as code on Cursor's agent harness."},"headers":[],"relativePath":"index.md","filePath":"README.md"}`),r={name:"index.md"};function i(p,e,l,d,c,h){return s(),a("div",null,[...e[0]||(e[0]=[n("",21)])])}const m=t(r,[["render",i]]);export{g as __pageData,m as default};
1
+ import{_ as t,c as s,o as a,a3 as n}from"./chunks/framework.BNw1pucY.js";const o="/docs/architecture.svg",g=JSON.parse(`{"title":"Grok Bot Development Kit (BDK)","description":"Build, test, and deploy BDK bots and agents as code on Cursor's agent harness.","frontmatter":{"title":"Grok Bot Development Kit (BDK)","description":"Build, test, and deploy BDK bots and agents as code on Cursor's agent harness."},"headers":[],"relativePath":"index.md","filePath":"README.md"}`),r={name:"index.md"};function i(p,e,l,d,c,h){return a(),s("div",null,[...e[0]||(e[0]=[n("",18)])])}const m=t(r,[["render",i]]);export{g as __pageData,m as default};
@@ -1,4 +1,4 @@
1
- import{_ as i,c as a,o as n,a3 as t}from"./chunks/framework.BNw1pucY.js";const g=JSON.parse('{"title":"Build a PR reviewer","description":"Create a BDK bot or agent that reviews pull requests by complexity, approves safe changes, and handles GitHub webhook events.","frontmatter":{"title":"Build a PR reviewer","description":"Create a BDK bot or agent that reviews pull requests by complexity, approves safe changes, and handles GitHub webhook events."},"headers":[],"relativePath":"quickstart.md","filePath":"quickstart.md"}'),h={name:"quickstart.md"};function l(p,s,e,k,r,E){return n(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="build-a-pr-reviewer-with-bdk" tabindex="-1">Build a PR reviewer with BDK <a class="header-anchor" href="#build-a-pr-reviewer-with-bdk" aria-label="Permalink to &quot;Build a PR reviewer with BDK&quot;">​</a></h1><p>Build a Grok Bot Development Kit (BDK) PR reviewer that classifies changes as <code>trivial</code>, <code>moderate</code>, or <code>large</code>, then approves safe changes or requests human review.</p><h2 id="prerequisites" tabindex="-1">Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to &quot;Prerequisites&quot;">​</a></h2><ul><li><p>Node 22.13 or newer.</p></li><li><p>The docs-ahead BDK package and CLI. <code>@cursor/bdk</code> is not on npm yet, so these commands will not run until publication. See <a href="/docs/#bdk-package-availability">BDK package availability</a>.</p></li></ul><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>npm install -g @cursor/bdk</span></span></code></pre></div><ul><li>A Cursor credential for model turns. After publication, sign in once:</li></ul><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk login</span></span></code></pre></div><h2 id="create-and-run-the-project" tabindex="-1">Create and run the project <a class="header-anchor" href="#create-and-run-the-project" aria-label="Permalink to &quot;Create and run the project&quot;">​</a></h2><p>The preferred BDK workflow uses <code>bdk init</code> and <code>bdk dev</code>.</p><blockquote><p><strong>Docs ahead:</strong> <code>@cursor/bdk</code> is not on npm yet. This block shows future CLI syntax and will not run until the package publishes.</p></blockquote><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk init ./pr-reviewer</span></span>
1
+ import{_ as i,c as a,o as n,a3 as t}from"./chunks/framework.BNw1pucY.js";const g=JSON.parse('{"title":"Build a PR reviewer","description":"Create a BDK bot or agent that reviews pull requests by complexity, approves safe changes, and handles GitHub webhook events.","frontmatter":{"title":"Build a PR reviewer","description":"Create a BDK bot or agent that reviews pull requests by complexity, approves safe changes, and handles GitHub webhook events."},"headers":[],"relativePath":"quickstart.md","filePath":"quickstart.md"}'),h={name:"quickstart.md"};function l(p,s,e,k,r,E){return n(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="build-a-pr-reviewer-with-bdk" tabindex="-1">Build a PR reviewer with BDK <a class="header-anchor" href="#build-a-pr-reviewer-with-bdk" aria-label="Permalink to &quot;Build a PR reviewer with BDK&quot;">​</a></h1><p>Build a Grok Bot Development Kit (BDK) PR reviewer that classifies changes as <code>trivial</code>, <code>moderate</code>, or <code>large</code>, then approves safe changes or requests human review.</p><h2 id="prerequisites" tabindex="-1">Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to &quot;Prerequisites&quot;">​</a></h2><ul><li><p>Node 22.13 or newer.</p></li><li><p>The <code>@cursor/bdk</code> package:</p></li></ul><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>npm install -g @cursor/bdk</span></span></code></pre></div><ul><li>A Cursor credential for model turns. Sign in once:</li></ul><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk login</span></span></code></pre></div><h2 id="create-and-run-the-project" tabindex="-1">Create and run the project <a class="header-anchor" href="#create-and-run-the-project" aria-label="Permalink to &quot;Create and run the project&quot;">​</a></h2><p>The preferred BDK workflow uses <code>bdk init</code> and <code>bdk dev</code>.</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk init ./pr-reviewer</span></span>
2
2
  <span class="line"><span>cd pr-reviewer</span></span>
3
3
  <span class="line"><span>bdk dev</span></span></code></pre></div><p>Keep <code>bdk dev</code> running. In a second terminal, run:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk run --dir . --message &quot;Introduce yourself in one sentence.&quot;</span></span></code></pre></div><p>Confirm the agent replies.</p><h2 id="add-review-instructions" tabindex="-1">Add review instructions <a class="header-anchor" href="#add-review-instructions" aria-label="Permalink to &quot;Add review instructions&quot;">​</a></h2><p>Replace <code>bot/instructions.md</code>:</p><div class="language-md vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">md</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold;"># PR reviewer</span></span>
4
4
  <span class="line"></span>
@@ -167,4 +167,4 @@ import{_ as i,c as a,o as n,a3 as t}from"./chunks/framework.BNw1pucY.js";const g
167
167
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
168
168
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>Channel-turn <code>context</code> is a <code>readonly string[]</code>, so wrap each context block in an array. The <code>context</code> label under <code>progress.commitStatus</code> is a separate string option.</p><p>Keep <code>bdk dev</code> running. In a second terminal, replay an open pull request. Pull access is enough; repo admin isn&#39;t required:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>bdk github replay https://github.com/acme/checkout/pull/42 \\</span></span>
169
169
  <span class="line"><span> --dir . --action opened</span></span></code></pre></div><p>Open the playground and confirm <code>Review acme/checkout#42</code> contains the trigger, both tool calls, and the verdict.</p><h2 id="run-options" tabindex="-1">Run options <a class="header-anchor" href="#run-options" aria-label="Permalink to &quot;Run options&quot;">​</a></h2><ol><li><strong>CLI message</strong></li></ol><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span> bdk run --dir . --message &quot;Review https://github.com/acme/checkout/pull/42&quot;</span></span></code></pre></div><ol start="2"><li><strong>Local replay</strong></li></ol><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span> bdk github replay https://github.com/acme/checkout/pull/42 \\</span></span>
170
- <span class="line"><span> --dir . --action opened</span></span></code></pre></div><h2 id="where-to-go-next" tabindex="-1">Where to go next <a class="header-anchor" href="#where-to-go-next" aria-label="Permalink to &quot;Where to go next&quot;">​</a></h2><ul><li><a href="./evals.html">Evals</a>: freeze these two PRs as regression checks so prompt changes can&#39;t flip a verdict</li><li><a href="./reference/tools.html">Tools</a>: more on typed tools, approvals, and direct calls</li><li><a href="./guides/github.html">GitHub</a>: fixtures, forwarding, and pulling events from Cursor</li><li><a href="./building-with-agents.html">Building agents with agents</a>: have a coding agent extend the project for you</li></ul>`,49)])])}const o=i(h,[["render",l]]);export{g as __pageData,o as default};
170
+ <span class="line"><span> --dir . --action opened</span></span></code></pre></div><h2 id="where-to-go-next" tabindex="-1">Where to go next <a class="header-anchor" href="#where-to-go-next" aria-label="Permalink to &quot;Where to go next&quot;">​</a></h2><ul><li><a href="./evals.html">Evals</a>: freeze these two PRs as regression checks so prompt changes can&#39;t flip a verdict</li><li><a href="./reference/tools.html">Tools</a>: more on typed tools, approvals, and direct calls</li><li><a href="./guides/github.html">GitHub</a>: fixtures, forwarding, and pulling events from Cursor</li><li><a href="./building-with-agents.html">Building agents with agents</a>: have a coding agent extend the project for you</li></ul>`,48)])])}const o=i(h,[["render",l]]);export{g as __pageData,o as default};
@@ -1 +1 @@
1
- import{_ as i,c as a,o as n,a3 as t}from"./chunks/framework.BNw1pucY.js";const g=JSON.parse('{"title":"Build a PR reviewer","description":"Create a BDK bot or agent that reviews pull requests by complexity, approves safe changes, and handles GitHub webhook events.","frontmatter":{"title":"Build a PR reviewer","description":"Create a BDK bot or agent that reviews pull requests by complexity, approves safe changes, and handles GitHub webhook events."},"headers":[],"relativePath":"quickstart.md","filePath":"quickstart.md"}'),h={name:"quickstart.md"};function l(p,s,e,k,r,E){return n(),a("div",null,[...s[0]||(s[0]=[t("",49)])])}const o=i(h,[["render",l]]);export{g as __pageData,o as default};
1
+ import{_ as i,c as a,o as n,a3 as t}from"./chunks/framework.BNw1pucY.js";const g=JSON.parse('{"title":"Build a PR reviewer","description":"Create a BDK bot or agent that reviews pull requests by complexity, approves safe changes, and handles GitHub webhook events.","frontmatter":{"title":"Build a PR reviewer","description":"Create a BDK bot or agent that reviews pull requests by complexity, approves safe changes, and handles GitHub webhook events."},"headers":[],"relativePath":"quickstart.md","filePath":"quickstart.md"}'),h={name:"quickstart.md"};function l(p,s,e,k,r,E){return n(),a("div",null,[...s[0]||(s[0]=[t("",48)])])}const o=i(h,[["render",l]]);export{g as __pageData,o as default};
@@ -1,4 +1,4 @@
1
- import{_ as e,c as i,o as a,a3 as t}from"./chunks/framework.BNw1pucY.js";const k=JSON.parse('{"title":"Agent config","description":"defineAgent at bot/agent.ts: the model, local workspace, and programmatic serving.","frontmatter":{"title":"Agent config","description":"defineAgent at bot/agent.ts: the model, local workspace, and programmatic serving."},"headers":[],"relativePath":"reference/agent-config.md","filePath":"reference/agent-config.md"}'),n={name:"reference/agent-config.md"};function o(l,s,d,r,h,c){return a(),i("div",null,[...s[0]||(s[0]=[t(`<h1 id="agent-config" tabindex="-1">Agent config <a class="header-anchor" href="#agent-config" aria-label="Permalink to &quot;Agent config&quot;">​</a></h1><p><code>bot/agent.ts</code> default-exports <code>defineAgent(config)</code>: which model runs the agent and its local harness defaults. Everything is optional on the root agent.</p><p>The <code>@cursor/bdk</code> imports and <code>bdk</code> commands on this page are docs-ahead until publication; see <a href="/docs/#bdk-package-availability">BDK package availability</a>.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { defineAgent } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;@cursor/bdk&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
1
+ import{_ as e,c as i,o as a,a3 as t}from"./chunks/framework.BNw1pucY.js";const k=JSON.parse('{"title":"Agent config","description":"defineAgent at bot/agent.ts: the model, local workspace, and programmatic serving.","frontmatter":{"title":"Agent config","description":"defineAgent at bot/agent.ts: the model, local workspace, and programmatic serving."},"headers":[],"relativePath":"reference/agent-config.md","filePath":"reference/agent-config.md"}'),n={name:"reference/agent-config.md"};function o(l,s,d,r,h,c){return a(),i("div",null,[...s[0]||(s[0]=[t(`<h1 id="agent-config" tabindex="-1">Agent config <a class="header-anchor" href="#agent-config" aria-label="Permalink to &quot;Agent config&quot;">​</a></h1><p><code>bot/agent.ts</code> default-exports <code>defineAgent(config)</code>: which model runs the agent and its local harness defaults. Everything is optional on the root agent.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { defineAgent } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;@cursor/bdk&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
2
2
  <span class="line"></span>
3
3
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> defineAgent</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
4
4
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> model: {</span></span>
@@ -8,7 +8,7 @@ import{_ as e,c as i,o as a,a3 as t}from"./chunks/framework.BNw1pucY.js";const k
8
8
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { id: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;fast&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, value: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;true&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
9
9
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
10
10
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// optional; this is the default</span></span>
11
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><h2 id="agent-fields" tabindex="-1">Agent fields <a class="header-anchor" href="#agent-fields" aria-label="Permalink to &quot;Agent fields&quot;">​</a></h2><table tabindex="0"><thead><tr><th>Field</th><th>Type</th><th>Meaning</th></tr></thead><tbody><tr><td><code>model</code></td><td>string or <code>{ id, params }</code></td><td>Cursor model for turns. Defaults to <code>grok-4.5</code> with <code>effort=high</code>, <code>fast=true</code> on the root agent. Subagents omit it to inherit.</td></tr><tr><td><code>name</code></td><td>string</td><td>Display name override. Defaults to the package name or directory name.</td></tr><tr><td><code>description</code></td><td>string</td><td>What the agent is for. Required on subagents; the parent model reads it to decide when to delegate. Documentation-only on the root.</td></tr><tr><td><code>instructions</code></td><td>string</td><td>Inline instructions. Prefer <code>instructions.md</code>; this exists for subagents and generated configs.</td></tr><tr><td><code>local</code></td><td><code>{ cwd?, workspaceDir?, sandbox? }</code></td><td>Local harness defaults. See <a href="#local-options">Local options</a>.</td></tr><tr><td><code>hosting</code></td><td><code>{ egressDomains?, secretNames? }</code></td><td>Managed-hosting declarations read by <code>bdk deploy</code>: the pod&#39;s egress allowlist and the secret names the agent expects. Ignored by local serving.</td></tr><tr><td><code>concurrency</code></td><td><code>{ maxRunningTurns? }</code></td><td>Engine-wide turn admission limit. See <a href="#concurrency">Concurrency</a>.</td></tr><tr><td><code>builtinTools</code></td><td><code>{ reminders? }</code></td><td>Framework-provided model-facing tools, opted in per capability. See <a href="#built-in-tools">Built-in tools</a>.</td></tr><tr><td><code>tools</code></td><td><code>ToolName[]</code></td><td>Allowlist of built-in harness tools offered to the model. Unset = the model&#39;s full standard toolset. See <a href="#harness-tools">Harness tools</a>.</td></tr></tbody></table><h2 id="model" tabindex="-1">Model <a class="header-anchor" href="#model" aria-label="Permalink to &quot;Model&quot;">​</a></h2><p><code>model</code> is a Cursor model id string, or <code>{ id, params }</code>. Effort and speed are params, not id suffixes. The SDK rejects suffix-style ids like <code>grok-4.5-fast</code>:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">model</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
11
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><h2 id="agent-fields" tabindex="-1">Agent fields <a class="header-anchor" href="#agent-fields" aria-label="Permalink to &quot;Agent fields&quot;">​</a></h2><table tabindex="0"><thead><tr><th>Field</th><th>Type</th><th>Meaning</th></tr></thead><tbody><tr><td><code>model</code></td><td>string or <code>{ id, params }</code></td><td>Cursor model for turns. Defaults to <code>grok-4.5</code> with <code>effort=high</code>, <code>fast=true</code> on the root agent. Subagents omit it to inherit.</td></tr><tr><td><code>name</code></td><td>string</td><td>Display name override. Defaults to the package name or directory name.</td></tr><tr><td><code>description</code></td><td>string</td><td>What the agent is for. Required on subagents; the parent model reads it to decide when to delegate. Documentation-only on the root.</td></tr><tr><td><code>instructions</code></td><td>string</td><td>Inline instructions. Prefer <code>instructions.md</code>; this exists for subagents and generated configs.</td></tr><tr><td><code>local</code></td><td><code>{ cwd?, workspaceDir?, sandbox? }</code></td><td>Local harness defaults. See <a href="#local-options">Local options</a>.</td></tr><tr><td><code>hosting</code></td><td><code>{ egressDomains?, secretNames? }</code></td><td>Managed-hosting declarations read by <code>bdk deploy</code>: the deployment&#39;s egress allowlist and the secret names the agent expects. Mounted <a href="./extensions.html#build-an-extension">extensions</a> add their own. Ignored by local serving.</td></tr><tr><td><code>concurrency</code></td><td><code>{ maxRunningTurns? }</code></td><td>Agent-wide concurrent turn limit. See <a href="#concurrency">Concurrency</a>.</td></tr><tr><td><code>builtinTools</code></td><td><code>{ reminders? }</code></td><td>Framework-provided model-facing tools, opted in per capability. See <a href="#built-in-tools">Built-in tools</a>.</td></tr><tr><td><code>tools</code></td><td><code>ToolName[]</code></td><td>Allowlist of built-in harness tools offered to the model. Unset = the model&#39;s full standard toolset. See <a href="#harness-tools">Harness tools</a>.</td></tr></tbody></table><h2 id="model" tabindex="-1">Model <a class="header-anchor" href="#model" aria-label="Permalink to &quot;Model&quot;">​</a></h2><p><code>model</code> is a Cursor model id string, or <code>{ id, params }</code>. Effort and speed are params, not id suffixes. BDK rejects suffix-style ids like <code>grok-4.5-fast</code>:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">model</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
12
12
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;grok-4.5&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
13
13
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> params</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
14
14
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { id: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;effort&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, value: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;high&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
@@ -19,7 +19,7 @@ import{_ as e,c as i,o as a,a3 as t}from"./chunks/framework.BNw1pucY.js";const k
19
19
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Read-only triage agent: search and read only.</span></span>
20
20
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // No shell, no edits, no subagents.</span></span>
21
21
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> tools: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;read&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;grep&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;glob&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;ls&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
22
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>BDK always adds <code>&quot;mcp&quot;</code> to a configured allowlist, because authored server tools in <code>bot/tools/</code> reach the model over MCP. MCP can also expose declared connections and servers from the harness directory&#39;s ambient <code>.cursor</code> config. To exclude a checkout&#39;s MCP servers, point <code>local.cwd</code> outside the checkout. See <a href="#local-cwd">Local cwd</a>. <code>local.sandbox</code> makes MCP tool calls fail closed.</p><p>Use the SDK&#39;s public tool names, including <code>&quot;shell&quot;</code>, <code>&quot;read&quot;</code>, <code>&quot;edit&quot;</code>, <code>&quot;grep&quot;</code>, <code>&quot;glob&quot;</code>, <code>&quot;ls&quot;</code>, and <code>&quot;task&quot;</code>. Unknown names fail the turn with a <code>ConfigurationError</code>.</p><p>Two names have broader effects:</p><ul><li><code>&quot;shell&quot;</code> also grants shell input. Tools with <code>execution: &quot;agent&quot;</code> need it to run their scripts. Discovery warns when your allowlist would prevent those tools from running.</li><li><code>&quot;task&quot;</code> lets the root agent start subagents. Each subagent keeps its own curated toolset.</li></ul><p>The allowlist controls which tools the model can call. It does not isolate the serve host. For agents that process untrusted input, also set <code>local: { sandbox: true }</code>.</p><h2 id="concurrency" tabindex="-1">Concurrency <a class="header-anchor" href="#concurrency" aria-label="Permalink to &quot;Concurrency&quot;">​</a></h2><p><code>concurrency.maxRunningTurns</code> caps how many model turns run at once across all of the agent&#39;s sessions (positive integer, hard cap 200). When every slot is busy, newly admitted turns queue FIFO instead of failing: the stream records a durable <code>turn.queued</code> event with the queue position, <code>GET /v1/sessions</code> reports <code>queued: true</code>, and each queued turn starts as soon as a slot frees. A queued turn still counts as running for busy semantics: follow-ups preempt it, and direct write-effect tool calls get <code>409 session_busy</code>. Omit for unlimited.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> defineAgent</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
22
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>BDK always adds <code>&quot;mcp&quot;</code> to a configured allowlist, because authored server tools in <code>bot/tools/</code> reach the model over MCP. MCP can also expose declared connections and servers from the harness directory&#39;s ambient <code>.cursor</code> config. To exclude a checkout&#39;s MCP servers, point <code>local.cwd</code> outside the checkout. See <a href="#local-cwd">Local cwd</a>. <code>local.sandbox</code> makes MCP tool calls fail closed.</p><p>Use the Cursor SDK&#39;s public tool names, including <code>&quot;shell&quot;</code>, <code>&quot;read&quot;</code>, <code>&quot;edit&quot;</code>, <code>&quot;grep&quot;</code>, <code>&quot;glob&quot;</code>, <code>&quot;ls&quot;</code>, and <code>&quot;task&quot;</code>. Unknown names fail the turn with a <code>ConfigurationError</code>.</p><p>Two names have broader effects:</p><ul><li><code>&quot;shell&quot;</code> also grants shell input. Tools with <code>execution: &quot;agent&quot;</code> need it to run their scripts. Discovery warns when your allowlist would prevent those tools from running.</li><li><code>&quot;task&quot;</code> lets the root agent start subagents. Each subagent keeps its own curated toolset.</li></ul><p>The allowlist controls which tools the model can call. It does not isolate the serve host. For agents that process untrusted input, also set <code>local: { sandbox: true }</code>.</p><h2 id="concurrency" tabindex="-1">Concurrency <a class="header-anchor" href="#concurrency" aria-label="Permalink to &quot;Concurrency&quot;">​</a></h2><p><code>concurrency.maxRunningTurns</code> caps how many model turns run at once across all of the agent&#39;s sessions (positive integer, hard cap 200). When every slot is busy, newly admitted turns queue FIFO instead of failing: the stream records a durable <code>turn.queued</code> event with the queue position, <code>GET /v1/sessions</code> reports <code>queued: true</code>, and each queued turn starts as soon as a slot frees. A queued turn still counts as running for busy semantics: follow-ups preempt it, and direct write-effect tool calls get <code>409 session_busy</code>. Omit for unlimited.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> defineAgent</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
23
23
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> concurrency: { maxRunningTurns: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
24
24
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><h2 id="built-in-tools" tabindex="-1">Built-in tools <a class="header-anchor" href="#built-in-tools" aria-label="Permalink to &quot;Built-in tools&quot;">​</a></h2><p><code>builtinTools</code> opts into framework-provided model-facing tools. Each enabled capability shows up as ordinary server tools, so turns, direct calls, <code>info</code>, and the playground treat them like authored tools. Authored tools with the same name win, with a warning, and like all server tools they run on the local runtime.</p><p><code>builtinTools: { reminders: true }</code> adds three tools bound to the current conversation over <code>host.reminders</code>: <code>reminders_create</code>, <code>reminders_list</code>, and <code>reminders_cancel</code>. Sessions without a continuation key can&#39;t arm reminders. See <a href="./schedules.html#reminders">Schedules and reminders</a>.</p><h2 id="serve-programmatically" tabindex="-1">Serve programmatically <a class="header-anchor" href="#serve-programmatically" aria-label="Permalink to &quot;Serve programmatically&quot;">​</a></h2><p><code>serve(dirOrProject, options)</code> embeds the server in your own process:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { serve } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;@cursor/bdk&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
25
25
  <span class="line"></span>
@@ -29,4 +29,4 @@ import{_ as e,c as i,o as a,a3 as t}from"./chunks/framework.BNw1pucY.js";const k
29
29
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span>
30
30
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">\`listening on \${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">handle</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">url</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">}\`</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
31
31
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// handle.callTool(...), handle.dispatchSchedule(&quot;heartbeat&quot;),</span></span>
32
- <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// handle.createReminder(...), handle.project, await handle.close()</span></span></code></pre></div><p>Host settings match the documented <a href="./cli.html">CLI</a> <code>serve</code> flags. <code>serve()</code> also accepts <code>discovery</code> (project-loading options) and <code>mode: &quot;single&quot; | &quot;multi&quot;</code>. Pass <code>apiKey</code> or use the same Cursor credential as the CLI: <code>CURSOR_API_KEY</code>, <code>CURSOR_API_KEY_FILE</code>, <code>CURSOR_SERVICE_ACCOUNT_KEY</code>, or <code>bdk login</code>.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./instructions.html">Instructions</a>: the required half of a minimal agent</li><li><a href="./cli.html">CLI</a>: the <code>serve</code> flags <code>serve()</code> accepts</li><li><a href="./sessions.html">Sessions</a>: workspaces, identifiers, and turn admission</li><li><a href="./schedules.html">Schedules</a>: reminder tools opted in here</li></ul>`,38)])])}const u=e(n,[["render",o]]);export{k as __pageData,u as default};
32
+ <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// handle.createReminder(...), handle.project, await handle.close()</span></span></code></pre></div><p>Host settings match the documented <a href="./cli.html">CLI</a> <code>serve</code> flags. <code>serve()</code> also accepts <code>discovery</code> (project-loading options) and <code>mode: &quot;single&quot; | &quot;multi&quot;</code>. Pass <code>apiKey</code> or use the same Cursor credential as the CLI: <code>CURSOR_API_KEY</code>, <code>CURSOR_API_KEY_FILE</code>, <code>CURSOR_SERVICE_ACCOUNT_KEY</code>, or <code>bdk login</code>.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to &quot;Related&quot;">​</a></h2><ul><li><a href="./instructions.html">Instructions</a>: the required half of a minimal agent</li><li><a href="./cli.html">CLI</a>: the <code>serve</code> flags <code>serve()</code> accepts</li><li><a href="./sessions.html">Sessions</a>: workspaces, identifiers, and turn admission</li><li><a href="./schedules.html">Schedules</a>: reminder tools opted in here</li></ul>`,37)])])}const u=e(n,[["render",o]]);export{k as __pageData,u as default};