@cursor/bdk 0.2.23 → 0.2.25

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 (421) hide show
  1. package/AGENTS.md +1 -0
  2. package/dist/artifacts.d.ts +1 -1
  3. package/dist/artifacts.js +1 -1
  4. package/dist/bin/agent-serve.d.ts +1 -1
  5. package/dist/bin/agent-serve.js +48 -12
  6. package/dist/channels/bitbucket/bitbucket-channel.js +1 -1
  7. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +3 -2
  8. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  9. package/dist/channels/bitbucket/bitbucket-webhook.js +14 -9
  10. package/dist/channels/change-monitors/change-monitors-channel.js +1 -1
  11. package/dist/channels/deployments/deployments-channel.js +1 -1
  12. package/dist/channels/github/github-channel.d.ts.map +1 -1
  13. package/dist/channels/github/github-channel.js +10 -19
  14. package/dist/channels/gitlab/gitlab-channel.js +1 -1
  15. package/dist/channels/issues/issues-channel.js +1 -1
  16. package/dist/channels/origin/origin-channel.js +1 -1
  17. package/dist/channels/pagerduty/api.d.ts +74 -0
  18. package/dist/channels/pagerduty/api.d.ts.map +1 -0
  19. package/dist/channels/pagerduty/api.js +101 -0
  20. package/dist/channels/pagerduty/defaults.d.ts +42 -0
  21. package/dist/channels/pagerduty/defaults.d.ts.map +1 -0
  22. package/dist/channels/pagerduty/defaults.js +132 -0
  23. package/dist/channels/pagerduty/events.d.ts +24 -0
  24. package/dist/channels/pagerduty/events.d.ts.map +1 -0
  25. package/dist/channels/pagerduty/events.js +38 -0
  26. package/dist/channels/pagerduty/index.d.ts +31 -0
  27. package/dist/channels/pagerduty/index.d.ts.map +1 -0
  28. package/dist/channels/pagerduty/index.js +30 -0
  29. package/dist/channels/pagerduty/pagerduty-channel.d.ts +64 -0
  30. package/dist/channels/pagerduty/pagerduty-channel.d.ts.map +1 -0
  31. package/dist/channels/pagerduty/pagerduty-channel.js +195 -0
  32. package/dist/channels/pagerduty/pagerduty-webhook.d.ts +70 -0
  33. package/dist/channels/pagerduty/pagerduty-webhook.d.ts.map +1 -0
  34. package/dist/channels/pagerduty/pagerduty-webhook.js +280 -0
  35. package/dist/channels/pagerduty/payload.d.ts +33 -0
  36. package/dist/channels/pagerduty/payload.d.ts.map +1 -0
  37. package/dist/channels/pagerduty/payload.js +150 -0
  38. package/dist/channels/pagerduty/replay.d.ts +35 -0
  39. package/dist/channels/pagerduty/replay.d.ts.map +1 -0
  40. package/dist/channels/pagerduty/replay.js +115 -0
  41. package/dist/channels/pagerduty/secrets.d.ts +16 -0
  42. package/dist/channels/pagerduty/secrets.d.ts.map +1 -0
  43. package/dist/channels/pagerduty/secrets.js +23 -0
  44. package/dist/channels/pagerduty/self-user.d.ts +51 -0
  45. package/dist/channels/pagerduty/self-user.d.ts.map +1 -0
  46. package/dist/channels/pagerduty/self-user.js +157 -0
  47. package/dist/channels/pagerduty/state.d.ts +31 -0
  48. package/dist/channels/pagerduty/state.d.ts.map +1 -0
  49. package/dist/channels/pagerduty/state.js +30 -0
  50. package/dist/channels/pagerduty/types.d.ts +217 -0
  51. package/dist/channels/pagerduty/types.d.ts.map +1 -0
  52. package/dist/channels/pagerduty/types.js +1 -0
  53. package/dist/channels/runs/runs-channel.js +1 -1
  54. package/dist/channels/slack/tool-approval-events.js +5 -5
  55. package/dist/channels.d.ts +14 -1
  56. package/dist/channels.d.ts.map +1 -1
  57. package/dist/channels.js +24 -9
  58. package/dist/docs/404.html +3 -3
  59. package/dist/docs/assets/{app.AXQcJZaf.js → app.BjS1QEI4.js} +4 -4
  60. package/dist/docs/assets/chunks/@localSearchIndexroot.oGqZumnJ.js +1 -0
  61. package/dist/docs/assets/chunks/{VPLocalSearchBox.hlZ2vmun.js → VPLocalSearchBox.BOuvjb5Y.js} +2 -2
  62. package/dist/docs/assets/chunks/{arc.9KNWdH-l.js → arc.3WR6Jf-y.js} +1 -1
  63. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.BfGzkBHI.js → architectureDiagram-Q4EWVU46.Dtb6Dqh6.js} +1 -1
  64. package/dist/docs/assets/chunks/{baseUniq.Btk8-2Rs.js → baseUniq.BUyrgrZE.js} +1 -1
  65. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.BmHm9OH5.js → blockDiagram-DXYQGD6D.BVLV_voZ.js} +1 -1
  66. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.9POrbDHJ.js → c4Diagram-AHTNJAMY.jXJ1q70M.js} +1 -1
  67. package/dist/docs/assets/chunks/channel.Dt4aweTm.js +1 -0
  68. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.YWZVSM6S.js → chunk-4BX2VUAB.zz1SMBvK.js} +1 -1
  69. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.Cxr_SFgw.js → chunk-4TB4RGXK.CzYKuv3I.js} +1 -1
  70. package/dist/docs/assets/chunks/{chunk-55IACEB6.DtiJyPlD.js → chunk-55IACEB6.C7_tcJZD.js} +1 -1
  71. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.b5gNHJPH.js → chunk-EDXVE4YY.DeTwQPVO.js} +1 -1
  72. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DmN9yA_M.js → chunk-FMBD7UC4.DhMTl7ut.js} +1 -1
  73. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Dfm3xgV5.js → chunk-OYMX7WX6.Me7f5hEp.js} +1 -1
  74. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.sXNxDcJA.js → chunk-QZHKN3VN.D0E0Bb6g.js} +1 -1
  75. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.DgBnDUV7.js → chunk-YZCP3GAM.CdOOBFYL.js} +1 -1
  76. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DGUHZs6j.js +1 -0
  77. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DGUHZs6j.js +1 -0
  78. package/dist/docs/assets/chunks/clone.DWf3k0Z0.js +1 -0
  79. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.D18MEcoN.js → cose-bilkent-S5V4N54A.BNbGESzN.js} +1 -1
  80. package/dist/docs/assets/chunks/{dagre-KV5264BT.CSf3tihh.js → dagre-KV5264BT.zU7Lu_xJ.js} +1 -1
  81. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.cbfzAfoC.js → diagram-5BDNPKRD.B9qOdE5h.js} +1 -1
  82. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.6i6P3uu9.js → diagram-G4DWMVQ6.D8X-sf77.js} +1 -1
  83. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.B9HAIfN6.js → diagram-MMDJMWI5.CW7MvMlE.js} +1 -1
  84. package/dist/docs/assets/chunks/{diagram-TYMM5635.B9baAjUv.js → diagram-TYMM5635.J489G0Nd.js} +1 -1
  85. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DaBmX_GN.js → erDiagram-SMLLAGMA.BkW7tGfs.js} +1 -1
  86. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.CJqQJjkb.js → flowDiagram-DWJPFMVM.jc9iWORD.js} +1 -1
  87. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.CIXBLQhC.js → ganttDiagram-T4ZO3ILL.B-UQfd9E.js} +1 -1
  88. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.CDgentto.js → gitGraphDiagram-UUTBAWPF.DFzrTSlJ.js} +1 -1
  89. package/dist/docs/assets/chunks/{graph.BWHn6JBQ.js → graph.C5IB6_e_.js} +1 -1
  90. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.d9VU_ts_.js → infoDiagram-42DDH7IO.DwF0-c8L.js} +1 -1
  91. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.BNO79Prj.js → ishikawaDiagram-UXIWVN3A.fBaTqzE7.js} +1 -1
  92. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CPgUTM1R.js → journeyDiagram-VCZTEJTY.CM8gDVJy.js} +1 -1
  93. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.idl0Eoe1.js → kanban-definition-6JOO6SKY.YiD1p0LB.js} +1 -1
  94. package/dist/docs/assets/chunks/{layout.BY7DIMr6.js → layout.6Um-DVJT.js} +1 -1
  95. package/dist/docs/assets/chunks/{linear.DYaUDrHd.js → linear.DcTeg4Hn.js} +1 -1
  96. package/dist/docs/assets/chunks/{min.V6MWb1UC.js → min.CIxkY8Fe.js} +1 -1
  97. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.BRlJXuFS.js → mindmap-definition-QFDTVHPH.D4QM_voR.js} +1 -1
  98. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.BIhkDLcB.js → pieDiagram-DEJITSTG.nmB309G1.js} +1 -1
  99. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.Bw-_VEL3.js → quadrantDiagram-34T5L4WZ.D1HtZR3C.js} +1 -1
  100. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DolEGwxw.js → requirementDiagram-MS252O5E.CZgQWob-.js} +1 -1
  101. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.hMM-8BhN.js → sankeyDiagram-XADWPNL6.DtiBfU-P.js} +1 -1
  102. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Bg_CRVDy.js → sequenceDiagram-FGHM5R23.Cld4gDSt.js} +1 -1
  103. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.DNWdl34_.js → stateDiagram-FHFEXIEX.DatP823_.js} +1 -1
  104. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C0571l4D.js +1 -0
  105. package/dist/docs/assets/chunks/{theme.CBW1oolh.js → theme.D5jbBys7.js} +2 -2
  106. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Cr1wJ1mB.js → timeline-definition-GMOUNBTQ.DwQLI2be.js} +1 -1
  107. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BltDV9j7.js → vennDiagram-DHZGUBPP.a5yMfnsa.js} +1 -1
  108. package/dist/docs/assets/chunks/{wardley-RL74JXVD.BWPaUhOs.js → wardley-RL74JXVD.B-FXivgT.js} +1 -1
  109. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.nsADqCCo.js → wardleyDiagram-NUSXRM2D.Dz--Opy3.js} +1 -1
  110. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CCwbO3dK.js → xychartDiagram-5P7HB3ND.Dl8w8TeT.js} +1 -1
  111. package/dist/docs/assets/{deployment.md.CtSJ6sF9.js → deployment.md.3MMWuPeV.js} +5 -5
  112. package/dist/docs/assets/{deployment.md.CtSJ6sF9.lean.js → deployment.md.3MMWuPeV.lean.js} +1 -1
  113. package/dist/docs/assets/{guides_cloud-agents.md.CBK7W0-O.js → guides_cloud-agents.md.BzbzcOyj.js} +2 -2
  114. package/dist/docs/assets/{guides_cloud-agents.md.CBK7W0-O.lean.js → guides_cloud-agents.md.BzbzcOyj.lean.js} +1 -1
  115. package/dist/docs/assets/{guides_opentelemetry.md.ByW1Fs7b.js → guides_opentelemetry.md.DBQtp7_V.js} +13 -5
  116. package/dist/docs/assets/{guides_opentelemetry.md.ByW1Fs7b.lean.js → guides_opentelemetry.md.DBQtp7_V.lean.js} +1 -1
  117. package/dist/docs/assets/guides_pagerduty.md.BHXMcMtx.js +60 -0
  118. package/dist/docs/assets/guides_pagerduty.md.BHXMcMtx.lean.js +1 -0
  119. package/dist/docs/assets/{reference_agent-config.md.DYA6ge6t.js → reference_agent-config.md.IplwL25I.js} +1 -2
  120. package/dist/docs/assets/{reference_agent-config.md.DYA6ge6t.lean.js → reference_agent-config.md.IplwL25I.lean.js} +1 -1
  121. package/dist/docs/assets/{reference_channels.md.DYg0CLud.js → reference_channels.md.Bxaa020x.js} +1 -1
  122. package/dist/docs/assets/{reference_cli.md.DB7Llw3T.js → reference_cli.md.1o_TqKdt.js} +7 -2
  123. package/dist/docs/assets/{reference_cli.md.DB7Llw3T.lean.js → reference_cli.md.1o_TqKdt.lean.js} +1 -1
  124. package/dist/docs/assets/{reference_extensions.md.OUacPetl.js → reference_extensions.md.DKxTuCIw.js} +11 -8
  125. package/dist/docs/assets/{reference_extensions.md.OUacPetl.lean.js → reference_extensions.md.DKxTuCIw.lean.js} +1 -1
  126. package/dist/docs/assets/{reference_instructions.md.DrcHZXig.js → reference_instructions.md.BYMVxAkw.js} +4 -4
  127. package/dist/docs/assets/{reference_instructions.md.DrcHZXig.lean.js → reference_instructions.md.BYMVxAkw.lean.js} +1 -1
  128. package/dist/docs/assets/{reference_schedules.md.BqWnJES4.js → reference_schedules.md.03Ryy9ca.js} +3 -3
  129. package/dist/docs/assets/{reference_tools.md.08XR7lIl.js → reference_tools.md.-6pypsWt.js} +1 -1
  130. package/dist/docs/assets/{style.Dwls12uf.css → style.nMsabY-V.css} +1 -1
  131. package/dist/docs/assets/templates_agentic-owners.md.CTEnR0jp.js +13 -0
  132. package/dist/docs/assets/{templates_agentic-owners.md.CvmABtia.lean.js → templates_agentic-owners.md.CTEnR0jp.lean.js} +1 -1
  133. package/dist/docs/building-with-agents.html +37 -37
  134. package/dist/docs/deployment.html +42 -42
  135. package/dist/docs/deployment.md +9 -4
  136. package/dist/docs/evals.html +37 -37
  137. package/dist/docs/guides/agent-to-agent.html +37 -37
  138. package/dist/docs/guides/bitbucket.html +37 -37
  139. package/dist/docs/guides/cloud-agents.html +38 -38
  140. package/dist/docs/guides/cloud-agents.md +1 -0
  141. package/dist/docs/guides/convert-automation.html +37 -37
  142. package/dist/docs/guides/export-grokbot.html +37 -37
  143. package/dist/docs/guides/github.html +37 -37
  144. package/dist/docs/guides/gitlab.html +37 -37
  145. package/dist/docs/guides/grokbot-agents.html +37 -37
  146. package/dist/docs/guides/hooks.html +37 -37
  147. package/dist/docs/guides/improve.html +37 -37
  148. package/dist/docs/guides/jev.html +37 -37
  149. package/dist/docs/guides/mcp-oauth.html +37 -37
  150. package/dist/docs/guides/migrate.html +37 -37
  151. package/dist/docs/guides/opentelemetry.html +49 -41
  152. package/dist/docs/guides/opentelemetry.md +54 -3
  153. package/dist/docs/guides/pagerduty.html +119 -0
  154. package/dist/docs/guides/pagerduty.md +336 -0
  155. package/dist/docs/guides/slack.html +37 -37
  156. package/dist/docs/guides/webhooks.html +37 -37
  157. package/dist/docs/hashmap.json +1 -1
  158. package/dist/docs/hillclimbing.html +37 -37
  159. package/dist/docs/index.html +37 -37
  160. package/dist/docs/llms-full.txt +510 -42
  161. package/dist/docs/llms.txt +1 -0
  162. package/dist/docs/quickstart.html +37 -37
  163. package/dist/docs/reference/agent-config.html +38 -39
  164. package/dist/docs/reference/agent-config.md +0 -1
  165. package/dist/docs/reference/artifacts.html +37 -37
  166. package/dist/docs/reference/channels.html +38 -38
  167. package/dist/docs/reference/channels.md +2 -1
  168. package/dist/docs/reference/cli.html +43 -38
  169. package/dist/docs/reference/cli.md +27 -0
  170. package/dist/docs/reference/connections.html +37 -37
  171. package/dist/docs/reference/evals.html +37 -37
  172. package/dist/docs/reference/extensions.html +47 -44
  173. package/dist/docs/reference/extensions.md +15 -9
  174. package/dist/docs/reference/hooks.html +37 -37
  175. package/dist/docs/reference/http-api.html +37 -37
  176. package/dist/docs/reference/instructions.html +40 -40
  177. package/dist/docs/reference/instructions.md +5 -1
  178. package/dist/docs/reference/memory.html +37 -37
  179. package/dist/docs/reference/playground.html +36 -36
  180. package/dist/docs/reference/project-layout.html +37 -37
  181. package/dist/docs/reference/prompt.html +37 -37
  182. package/dist/docs/reference/schedules.html +40 -40
  183. package/dist/docs/reference/sessions.html +36 -36
  184. package/dist/docs/reference/skills.html +37 -37
  185. package/dist/docs/reference/subagents.html +37 -37
  186. package/dist/docs/reference/tools.html +39 -39
  187. package/dist/docs/reference/tools.md +1 -0
  188. package/dist/docs/templates/agentic-owners.html +42 -43
  189. package/dist/docs/templates/agentic-owners.md +55 -23
  190. package/dist/docs/templates/grokbot-agents.html +37 -37
  191. package/dist/docs/templates/security-reviewer.html +37 -37
  192. package/dist/docs/templates/thermo-quality-review.html +37 -37
  193. package/dist/docs/templates/thermo-review.html +37 -37
  194. package/dist/docs/templates/triage.html +37 -37
  195. package/dist/docs/troubleshooting.html +36 -36
  196. package/dist/extensions/cursor-cloud-agents/extension.d.ts +2 -0
  197. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
  198. package/dist/extensions/cursor-cloud-agents/extension.js +2 -1
  199. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +1 -0
  200. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
  201. package/dist/extensions/cursor-cloud-agents/lib/backend.js +2 -1
  202. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
  203. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts +1 -1
  204. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts.map +1 -1
  205. package/dist/extensions/cursor-cloud-agents/lib/inputs.js +1 -1
  206. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +1 -1
  207. package/dist/extensions/cursor-cloud-agents/tools/launch.js +1 -1
  208. package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
  209. package/dist/extensions/cursor-cloud-agents/tools/reply.js +1 -1
  210. package/dist/extensions/cursor-grokbot-agents/extension.js +1 -1
  211. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +1 -1
  212. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +1 -1
  213. package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts +1 -1
  214. package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts.map +1 -1
  215. package/dist/extensions/cursor-grokbot-agents/lib/inputs.js +1 -1
  216. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +1 -1
  217. package/dist/extensions/cursor-grokbot-agents/tools/check.js +1 -1
  218. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +1 -1
  219. package/dist/extensions/cursor-grokbot-agents/tools/list.js +1 -1
  220. package/dist/extensions/improve/extension.js +1 -1
  221. package/dist/extensions/jev/extension.js +1 -1
  222. package/dist/extensions/jev/tools/evaluate.js +1 -1
  223. package/dist/extensions/slack-communication/extension.js +1 -1
  224. package/dist/extensions/slack-communication/tools/delete-message.js +1 -1
  225. package/dist/extensions/slack-communication/tools/edit-message.js +1 -1
  226. package/dist/extensions/slack-communication/tools/post-card.js +1 -1
  227. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  228. package/dist/extensions/slack-communication/tools/post-update.js +1 -1
  229. package/dist/extensions/slack-communication/tools/react.js +1 -1
  230. package/dist/extensions/slack-communication/tools/set-status.js +1 -1
  231. package/dist/extensions.d.ts +1 -1
  232. package/dist/extensions.js +1 -1
  233. package/dist/internal/approval-gate.d.ts +4 -2
  234. package/dist/internal/approval-gate.d.ts.map +1 -1
  235. package/dist/internal/approval-gate.js +2 -1
  236. package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -1
  237. package/dist/internal/builtin-tools/artifacts.js +46 -13
  238. package/dist/internal/builtin-tools/reminders.js +1 -1
  239. package/dist/internal/channel-architecture.d.ts +1 -1
  240. package/dist/internal/channel-architecture.d.ts.map +1 -1
  241. package/dist/internal/channel-architecture.js +4 -2
  242. package/dist/internal/cli-deploy.d.ts.map +1 -1
  243. package/dist/internal/cli-deploy.js +21 -12
  244. package/dist/internal/cli-pagerduty.d.ts +32 -0
  245. package/dist/internal/cli-pagerduty.d.ts.map +1 -0
  246. package/dist/internal/cli-pagerduty.js +242 -0
  247. package/dist/internal/continuation-channel.d.ts.map +1 -1
  248. package/dist/internal/continuation-channel.js +7 -0
  249. package/dist/internal/continuation-identity.d.ts +11 -3
  250. package/dist/internal/continuation-identity.d.ts.map +1 -1
  251. package/dist/internal/continuation-identity.js +83 -0
  252. package/dist/internal/convert-automation/convert-workflow.js +1 -1
  253. package/dist/internal/convert-grokbot/answers.js +1 -1
  254. package/dist/internal/convert-grokbot/recipe.d.ts +1 -1
  255. package/dist/internal/convert-grokbot/recipe.d.ts.map +1 -1
  256. package/dist/internal/convert-grokbot/recipe.js +1 -1
  257. package/dist/internal/cursor/backend-client.d.ts +1 -1
  258. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  259. package/dist/internal/cursor/backend-client.js +1 -1
  260. package/dist/internal/cursor/credentials.d.ts +1 -1
  261. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  262. package/dist/internal/cursor/credentials.js +1 -1
  263. package/dist/internal/deploy-client.js +1 -1
  264. package/dist/internal/deploy-manifest.d.ts +11 -4
  265. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  266. package/dist/internal/deploy-manifest.js +19 -6
  267. package/dist/internal/discovery/agent-config.d.ts.map +1 -1
  268. package/dist/internal/discovery/agent-config.js +10 -10
  269. package/dist/internal/discovery/agent.d.ts.map +1 -1
  270. package/dist/internal/discovery/agent.js +10 -10
  271. package/dist/internal/discovery/channels.d.ts.map +1 -1
  272. package/dist/internal/discovery/channels.js +20 -16
  273. package/dist/internal/discovery/context.d.ts +16 -0
  274. package/dist/internal/discovery/context.d.ts.map +1 -1
  275. package/dist/internal/discovery/context.js +66 -0
  276. package/dist/internal/discovery/cursor-plugin.js +1 -1
  277. package/dist/internal/discovery/extension-overlay.d.ts.map +1 -1
  278. package/dist/internal/discovery/extension-overlay.js +2 -6
  279. package/dist/internal/discovery/info.d.ts.map +1 -1
  280. package/dist/internal/discovery/info.js +3 -0
  281. package/dist/internal/discovery/instructions.d.ts.map +1 -1
  282. package/dist/internal/discovery/instructions.js +3 -6
  283. package/dist/internal/discovery/modules.d.ts.map +1 -1
  284. package/dist/internal/discovery/modules.js +3 -6
  285. package/dist/internal/discovery/project.d.ts +6 -0
  286. package/dist/internal/discovery/project.d.ts.map +1 -1
  287. package/dist/internal/discovery/project.js +27 -5
  288. package/dist/internal/discovery/runtime.d.ts.map +1 -1
  289. package/dist/internal/discovery/runtime.js +8 -8
  290. package/dist/internal/discovery.d.ts +1 -1
  291. package/dist/internal/discovery.d.ts.map +1 -1
  292. package/dist/internal/discovery.js +1 -1
  293. package/dist/internal/expected-delivery-failure.d.ts.map +1 -1
  294. package/dist/internal/expected-delivery-failure.js +6 -0
  295. package/dist/internal/factory-resource-channel.d.ts +1 -1
  296. package/dist/internal/factory-resource-channel.d.ts.map +1 -1
  297. package/dist/internal/filesystem/sdk-schemas.d.ts +1 -1
  298. package/dist/internal/filesystem/sdk-schemas.d.ts.map +1 -1
  299. package/dist/internal/filesystem/sdk-schemas.js +5 -4
  300. package/dist/internal/filesystem/tools.js +1 -1
  301. package/dist/internal/hmac-secret-values.d.ts +48 -0
  302. package/dist/internal/hmac-secret-values.d.ts.map +1 -0
  303. package/dist/internal/hmac-secret-values.js +68 -0
  304. package/dist/internal/host-otel.d.ts +2 -1
  305. package/dist/internal/host-otel.d.ts.map +1 -1
  306. package/dist/internal/host-otel.js +20 -6
  307. package/dist/internal/host-platforms.d.ts.map +1 -1
  308. package/dist/internal/host-platforms.js +8 -2
  309. package/dist/internal/hosted-delivery-protocol.d.ts +4 -0
  310. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  311. package/dist/internal/hosted-delivery.d.ts +7 -0
  312. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  313. package/dist/internal/hosted-delivery.js +19 -17
  314. package/dist/internal/hosting.d.ts +6 -0
  315. package/dist/internal/hosting.d.ts.map +1 -1
  316. package/dist/internal/hosting.js +9 -0
  317. package/dist/internal/init-scaffold.js +1 -1
  318. package/dist/internal/interview/agent-questions.d.ts +1 -1
  319. package/dist/internal/interview/agent-questions.d.ts.map +1 -1
  320. package/dist/internal/interview/agent-questions.js +1 -1
  321. package/dist/internal/interview/question.d.ts +1 -1
  322. package/dist/internal/interview/question.d.ts.map +1 -1
  323. package/dist/internal/interview/question.js +1 -1
  324. package/dist/internal/json-schema.d.ts +7 -7
  325. package/dist/internal/json-schema.d.ts.map +1 -1
  326. package/dist/internal/json-schema.js +14 -17
  327. package/dist/internal/mcp-endpoint.js +1 -1
  328. package/dist/internal/otel/collector.d.ts.map +1 -1
  329. package/dist/internal/otel/collector.js +50 -19
  330. package/dist/internal/otel/config.d.ts +10 -1
  331. package/dist/internal/otel/config.d.ts.map +1 -1
  332. package/dist/internal/otel/config.js +47 -10
  333. package/dist/internal/otel/http.d.ts +1 -1
  334. package/dist/internal/otel/http.d.ts.map +1 -1
  335. package/dist/internal/otel/http.js +1 -1
  336. package/dist/internal/otel/runtime.d.ts +17 -14
  337. package/dist/internal/otel/runtime.d.ts.map +1 -1
  338. package/dist/internal/otel/runtime.js +203 -237
  339. package/dist/internal/package-inline-stdio.d.ts.map +1 -1
  340. package/dist/internal/package-inline-stdio.js +21 -5
  341. package/dist/internal/process-memory-telemetry.d.ts +1 -1
  342. package/dist/internal/process-memory-telemetry.d.ts.map +1 -1
  343. package/dist/internal/process-memory-telemetry.js +1 -1
  344. package/dist/internal/sdk-runner.d.ts +2 -3
  345. package/dist/internal/sdk-runner.d.ts.map +1 -1
  346. package/dist/internal/sdk-runner.js +30 -6
  347. package/dist/internal/secret-alternatives.d.ts +11 -0
  348. package/dist/internal/secret-alternatives.d.ts.map +1 -0
  349. package/dist/internal/secret-alternatives.js +13 -0
  350. package/dist/internal/server.d.ts.map +1 -1
  351. package/dist/internal/server.js +27 -15
  352. package/dist/internal/session-engine.d.ts +9 -1
  353. package/dist/internal/session-engine.d.ts.map +1 -1
  354. package/dist/internal/session-engine.js +30 -4
  355. package/dist/internal/slack-provision-client.js +1 -1
  356. package/dist/internal/sqlite-experimental-warning.d.ts +2 -0
  357. package/dist/internal/sqlite-experimental-warning.d.ts.map +1 -0
  358. package/dist/internal/sqlite-experimental-warning.js +22 -0
  359. package/dist/internal/store-api-protocol.d.ts +1 -1
  360. package/dist/internal/store-api-protocol.d.ts.map +1 -1
  361. package/dist/internal/store-api-protocol.js +1 -1
  362. package/dist/internal/testing/conversation-identity-vectors.d.ts +6 -1
  363. package/dist/internal/testing/conversation-identity-vectors.d.ts.map +1 -1
  364. package/dist/internal/testing/conversation-identity-vectors.js +34 -0
  365. package/dist/internal/testing/hmac-secret-vectors.d.ts +38 -0
  366. package/dist/internal/testing/hmac-secret-vectors.d.ts.map +1 -0
  367. package/dist/internal/testing/hmac-secret-vectors.js +89 -0
  368. package/dist/internal/testing/pagerduty-continuation-fixtures.d.ts +42 -0
  369. package/dist/internal/testing/pagerduty-continuation-fixtures.d.ts.map +1 -0
  370. package/dist/internal/testing/pagerduty-continuation-fixtures.js +175 -0
  371. package/dist/internal/update-check.d.ts +1 -1
  372. package/dist/internal/update-check.d.ts.map +1 -1
  373. package/dist/internal/update-check.js +1 -1
  374. package/dist/internal/zod-schema.d.ts +14 -0
  375. package/dist/internal/zod-schema.d.ts.map +1 -0
  376. package/dist/internal/zod-schema.js +22 -0
  377. package/dist/otel.d.ts +1 -2
  378. package/dist/otel.d.ts.map +1 -1
  379. package/dist/otel.js +0 -1
  380. package/dist/playground/assets/cursor-icons-16-DmHBTm1-.woff2 +0 -0
  381. package/dist/playground/assets/index-BdMwybMt.css +1 -0
  382. package/dist/playground/assets/index-CHk6O92d.js +62 -0
  383. package/dist/playground/index.html +2 -2
  384. package/dist/tools.d.ts +14 -11
  385. package/dist/tools.d.ts.map +1 -1
  386. package/dist/tools.js +4 -3
  387. package/dist/types.d.ts +67 -16
  388. package/dist/types.d.ts.map +1 -1
  389. package/docs/deployment.md +9 -4
  390. package/docs/guides/cloud-agents.md +1 -0
  391. package/docs/guides/opentelemetry.md +54 -3
  392. package/docs/guides/pagerduty.md +341 -0
  393. package/docs/reference/agent-config.md +0 -1
  394. package/docs/reference/channels.md +2 -1
  395. package/docs/reference/cli.md +27 -0
  396. package/docs/reference/extensions.md +15 -9
  397. package/docs/reference/instructions.md +5 -1
  398. package/docs/reference/tools.md +1 -0
  399. package/docs/templates/agentic-owners.md +55 -23
  400. package/package.json +24 -19
  401. package/skills/migrate-v2/SKILL.md +1 -1
  402. package/skills/otel/SKILL.md +24 -7
  403. package/templates/agentic-owners/README.md +6 -1
  404. package/templates/agentic-owners/bot/lib/owners/decision.ts +31 -5
  405. package/templates/agentic-owners/bot/lib/owners/globalOverride.ts +60 -0
  406. package/templates/agentic-owners/bot/lib/owners/match.ts +85 -19
  407. package/templates/agentic-owners/bot/lib/owners/parse.ts +133 -2
  408. package/templates/agentic-owners/bot/lib/owners/types.ts +23 -0
  409. package/dist/docs/assets/chunks/@localSearchIndexroot.B3j7LFef.js +0 -1
  410. package/dist/docs/assets/chunks/channel.RoCpi7X1.js +0 -1
  411. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.oxdmwwqk.js +0 -1
  412. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.oxdmwwqk.js +0 -1
  413. package/dist/docs/assets/chunks/clone.BkguoIMm.js +0 -1
  414. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.7W-btjJ2.js +0 -1
  415. package/dist/docs/assets/templates_agentic-owners.md.CvmABtia.js +0 -14
  416. package/dist/playground/assets/cursor-icons-16-gwXtdAvu.woff2 +0 -0
  417. package/dist/playground/assets/index-BtsbIqV9.css +0 -1
  418. package/dist/playground/assets/index-CD8VRa25.js +0 -71
  419. /package/dist/docs/assets/{reference_channels.md.DYg0CLud.lean.js → reference_channels.md.Bxaa020x.lean.js} +0 -0
  420. /package/dist/docs/assets/{reference_schedules.md.BqWnJES4.lean.js → reference_schedules.md.03Ryy9ca.lean.js} +0 -0
  421. /package/dist/docs/assets/{reference_tools.md.08XR7lIl.lean.js → reference_tools.md.-6pypsWt.lean.js} +0 -0
