@cursor/bdk 0.2.24 → 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 (290) hide show
  1. package/AGENTS.md +1 -0
  2. package/dist/bin/agent-serve.d.ts +1 -1
  3. package/dist/bin/agent-serve.js +48 -12
  4. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +3 -2
  5. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  6. package/dist/channels/bitbucket/bitbucket-webhook.js +14 -9
  7. package/dist/channels/github/github-channel.d.ts.map +1 -1
  8. package/dist/channels/github/github-channel.js +9 -18
  9. package/dist/channels/pagerduty/api.d.ts +74 -0
  10. package/dist/channels/pagerduty/api.d.ts.map +1 -0
  11. package/dist/channels/pagerduty/api.js +101 -0
  12. package/dist/channels/pagerduty/defaults.d.ts +42 -0
  13. package/dist/channels/pagerduty/defaults.d.ts.map +1 -0
  14. package/dist/channels/pagerduty/defaults.js +132 -0
  15. package/dist/channels/pagerduty/events.d.ts +24 -0
  16. package/dist/channels/pagerduty/events.d.ts.map +1 -0
  17. package/dist/channels/pagerduty/events.js +38 -0
  18. package/dist/channels/pagerduty/index.d.ts +31 -0
  19. package/dist/channels/pagerduty/index.d.ts.map +1 -0
  20. package/dist/channels/pagerduty/index.js +30 -0
  21. package/dist/channels/pagerduty/pagerduty-channel.d.ts +64 -0
  22. package/dist/channels/pagerduty/pagerduty-channel.d.ts.map +1 -0
  23. package/dist/channels/pagerduty/pagerduty-channel.js +195 -0
  24. package/dist/channels/pagerduty/pagerduty-webhook.d.ts +70 -0
  25. package/dist/channels/pagerduty/pagerduty-webhook.d.ts.map +1 -0
  26. package/dist/channels/pagerduty/pagerduty-webhook.js +280 -0
  27. package/dist/channels/pagerduty/payload.d.ts +33 -0
  28. package/dist/channels/pagerduty/payload.d.ts.map +1 -0
  29. package/dist/channels/pagerduty/payload.js +150 -0
  30. package/dist/channels/pagerduty/replay.d.ts +35 -0
  31. package/dist/channels/pagerduty/replay.d.ts.map +1 -0
  32. package/dist/channels/pagerduty/replay.js +115 -0
  33. package/dist/channels/pagerduty/secrets.d.ts +16 -0
  34. package/dist/channels/pagerduty/secrets.d.ts.map +1 -0
  35. package/dist/channels/pagerduty/secrets.js +23 -0
  36. package/dist/channels/pagerduty/self-user.d.ts +51 -0
  37. package/dist/channels/pagerduty/self-user.d.ts.map +1 -0
  38. package/dist/channels/pagerduty/self-user.js +157 -0
  39. package/dist/channels/pagerduty/state.d.ts +31 -0
  40. package/dist/channels/pagerduty/state.d.ts.map +1 -0
  41. package/dist/channels/pagerduty/state.js +30 -0
  42. package/dist/channels/pagerduty/types.d.ts +217 -0
  43. package/dist/channels/pagerduty/types.d.ts.map +1 -0
  44. package/dist/channels/pagerduty/types.js +1 -0
  45. package/dist/channels.d.ts +6 -0
  46. package/dist/channels.d.ts.map +1 -1
  47. package/dist/channels.js +11 -23
  48. package/dist/docs/404.html +2 -2
  49. package/dist/docs/assets/{app.DTIg0uKK.js → app.BjS1QEI4.js} +4 -4
  50. package/dist/docs/assets/chunks/@localSearchIndexroot.oGqZumnJ.js +1 -0
  51. package/dist/docs/assets/chunks/{VPLocalSearchBox.BpJoSaxi.js → VPLocalSearchBox.BOuvjb5Y.js} +1 -1
  52. package/dist/docs/assets/chunks/{arc.ylgNvRNq.js → arc.3WR6Jf-y.js} +1 -1
  53. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.BMrNJqYk.js → architectureDiagram-Q4EWVU46.Dtb6Dqh6.js} +1 -1
  54. package/dist/docs/assets/chunks/{baseUniq.BBWUEqf9.js → baseUniq.BUyrgrZE.js} +1 -1
  55. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DFMu-Vza.js → blockDiagram-DXYQGD6D.BVLV_voZ.js} +1 -1
  56. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.8nkAAxWv.js → c4Diagram-AHTNJAMY.jXJ1q70M.js} +1 -1
  57. package/dist/docs/assets/chunks/channel.Dt4aweTm.js +1 -0
  58. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.sO-z2Bag.js → chunk-4BX2VUAB.zz1SMBvK.js} +1 -1
  59. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.BMROzTMq.js → chunk-4TB4RGXK.CzYKuv3I.js} +1 -1
  60. package/dist/docs/assets/chunks/{chunk-55IACEB6.X81urwg7.js → chunk-55IACEB6.C7_tcJZD.js} +1 -1
  61. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.eaZVFLZM.js → chunk-EDXVE4YY.DeTwQPVO.js} +1 -1
  62. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CmZhzstR.js → chunk-FMBD7UC4.DhMTl7ut.js} +1 -1
  63. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CTezt9Lc.js → chunk-OYMX7WX6.Me7f5hEp.js} +1 -1
  64. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.s-T8zukB.js → chunk-QZHKN3VN.D0E0Bb6g.js} +1 -1
  65. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.DN4Nhy-D.js → chunk-YZCP3GAM.CdOOBFYL.js} +1 -1
  66. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DGUHZs6j.js +1 -0
  67. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DGUHZs6j.js +1 -0
  68. package/dist/docs/assets/chunks/clone.DWf3k0Z0.js +1 -0
  69. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Cqyp4BUH.js → cose-bilkent-S5V4N54A.BNbGESzN.js} +1 -1
  70. package/dist/docs/assets/chunks/{dagre-KV5264BT.BIECOiqR.js → dagre-KV5264BT.zU7Lu_xJ.js} +1 -1
  71. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.1tLyWoTg.js → diagram-5BDNPKRD.B9qOdE5h.js} +1 -1
  72. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.BVY_6VMO.js → diagram-G4DWMVQ6.D8X-sf77.js} +1 -1
  73. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BSZ7xiBB.js → diagram-MMDJMWI5.CW7MvMlE.js} +1 -1
  74. package/dist/docs/assets/chunks/{diagram-TYMM5635.Bho6GmLh.js → diagram-TYMM5635.J489G0Nd.js} +1 -1
  75. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.A0yVIANn.js → erDiagram-SMLLAGMA.BkW7tGfs.js} +1 -1
  76. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.ZMgbllH6.js → flowDiagram-DWJPFMVM.jc9iWORD.js} +1 -1
  77. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.BCCPBhXo.js → ganttDiagram-T4ZO3ILL.B-UQfd9E.js} +1 -1
  78. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.BOkL0BbA.js → gitGraphDiagram-UUTBAWPF.DFzrTSlJ.js} +1 -1
  79. package/dist/docs/assets/chunks/{graph.DMyZPu86.js → graph.C5IB6_e_.js} +1 -1
  80. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.CjG1IiEw.js → infoDiagram-42DDH7IO.DwF0-c8L.js} +1 -1
  81. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.UCe-kq9g.js → ishikawaDiagram-UXIWVN3A.fBaTqzE7.js} +1 -1
  82. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.3WyOK_eY.js → journeyDiagram-VCZTEJTY.CM8gDVJy.js} +1 -1
  83. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.WoRG2qY1.js → kanban-definition-6JOO6SKY.YiD1p0LB.js} +1 -1
  84. package/dist/docs/assets/chunks/{layout.DV07xDd5.js → layout.6Um-DVJT.js} +1 -1
  85. package/dist/docs/assets/chunks/{linear.CTO8mN6o.js → linear.DcTeg4Hn.js} +1 -1
  86. package/dist/docs/assets/chunks/{min.SvTtcKuZ.js → min.CIxkY8Fe.js} +1 -1
  87. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.DMGgQ-HB.js → mindmap-definition-QFDTVHPH.D4QM_voR.js} +1 -1
  88. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B7851apI.js → pieDiagram-DEJITSTG.nmB309G1.js} +1 -1
  89. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CEqyypIX.js → quadrantDiagram-34T5L4WZ.D1HtZR3C.js} +1 -1
  90. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.C3Mwsw-H.js → requirementDiagram-MS252O5E.CZgQWob-.js} +1 -1
  91. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DyYK0XxY.js → sankeyDiagram-XADWPNL6.DtiBfU-P.js} +1 -1
  92. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.SiQPH-XM.js → sequenceDiagram-FGHM5R23.Cld4gDSt.js} +1 -1
  93. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CTJMsP4p.js → stateDiagram-FHFEXIEX.DatP823_.js} +1 -1
  94. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C0571l4D.js +1 -0
  95. package/dist/docs/assets/chunks/{theme.DJo4my9R.js → theme.D5jbBys7.js} +2 -2
  96. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.CxSNRlQ6.js → timeline-definition-GMOUNBTQ.DwQLI2be.js} +1 -1
  97. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BdoJskyD.js → vennDiagram-DHZGUBPP.a5yMfnsa.js} +1 -1
  98. package/dist/docs/assets/chunks/wardley-RL74JXVD.B-FXivgT.js +162 -0
  99. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.IjIbFn_F.js → wardleyDiagram-NUSXRM2D.Dz--Opy3.js} +1 -1
  100. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CPUxDZLH.js → xychartDiagram-5P7HB3ND.Dl8w8TeT.js} +1 -1
  101. package/dist/docs/assets/{guides_opentelemetry.md.Ck1o2frw.js → guides_opentelemetry.md.DBQtp7_V.js} +4 -4
  102. package/dist/docs/assets/{guides_opentelemetry.md.Ck1o2frw.lean.js → guides_opentelemetry.md.DBQtp7_V.lean.js} +1 -1
  103. package/dist/docs/assets/guides_pagerduty.md.BHXMcMtx.js +60 -0
  104. package/dist/docs/assets/guides_pagerduty.md.BHXMcMtx.lean.js +1 -0
  105. package/dist/docs/assets/{reference_channels.md.DYg0CLud.js → reference_channels.md.Bxaa020x.js} +1 -1
  106. package/dist/docs/assets/{reference_cli.md.DB7Llw3T.js → reference_cli.md.1o_TqKdt.js} +7 -2
  107. package/dist/docs/assets/{reference_cli.md.DB7Llw3T.lean.js → reference_cli.md.1o_TqKdt.lean.js} +1 -1
  108. package/dist/docs/assets/{reference_tools.md.08XR7lIl.js → reference_tools.md.-6pypsWt.js} +1 -1
  109. package/dist/docs/building-with-agents.html +35 -35
  110. package/dist/docs/deployment.html +35 -35
  111. package/dist/docs/evals.html +35 -35
  112. package/dist/docs/guides/agent-to-agent.html +35 -35
  113. package/dist/docs/guides/bitbucket.html +36 -36
  114. package/dist/docs/guides/cloud-agents.html +35 -35
  115. package/dist/docs/guides/convert-automation.html +35 -35
  116. package/dist/docs/guides/export-grokbot.html +35 -35
  117. package/dist/docs/guides/github.html +35 -35
  118. package/dist/docs/guides/gitlab.html +35 -35
  119. package/dist/docs/guides/grokbot-agents.html +35 -35
  120. package/dist/docs/guides/hooks.html +35 -35
  121. package/dist/docs/guides/improve.html +35 -35
  122. package/dist/docs/guides/jev.html +35 -35
  123. package/dist/docs/guides/mcp-oauth.html +35 -35
  124. package/dist/docs/guides/migrate.html +35 -35
  125. package/dist/docs/guides/opentelemetry.html +39 -39
  126. package/dist/docs/guides/opentelemetry.md +10 -5
  127. package/dist/docs/guides/pagerduty.html +119 -0
  128. package/dist/docs/guides/pagerduty.md +336 -0
  129. package/dist/docs/guides/slack.html +35 -35
  130. package/dist/docs/guides/webhooks.html +35 -35
  131. package/dist/docs/hashmap.json +1 -1
  132. package/dist/docs/hillclimbing.html +35 -35
  133. package/dist/docs/index.html +35 -35
  134. package/dist/docs/llms-full.txt +381 -6
  135. package/dist/docs/llms.txt +1 -0
  136. package/dist/docs/quickstart.html +35 -35
  137. package/dist/docs/reference/agent-config.html +35 -35
  138. package/dist/docs/reference/artifacts.html +35 -35
  139. package/dist/docs/reference/channels.html +37 -37
  140. package/dist/docs/reference/channels.md +2 -1
  141. package/dist/docs/reference/cli.html +42 -37
  142. package/dist/docs/reference/cli.md +27 -0
  143. package/dist/docs/reference/connections.html +35 -35
  144. package/dist/docs/reference/evals.html +35 -35
  145. package/dist/docs/reference/extensions.html +36 -36
  146. package/dist/docs/reference/hooks.html +35 -35
  147. package/dist/docs/reference/http-api.html +35 -35
  148. package/dist/docs/reference/instructions.html +35 -35
  149. package/dist/docs/reference/memory.html +35 -35
  150. package/dist/docs/reference/playground.html +35 -35
  151. package/dist/docs/reference/project-layout.html +35 -35
  152. package/dist/docs/reference/prompt.html +35 -35
  153. package/dist/docs/reference/schedules.html +35 -35
  154. package/dist/docs/reference/sessions.html +35 -35
  155. package/dist/docs/reference/skills.html +35 -35
  156. package/dist/docs/reference/subagents.html +35 -35
  157. package/dist/docs/reference/tools.html +37 -37
  158. package/dist/docs/reference/tools.md +1 -0
  159. package/dist/docs/templates/agentic-owners.html +35 -35
  160. package/dist/docs/templates/grokbot-agents.html +35 -35
  161. package/dist/docs/templates/security-reviewer.html +35 -35
  162. package/dist/docs/templates/thermo-quality-review.html +35 -35
  163. package/dist/docs/templates/thermo-review.html +35 -35
  164. package/dist/docs/templates/triage.html +35 -35
  165. package/dist/docs/troubleshooting.html +35 -35
  166. package/dist/internal/approval-gate.d.ts +4 -2
  167. package/dist/internal/approval-gate.d.ts.map +1 -1
  168. package/dist/internal/approval-gate.js +2 -1
  169. package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -1
  170. package/dist/internal/builtin-tools/artifacts.js +45 -12
  171. package/dist/internal/channel-architecture.d.ts +1 -1
  172. package/dist/internal/channel-architecture.d.ts.map +1 -1
  173. package/dist/internal/channel-architecture.js +4 -2
  174. package/dist/internal/cli-deploy.d.ts.map +1 -1
  175. package/dist/internal/cli-deploy.js +21 -12
  176. package/dist/internal/cli-pagerduty.d.ts +32 -0
  177. package/dist/internal/cli-pagerduty.d.ts.map +1 -0
  178. package/dist/internal/cli-pagerduty.js +242 -0
  179. package/dist/internal/continuation-channel.d.ts.map +1 -1
  180. package/dist/internal/continuation-channel.js +7 -0
  181. package/dist/internal/continuation-identity.d.ts +11 -3
  182. package/dist/internal/continuation-identity.d.ts.map +1 -1
  183. package/dist/internal/continuation-identity.js +83 -0
  184. package/dist/internal/deploy-manifest.d.ts +11 -4
  185. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  186. package/dist/internal/deploy-manifest.js +17 -5
  187. package/dist/internal/discovery/agent-config.d.ts.map +1 -1
  188. package/dist/internal/discovery/agent-config.js +10 -10
  189. package/dist/internal/discovery/agent.d.ts.map +1 -1
  190. package/dist/internal/discovery/agent.js +10 -10
  191. package/dist/internal/discovery/channels.d.ts.map +1 -1
  192. package/dist/internal/discovery/channels.js +20 -16
  193. package/dist/internal/discovery/context.d.ts +16 -0
  194. package/dist/internal/discovery/context.d.ts.map +1 -1
  195. package/dist/internal/discovery/context.js +66 -0
  196. package/dist/internal/discovery/extension-overlay.d.ts.map +1 -1
  197. package/dist/internal/discovery/extension-overlay.js +2 -6
  198. package/dist/internal/discovery/info.d.ts.map +1 -1
  199. package/dist/internal/discovery/info.js +3 -0
  200. package/dist/internal/discovery/instructions.d.ts.map +1 -1
  201. package/dist/internal/discovery/instructions.js +3 -6
  202. package/dist/internal/discovery/modules.d.ts.map +1 -1
  203. package/dist/internal/discovery/modules.js +3 -6
  204. package/dist/internal/discovery/project.d.ts +6 -0
  205. package/dist/internal/discovery/project.d.ts.map +1 -1
  206. package/dist/internal/discovery/project.js +27 -5
  207. package/dist/internal/discovery/runtime.d.ts.map +1 -1
  208. package/dist/internal/discovery/runtime.js +8 -8
  209. package/dist/internal/discovery.d.ts +1 -1
  210. package/dist/internal/discovery.d.ts.map +1 -1
  211. package/dist/internal/discovery.js +1 -1
  212. package/dist/internal/expected-delivery-failure.d.ts.map +1 -1
  213. package/dist/internal/expected-delivery-failure.js +6 -0
  214. package/dist/internal/filesystem/sdk-schemas.d.ts.map +1 -1
  215. package/dist/internal/filesystem/sdk-schemas.js +4 -3
  216. package/dist/internal/hmac-secret-values.d.ts +48 -0
  217. package/dist/internal/hmac-secret-values.d.ts.map +1 -0
  218. package/dist/internal/hmac-secret-values.js +68 -0
  219. package/dist/internal/host-platforms.d.ts.map +1 -1
  220. package/dist/internal/host-platforms.js +8 -2
  221. package/dist/internal/json-schema.d.ts +7 -7
  222. package/dist/internal/json-schema.d.ts.map +1 -1
  223. package/dist/internal/json-schema.js +13 -16
  224. package/dist/internal/otel/collector.d.ts.map +1 -1
  225. package/dist/internal/otel/collector.js +3 -1
  226. package/dist/internal/otel/config.d.ts +6 -1
  227. package/dist/internal/otel/config.d.ts.map +1 -1
  228. package/dist/internal/otel/config.js +27 -1
  229. package/dist/internal/otel/runtime.d.ts.map +1 -1
  230. package/dist/internal/otel/runtime.js +26 -3
  231. package/dist/internal/package-inline-stdio.d.ts.map +1 -1
  232. package/dist/internal/package-inline-stdio.js +21 -6
  233. package/dist/internal/sdk-runner.d.ts +2 -3
  234. package/dist/internal/sdk-runner.d.ts.map +1 -1
  235. package/dist/internal/sdk-runner.js +8 -4
  236. package/dist/internal/secret-alternatives.d.ts +11 -0
  237. package/dist/internal/secret-alternatives.d.ts.map +1 -0
  238. package/dist/internal/secret-alternatives.js +13 -0
  239. package/dist/internal/server.js +2 -2
  240. package/dist/internal/session-engine.d.ts.map +1 -1
  241. package/dist/internal/session-engine.js +5 -4
  242. package/dist/internal/sqlite-experimental-warning.d.ts +2 -0
  243. package/dist/internal/sqlite-experimental-warning.d.ts.map +1 -0
  244. package/dist/internal/sqlite-experimental-warning.js +22 -0
  245. package/dist/internal/testing/conversation-identity-vectors.d.ts +6 -1
  246. package/dist/internal/testing/conversation-identity-vectors.d.ts.map +1 -1
  247. package/dist/internal/testing/conversation-identity-vectors.js +34 -0
  248. package/dist/internal/testing/hmac-secret-vectors.d.ts +38 -0
  249. package/dist/internal/testing/hmac-secret-vectors.d.ts.map +1 -0
  250. package/dist/internal/testing/hmac-secret-vectors.js +89 -0
  251. package/dist/internal/testing/pagerduty-continuation-fixtures.d.ts +42 -0
  252. package/dist/internal/testing/pagerduty-continuation-fixtures.d.ts.map +1 -0
  253. package/dist/internal/testing/pagerduty-continuation-fixtures.js +175 -0
  254. package/dist/internal/zod-schema.d.ts +14 -0
  255. package/dist/internal/zod-schema.d.ts.map +1 -0
  256. package/dist/internal/zod-schema.js +22 -0
  257. package/dist/playground/assets/cursor-icons-16-DmHBTm1-.woff2 +0 -0
  258. package/dist/playground/assets/index-BdMwybMt.css +1 -0
  259. package/dist/playground/assets/{index-DKKdkF29.js → index-CHk6O92d.js} +38 -38
  260. package/dist/playground/index.html +2 -2
  261. package/dist/tools.d.ts +13 -10
  262. package/dist/tools.d.ts.map +1 -1
  263. package/dist/tools.js +3 -2
  264. package/dist/types.d.ts +67 -16
  265. package/dist/types.d.ts.map +1 -1
  266. package/docs/guides/opentelemetry.md +10 -5
  267. package/docs/guides/pagerduty.md +341 -0
  268. package/docs/reference/channels.md +2 -1
  269. package/docs/reference/cli.md +27 -0
  270. package/docs/reference/tools.md +1 -0
  271. package/package.json +10 -3
  272. package/skills/migrate-v2/SKILL.md +1 -1
  273. package/skills/otel/SKILL.md +7 -3
  274. package/templates/agentic-owners/README.md +6 -1
  275. package/templates/agentic-owners/bot/lib/owners/decision.ts +31 -5
  276. package/templates/agentic-owners/bot/lib/owners/globalOverride.ts +60 -0
  277. package/templates/agentic-owners/bot/lib/owners/match.ts +85 -19
  278. package/templates/agentic-owners/bot/lib/owners/parse.ts +133 -2
  279. package/templates/agentic-owners/bot/lib/owners/types.ts +23 -0
  280. package/dist/docs/assets/chunks/@localSearchIndexroot.3ebvCWKy.js +0 -1
  281. package/dist/docs/assets/chunks/channel.BOebySCN.js +0 -1
  282. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C55IaN-T.js +0 -1
  283. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C55IaN-T.js +0 -1
  284. package/dist/docs/assets/chunks/clone.D06pA7ML.js +0 -1
  285. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DddRVjeq.js +0 -1
  286. package/dist/docs/assets/chunks/wardley-RL74JXVD.CVCRSuQK.js +0 -162
  287. package/dist/playground/assets/cursor-icons-16-gwXtdAvu.woff2 +0 -0
  288. package/dist/playground/assets/index-DpKinTMs.css +0 -1
  289. /package/dist/docs/assets/{reference_channels.md.DYg0CLud.lean.js → reference_channels.md.Bxaa020x.lean.js} +0 -0
  290. /package/dist/docs/assets/{reference_tools.md.08XR7lIl.lean.js → reference_tools.md.-6pypsWt.lean.js} +0 -0