@@ -8,13 +8,13 @@ description: "Scaffold the agent, commit .agentic-owners policies, and let it ri
8
8
  This agent reviews every pull request in your repository. It risk-tiers
9
9
  the diff, requests the owning team or user as reviewers, and approves
10
10
  what your policy allows. Ownership rules live in
11
- `.agentic-owners/policy.yml` files committed at any depth of the repo;
12
- the closest policy to a changed file wins, and policies are always read
13
- from the PR's base ref so a PR cannot exempt itself.
11
+ `.agentic-owners/policy.yml` files committed at any depth of the repo.
12
+ The closest policy to a changed file wins, and policies are always read
13
+ from the PR's base ref, so a PR cannot exempt itself.
14
14
 
15
15
  ## Scaffold
16
16
 
17
- ```text
17
+ ```bash
18
18
  bdk init ./owners-agent --template agentic-owners
19
19
  ```
20
20
 
@@ -23,21 +23,23 @@ on PATH.
23
23
 
24
24
  ## Log in and run
25
25
 
26
- Set your repositories in `bot/lib/config.ts` (`repos: ["you/your-repo"]`),
26
+ Set your repositories in `bot/lib/config.ts` (`repos: ["acme/api"]`),
27
27
  then:
28
28
 
29
- ```text
29
+ ```bash
30
30
  cd owners-agent
31
31
  bdk login
32
32
  bdk dev
33
33
  ```