@@ -0,0 +1,51 @@
1
+ /**
2
+ * The PagerDuty user the agent acts as, for skipping its own echoed
3
+ * actions. Precedence: the authored `selfUserIds`, then the
4
+ * `PAGERDUTY_USER_ID` env var / deployment secret, then inference from the
5
+ * deployment's `PAGERDUTY_TOKEN`.
6
+ *
7
+ * Inference asks `GET /users/me`, which PagerDuty serves only to a
8
+ * user-level REST API key or an OAuth user token. An account-level REST
9
+ * API key or an OAuth app token has no user of its own; with
10
+ * `PAGERDUTY_FROM_EMAIL` set, the user whose email matches it exactly (the
11
+ * `From` user those tokens write as) is used instead. Results are cached
12
+ * in memory per credential set, never in agent storage.
13
+ */
14
+ import { type PagerDutyClientOptions } from "./api.js";
15
+ import type { PagerDutyChannelOptions } from "./types.js";
16
+ /** Env var / deployment secret naming the agent's own PagerDuty user id. */
17
+ export declare const PAGERDUTY_USER_ID_ENV = "PAGERDUTY_USER_ID";
18
+ export interface PagerDutySelfUserDeps {
19
+ fetch?: typeof fetch;
20
+ now?: () => number;
21
+ warn?: (line: string) => void;
22
+ }
23
+ /**
24
+ * The secret the agent's user id is read from: a named `selfUserIds`, else
25
+ * `PAGERDUTY_USER_ID`. `undefined` when the ids are authored in code.
26
+ */
27
+ export declare function pagerDutySelfUserIdSecretName(options: Pick<PagerDutyChannelOptions, "selfUserIds">): string | undefined;
28
+ /**
29
+ * The user ids the agent acts as, resolved per delivery. Authored ids, a
30
+ * getter, or a named secret are used as given and never fall back. With
31
+ * nothing authored, `PAGERDUTY_USER_ID` (one id) wins, else the id inferred
32
+ * from the channel's token (`PAGERDUTY_TOKEN` unless `token` is set).
33
+ * Empty when none resolves, which turns echo skip off.
34
+ */
35
+ export declare function resolvePagerDutySelfUserIds(input: {
36
+ options: Pick<PagerDutyChannelOptions, "selfUserIds" | "token" | "from" | "apiBaseUrl">;
37
+ deps?: PagerDutySelfUserDeps;
38
+ }): Promise<ReadonlySet<string>>;
39
+ /**
40
+ * The user the channel's token acts as (`token`, else `PAGERDUTY_TOKEN`),
41
+ * cached for an hour per base URL, token, and `From` email (an unresolved
42
+ * answer for five minutes). `undefined` without a token or when PagerDuty
43
+ * names no single user.
44
+ */
45
+ export declare function inferPagerDutySelfUserId(input?: {
46
+ credentials?: Pick<PagerDutyClientOptions, "token" | "from" | "apiBaseUrl">;
47
+ deps?: PagerDutySelfUserDeps;
48
+ }): Promise<string | undefined>;
49
+ /** Forget every inferred user, so the next delivery asks PagerDuty again. */
50
+ export declare function clearPagerDutySelfUserCache(): void;
51
+ //# sourceMappingURL=self-user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-user.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/self-user.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAKL,KAAK,sBAAsB,EAC5B,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAWzD,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,aAAa,CAAC,GACpD,MAAM,GAAG,SAAS,CAKpB;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE;IACvD,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC;IACxF,IAAI,CAAC,EAAE,qBAAqB,CAAC;CAC9B,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAiB/B;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,GAAE;IACL,WAAW,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC;IAC5E,IAAI,CAAC,EAAE,qBAAqB,CAAC;CACzB,GACL,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAiD7B;AAED,6EAA6E;AAC7E,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * The PagerDuty user the agent acts as, for skipping its own echoed
3
+ * actions. Precedence: the authored `selfUserIds`, then the
4
+ * `PAGERDUTY_USER_ID` env var / deployment secret, then inference from the
5
+ * deployment's `PAGERDUTY_TOKEN`.
6
+ *
7
+ * Inference asks `GET /users/me`, which PagerDuty serves only to a
8
+ * user-level REST API key or an OAuth user token. An account-level REST
9
+ * API key or an OAuth app token has no user of its own; with
10
+ * `PAGERDUTY_FROM_EMAIL` set, the user whose email matches it exactly (the
11
+ * `From` user those tokens write as) is used instead. Results are cached
12
+ * in memory per credential set, never in agent storage.
13
+ */
14
+ import { createHash } from "node:crypto";
15
+ import { isSecretRef } from "../../types.js";
16
+ import { PAGERDUTY_FROM_EMAIL_ENV, PAGERDUTY_TOKEN_ENV, pagerDutyApiBaseUrl, pagerDutyAuthorizationHeader, } from "./api.js";
17
+ import { resolvePagerDutySecret } from "./secrets.js";
18
+ /** Env var / deployment secret naming the agent's own PagerDuty user id. */
19
+ export const PAGERDUTY_USER_ID_ENV = "PAGERDUTY_USER_ID";
20
+ const RESOLVED_TTL_MS = 60 * 60 * 1000;
21
+ const UNRESOLVED_TTL_MS = 5 * 60 * 1000;
22
+ const LOOKUP_TIMEOUT_MS = 5_000;
23
+ const MAX_CACHED_CREDENTIALS = 256;
24
+ const inferredSelfUsers = new Map();
25
+ /**
26
+ * The secret the agent's user id is read from: a named `selfUserIds`, else
27
+ * `PAGERDUTY_USER_ID`. `undefined` when the ids are authored in code.
28
+ */
29
+ export function pagerDutySelfUserIdSecretName(options) {
30
+ if (options.selfUserIds === undefined) {
31
+ return PAGERDUTY_USER_ID_ENV;
32
+ }
33
+ return isSecretRef(options.selfUserIds) ? options.selfUserIds.secretName : undefined;
34
+ }
35
+ /**
36
+ * The user ids the agent acts as, resolved per delivery. Authored ids, a
37
+ * getter, or a named secret are used as given and never fall back. With
38
+ * nothing authored, `PAGERDUTY_USER_ID` (one id) wins, else the id inferred
39
+ * from the channel's token (`PAGERDUTY_TOKEN` unless `token` is set).
40
+ * Empty when none resolves, which turns echo skip off.
41
+ */
42
+ export async function resolvePagerDutySelfUserIds(input) {
43
+ const options = input.options;
44
+ const selfUserIds = options.selfUserIds;
45
+ if (selfUserIds !== undefined) {
46
+ const ids = isSecretRef(selfUserIds)
47
+ ? [resolvePagerDutySecret(selfUserIds, selfUserIds.secretName) ?? ""]
48
+ : typeof selfUserIds === "function"
49
+ ? (selfUserIds() ?? [])
50
+ : selfUserIds;
51
+ return new Set(ids.map((id) => id.trim()).filter(Boolean));
52
+ }
53
+ const configured = resolvePagerDutySecret(undefined, PAGERDUTY_USER_ID_ENV);
54
+ if (configured !== undefined) {
55
+ return new Set([configured]);
56
+ }
57
+ const inferred = await inferPagerDutySelfUserId({ credentials: options, deps: input.deps });
58
+ return new Set(inferred === undefined ? [] : [inferred]);
59
+ }
60
+ /**
61
+ * The user the channel's token acts as (`token`, else `PAGERDUTY_TOKEN`),
62
+ * cached for an hour per base URL, token, and `From` email (an unresolved
63
+ * answer for five minutes). `undefined` without a token or when PagerDuty
64
+ * names no single user.
65
+ */
66
+ export async function inferPagerDutySelfUserId(input = {}) {
67
+ const credentials = input.credentials ?? {};
68
+ const deps = input.deps ?? {};
69
+ const token = resolvePagerDutySecret(credentials.token, PAGERDUTY_TOKEN_ENV);
70
+ if (token === undefined) {
71
+ return undefined;
72
+ }
73
+ const from = resolvePagerDutySecret(credentials.from, PAGERDUTY_FROM_EMAIL_ENV);
74
+ const baseUrl = pagerDutyApiBaseUrl(credentials.apiBaseUrl);
75
+ const key = createHash("sha256")
76
+ .update(`${baseUrl}\n${token}\n${from ?? ""}`)
77
+ .digest("hex");
78
+ const now = deps.now ?? Date.now;
79
+ const cached = inferredSelfUsers.get(key);
80
+ if (cached !== undefined && cached.expiresAt > now()) {
81
+ return cached.userId;
82
+ }
83
+ const entry = {
84
+ expiresAt: now() + UNRESOLVED_TTL_MS,
85
+ userId: lookUpSelfUser({ baseUrl, token, from, fetch: deps.fetch ?? fetch }).then((userId) => {
86
+ if (userId === undefined) {
87
+ (deps.warn ?? console.warn)(`[bdk/pagerduty] warn ${PAGERDUTY_TOKEN_ENV} names no single PagerDuty user (an account-level key or app token needs ${PAGERDUTY_FROM_EMAIL_ENV} set to one user's email); set ${PAGERDUTY_USER_ID_ENV} to skip the agent's own actions`);
88
+ }
89
+ else {
90
+ entry.expiresAt = now() + RESOLVED_TTL_MS;
91
+ }
92
+ return userId;
93
+ }, (error) => {
94
+ (deps.warn ?? console.warn)(`[bdk/pagerduty] warn could not look up the agent's PagerDuty user; echo skip is off until it resolves: ${error instanceof Error ? error.message : String(error)}`);
95
+ return undefined;
96
+ }),
97
+ };
98
+ inferredSelfUsers.delete(key);
99
+ inferredSelfUsers.set(key, entry);
100
+ while (inferredSelfUsers.size > MAX_CACHED_CREDENTIALS) {
101
+ const oldest = inferredSelfUsers.keys().next().value;
102
+ if (oldest === undefined) {
103
+ break;
104
+ }
105
+ inferredSelfUsers.delete(oldest);
106
+ }
107
+ return entry.userId;
108
+ }
109
+ /** Forget every inferred user, so the next delivery asks PagerDuty again. */
110
+ export function clearPagerDutySelfUserCache() {
111
+ inferredSelfUsers.clear();
112
+ }
113
+ async function lookUpSelfUser(input) {
114
+ const get = async (path) => input.fetch(`${input.baseUrl}${path}`, {
115
+ method: "GET",
116
+ headers: {
117
+ Accept: "application/vnd.pagerduty+json;version=2",
118
+ Authorization: pagerDutyAuthorizationHeader(input.token),
119
+ },
120
+ signal: AbortSignal.timeout(LOOKUP_TIMEOUT_MS),
121
+ });
122
+ const me = await get("/users/me");
123
+ if (me.ok) {
124
+ const id = userIdOf((await me.json()).user);
125
+ if (id !== undefined) {
126
+ return id;
127
+ }
128
+ }
129
+ else {
130
+ await me.body?.cancel();
131
+ if (me.status === 401 || me.status >= 500) {
132
+ throw new Error(`GET /users/me answered ${me.status}`);
133
+ }
134
+ }
135
+ if (input.from === undefined) {
136
+ return undefined;
137
+ }
138
+ const email = input.from.toLowerCase();
139
+ const found = await get(`/users?query=${encodeURIComponent(input.from)}&limit=100`);
140
+ if (!found.ok) {
141
+ await found.body?.cancel();
142
+ throw new Error(`GET /users?query= answered ${found.status}`);
143
+ }
144
+ const users = (await found.json()).users;
145
+ const matches = (Array.isArray(users) ? users : []).filter((user) => typeof user === "object" &&
146
+ user !== null &&
147
+ typeof user.email === "string" &&
148
+ user.email.toLowerCase() === email);
149
+ return matches.length === 1 ? userIdOf(matches[0]) : undefined;
150
+ }
151
+ function userIdOf(user) {
152
+ if (typeof user !== "object" || user === null) {
153
+ return undefined;
154
+ }
155
+ const id = user.id;
156
+ return typeof id === "string" && id.trim() !== "" ? id.trim() : undefined;
157
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Durable per-session PagerDuty channel state, persisted with the turn so
3
+ * stream-event handlers can address the incident without re-parsing the
4
+ * webhook.
5
+ */
6
+ export interface PagerDutyChannelState {
7
+ /** Incident the latest dispatched event named. */
8
+ incidentId: string | null;
9
+ incidentNumber: number | null;
10
+ /** That incident's dedup key, when the event carried one. */
11
+ incidentKey: string | null;
12
+ serviceId: string | null;
13
+ /** v3 `event_type` that woke the turn. */
14
+ eventType: string | null;
15
+ /** v3 `event.id` that woke the turn. */
16
+ eventId: string | null;
17
+ deliveryId: string | null;
18
+ occurredAt: string | null;
19
+ }
20
+ export declare function emptyPagerDutyChannelState(overrides?: Partial<PagerDutyChannelState>): PagerDutyChannelState;
21
+ export declare function pagerDutyChannelStateForEvent(input: {
22
+ eventType: string;
23
+ eventId: string;
24
+ incidentId?: string;
25
+ incidentNumber?: number;
26
+ incidentKey?: string;
27
+ serviceId?: string;
28
+ deliveryId?: string;
29
+ occurredAt?: string;
30
+ }): PagerDutyChannelState;
31
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,6DAA6D;IAC7D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,wCAAwC;IACxC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,qBAAqB,CAAM,GAC7C,qBAAqB,CAYvB;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,qBAAqB,CAWxB"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Durable per-session PagerDuty channel state, persisted with the turn so
3
+ * stream-event handlers can address the incident without re-parsing the
4
+ * webhook.
5
+ */
6
+ export function emptyPagerDutyChannelState(overrides = {}) {
7
+ return {
8
+ incidentId: null,
9
+ incidentNumber: null,
10
+ incidentKey: null,
11
+ serviceId: null,
12
+ eventType: null,
13
+ eventId: null,
14
+ deliveryId: null,
15
+ occurredAt: null,
16
+ ...overrides,
17
+ };
18
+ }
19
+ export function pagerDutyChannelStateForEvent(input) {
20
+ return emptyPagerDutyChannelState({
21
+ incidentId: input.incidentId ?? null,
22
+ incidentNumber: input.incidentNumber ?? null,
23
+ incidentKey: input.incidentKey ?? null,
24
+ serviceId: input.serviceId ?? null,
25
+ eventType: input.eventType,
26
+ eventId: input.eventId,
27
+ deliveryId: input.deliveryId ?? null,
28
+ occurredAt: input.occurredAt ?? null,
29
+ });
30
+ }
@@ -0,0 +1,217 @@
1
+ import type { ContinuationIdentity } from "../../internal/continuation-identity.js";
2
+ import type { AgentCloudOptions, ArtifactsApi, AuthContext, AuthPolicy, ChannelEventHandlers, ChannelStartArgs, HostContext, SecretRef, SendMessageFn } from "../../types.js";
3
+ import type { PagerDutyClient } from "./api.js";
4
+ import type { PagerDutyIncidentLifecycleEvent } from "./events.js";
5
+ import type { PagerDutyChannelState } from "./state.js";
6
+ /** A PagerDuty object reference (`user_reference`, `service_reference`, …). */
7
+ export interface PagerDutyReference {
8
+ id: string;
9
+ /** PagerDuty's `type`, e.g. `user_reference` or `service_reference`. */
10
+ type?: string;
11
+ summary?: string;
12
+ htmlUrl?: string;
13
+ }
14
+ /** The incident a lifecycle event carries as its `data`. */
15
+ export interface PagerDutyIncident {
16
+ id: string;
17
+ number?: number;
18
+ title?: string;
19
+ /** `triggered`, `acknowledged`, or `resolved`. */
20
+ status?: string;
21
+ /** `high` or `low`. */
22
+ urgency?: string;
23
+ /** The dedup key of the alert that opened the incident. */
24
+ incidentKey?: string;
25
+ htmlUrl?: string;
26
+ createdAt?: string;
27
+ service?: PagerDutyReference;
28
+ escalationPolicy?: PagerDutyReference;
29
+ priority?: PagerDutyReference;
30
+ assignees: PagerDutyReference[];
31
+ teams: PagerDutyReference[];
32
+ resolveReason?: string;
33
+ }
34
+ /**
35
+ * The incident a sub-resource event names. PagerDuty sends a reference here,
36
+ * so `incidentKey` is present only when the delivery includes it.
37
+ */
38
+ export interface PagerDutyIncidentRef extends PagerDutyReference {
39
+ incidentKey?: string;
40
+ }
41
+ /** An incident lifecycle event: `incident.triggered`, `.acknowledged`, … */
42
+ export interface PagerDutyIncidentEvent {
43
+ eventType: PagerDutyIncidentLifecycleEvent;
44
+ /** The event type without its `incident.` prefix: `triggered`, `priority_updated`, … */
45
+ action: string;
46
+ incident: PagerDutyIncident;
47
+ }
48
+ /** `incident.annotated`: a note added to an incident. */
49
+ export interface PagerDutyIncidentNote {
50
+ id?: string;
51
+ content: string;
52
+ /** True when PagerDuty truncated `content` for the webhook. */
53
+ trimmed: boolean;
54
+ incident: PagerDutyIncidentRef;
55
+ }
56
+ /** `incident.responder.added` / `incident.responder.replied`. */
57
+ export interface PagerDutyResponderEvent {
58
+ action: "added" | "replied";
59
+ incident: PagerDutyIncidentRef;
60
+ /** The requested responder. */
61
+ user?: PagerDutyReference;
62
+ escalationPolicy?: PagerDutyReference;
63
+ message?: string;
64
+ /** `pending`, `joined`, or `declined`. */
65
+ state?: string;
66
+ }
67
+ export interface PagerDutyEventContext {
68
+ /** `X-Webhook-Id` of the delivery, when present. */
69
+ deliveryId?: string;
70
+ /** `event.id`: the same across PagerDuty's retries of one event. */
71
+ eventId: string;
72
+ /** `event.event_type`, e.g. `incident.triggered`. */
73
+ eventType: string;
74
+ /** `event.resource_type`, e.g. `incident`. */
75
+ resourceType?: string;
76
+ /** When the change happened in PagerDuty (ISO-8601). */
77
+ occurredAt?: string;
78
+ /** Who made the change: a user, a service integration, or absent for PagerDuty itself. */
79
+ agent?: PagerDutyReference;
80
+ /** The incident the event names, when it names one. */
81
+ incidentId?: string;
82
+ /** That incident's dedup key, when the delivery carries it. */
83
+ incidentKey?: string;
84
+ /** The account subdomain, e.g. `acme` for `acme.pagerduty.com`, read from the event's URLs. */
85
+ accountSubdomain?: string;
86
+ /** The raw `event` record, for fields the typed views omit. */
87
+ payload: Record<string, unknown>;
88
+ /**
89
+ * PagerDuty REST client with the channel's credentials (`token`, `from`,
90
+ * `apiBaseUrl`, else their well-known secrets), read per call.
91
+ */
92
+ pagerduty: PagerDutyClient;
93
+ /**
94
+ * Channel `send`. Set on every delivery path so a hook can start a turn
95
+ * itself instead of returning `{ auth, message }` or a deferred `{ task }`.
96
+ */
97
+ send?: SendMessageFn;
98
+ host: HostContext;
99
+ artifacts: ArtifactsApi;
100
+ }
101
+ export type PagerDutyTurnDispatch = {
102
+ auth: AuthContext;
103
+ message?: string;
104
+ title?: string;
105
+ context?: readonly string[];
106
+ };
107
+ /** Bound per-delivery helpers passed to a {@link PagerDutyTaskDispatch.task}. */
108
+ export interface PagerDutyTaskArgs {
109
+ send: SendMessageFn;
110
+ waitUntil: (promise: Promise<unknown>) => void;
111
+ }
112
+ /** Run a host-side handler after the webhook is acknowledged with a 202. */
113
+ export type PagerDutyTaskDispatch = {
114
+ task: (args: PagerDutyTaskArgs) => void | Promise<void>;
115
+ };
116
+ export type PagerDutyDispatch = PagerDutyTurnDispatch | PagerDutyTaskDispatch;
117
+ export type PagerDutyDispatchResult = PagerDutyDispatch | null | Promise<PagerDutyDispatch | null>;
118
+ export type PagerDutyIncidentHook = (ctx: PagerDutyEventContext, event: PagerDutyIncidentEvent) => PagerDutyDispatchResult;
119
+ export type PagerDutyNoteHook = (ctx: PagerDutyEventContext, note: PagerDutyIncidentNote) => PagerDutyDispatchResult;
120
+ export type PagerDutyResponderHook = (ctx: PagerDutyEventContext, responder: PagerDutyResponderEvent) => PagerDutyDispatchResult;
121
+ export type PagerDutyEventHook = (ctx: PagerDutyEventContext, event: {
122
+ eventType: string;
123
+ data: unknown;
124
+ }) => PagerDutyDispatchResult;
125
+ /** One parsed v3 delivery handed to {@link dispatchPagerDutyWebhook}. */
126
+ export interface PagerDutyWebhookDelivery {
127
+ eventType: string;
128
+ /** The whole delivery body, `{ event: { … } }`. */
129
+ payload: Record<string, unknown>;
130
+ deliveryId?: string;
131
+ }
132
+ export interface PagerDutyChannelOptions {
133
+ /**
134
+ * The v3 webhook subscription's signing secret. PagerDuty signs the raw
135
+ * body as `X-PagerDuty-Signature: v1=<hex>`, listing one `v1=` entry per
136
+ * active secret while a secret rotates; any matching entry admits.
137
+ * While the default secret is unset, production stays loopback-strict
138
+ * and `serve --dev` admits unsigned loopback deliveries.
139
+ *
140
+ * Omitted, it names `PAGERDUTY_WEBHOOK_SECRET`: locally that env var; on
141
+ * Cursor hosting the deployment secret of that name, which the control
142
+ * plane verifies before any compute starts. Pass `{ secretName }` to
143
+ * name another secret. Architecture `v2` rejects a literal or getter,
144
+ * which never reaches the manifest.
145
+ */
146
+ webhookSecret?: string | SecretRef | (() => string | undefined);
147
+ /**
148
+ * PagerDuty user ids this agent acts as. An event whose `agent` is one of
149
+ * them is the agent's own action echoed back, and is acknowledged without
150
+ * running a hook or starting a turn. Pass ids, a getter, or
151
+ * `{ secretName }` naming a secret that holds one id; any of them is used
152
+ * as given. Omitted, each delivery reads the `PAGERDUTY_USER_ID` env var
153
+ * / deployment secret (one id), else infers the user `PAGERDUTY_TOKEN`
154
+ * acts as. When none resolves, echo skip is off.
155
+ */
156
+ selfUserIds?: readonly string[] | SecretRef | (() => readonly string[] | undefined);
157
+ /**
158
+ * API token for `ctx.pagerduty`, reply notes, and inferring the agent's
159
+ * own user: a REST API key, or an OAuth access token written as
160
+ * `Bearer <token>`. Falls back to `PAGERDUTY_TOKEN`.
161
+ */
162
+ token?: string | SecretRef | (() => string | undefined);
163
+ /**
164
+ * Email of the PagerDuty user that writes made with an account-level key
165
+ * or app token are attributed to, sent as `From`. Falls back to
166
+ * `PAGERDUTY_FROM_EMAIL`.
167
+ */
168
+ from?: string | SecretRef | (() => string | undefined);
169
+ /** REST base, e.g. `https://api.eu.pagerduty.com`. Falls back to `PAGERDUTY_API_BASE_URL`. */
170
+ apiBaseUrl?: string;
171
+ /**
172
+ * When true, post each completed reply (and a short note when a turn
173
+ * fails) to the session's incident as a note. Off by default: an agent
174
+ * that writes to PagerDuty through its own path posts only what it asks for.
175
+ */
176
+ deliverReplies?: boolean;
177
+ /** Route auth chain; defaults follow {@link webhookSecret}. */
178
+ auth?: AuthPolicy[];
179
+ /** Route path under `/v1/channels/<name>`. Defaults to `/`. */
180
+ path?: string;
181
+ /**
182
+ * Pin the v3 event types this channel declares. Published as
183
+ * `meta.pagerdutyWebhookEvents`; defaults to every incident event type.
184
+ */
185
+ webhookEvents?: readonly string[];
186
+ /**
187
+ * Continuation selector. Omit this to inherit the agent architecture's
188
+ * default (`pagerduty.incident/v2` on v2). Set it explicitly only when
189
+ * migrating persisted identities.
190
+ */
191
+ continuation?: ContinuationIdentity;
192
+ /**
193
+ * Decide whether an incident lifecycle event starts a turn. Without this
194
+ * hook, `incident.triggered` and `incident.reopened` start one as the
195
+ * event's agent and every other lifecycle event is acknowledged.
196
+ */
197
+ onIncident?: PagerDutyIncidentHook;
198
+ /** Opt-in `incident.annotated` handler. */
199
+ onNote?: PagerDutyNoteHook;
200
+ /** Opt-in `incident.responder.added` / `.replied` handler. */
201
+ onResponder?: PagerDutyResponderHook;
202
+ /**
203
+ * Catch-all for event types without a typed hook (status updates,
204
+ * conference bridges, workflows, service events). NOT a fallback: typed
205
+ * events never reach it.
206
+ */
207
+ onEvent?: PagerDutyEventHook;
208
+ /** Per-session cloud options for every turn the channel starts. */
209
+ cloud?: AgentCloudOptions;
210
+ /** Channel stream-event handlers. */
211
+ events?: ChannelEventHandlers<PagerDutyChannelState>;
212
+ /** Called once when the server mounts this channel. */
213
+ onStart?: (args: ChannelStartArgs) => void | Promise<void>;
214
+ /** Called when the server shuts down. */
215
+ onStop?: () => void | Promise<void>;
216
+ }
217
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -172,6 +172,12 @@ export declare function sharedSecretAuth(options: {
172
172
  * while a secret rotates, e.g. PagerDuty's
173
173
  * `X-PagerDuty-Signature: v1=<hex>,v1=<hex>` with `prefix: "v1="` and
174
174
  * `separator: ","`. The request is admitted when any entry matches.
175
+ *
176
+ * The named secret may hold several signing secrets, one per line (for
177
+ * example one per provider subscription, or old and new during a
178
+ * rotation); any of them verifies. Lines are trimmed and blank lines
179
+ * ignored, a value with no line break is one secret used as-is, and a
180
+ * value holding more secrets than the cap admits nothing.
175
181
  */
176
182
  export declare function hmacSignatureAuth(options: {
177
183
  header: string;
@@ -1 +1 @@
1
- {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,WAAW,EACX,aAAa,GACd,MAAM,sBAAsB,CAAC;AAO9B,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,YAAY,EAEZ,kBAAkB,EAGlB,SAAS,EAEV,MAAM,YAAY,CAAC;AAEpB,+EAA+E;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,YAAY,EACV,WAAW,EACX,UAAU,EACV,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,kCAAkC,EAClC,2BAA2B,EAC3B,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,+BAA+B;AAC/B,wBAAgB,aAAa,CAAC,MAAM,GAAG,SAAS,EAC9C,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAC5B,iBAAiB,CAAC,MAAM,CAAC,CAQ3B;AAoCD,4EAA4E;AAC5E,wBAAgB,GAAG,CAAC,MAAM,SAAS,kBAAkB,EACnD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAChC,YAAY,CAMd;AAED,2CAA2C;AAC3C,wBAAgB,IAAI,CAClB,KAAK,SAAS,kBAAkB,EAChC,MAAM,SAAS,kBAAkB,GAAG,SAAS,GAAG,SAAS,EACzD,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,YAAY,CAOvE;AAED,0CAA0C;AAC1C,wBAAgB,GAAG,CACjB,KAAK,SAAS,kBAAkB,EAChC,MAAM,SAAS,kBAAkB,GAAG,SAAS,GAAG,SAAS,EACzD,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,YAAY,CAOvE;AAED,4CAA4C;AAC5C,wBAAgB,KAAK,CACnB,KAAK,SAAS,kBAAkB,EAChC,MAAM,SAAS,kBAAkB,GAAG,SAAS,GAAG,SAAS,EACzD,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,YAAY,CAOvE;AAED,qCAAqC;AACrC,wBAAgB,MAAM,CACpB,KAAK,SAAS,kBAAkB,GAAG,SAAS,GAAG,SAAS,EACxD,MAAM,SAAS,kBAAkB,GAAG,SAAS,GAAG,SAAS,EACzD,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,YAAY,CAOzE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,IAAI,UAAU,CAcrC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,UAAU,CAoB3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,IAAI,UAAU,CAWzC;AAOD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,CAc9C;AAWD;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,GAC5F,UAAU,CAmBZ;AAWD;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,UAAU,CAMrC;AAQD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,IAAI,UAAU,CAY3C;AAED,gEAAgE;AAChE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAElE;AAID;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AACH,oFAAoF;GAClF;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAMvB,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,oBAAoB,GAAG,SAAS,CAKzF;AASD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAwBxF;AA+BD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,UAAU,CAoCb"}
1
+ {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"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"}
package/dist/channels.js CHANGED
@@ -46,8 +46,9 @@
46
46
  */
47
47
  export { openCiCheck, resumeCiCheck, } from "./channels/checks.js";
48
48
  import { Buffer } from "node:buffer";
49
- import { createHmac, timingSafeEqual } from "node:crypto";
49
+ import { timingSafeEqual } from "node:crypto";
50
50
  import { brandDefinition } from "./internal/brand.js";
51
+ import { hmacSignatureMatchesAny, parseHmacSecrets } from "./internal/hmac-secret-values.js";
51
52
  import { attachCatchAdmission } from "./internal/hosted-catch.js";
52
53
  import { isLoopbackAddress, isLoopbackHostname } from "./internal/net.js";
53
54
  /** Configure the built-in HTTP session channel at `agent/channels/http.ts`. */
@@ -369,24 +370,6 @@ export function sharedSecretAuth(options) {
369
370
  });
370
371
  }
371
372
  const MAX_HMAC_SEPARATOR_LENGTH = 8;
372
- /**
373
- * True when any signature in `presented` is `prefix` + the hex `expected`
374
- * digest. Without a `separator` the whole value is one signature. Every
375
- * entry is compared, so timing does not reveal which one matched; entries
376
- * without the prefix never match.
377
- */
378
- function presentedHmacMatches(args) {
379
- const entries = args.separator === undefined ? [args.presented] : args.presented.split(args.separator);
380
- let matched = false;
381
- for (const raw of entries) {
382
- const entry = raw.trim();
383
- if (entry.startsWith(args.prefix) &&
384
- constantTimeEquals(entry.slice(args.prefix.length).toLowerCase(), args.expected)) {
385
- matched = true;
386
- }
387
- }
388
- return matched;
389
- }
390
373
  /**
391
374
  * Admit requests whose `header` carries the hex HMAC-SHA256 of the raw body
392
375
  * under the secret named `secret` (optionally behind a literal `prefix`
@@ -397,6 +380,12 @@ function presentedHmacMatches(args) {
397
380
  * while a secret rotates, e.g. PagerDuty's
398
381
  * `X-PagerDuty-Signature: v1=<hex>,v1=<hex>` with `prefix: "v1="` and
399
382
  * `separator: ","`. The request is admitted when any entry matches.
383
+ *
384
+ * The named secret may hold several signing secrets, one per line (for
385
+ * example one per provider subscription, or old and new during a
386
+ * rotation); any of them verifies. Lines are trimmed and blank lines
387
+ * ignored, a value with no line break is one secret used as-is, and a
388
+ * value holding more secrets than the cap admits nothing.
400
389
  */
401
390
  export function hmacSignatureAuth(options) {
402
391
  const header = options.header.toLowerCase();
@@ -407,14 +396,13 @@ export function hmacSignatureAuth(options) {
407
396
  throw new Error(`hmacSignatureAuth separator must be 1-${MAX_HMAC_SEPARATOR_LENGTH} characters.`);
408
397
  }
409
398
  const policy = async (request) => {
410
- const secret = process.env[options.secret];
399
+ const parsed = parseHmacSecrets(process.env[options.secret]);
411
400
  const presented = request.headers.get(header)?.trim();
412
- if (secret === undefined || secret.length === 0 || presented === undefined) {
401
+ if (!parsed.ok || presented === undefined) {
413
402
  return null;
414
403
  }
415
404
  const body = Buffer.from(await request.clone().arrayBuffer());
416
- const expected = createHmac("sha256", secret).update(body).digest("hex");
417
- if (!presentedHmacMatches({ presented, expected, prefix, separator })) {
405
+ if (!hmacSignatureMatchesAny({ body, presented, secrets: parsed.secrets, prefix, separator })) {
418
406
  return null;
419
407
  }
420
408
  return {