34
34
 
35
35
  PR events stream through your Cursor account. No webhook or GitHub App
36
- setup. Open a PR, or replay a real one deterministically (this also works
36
+ setup. The agent reviews a PR when it is opened, reopened, pushed to,
37
+ marked ready for review, or retargeted to another base. Draft PRs wait
38
+ until they are ready. Open a PR, or replay a real one (this also works
37
39
  with `repos` empty):
38
40
 
39
- ```text
40
- bdk github replay https://github.com/you/your-repo/pull/123 --dir .
41
+ ```bash
42
+ bdk github replay https://github.com/acme/api/pull/123 --dir .
41
43
  ```
42
44
 
43
45
  Deploy with `bdk deploy`.
@@ -49,37 +51,67 @@ low risk approve, medium and above hold with a comment. Route reviews by
49
51
  committing policies:
50
52
 
51
53
  ```yaml
52
- # .agentic-owners/policy.yml. Anywhere in the repo; closest wins.
53
- # paths are repo-root-relative globs, wherever the policy file lives.
54
+ # .agentic-owners/policy.yml at any depth; the closest policy wins.
54
55
  version: 1
55
56
  policies:
56
57
  - paths: ["docs/**"]
57
58
  always_approve: true
58
59
  - paths: ["src/api/**"]
59
- team: acme/platform # or user: alice
60
+ team: platform # bare slug in the repo's org; or acme/platform, or user: alice
60
61
  prompt: api-review.md # optional extra rubric, same directory
61
62
  - paths: ["src/billing/**"]
62
- user: alice
63
- human_review_required: true # the agent never approves; a person must
63
+ users: [alice, bob]
64
+ mode: hard # the agent never approves; a person must
64
65
  ```
65
66
 
66
- `self_review: true` lets a listed owner's own PRs clear their rule.
67
- `global_exclusions` in the root policy opts paths out entirely.
67
+ `paths` are globs relative to the directory that holds the
68
+ `.agentic-owners/` folder, so a root policy sees repo-relative paths and
69
+ `src/.agentic-owners/policy.yml` matches `api/**` against
70
+ `src/api/**`. Leading `../` segments reach a sibling tree. A path cannot
71
+ escape the repo.
72
+
73
+ | Key | Meaning |
74
+ | --- | --- |
75
+ | `paths` | Globs relative to the policy's directory. Required. |
76
+ | `team` / `teams` | Owner teams. A bare slug resolves in the repo's org. An `org/team` handle names a team directly. |
77
+ | `user` / `users` | Owner GitHub logins, without `@`. |
78
+ | `prompt` | Markdown filename in the same directory, added to the rubric for matching PRs. |
79
+ | `mode` | `advisory` (default): low risk approves. `hard`: a person must approve. `notify`: the rule never blocks and its owners are not requested. |
80
+ | `human_review_required` | `true` is the older spelling of `mode: hard`. |
81
+ | `self_review` | A listed `user:` owner's own PRs clear this rule. |
82
+ | `always_approve` | Satisfied at every risk tier. Cannot combine with owners, `prompt`, `mode`, `self_review`, or `human_review_required`. |
83
+
84
+ A rule without owners must set `always_approve: true`.
85
+ `global_exclusions` in the root policy opts paths out entirely. The
86
+ agent rejects `delegated_automations`: nothing in this template consumes
87
+ automation approvals.
68
88
 
69
89
  ## What one review does
70
90
 
71
91
  One model turn per PR head assesses the host-fetched diff against the
72
- base rubric plus any matched rule prompts, then records a verdict with
92
+ base rubric plus any matched rule prompts, then records a risk tier of
93
+ `very_low`, `low`, `medium`, `medium_high`, or `high` with
73
94
  `record_review`. The host recomputes the policy from trusted state and
74
95
  applies the deterministic decision:
75
96
 
76
- - **Approve** when the tier is low and no matched rule demands a human,
77
- bound to the head SHA.
97
+ - **Approve** when every matched rule is `always_approve` or `notify`,
98
+ or when the tier is very low or low and every matched `hard` rule is
99
+ cleared by an owner-author with `self_review`. At medium and above,
100
+ the agent approves only when the author's `self_review` covers every
101
+ rule that can require review.
78
102
  - **Request reviewers** otherwise: the policy owners (max 2, never the
79
103
  author), plus one status comment the agent keeps updated in place.
80
104
 
105
+ An approval binds to the head SHA, and a later hold dismisses the
106
+ agent's earlier approvals. The agent also holds when the PR edits
107
+ `.agentic-owners/` or `CODEOWNERS`, when the diff is empty or truncated,
108
+ or when GitHub capped the changed-file list. `self_review` never clears
109
+ a governance edit.
110
+
81
111
  The model never writes to GitHub. A broken policy file fails closed with
82
- a comment listing the validation issues.
112
+ a comment listing the validation issues. Team membership is not
113
+ resolved, because repo-scoped credentials cannot read org teams, so
114
+ `self_review` applies to `user:` owners only.
83
115
 
84
116
  ## Rubric
85
117
 
@@ -91,9 +123,9 @@ next to the policy that names them. The next review reads both.
91
123
 
92
124
  Use the three smoke reviews as a local exercise:
93
125
 
94
- ```text
126
+ ```bash
95
127
  bdk eval
96
128
  ```
97
129
 
98
- Three smoke reviews (docs-only, auth deletion, prompt injection). Eval
99
- sessions skip GitHub writes.
130
+ The cases are a docs-only change, an auth deletion, and a prompt
131
+ injection. Eval sessions skip GitHub writes.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cursor/bdk",
3
- "version": "0.2.23",
3
+ "version": "0.2.25",
4
4
  "description": "Build, test, and deploy BDK bots and agents as code on Cursor's agent harness.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "repository": {
@@ -141,6 +141,13 @@
141
141
  "import": "./dist/channels/bitbucket/index.js",
142
142
  "default": "./dist/channels/bitbucket/index.js"
143
143
  },
144
+ "./channels/pagerduty": {
145
+ "anysphere-source": "./src/channels/pagerduty/index.ts",
146
+ "bun": "./dist/channels/pagerduty/index.js",
147
+ "types": "./dist/channels/pagerduty/index.d.ts",
148
+ "import": "./dist/channels/pagerduty/index.js",
149
+ "default": "./dist/channels/pagerduty/index.js"
150
+ },
144
151
  "./channels/deployments": {
145
152
  "anysphere-source": "./src/channels/deployments/index.ts",
146
153
  "types": "./dist/channels/deployments/index.d.ts",
@@ -329,17 +336,14 @@
329
336
  "ms": "^2.1.3",
330
337
  "proper-lockfile": "^4.1.2",
331
338
  "slackify-markdown": "^5.0.0",
332
- "tsx": "^4.0.0",
333
- "zod": "^3.25.0",
334
- "zod-to-json-schema": "^3.24.5"
339
+ "tsx": "4.23.15",
340
+ "zod-to-json-schema": "^3.25.2"
341
+ },
342
+ "peerDependencies": {
343
+ "zod": "^3.25.0 || ^4.0.0"
335
344
  },
336
345
  "devDependencies": {
337
346
  "@braintree/sanitize-url": "7.1.2",
338
- "@cursor/sdk-darwin-arm64": "1.0.37",
339
- "@cursor/sdk-darwin-x64": "1.0.37",
340
- "@cursor/sdk-linux-arm64": "1.0.37",
341
- "@cursor/sdk-linux-x64": "1.0.37",
342
- "@cursor/sdk-win32-x64": "1.0.37",
343
347
  "@stylexswc/rs-compiler": "^0.18.0",
344
348
  "@tanstack/react-virtual": "3.13.23",
345
349
  "@types/js-yaml": "4.0.9",
@@ -347,33 +351,34 @@
347
351
  "@types/node": "22.14.1",
348
352
  "@types/pg": "^8.16.0",
349
353
  "@types/proper-lockfile": "^4.1.4",
350
- "@types/react": "^19.0.0",
351
- "@types/react-dom": "^19.0.0",
354
+ "@types/react": "19.3.0",
355
+ "@types/react-dom": "19.3.0",
352
356
  "@typescript/native": "npm:typescript@^7.0.2",
353
- "@vitejs/plugin-react": "^5.1.2",
357
+ "@vitejs/plugin-react": "6.1.2",
354
358
  "cytoscape": "3.33.3",
355
359
  "cytoscape-cose-bilkent": "4.1.0",
356
360
  "dayjs": "1.11.20",
357
361
  "mermaid": "^11.14.0",
358
362
  "pg": "^8.18.0",
359
363
  "pretty-ms": "^9.2.0",
360
- "react": "^19.2.1",
361
- "react-dom": "^19.2.1",
364
+ "react": "19.3.0",
365
+ "react-dom": "19.3.0",
362
366
  "react-markdown": "^10.1.0",
363
367
  "rehype-highlight": "^7.0.2",
364
368
  "remark-gfm": "^4.0.1",
365
369
  "typescript": "npm:@typescript/typescript6@^6.0.2",
366
- "vite": "^7.3.0",
370
+ "vite": "8.3.1",
367
371
  "vitepress": "1.6.4",
368
372
  "vitepress-plugin-mermaid": "^2.0.17",
369
- "vitest": "^4.0.18",
373
+ "vitest": "5.0.3",
370
374
  "yaml": "^2.4.2",
375
+ "zod": "4.6.5",
371
376
  "zustand": "^5.0.9",
372
377
  "@anysphere/agent-exec": "1.0.0",
378
+ "@anysphere/agent-store-sync": "1.0.0",
373
379
  "@anysphere/proto": "1.0.0",
374
380
  "@anysphere/context": "1.0.0",
375
- "@anysphere/ui": "1.0.0",
376
- "@anysphere/agent-store-sync": "1.0.0"
381
+ "@anysphere/ui": "1.0.0"
377
382
  },
378
383
  "scripts": {
379
384
  "build": "tsc -p tsconfig.build.json && node scripts/bundle-publish-shims.mjs && node scripts/copy-extension-assets.mjs && pnpm run build:playground && pnpm run docs:build",
@@ -396,4 +401,4 @@
396
401
  "smoke-publish": "node scripts/smoke-publish-artifact.mjs",
397
402
  "publish-check": "pnpm run build && pnpm run verify-publish && pnpm run smoke-publish"
398
403
  }
399
- }
404
+ }
@@ -393,5 +393,5 @@ After the deploy is running:
393
393
  `bdk session <ses_...> --prod --slug <slug>` until the latest run
394
394
  finishes.
395
395
 
396
- The [deploy skill](../deploy/SKILL.md) covers deploys with an attached
396
+ The deploy skill (`skills/deploy/SKILL.md`) covers deploys with an attached
397
397
  service account.
@@ -22,10 +22,26 @@ Public surface (use one of these):
22
22
  2. `serve(dir, { otel: { … } })`. `otel: false` disables env and
23
23
  authored config.
24
24
 
25
- `defineOtel` / `bot/otel.ts` is factory-only
26
- (`@cursor/bdk/internal/otel`). Do not import that path from a
27
- customer agent. Hosted secrets can arrive after startup; env and
28
- `serve({ otel })` are the supported public late-bind.
25
+ Metrics use delta temporality by default. For Grafana Cloud, set
26
+ `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=cumulative`.
27
+
28
+ `bot/otel.ts` is factory-only. Import `defineOtel` from
29
+ `@cursor/bdk/internal/otel` only in a Cursor factory agent.
30
+ A customer agent uses the environment variables above.
31
+
32
+ Hosted agents:
33
+
34
+ - Set `OTEL_EXPORTER_OTLP_ENDPOINT` and
35
+ `OTEL_EXPORTER_OTLP_HEADERS` with `bdk secrets set`. Add the
36
+ collector host to `hosting.egressDomains`.
37
+ - Header values are URL-encoded (`Authorization=Basic%20...`).
38
+ - A new header from `bdk secrets set` applies on the next export.
39
+ You do not redeploy for a token change.
40
+ - BDK logs an error when an exporter host is not in
41
+ `hosting.egressDomains`.
42
+ - Spans and metrics from before the first request are not exported.
43
+ - If the OpenTelemetry config fails, BDK logs the error and the
44
+ request still completes.
29
45
 
30
46
  | Signal | Default |
31
47
  | --- | --- |
@@ -34,9 +50,10 @@ customer agent. Hosted secrets can arrive after startup; env and
34
50
  | Logs | off (`logs: true` or `OTEL_LOGS_EXPORTER=otlp`) |
35
51
 
36
52
  Prompt text and tool payloads stay off the wire unless you set
37
- `OTEL_LOG_USER_PROMPTS` / `OTEL_LOG_TOOL_CONTENT`. A failed tool
38
- span status includes a short failure reason. BDK keeps its own
39
- exporters when the process already has a provider.
53
+ `OTEL_LOG_USER_PROMPTS` / `OTEL_LOG_TOOL_CONTENT`. A failed tool's
54
+ span status and its `action.result` log include a short failure
55
+ reason. BDK keeps its own exporters when the process already has a
56
+ provider.
40
57
 
41
58
  ## Custom metrics
42
59
 
@@ -51,7 +51,12 @@ policies:
51
51
  `self_review: true` lets a listed `user:` owner's own PRs auto-approve
52
52
  (team membership is not resolved with repo-scoped credentials, so team
53
53
  ownership stays fail-closed for authors). `global_exclusions` (root
54
- policy only) opts paths out entirely.
54
+ policy only) opts paths out entirely. `global_overrides` (root policy
55
+ only, `self_review: true` required) let their owners self-review a file
56
+ whose advisory winner they do not own. They add no owners and leave a file
57
+ with no owner unowned. They leave exclusions, always-approve, hard, and
58
+ notify winners unchanged, and they skip a `skip_teams` team or a
59
+ `skip_paths` path.
55
60
 
56
61
  ## What the agent does
57
62
 
@@ -140,16 +140,42 @@ export function authorOwnsRule(
140
140
  return rule.users.some((user) => normalizeHandle(user) === handle);
141
141
  }
142
142
 
143
+ /**
144
+ * Whether the author may clear `rule` by self-review. A merged override
145
+ * records who may self-review in `selfReviewTeams` / `selfReviewUsers`:
146
+ * the winner's owners when that rule sets `self_review`, and the override's
147
+ * owners when the override sets it.
148
+ */
149
+ export function authorMaySelfReview(
150
+ rule: AgenticOwnersPathRule,
151
+ author: ApprovalAuthor | undefined,
152
+ ): boolean {
153
+ if (!rule.selfReview) {
154
+ return false;
155
+ }
156
+ if (rule.selfReviewTeams === undefined && rule.selfReviewUsers === undefined) {
157
+ return authorOwnsRule(rule, author);
158
+ }
159
+ return authorOwnsRule(
160
+ {
161
+ ...rule,
162
+ teams: rule.selfReviewTeams ?? [],
163
+ users: rule.selfReviewUsers ?? [],
164
+ },
165
+ author,
166
+ );
167
+ }
168
+
143
169
  /**
144
170
  * The first matched rule (closest-match order is preserved) for which the author
145
- * is an owner AND `self_review` is enabled — i.e. the rule that authorizes the
146
- * author to approve their own change. Undefined when none applies.
171
+ * may self-review — the rule that authorizes the author to approve their own
172
+ * change. Undefined when none applies.
147
173
  */
148
174
  function selfReviewRuleForAuthor(
149
175
  matchedRules: readonly AgenticOwnersPathRule[],
150
176
  author: ApprovalAuthor | undefined,
151
177
  ): AgenticOwnersPathRule | undefined {
152
- return matchedRules.find((rule) => rule.selfReview && authorOwnsRule(rule, author));
178
+ return matchedRules.find((rule) => authorMaySelfReview(rule, author));
153
179
  }
154
180
 
155
181
  /**
@@ -180,7 +206,7 @@ export function authorSelfReviewCoversMatchedRules(
180
206
  );
181
207
  return (
182
208
  reviewCapableRules.length > 0 &&
183
- reviewCapableRules.every((rule) => rule.selfReview && authorOwnsRule(rule, author))
209
+ reviewCapableRules.every((rule) => authorMaySelfReview(rule, author))
184
210
  );
185
211
  }
186
212
 
@@ -384,7 +410,7 @@ function baseApprovalVerdict(input: {
384
410
  // owner self_review on that same rule. Low-risk auto-approve never clears a
385
411
  // hard gate without self_review.
386
412
  const blockingHardGate = reviewRequiredRules.find(
387
- (rule) => ruleIsHardGate(rule) && !(rule.selfReview && authorOwnsRule(rule, author)),
413
+ (rule) => ruleIsHardGate(rule) && !authorMaySelfReview(rule, author),
388
414
  );
389
415
  if (blockingHardGate !== undefined) {
390
416
  return requestVerdict("a matched policy requires human review");
@@ -0,0 +1,60 @@
1
+ // Vendored from the Agentic Owners policy core; see README.md in this
2
+ // directory. Precedence must stay identical to the source's.
3
+
4
+ import type { AgenticOwnersPathRule } from "./types.js";
5
+
6
+ /**
7
+ * Winners a root `global_overrides` entry must not change: owner-clearing
8
+ * carve-outs, hard gates, and notify rules.
9
+ */
10
+ export function blocksGlobalOverride(rule: AgenticOwnersPathRule): boolean {
11
+ return (
12
+ rule.globalExclusion === true ||
13
+ rule.alwaysApprove ||
14
+ rule.mode === "hard" ||
15
+ rule.humanReviewRequired ||
16
+ rule.mode === "notify"
17
+ );
18
+ }
19
+
20
+ function unionOwners(lists: readonly (readonly string[])[]): string[] {
21
+ return [...new Set(lists.flat())];
22
+ }
23
+
24
+ function selfReviewOwners(rule: AgenticOwnersPathRule): {
25
+ readonly selfReviewTeams: readonly string[];
26
+ readonly selfReviewUsers: readonly string[];
27
+ } {
28
+ return {
29
+ selfReviewTeams: rule.selfReviewTeams ?? rule.teams,
30
+ selfReviewUsers: rule.selfReviewUsers ?? rule.users,
31
+ };
32
+ }
33
+
34
+ /**
35
+ * Let override owners clear a file the winner owns by self-review. The
36
+ * winner's owners, reviewers, and lane are unchanged, so an author outside the
37
+ * override needs exactly the review they would without it. The winner's
38
+ * owners self-review only when the winner sets `self_review`. An override
39
+ * whose `self_review` a policy edit withheld grants nothing.
40
+ */
41
+ export function mergeGlobalOverride(
42
+ winner: AgenticOwnersPathRule,
43
+ overrides: readonly AgenticOwnersPathRule[],
44
+ ): AgenticOwnersPathRule {
45
+ const granting = overrides.filter((rule) => rule.selfReview);
46
+ if (granting.length === 0) {
47
+ return winner;
48
+ }
49
+ const selfReviewers = winner.selfReview ? [winner, ...granting] : granting;
50
+ return {
51
+ ...winner,
52
+ selfReview: true,
53
+ selfReviewTeams: unionOwners(
54
+ selfReviewers.map((rule) => selfReviewOwners(rule).selfReviewTeams),
55
+ ),
56
+ selfReviewUsers: unionOwners(
57
+ selfReviewers.map((rule) => selfReviewOwners(rule).selfReviewUsers),
58
+ ),
59
+ };
60
+ }
@@ -3,6 +3,7 @@
3
3
 
4
4
  import { posix } from "node:path";
5
5
  import { AGENTIC_OWNERS_DIR } from "./constants.js";
6
+ import { blocksGlobalOverride, mergeGlobalOverride } from "./globalOverride.js";
6
7
  import { patternMatchesFile, patternSpecificity } from "./matching.js";
7
8
  import type {
8
9
  AgenticOwnersMatchedConfig,
@@ -16,6 +17,11 @@ type PathScopedRule = {
16
17
  readonly paths: readonly string[];
17
18
  /** Root-only repository-wide exemption, produced from `global_exclusions`. */
18
19
  readonly globalExclusion?: boolean;
20
+ /**
21
+ * Root `global_overrides` entry. Applied after precedence, not as a
22
+ * candidate for it.
23
+ */
24
+ readonly globalOverride?: boolean;
19
25
  };
20
26
 
21
27
  /**
@@ -116,23 +122,84 @@ function compareRulePrecedence(
116
122
  return left.sourcePath.localeCompare(right.sourcePath);
117
123
  }
118
124
 
119
- function pickWinningRuleForFile<T extends PathScopedRule>({
120
- filepath,
121
- rules,
122
- }: {
123
- filepath: string;
124
- rules: readonly T[];
125
- }): T | undefined {
126
- let winner: T | undefined;
127
- for (const rule of rules) {
125
+ function selectRuleForFile(
126
+ filepath: string,
127
+ rules: readonly AgenticOwnersPathRule[],
128
+ ): {
129
+ readonly winner: { readonly rule: AgenticOwnersPathRule; readonly order: number } | undefined;
130
+ readonly overrides: readonly { readonly rule: AgenticOwnersPathRule; readonly order: number }[];
131
+ } {
132
+ let winner: { readonly rule: AgenticOwnersPathRule; readonly order: number } | undefined;
133
+ const overrides: { readonly rule: AgenticOwnersPathRule; readonly order: number }[] = [];
134
+ for (const [order, rule] of rules.entries()) {
128
135
  if (!ruleMatchesFile({ rule, filepath })) {
129
136
  continue;
130
137
  }
131
- if (winner === undefined || compareRulePrecedence(rule, winner, filepath) > 0) {
132
- winner = rule;
138
+ if (rule.globalOverride === true) {
139
+ overrides.push({ rule, order });
140
+ continue;
141
+ }
142
+ if (winner === undefined || compareRulePrecedence(rule, winner.rule, filepath) > 0) {
143
+ winner = { rule, order };
133
144
  }
134
145
  }
135
- return winner;
146
+ return { winner, overrides };
147
+ }
148
+
149
+ function teamsSkippedByOverride(
150
+ winner: AgenticOwnersPathRule,
151
+ override: AgenticOwnersPathRule,
152
+ ): boolean {
153
+ const skipped = override.skipTeams;
154
+ if (skipped === undefined || skipped.length === 0) {
155
+ return false;
156
+ }
157
+ const names = new Set(skipped.map((team) => team.trim().toLowerCase()));
158
+ return winner.teams.some((team) => names.has(team.trim().toLowerCase()));
159
+ }
160
+
161
+ function overrideAppliesToFile(
162
+ override: AgenticOwnersPathRule,
163
+ winner: AgenticOwnersPathRule,
164
+ filepath: string,
165
+ ): boolean {
166
+ if (teamsSkippedByOverride(winner, override)) {
167
+ return false;
168
+ }
169
+ const skipPaths = override.skipPaths;
170
+ if (skipPaths === undefined || skipPaths.length === 0) {
171
+ return true;
172
+ }
173
+ return !ruleMatchesFile({ rule: { ...override, paths: skipPaths }, filepath });
174
+ }
175
+
176
+ function effectiveRuleSelector(
177
+ rules: readonly AgenticOwnersPathRule[],
178
+ ): (filepath: string) => AgenticOwnersPathRule | undefined {
179
+ const cache = new Map<string, AgenticOwnersPathRule>();
180
+ return (filepath) => {
181
+ const { winner, overrides } = selectRuleForFile(filepath, rules);
182
+ if (winner === undefined || blocksGlobalOverride(winner.rule)) {
183
+ return winner?.rule;
184
+ }
185
+ const applicable = overrides.filter((entry) =>
186
+ overrideAppliesToFile(entry.rule, winner.rule, filepath),
187
+ );
188
+ if (applicable.length === 0) {
189
+ return winner.rule;
190
+ }
191
+ const key = `${winner.order}:${applicable.map((entry) => entry.order).join(",")}`;
192
+ const cached = cache.get(key);
193
+ if (cached !== undefined) {
194
+ return cached;
195
+ }
196
+ const effective = mergeGlobalOverride(
197
+ winner.rule,
198
+ applicable.map((entry) => entry.rule),
199
+ );
200
+ cache.set(key, effective);
201
+ return effective;
202
+ };
136
203
  }
137
204
 
138
205
  export function matchRepoConfigForChangedFiles({
@@ -147,8 +214,9 @@ export function matchRepoConfigForChangedFiles({
147
214
  // file path would silently drop one (e.g. a hard-gate rule lost behind an
148
215
  // advisory rule from the same policy).
149
216
  const winners = new Set<AgenticOwnersPathRule>();
217
+ const ruleForFile = effectiveRuleSelector(config.rules);
150
218
  for (const filepath of changedFiles) {
151
- const winner = pickWinningRuleForFile({ filepath, rules: config.rules });
219
+ const winner = ruleForFile(filepath);
152
220
  if (winner !== undefined) {
153
221
  winners.add(winner);
154
222
  }
@@ -175,9 +243,8 @@ export function changedFilesWithoutWinningRule({
175
243
  changedFiles: readonly string[];
176
244
  rules: readonly AgenticOwnersPathRule[];
177
245
  }): string[] {
178
- return changedFiles.filter(
179
- (filepath) => pickWinningRuleForFile({ filepath, rules }) === undefined,
180
- );
246
+ const ruleForFile = effectiveRuleSelector(rules);
247
+ return changedFiles.filter((filepath) => ruleForFile(filepath) === undefined);
181
248
  }
182
249
 
183
250
  /**
@@ -198,9 +265,8 @@ export function everyChangedFileGloballyExcluded({
198
265
  if (changedFiles.length === 0) {
199
266
  return false;
200
267
  }
201
- return changedFiles.every(
202
- (filepath) => pickWinningRuleForFile({ filepath, rules })?.globalExclusion === true,
203
- );
268
+ const ruleForFile = effectiveRuleSelector(rules);
269
+ return changedFiles.every((filepath) => ruleForFile(filepath)?.globalExclusion === true);
204
270
  }
205
271
 
206
272
  function hasOwners(rule: AgenticOwnersPathRule): boolean {