@cursor/bdk 0.2.24 → 0.2.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -18
- package/CHANGELOG.md +3 -0
- package/dist/artifacts.d.ts +1 -1
- package/dist/artifacts.js +1 -1
- package/dist/bin/agent-serve.d.ts +1 -1
- package/dist/bin/agent-serve.js +71 -31
- package/dist/channels/bitbucket/api.d.ts +2 -2
- package/dist/channels/bitbucket/api.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-channel.js +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +5 -4
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +14 -9
- package/dist/channels/change-monitors/change-monitors-channel.js +1 -1
- package/dist/channels/deployments/deployments-channel.js +1 -1
- package/dist/channels/github/cursor-account.d.ts +7 -0
- package/dist/channels/github/cursor-account.d.ts.map +1 -1
- package/dist/channels/github/cursor-account.js +22 -5
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +10 -19
- package/dist/channels/github/replay.d.ts +1 -1
- package/dist/channels/github/replay.d.ts.map +1 -1
- package/dist/channels/gitlab/api.d.ts +2 -2
- package/dist/channels/gitlab/api.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +1 -1
- package/dist/channels/issues/issues-channel.js +1 -1
- package/dist/channels/origin/api.d.ts +4 -4
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +1 -1
- package/dist/channels/origin/origin-webhook.d.ts +3 -3
- package/dist/channels/origin/origin-webhook.d.ts.map +1 -1
- package/dist/channels/pagerduty/api.d.ts +74 -0
- package/dist/channels/pagerduty/api.d.ts.map +1 -0
- package/dist/channels/pagerduty/api.js +101 -0
- package/dist/channels/pagerduty/defaults.d.ts +42 -0
- package/dist/channels/pagerduty/defaults.d.ts.map +1 -0
- package/dist/channels/pagerduty/defaults.js +132 -0
- package/dist/channels/pagerduty/events.d.ts +24 -0
- package/dist/channels/pagerduty/events.d.ts.map +1 -0
- package/dist/channels/pagerduty/events.js +38 -0
- package/dist/channels/pagerduty/index.d.ts +31 -0
- package/dist/channels/pagerduty/index.d.ts.map +1 -0
- package/dist/channels/pagerduty/index.js +30 -0
- package/dist/channels/pagerduty/pagerduty-channel.d.ts +64 -0
- package/dist/channels/pagerduty/pagerduty-channel.d.ts.map +1 -0
- package/dist/channels/pagerduty/pagerduty-channel.js +195 -0
- package/dist/channels/pagerduty/pagerduty-webhook.d.ts +70 -0
- package/dist/channels/pagerduty/pagerduty-webhook.d.ts.map +1 -0
- package/dist/channels/pagerduty/pagerduty-webhook.js +280 -0
- package/dist/channels/pagerduty/payload.d.ts +33 -0
- package/dist/channels/pagerduty/payload.d.ts.map +1 -0
- package/dist/channels/pagerduty/payload.js +150 -0
- package/dist/channels/pagerduty/replay.d.ts +35 -0
- package/dist/channels/pagerduty/replay.d.ts.map +1 -0
- package/dist/channels/pagerduty/replay.js +115 -0
- package/dist/channels/pagerduty/secrets.d.ts +16 -0
- package/dist/channels/pagerduty/secrets.d.ts.map +1 -0
- package/dist/channels/pagerduty/secrets.js +23 -0
- package/dist/channels/pagerduty/self-user.d.ts +51 -0
- package/dist/channels/pagerduty/self-user.d.ts.map +1 -0
- package/dist/channels/pagerduty/self-user.js +157 -0
- package/dist/channels/pagerduty/state.d.ts +31 -0
- package/dist/channels/pagerduty/state.d.ts.map +1 -0
- package/dist/channels/pagerduty/state.js +30 -0
- package/dist/channels/pagerduty/types.d.ts +217 -0
- package/dist/channels/pagerduty/types.d.ts.map +1 -0
- package/dist/channels/pagerduty/types.js +1 -0
- package/dist/channels/runs/runs-channel.js +1 -1
- package/dist/channels/slack/agentic-delivery.d.ts +2 -1
- package/dist/channels/slack/agentic-delivery.d.ts.map +1 -1
- package/dist/channels/slack/agentic-delivery.js +6 -10
- package/dist/channels/slack/agentic-signals.d.ts +2 -7
- package/dist/channels/slack/agentic-signals.d.ts.map +1 -1
- package/dist/channels/slack/agentic-signals.js +4 -3
- package/dist/channels/slack/api.d.ts +1 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +3 -0
- package/dist/channels/slack/constants.d.ts +2 -0
- package/dist/channels/slack/constants.d.ts.map +1 -1
- package/dist/channels/slack/constants.js +2 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +3 -2
- package/dist/channels/slack/dispatch.d.ts +9 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +3 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +24 -20
- package/dist/channels/slack/interactive.d.ts +2 -0
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +1 -0
- package/dist/channels/slack/live-delivery.d.ts +3 -0
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +5 -0
- package/dist/channels/slack/reply-options.d.ts +9 -0
- package/dist/channels/slack/reply-options.d.ts.map +1 -1
- package/dist/channels/slack/reply-options.js +31 -1
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +7 -0
- package/dist/channels/slack/stream.d.ts +5 -1
- package/dist/channels/slack/stream.d.ts.map +1 -1
- package/dist/channels/slack/types.d.ts +29 -0
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels.d.ts +7 -1
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +12 -24
- package/dist/docs/404.html +3 -3
- package/dist/docs/assets/{app.DTIg0uKK.js → app.BITbgXMP.js} +4 -4
- package/dist/docs/assets/changelog.md.sdD6ctqK.js +1 -0
- package/dist/docs/assets/changelog.md.sdD6ctqK.lean.js +1 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.B45uCZp9.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BpJoSaxi.js → VPLocalSearchBox.3qo4-bX9.js} +2 -2
- package/dist/docs/assets/chunks/{arc.ylgNvRNq.js → arc.CTrZocKU.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.BMrNJqYk.js → architectureDiagram-Q4EWVU46.BkgIqxrv.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.BBWUEqf9.js → baseUniq.5w0JfVgo.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DFMu-Vza.js → blockDiagram-DXYQGD6D.BVLtPjQc.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.8nkAAxWv.js → c4Diagram-AHTNJAMY.CQ7neZTW.js} +1 -1
- package/dist/docs/assets/chunks/channel.Cv2w64wj.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.sO-z2Bag.js → chunk-4BX2VUAB.D-hJ7uKM.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.BMROzTMq.js → chunk-4TB4RGXK.RBYX5ywX.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.X81urwg7.js → chunk-55IACEB6.Br05HoEb.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.eaZVFLZM.js → chunk-EDXVE4YY.BD_7QS60.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CmZhzstR.js → chunk-FMBD7UC4.BOPnMabX.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CTezt9Lc.js → chunk-OYMX7WX6.DmGIdP8i.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.s-T8zukB.js → chunk-QZHKN3VN.CGHmolCB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.DN4Nhy-D.js → chunk-YZCP3GAM.C_Uhs25v.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CtO2atCr.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CtO2atCr.js +1 -0
- package/dist/docs/assets/chunks/clone.hfsCtgP4.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Cqyp4BUH.js → cose-bilkent-S5V4N54A.DsU6xpcZ.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.BIECOiqR.js → dagre-KV5264BT.BqQLDcoU.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.1tLyWoTg.js → diagram-5BDNPKRD.Cgv8uUNF.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.BVY_6VMO.js → diagram-G4DWMVQ6.BXHPSXh_.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BSZ7xiBB.js → diagram-MMDJMWI5.CgJzo8f_.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.Bho6GmLh.js → diagram-TYMM5635.CfiN6lgT.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.A0yVIANn.js → erDiagram-SMLLAGMA.8n_hHzAd.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.ZMgbllH6.js → flowDiagram-DWJPFMVM.B2pb1Dv_.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.BCCPBhXo.js → ganttDiagram-T4ZO3ILL.BFih4ucI.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.BOkL0BbA.js → gitGraphDiagram-UUTBAWPF.CqZ8PTl8.js} +1 -1
- package/dist/docs/assets/chunks/{graph.DMyZPu86.js → graph.0ufsI9gu.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.CjG1IiEw.js → infoDiagram-42DDH7IO.BkPRFww4.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.UCe-kq9g.js → ishikawaDiagram-UXIWVN3A.DCRK-cVX.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.3WyOK_eY.js → journeyDiagram-VCZTEJTY.BFyAJo33.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.WoRG2qY1.js → kanban-definition-6JOO6SKY.CmA2SoGc.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DV07xDd5.js → layout.CYY-CbMr.js} +1 -1
- package/dist/docs/assets/chunks/{linear.CTO8mN6o.js → linear.DeeDV4Oq.js} +1 -1
- package/dist/docs/assets/chunks/{min.SvTtcKuZ.js → min.BL3XTBN2.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.DMGgQ-HB.js → mindmap-definition-QFDTVHPH.BcbY-G6H.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B7851apI.js → pieDiagram-DEJITSTG.dzDcQnPE.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CEqyypIX.js → quadrantDiagram-34T5L4WZ.RxR0m5iK.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.C3Mwsw-H.js → requirementDiagram-MS252O5E.DflaXb6Q.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DyYK0XxY.js → sankeyDiagram-XADWPNL6.BteLKQAe.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.SiQPH-XM.js → sequenceDiagram-FGHM5R23.BD8jM8oz.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CTJMsP4p.js → stateDiagram-FHFEXIEX.C8SBkbPH.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BLz7Qyo3.js +1 -0
- package/dist/docs/assets/chunks/{theme.DJo4my9R.js → theme.DiViIOLe.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.CxSNRlQ6.js → timeline-definition-GMOUNBTQ.D64XF5dV.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BdoJskyD.js → vennDiagram-DHZGUBPP.CwmeYan-.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.DmAlXlpu.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.IjIbFn_F.js → wardleyDiagram-NUSXRM2D.5VJ2-5K0.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CPUxDZLH.js → xychartDiagram-5P7HB3ND.Cl6_fZVC.js} +1 -1
- package/dist/docs/assets/{guides_hooks.md.Bfj0pK91.js → guides_hooks.md.B2XfGX50.js} +7 -3
- package/dist/docs/assets/{guides_mcp-oauth.md.BM_eFC0L.js → guides_mcp-oauth.md.Cxq2TxBB.js} +3 -3
- package/dist/docs/assets/{guides_mcp-oauth.md.BM_eFC0L.lean.js → guides_mcp-oauth.md.Cxq2TxBB.lean.js} +1 -1
- package/dist/docs/assets/guides_opentelemetry.md.D4wO7_8v.js +37 -0
- package/dist/docs/assets/guides_opentelemetry.md.D4wO7_8v.lean.js +1 -0
- package/dist/docs/assets/guides_pagerduty.md.BHXMcMtx.js +60 -0
- package/dist/docs/assets/guides_pagerduty.md.BHXMcMtx.lean.js +1 -0
- package/dist/docs/assets/{guides_slack.md.Bn-WupSE.js → guides_slack.md.ClIyi7FI.js} +8 -3
- package/dist/docs/assets/{guides_slack.md.Bn-WupSE.lean.js → guides_slack.md.ClIyi7FI.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.IplwL25I.js → reference_agent-config.md.CGSx8COP.js} +6 -2
- package/dist/docs/assets/{reference_agent-config.md.IplwL25I.lean.js → reference_agent-config.md.CGSx8COP.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.DYg0CLud.js → reference_channels.md.CNNIS6K7.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.DB7Llw3T.js → reference_cli.md.1o_TqKdt.js} +7 -2
- package/dist/docs/assets/{reference_cli.md.DB7Llw3T.lean.js → reference_cli.md.1o_TqKdt.lean.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.B1jq3oGl.js → reference_hooks.md.CROr0QgC.js} +13 -7
- package/dist/docs/assets/{reference_hooks.md.B1jq3oGl.lean.js → reference_hooks.md.CROr0QgC.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.03Ryy9ca.js → reference_schedules.md.BqWnJES4.js} +3 -3
- package/dist/docs/assets/reference_sessions.md.Bi6lHttM.js +22 -0
- package/dist/docs/assets/reference_sessions.md.Bi6lHttM.lean.js +1 -0
- package/dist/docs/assets/{reference_skills.md.C2GWh7g8.js → reference_skills.md.Ckddg6KX.js} +3 -3
- package/dist/docs/assets/{reference_tools.md.08XR7lIl.js → reference_tools.md.Bo0UfT0a.js} +1 -1
- package/dist/docs/assets/{style.nMsabY-V.css → style.B9o0luvp.css} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/changelog.html +60 -0
- package/dist/docs/changelog.md +86 -0
- package/dist/docs/deployment.html +37 -37
- package/dist/docs/evals.html +37 -37
- package/dist/docs/guides/agent-to-agent.html +37 -37
- package/dist/docs/guides/bitbucket.html +37 -37
- package/dist/docs/guides/cloud-agents.html +37 -37
- package/dist/docs/guides/convert-automation.html +37 -37
- package/dist/docs/guides/export-grokbot.html +37 -37
- package/dist/docs/guides/github.html +37 -37
- package/dist/docs/guides/gitlab.html +37 -37
- package/dist/docs/guides/grokbot-agents.html +37 -37
- package/dist/docs/guides/hooks.html +45 -41
- package/dist/docs/guides/hooks.md +7 -3
- package/dist/docs/guides/improve.html +37 -37
- package/dist/docs/guides/jev.html +37 -37
- package/dist/docs/guides/mcp-oauth.html +39 -39
- package/dist/docs/guides/mcp-oauth.md +12 -0
- package/dist/docs/guides/migrate.html +37 -37
- package/dist/docs/guides/opentelemetry.html +62 -70
- package/dist/docs/guides/opentelemetry.md +150 -175
- package/dist/docs/guides/pagerduty.html +119 -0
- package/dist/docs/guides/pagerduty.md +336 -0
- package/dist/docs/guides/slack.html +44 -39
- package/dist/docs/guides/slack.md +41 -0
- package/dist/docs/guides/webhooks.html +37 -37
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +37 -37
- package/dist/docs/index.html +37 -37
- package/dist/docs/llms-full.txt +730 -163
- package/dist/docs/llms.txt +3 -1
- package/dist/docs/quickstart.html +37 -37
- package/dist/docs/reference/agent-config.html +42 -38
- package/dist/docs/reference/agent-config.md +21 -1
- package/dist/docs/reference/artifacts.html +37 -37
- package/dist/docs/reference/channels.html +38 -38
- package/dist/docs/reference/channels.md +7 -2
- package/dist/docs/reference/cli.html +43 -38
- package/dist/docs/reference/cli.md +27 -0
- package/dist/docs/reference/connections.html +37 -37
- package/dist/docs/reference/evals.html +37 -37
- package/dist/docs/reference/extensions.html +37 -37
- package/dist/docs/reference/hooks.html +49 -43
- package/dist/docs/reference/hooks.md +10 -5
- package/dist/docs/reference/http-api.html +37 -37
- package/dist/docs/reference/instructions.html +37 -37
- package/dist/docs/reference/memory.html +37 -37
- package/dist/docs/reference/playground.html +36 -36
- package/dist/docs/reference/project-layout.html +37 -37
- package/dist/docs/reference/prompt.html +37 -37
- package/dist/docs/reference/schedules.html +40 -40
- package/dist/docs/reference/sessions.html +58 -37
- package/dist/docs/reference/sessions.md +46 -1
- package/dist/docs/reference/skills.html +40 -40
- package/dist/docs/reference/subagents.html +37 -37
- package/dist/docs/reference/tools.html +39 -39
- package/dist/docs/reference/tools.md +4 -3
- package/dist/docs/templates/agentic-owners.html +37 -37
- package/dist/docs/templates/grokbot-agents.html +37 -37
- package/dist/docs/templates/security-reviewer.html +37 -37
- package/dist/docs/templates/thermo-quality-review.html +37 -37
- package/dist/docs/templates/thermo-review.html +37 -37
- package/dist/docs/templates/triage.html +37 -37
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/extension.js +15 -15
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/inputs.js +1 -1
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-grokbot-agents/extension.js +7 -3
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts.map +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +1 -1
- package/dist/extensions/improve/extension.js +1 -1
- package/dist/extensions/jev/extension.js +2 -2
- package/dist/extensions/jev/tools/evaluate.js +3 -3
- package/dist/extensions/slack-communication/extension.js +1 -1
- package/dist/extensions/slack-communication/tools/delete-message.js +1 -1
- package/dist/extensions/slack-communication/tools/edit-message.d.ts.map +1 -1
- package/dist/extensions/slack-communication/tools/edit-message.js +3 -6
- package/dist/extensions/slack-communication/tools/post-card.js +1 -1
- package/dist/extensions/slack-communication/tools/post-file.js +1 -1
- package/dist/extensions/slack-communication/tools/post-update.d.ts.map +1 -1
- package/dist/extensions/slack-communication/tools/post-update.js +3 -6
- package/dist/extensions/slack-communication/tools/react.js +1 -1
- package/dist/extensions/slack-communication/tools/set-status.js +1 -1
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +1 -1
- package/dist/index.d.ts +14 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/internal/approval-gate.d.ts +4 -2
- package/dist/internal/approval-gate.d.ts.map +1 -1
- package/dist/internal/approval-gate.js +2 -1
- package/dist/internal/as-of.d.ts +2 -0
- package/dist/internal/as-of.d.ts.map +1 -1
- package/dist/internal/as-of.js +2 -0
- package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -1
- package/dist/internal/builtin-tools/artifacts.js +45 -12
- package/dist/internal/builtin-tools/reminders.js +1 -1
- package/dist/internal/channel-architecture.d.ts +1 -1
- package/dist/internal/channel-architecture.d.ts.map +1 -1
- package/dist/internal/channel-architecture.js +4 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +39 -22
- package/dist/internal/cli-pagerduty.d.ts +32 -0
- package/dist/internal/cli-pagerduty.d.ts.map +1 -0
- package/dist/internal/cli-pagerduty.js +242 -0
- package/dist/internal/continuation-channel.d.ts.map +1 -1
- package/dist/internal/continuation-channel.js +7 -0
- package/dist/internal/continuation-identity.d.ts +11 -3
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +83 -0
- package/dist/internal/continuation.d.ts +3 -0
- package/dist/internal/continuation.d.ts.map +1 -0
- package/dist/internal/continuation.js +1 -0
- package/dist/internal/conversation-mirror.d.ts +5 -0
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +12 -1
- package/dist/internal/convert-automation/convert-workflow.js +1 -1
- package/dist/internal/convert-grokbot/answers.d.ts.map +1 -1
- package/dist/internal/convert-grokbot/answers.js +10 -8
- package/dist/internal/convert-grokbot/recipe.d.ts +1 -1
- package/dist/internal/convert-grokbot/recipe.d.ts.map +1 -1
- package/dist/internal/convert-grokbot/recipe.js +1 -1
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +2 -0
- package/dist/internal/cursor/backend-client.d.ts +8 -3
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +8 -3
- package/dist/internal/cursor/credentials.d.ts +2 -2
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +1 -1
- package/dist/internal/cursor-account-mcp-auth.d.ts +6 -2
- package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
- package/dist/internal/cursor-account-mcp-auth.js +15 -6
- package/dist/internal/deferred-channel-session.d.ts +5 -4
- package/dist/internal/deferred-channel-session.d.ts.map +1 -1
- package/dist/internal/deferred-channel-session.js +6 -4
- package/dist/internal/deploy-client.d.ts +5 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +3 -3
- package/dist/internal/deploy-manifest.d.ts +11 -4
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +19 -7
- package/dist/internal/describe-error.d.ts +2 -0
- package/dist/internal/describe-error.d.ts.map +1 -1
- package/dist/internal/describe-error.js +2 -0
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +10 -10
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +10 -10
- package/dist/internal/discovery/channels.d.ts.map +1 -1
- package/dist/internal/discovery/channels.js +20 -16
- package/dist/internal/discovery/context.d.ts +16 -0
- package/dist/internal/discovery/context.d.ts.map +1 -1
- package/dist/internal/discovery/context.js +67 -2
- package/dist/internal/discovery/cursor-plugin.js +8 -8
- package/dist/internal/discovery/extension-overlay.d.ts.map +1 -1
- package/dist/internal/discovery/extension-overlay.js +2 -6
- package/dist/internal/discovery/extensions.js +15 -8
- package/dist/internal/discovery/info.d.ts +2 -2
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +9 -9
- package/dist/internal/discovery/instructions.d.ts.map +1 -1
- package/dist/internal/discovery/instructions.js +3 -6
- package/dist/internal/discovery/instrumentation.d.ts +10 -0
- package/dist/internal/discovery/instrumentation.d.ts.map +1 -0
- package/dist/internal/discovery/instrumentation.js +29 -0
- package/dist/internal/discovery/modules.d.ts.map +1 -1
- package/dist/internal/discovery/modules.js +7 -10
- package/dist/internal/discovery/project-public.d.ts +16 -0
- package/dist/internal/discovery/project-public.d.ts.map +1 -0
- package/dist/internal/discovery/project-public.js +54 -0
- package/dist/internal/discovery/project.d.ts +6 -0
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +40 -8
- package/dist/internal/discovery/runtime.d.ts.map +1 -1
- package/dist/internal/discovery/runtime.js +8 -8
- package/dist/internal/discovery/services.d.ts +5 -4
- package/dist/internal/discovery/services.d.ts.map +1 -1
- package/dist/internal/discovery/services.js +12 -6
- package/dist/internal/discovery.d.ts +1 -1
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +1 -1
- package/dist/internal/event-mapper.d.ts.map +1 -1
- package/dist/internal/event-mapper.js +1 -0
- package/dist/internal/expected-delivery-failure.d.ts.map +1 -1
- package/dist/internal/expected-delivery-failure.js +6 -0
- package/dist/internal/factory-resource-channel.d.ts +1 -1
- package/dist/internal/factory-resource-channel.d.ts.map +1 -1
- package/dist/internal/filesystem/nearest.d.ts +1 -0
- package/dist/internal/filesystem/nearest.d.ts.map +1 -1
- package/dist/internal/filesystem/nearest.js +1 -0
- package/dist/internal/filesystem/sdk-schemas.d.ts.map +1 -1
- package/dist/internal/filesystem/sdk-schemas.js +4 -3
- package/dist/internal/filesystem/tools.d.ts.map +1 -1
- package/dist/internal/filesystem/tools.js +1 -1
- package/dist/internal/handleAgentServeTrigger.d.ts +10 -0
- package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -1
- package/dist/internal/handleAgentServeTrigger.js +3 -0
- package/dist/internal/hmac-secret-values.d.ts +48 -0
- package/dist/internal/hmac-secret-values.d.ts.map +1 -0
- package/dist/internal/hmac-secret-values.js +68 -0
- package/dist/internal/host-otel.d.ts +1 -1
- package/dist/internal/host-otel.d.ts.map +1 -1
- package/dist/internal/host-otel.js +5 -0
- package/dist/internal/host-platforms.d.ts.map +1 -1
- package/dist/internal/host-platforms.js +8 -2
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +6 -2
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +1 -0
- package/dist/internal/ids.d.ts +8 -0
- package/dist/internal/ids.d.ts.map +1 -1
- package/dist/internal/ids.js +20 -0
- package/dist/internal/init-scaffold.js +1 -1
- package/dist/internal/interview/agent-questions.d.ts +1 -1
- package/dist/internal/interview/agent-questions.d.ts.map +1 -1
- package/dist/internal/interview/agent-questions.js +1 -1
- package/dist/internal/interview/question.d.ts +2 -2
- package/dist/internal/interview/question.d.ts.map +1 -1
- package/dist/internal/interview/question.js +2 -2
- package/dist/internal/json-schema.d.ts +7 -7
- package/dist/internal/json-schema.d.ts.map +1 -1
- package/dist/internal/json-schema.js +16 -23
- package/dist/internal/mcp-endpoint.d.ts +16 -4
- package/dist/internal/mcp-endpoint.d.ts.map +1 -1
- package/dist/internal/mcp-endpoint.js +18 -6
- package/dist/internal/mcp-host.d.ts +9 -0
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +15 -0
- package/dist/internal/otel/collector.d.ts +5 -0
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +27 -6
- package/dist/internal/otel/config.d.ts +37 -22
- package/dist/internal/otel/config.d.ts.map +1 -1
- package/dist/internal/otel/config.js +132 -125
- package/dist/internal/otel/conversation-span-processor.d.ts +9 -0
- package/dist/internal/otel/conversation-span-processor.d.ts.map +1 -0
- package/dist/internal/otel/conversation-span-processor.js +34 -0
- package/dist/internal/otel/customer.d.ts +52 -0
- package/dist/internal/otel/customer.d.ts.map +1 -0
- package/dist/internal/otel/customer.js +727 -0
- package/dist/internal/otel/runtime.d.ts +12 -16
- package/dist/internal/otel/runtime.d.ts.map +1 -1
- package/dist/internal/otel/runtime.js +37 -218
- package/dist/internal/otel-env.d.ts +6 -0
- package/dist/internal/otel-env.d.ts.map +1 -0
- package/dist/internal/otel-env.js +5 -0
- package/dist/internal/package-inline-stdio.d.ts.map +1 -1
- package/dist/internal/package-inline-stdio.js +21 -6
- package/dist/internal/reminder-runner.d.ts +9 -4
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +12 -10
- package/dist/internal/reminder-schedule.d.ts +1 -0
- package/dist/internal/reminder-schedule.d.ts.map +1 -1
- package/dist/internal/reminder-schedule.js +1 -0
- package/dist/internal/sdk-runner.d.ts +4 -3
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +157 -17
- package/dist/internal/secret-alternatives.d.ts +11 -0
- package/dist/internal/secret-alternatives.d.ts.map +1 -0
- package/dist/internal/secret-alternatives.js +13 -0
- package/dist/internal/server.d.ts +4 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +27 -26
- package/dist/internal/session-engine.d.ts +27 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +154 -25
- package/dist/internal/slack-provision-client.js +1 -1
- package/dist/internal/sqlite-experimental-warning.d.ts +2 -0
- package/dist/internal/sqlite-experimental-warning.d.ts.map +1 -0
- package/dist/internal/sqlite-experimental-warning.js +22 -0
- package/dist/internal/store-api-protocol.d.ts +1 -1
- package/dist/internal/store-api-protocol.d.ts.map +1 -1
- package/dist/internal/store-api-protocol.js +1 -1
- package/dist/internal/testing/conversation-identity-vectors.d.ts +6 -1
- package/dist/internal/testing/conversation-identity-vectors.d.ts.map +1 -1
- package/dist/internal/testing/conversation-identity-vectors.js +34 -0
- package/dist/internal/testing/hmac-secret-vectors.d.ts +38 -0
- package/dist/internal/testing/hmac-secret-vectors.d.ts.map +1 -0
- package/dist/internal/testing/hmac-secret-vectors.js +89 -0
- package/dist/internal/testing/pagerduty-continuation-fixtures.d.ts +42 -0
- package/dist/internal/testing/pagerduty-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/pagerduty-continuation-fixtures.js +175 -0
- package/dist/internal/update-check.d.ts +2 -2
- package/dist/internal/update-check.d.ts.map +1 -1
- package/dist/internal/update-check.js +3 -3
- package/dist/internal/zod-schema.d.ts +14 -0
- package/dist/internal/zod-schema.d.ts.map +1 -0
- package/dist/internal/zod-schema.js +22 -0
- package/dist/internal/zod3-datetime.d.ts +12 -0
- package/dist/internal/zod3-datetime.d.ts.map +1 -0
- package/dist/internal/zod3-datetime.js +17 -0
- package/dist/otel-public.d.ts +2 -3
- package/dist/otel-public.d.ts.map +1 -1
- package/dist/otel-public.js +2 -2
- package/dist/otel.d.ts +3 -102
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +61 -97
- package/dist/playground/assets/cursor-icons-16-DmHBTm1-.woff2 +0 -0
- package/dist/playground/assets/index-CyPkf2y7.css +1 -0
- package/dist/playground/assets/index-DpbzbqFY.js +62 -0
- package/dist/playground/index.html +2 -2
- package/dist/public-deprecated.d.ts +36 -0
- package/dist/public-deprecated.d.ts.map +1 -0
- package/dist/public-deprecated.js +39 -0
- package/dist/tools.d.ts +16 -13
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +4 -3
- package/dist/types.d.ts +286 -104
- package/dist/types.d.ts.map +1 -1
- package/docs/changelog.md +91 -0
- package/docs/guides/hooks.md +7 -3
- package/docs/guides/mcp-oauth.md +12 -0
- package/docs/guides/opentelemetry.md +150 -180
- package/docs/guides/pagerduty.md +341 -0
- package/docs/guides/slack.md +41 -0
- package/docs/reference/agent-config.md +21 -1
- package/docs/reference/channels.md +7 -2
- package/docs/reference/cli.md +27 -0
- package/docs/reference/hooks.md +10 -5
- package/docs/reference/sessions.md +46 -1
- package/docs/reference/tools.md +4 -3
- package/package.json +39 -8
- package/schemas/grokbot-answers.schema.json +11 -0
- package/skills/framework-map/SKILL.md +2 -1
- package/skills/migrate-v2/SKILL.md +1 -1
- package/skills/otel/SKILL.md +30 -46
- package/templates/agentic-owners/README.md +6 -1
- package/templates/agentic-owners/bot/lib/owners/decision.ts +31 -5
- package/templates/agentic-owners/bot/lib/owners/globalOverride.ts +60 -0
- package/templates/agentic-owners/bot/lib/owners/match.ts +85 -19
- package/templates/agentic-owners/bot/lib/owners/parse.ts +133 -2
- package/templates/agentic-owners/bot/lib/owners/types.ts +23 -0
- package/templates/code-wiki/evals/wiki.eval.ts +2 -2
- package/dist/docs/assets/chunks/@localSearchIndexroot.3ebvCWKy.js +0 -1
- package/dist/docs/assets/chunks/channel.BOebySCN.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C55IaN-T.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C55IaN-T.js +0 -1
- package/dist/docs/assets/chunks/clone.D06pA7ML.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DddRVjeq.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.CVCRSuQK.js +0 -162
- package/dist/docs/assets/guides_opentelemetry.md.Ck1o2frw.js +0 -45
- package/dist/docs/assets/guides_opentelemetry.md.Ck1o2frw.lean.js +0 -1
- package/dist/docs/assets/reference_sessions.md.C8FXuGwk.js +0 -1
- package/dist/docs/assets/reference_sessions.md.C8FXuGwk.lean.js +0 -1
- package/dist/playground/assets/cursor-icons-16-gwXtdAvu.woff2 +0 -0
- package/dist/playground/assets/index-DKKdkF29.js +0 -62
- package/dist/playground/assets/index-DpKinTMs.css +0 -1
- package/templates/grokbot-agents/.gitignore +0 -4
- package/templates/security-help/.gitignore +0 -4
- /package/dist/docs/assets/{guides_hooks.md.Bfj0pK91.lean.js → guides_hooks.md.B2XfGX50.lean.js} +0 -0
- /package/dist/docs/assets/{reference_channels.md.DYg0CLud.lean.js → reference_channels.md.CNNIS6K7.lean.js} +0 -0
- /package/dist/docs/assets/{reference_schedules.md.03Ryy9ca.lean.js → reference_schedules.md.BqWnJES4.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.C2GWh7g8.lean.js → reference_skills.md.Ckddg6KX.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.08XR7lIl.lean.js → reference_tools.md.Bo0UfT0a.lean.js} +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type AuthPolicy, type ChannelDefinition } from "../../types.js";
|
|
2
|
+
import type { SecretAlternatives } from "../../internal/secret-alternatives.js";
|
|
3
|
+
import { type PagerDutyChannelState } from "./state.js";
|
|
4
|
+
import type { PagerDutyChannelOptions } from "./types.js";
|
|
5
|
+
export declare function getPagerDutyChannelOptions(definition: object): PagerDutyChannelOptions | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* Deployment secrets the channel reads in the guest that must each be set:
|
|
8
|
+
* a named `selfUserIds`, `token`, or `from` secret. `deploy` declares them
|
|
9
|
+
* so an unset one is flagged instead of the agent waking on its own echoes
|
|
10
|
+
* or failing its write-backs.
|
|
11
|
+
*/
|
|
12
|
+
export declare function pagerDutyChannelCredentialSecretNames(definition: object): string[];
|
|
13
|
+
/**
|
|
14
|
+
* Deployment secrets of which at least one must be set: with `selfUserIds`
|
|
15
|
+
* omitted, the agent's user comes from `PAGERDUTY_USER_ID` or is inferred
|
|
16
|
+
* from the channel's token. `deploy` warns when neither is set. A token
|
|
17
|
+
* authored in code always infers, so it needs no warning.
|
|
18
|
+
*/
|
|
19
|
+
export declare function pagerDutyChannelSecretAlternatives(definition: object): SecretAlternatives[];
|
|
20
|
+
/**
|
|
21
|
+
* Why a `pagerdutyChannel` cannot deploy onto architecture v2 as authored,
|
|
22
|
+
* or `undefined` when it can: v2 needs a named `webhookSecret` so the
|
|
23
|
+
* control plane can verify `X-PagerDuty-Signature` before any compute starts.
|
|
24
|
+
*/
|
|
25
|
+
export declare function pagerDutyChannelArchitectureError(definition: object): string | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* The route policy for a PagerDuty v3 webhook whose secret is named: any
|
|
28
|
+
* `v1=` entry of `X-PagerDuty-Signature` must be the body's HMAC under the
|
|
29
|
+
* env var / deployment secret `secretName`, so both of a rotating pair of
|
|
30
|
+
* secrets verify. Being an {@link hmacSignatureAuth} policy, `deploy`
|
|
31
|
+
* writes it into the manifest and the control plane runs the same check
|
|
32
|
+
* at ingestion.
|
|
33
|
+
*/
|
|
34
|
+
export declare function pagerDutyWebhookSignatureAuth(secretName: string): AuthPolicy;
|
|
35
|
+
export declare function pagerdutyChannel(options?: PagerDutyChannelOptions): ChannelDefinition<PagerDutyChannelState>;
|
|
36
|
+
/** The slice of a discovered agent mount that {@link findPagerDutyChannelTargets} reads. */
|
|
37
|
+
export interface PagerDutyAgentMountLike {
|
|
38
|
+
slug: string;
|
|
39
|
+
project: {
|
|
40
|
+
channels: Array<{
|
|
41
|
+
id: string;
|
|
42
|
+
definition: {
|
|
43
|
+
meta?: {
|
|
44
|
+
kind?: string;
|
|
45
|
+
pagerdutyWebhookEvents?: readonly string[];
|
|
46
|
+
};
|
|
47
|
+
routes?: ReadonlyArray<{
|
|
48
|
+
method: string;
|
|
49
|
+
path: string;
|
|
50
|
+
}>;
|
|
51
|
+
};
|
|
52
|
+
}>;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface PagerDutyChannelTarget {
|
|
56
|
+
slug: string;
|
|
57
|
+
channelId: string;
|
|
58
|
+
/** Route path under the channel (default `/`). */
|
|
59
|
+
routePath: string;
|
|
60
|
+
events: string[];
|
|
61
|
+
}
|
|
62
|
+
/** Every mounted `pagerdutyChannel()`, for `bdk pagerduty replay` and `events`. */
|
|
63
|
+
export declare function findPagerDutyChannelTargets(mounts: ReadonlyArray<PagerDutyAgentMountLike>): PagerDutyChannelTarget[];
|
|
64
|
+
//# sourceMappingURL=pagerduty-channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagerduty-channel.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/pagerduty-channel.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAe,MAAM,gBAAgB,CAAC;AACtF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAahF,OAAO,EAA8B,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAI1D,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,GACjB,uBAAuB,GAAG,SAAS,CAErC;AAED;;;;;GAKG;AACH,wBAAgB,qCAAqC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAUlF;AAED;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAe3F;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWxF;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAO5E;AAmCD,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,uBAA4B,GACpC,iBAAiB,CAAC,qBAAqB,CAAC,CA4D1C;AAED,4FAA4F;AAC5F,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QACP,QAAQ,EAAE,KAAK,CAAC;YACd,EAAE,EAAE,MAAM,CAAC;YACX,UAAU,EAAE;gBACV,IAAI,CAAC,EAAE;oBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;oBAAC,sBAAsB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;iBAAE,CAAC;gBACrE,MAAM,CAAC,EAAE,aAAa,CAAC;oBAAE,MAAM,EAAE,MAAM,CAAC;oBAAC,IAAI,EAAE,MAAM,CAAA;iBAAE,CAAC,CAAC;aAC1D,CAAC;SACH,CAAC,CAAC;KACJ,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,mFAAmF;AACnF,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,aAAa,CAAC,uBAAuB,CAAC,GAC7C,sBAAsB,EAAE,CAkB1B"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import * as z from "zod/v4";
|
|
2
|
+
import { allowAll, defineChannel, hmacSignatureAuth, localDevStrict, loopbackOnly, POST, } from "../../channels.js";
|
|
3
|
+
import { withPropagatingBackgroundErrors } from "../../internal/channel-dispatch.js";
|
|
4
|
+
import { normalizeIdentity } from "../../internal/continuation-identity.js";
|
|
5
|
+
import { isDevMode } from "../../internal/dev-mode.js";
|
|
6
|
+
import { attachHostedAdmissionAdapter } from "../../internal/hosted-admission-adapter.js";
|
|
7
|
+
import { replayCatchRequest } from "../../internal/hosted-catch.js";
|
|
8
|
+
import { AGENT_SDK_CATCH_EVENT_TYPE } from "../../internal/hosted-catch-protocol.js";
|
|
9
|
+
import { namedWebhookSecretArchitectureError } from "../../internal/named-webhook-secret.js";
|
|
10
|
+
import { isSecretRef } from "../../types.js";
|
|
11
|
+
import { buildDefaultPagerDutyEvents } from "./defaults.js";
|
|
12
|
+
import { derivePagerDutyWebhookEvents, PAGERDUTY_CHANNEL_KIND } from "./events.js";
|
|
13
|
+
import { handlePagerDutyWebhookRequest, PAGERDUTY_SIGNATURE_HEADER, PAGERDUTY_SIGNATURE_PREFIX, PAGERDUTY_SIGNATURE_SEPARATOR, PAGERDUTY_WEBHOOK_SECRET_ENV, } from "./pagerduty-webhook.js";
|
|
14
|
+
import { PAGERDUTY_TOKEN_ENV } from "./api.js";
|
|
15
|
+
import { PAGERDUTY_USER_ID_ENV, pagerDutySelfUserIdSecretName } from "./self-user.js";
|
|
16
|
+
import { pagerDutySecretName, resolvePagerDutySecret } from "./secrets.js";
|
|
17
|
+
import { emptyPagerDutyChannelState } from "./state.js";
|
|
18
|
+
const pagerDutyChannelOptionsByDefinition = new WeakMap();
|
|
19
|
+
export function getPagerDutyChannelOptions(definition) {
|
|
20
|
+
return pagerDutyChannelOptionsByDefinition.get(definition);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Deployment secrets the channel reads in the guest that must each be set:
|
|
24
|
+
* a named `selfUserIds`, `token`, or `from` secret. `deploy` declares them
|
|
25
|
+
* so an unset one is flagged instead of the agent waking on its own echoes
|
|
26
|
+
* or failing its write-backs.
|
|
27
|
+
*/
|
|
28
|
+
export function pagerDutyChannelCredentialSecretNames(definition) {
|
|
29
|
+
const options = getPagerDutyChannelOptions(definition);
|
|
30
|
+
if (options === undefined) {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
return [
|
|
34
|
+
...(options.selfUserIds === undefined ? [] : [pagerDutySelfUserIdSecretName(options)]),
|
|
35
|
+
...(isSecretRef(options.token) ? [options.token.secretName] : []),
|
|
36
|
+
...(isSecretRef(options.from) ? [options.from.secretName] : []),
|
|
37
|
+
].filter((name) => name !== undefined);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Deployment secrets of which at least one must be set: with `selfUserIds`
|
|
41
|
+
* omitted, the agent's user comes from `PAGERDUTY_USER_ID` or is inferred
|
|
42
|
+
* from the channel's token. `deploy` warns when neither is set. A token
|
|
43
|
+
* authored in code always infers, so it needs no warning.
|
|
44
|
+
*/
|
|
45
|
+
export function pagerDutyChannelSecretAlternatives(definition) {
|
|
46
|
+
const options = getPagerDutyChannelOptions(definition);
|
|
47
|
+
if (options === undefined || options.selfUserIds !== undefined) {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
const tokenName = pagerDutySecretName(options.token, PAGERDUTY_TOKEN_ENV);
|
|
51
|
+
if (tokenName === undefined) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
return [
|
|
55
|
+
{
|
|
56
|
+
names: [PAGERDUTY_USER_ID_ENV, tokenName],
|
|
57
|
+
unsetEffect: `the PagerDuty channel cannot tell the agent's own actions apart, so echo skip is off (set ${PAGERDUTY_USER_ID_ENV}, or ${tokenName} to infer it)`,
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Why a `pagerdutyChannel` cannot deploy onto architecture v2 as authored,
|
|
63
|
+
* or `undefined` when it can: v2 needs a named `webhookSecret` so the
|
|
64
|
+
* control plane can verify `X-PagerDuty-Signature` before any compute starts.
|
|
65
|
+
*/
|
|
66
|
+
export function pagerDutyChannelArchitectureError(definition) {
|
|
67
|
+
const options = getPagerDutyChannelOptions(definition);
|
|
68
|
+
if (options === undefined) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
return namedWebhookSecretArchitectureError({
|
|
72
|
+
option: "pagerdutyChannel webhookSecret",
|
|
73
|
+
webhookSecret: options.webhookSecret,
|
|
74
|
+
envName: PAGERDUTY_WEBHOOK_SECRET_ENV,
|
|
75
|
+
verifies: "X-PagerDuty-Signature",
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The route policy for a PagerDuty v3 webhook whose secret is named: any
|
|
80
|
+
* `v1=` entry of `X-PagerDuty-Signature` must be the body's HMAC under the
|
|
81
|
+
* env var / deployment secret `secretName`, so both of a rotating pair of
|
|
82
|
+
* secrets verify. Being an {@link hmacSignatureAuth} policy, `deploy`
|
|
83
|
+
* writes it into the manifest and the control plane runs the same check
|
|
84
|
+
* at ingestion.
|
|
85
|
+
*/
|
|
86
|
+
export function pagerDutyWebhookSignatureAuth(secretName) {
|
|
87
|
+
return hmacSignatureAuth({
|
|
88
|
+
header: PAGERDUTY_SIGNATURE_HEADER,
|
|
89
|
+
secret: secretName,
|
|
90
|
+
prefix: PAGERDUTY_SIGNATURE_PREFIX,
|
|
91
|
+
separator: PAGERDUTY_SIGNATURE_SEPARATOR,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Default route auth for the resolved webhook secret, the same postures as
|
|
96
|
+
* the SCM channels: a named secret is the route policy (and the control
|
|
97
|
+
* plane's catch check); a literal or getter keeps the check in the handler
|
|
98
|
+
* behind `allowAll()`.
|
|
99
|
+
*
|
|
100
|
+
* An omitted `webhookSecret` names `PAGERDUTY_WEBHOOK_SECRET`, so a
|
|
101
|
+
* zero-config channel deploys with the control plane verifying against
|
|
102
|
+
* that deployment secret. While it is unset (a fresh local checkout), the
|
|
103
|
+
* route keeps the no-secret posture: loopback-strict, and `--dev` admits
|
|
104
|
+
* loopback. Both are read per request: channel modules construct at import,
|
|
105
|
+
* and a hosted deployment receives its secrets per request.
|
|
106
|
+
*/
|
|
107
|
+
function defaultPagerDutyRouteAuth(webhookSecret, usesDefaultSecret) {
|
|
108
|
+
if (isSecretRef(webhookSecret)) {
|
|
109
|
+
const signature = pagerDutyWebhookSignatureAuth(webhookSecret.secretName);
|
|
110
|
+
if (!usesDefaultSecret) {
|
|
111
|
+
return [signature];
|
|
112
|
+
}
|
|
113
|
+
const whileUnset = (request, info) => {
|
|
114
|
+
if (resolvePagerDutySecret(webhookSecret, PAGERDUTY_WEBHOOK_SECRET_ENV) !== undefined) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
return (isDevMode() ? loopbackOnly() : localDevStrict())(request, info);
|
|
118
|
+
};
|
|
119
|
+
return [signature, whileUnset];
|
|
120
|
+
}
|
|
121
|
+
return [allowAll()];
|
|
122
|
+
}
|
|
123
|
+
export function pagerdutyChannel(options = {}) {
|
|
124
|
+
const routePath = options.path ?? "/";
|
|
125
|
+
// Always named, never read here: it deploys like an authored
|
|
126
|
+
// `{ secretName: "PAGERDUTY_WEBHOOK_SECRET" }` whether or not the shell
|
|
127
|
+
// that runs `deploy` has the value.
|
|
128
|
+
const usesDefaultSecret = options.webhookSecret === undefined;
|
|
129
|
+
const webhookSecret = options.webhookSecret ?? { secretName: PAGERDUTY_WEBHOOK_SECRET_ENV };
|
|
130
|
+
const auth = options.auth ?? defaultPagerDutyRouteAuth(webhookSecret, usesDefaultSecret);
|
|
131
|
+
const channelOptions = { ...options, webhookSecret };
|
|
132
|
+
if (channelOptions.continuation !== undefined) {
|
|
133
|
+
channelOptions.continuation = normalizeIdentity(channelOptions.continuation, PAGERDUTY_CHANNEL_KIND);
|
|
134
|
+
}
|
|
135
|
+
const definition = defineChannel({
|
|
136
|
+
auth,
|
|
137
|
+
state: emptyPagerDutyChannelState(),
|
|
138
|
+
events: { ...buildDefaultPagerDutyEvents(channelOptions), ...options.events },
|
|
139
|
+
onStart: options.onStart,
|
|
140
|
+
onStop: options.onStop,
|
|
141
|
+
meta: {
|
|
142
|
+
kind: PAGERDUTY_CHANNEL_KIND,
|
|
143
|
+
pagerdutyWebhookEvents: derivePagerDutyWebhookEvents(channelOptions),
|
|
144
|
+
},
|
|
145
|
+
routes: [
|
|
146
|
+
POST(routePath, {
|
|
147
|
+
bodySchema: z.unknown(),
|
|
148
|
+
description: "PagerDuty v3 webhook ingress",
|
|
149
|
+
handler: async (request, args) => handlePagerDutyWebhookRequest({ options: channelOptions, request, args }),
|
|
150
|
+
}),
|
|
151
|
+
],
|
|
152
|
+
});
|
|
153
|
+
pagerDutyChannelOptionsByDefinition.set(definition, channelOptions);
|
|
154
|
+
attachHostedAdmissionAdapter(definition, {
|
|
155
|
+
kind: PAGERDUTY_CHANNEL_KIND,
|
|
156
|
+
prepareArgs: withPropagatingBackgroundErrors,
|
|
157
|
+
dispatch: async ({ channelId, eventType, payload, deliveryId, args }) => {
|
|
158
|
+
// Hosted deliveries are http.request envelopes the control plane
|
|
159
|
+
// already verified with the deployment secret and stamped with the
|
|
160
|
+
// incident's key. Replay into the route handler, which verifies
|
|
161
|
+
// X-PagerDuty-Signature again and runs the echo skip.
|
|
162
|
+
if (eventType !== AGENT_SDK_CATCH_EVENT_TYPE) {
|
|
163
|
+
return Response.json({ ok: false, error: "unsupported_pagerduty_delivery" }, { status: 400 });
|
|
164
|
+
}
|
|
165
|
+
return replayCatchRequest({
|
|
166
|
+
channelId: channelId ?? PAGERDUTY_CHANNEL_KIND,
|
|
167
|
+
deliveryId,
|
|
168
|
+
routes: definition.routes ?? [],
|
|
169
|
+
payload,
|
|
170
|
+
args,
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
return definition;
|
|
175
|
+
}
|
|
176
|
+
/** Every mounted `pagerdutyChannel()`, for `bdk pagerduty replay` and `events`. */
|
|
177
|
+
export function findPagerDutyChannelTargets(mounts) {
|
|
178
|
+
const targets = [];
|
|
179
|
+
for (const { slug, project } of mounts) {
|
|
180
|
+
for (const channel of project.channels) {
|
|
181
|
+
const meta = channel.definition.meta;
|
|
182
|
+
if (meta?.kind !== PAGERDUTY_CHANNEL_KIND) {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const postRoute = (channel.definition.routes ?? []).find((route) => route.method === "POST");
|
|
186
|
+
targets.push({
|
|
187
|
+
slug,
|
|
188
|
+
channelId: channel.id,
|
|
189
|
+
routePath: postRoute?.path ?? "/",
|
|
190
|
+
events: [...(meta.pagerdutyWebhookEvents ?? [])],
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return targets;
|
|
195
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { ChannelHandlerArgs } from "../../types.js";
|
|
2
|
+
import type { PagerDutyChannelOptions, PagerDutyEventContext, PagerDutyWebhookDelivery } from "./types.js";
|
|
3
|
+
/** Env var / deployment secret an omitted `webhookSecret` falls back to. */
|
|
4
|
+
export declare const PAGERDUTY_WEBHOOK_SECRET_ENV = "PAGERDUTY_WEBHOOK_SECRET";
|
|
5
|
+
/** Header PagerDuty signs v3 deliveries with: `v1=<hex>[,v1=<hex>…]`. */
|
|
6
|
+
export declare const PAGERDUTY_SIGNATURE_HEADER = "x-pagerduty-signature";
|
|
7
|
+
export declare const PAGERDUTY_SIGNATURE_PREFIX = "v1=";
|
|
8
|
+
/** Separator between signatures while a subscription's secret rotates. */
|
|
9
|
+
export declare const PAGERDUTY_SIGNATURE_SEPARATOR = ",";
|
|
10
|
+
/**
|
|
11
|
+
* The secret's value for the handler's own signature check, read now: an
|
|
12
|
+
* omitted field names `PAGERDUTY_WEBHOOK_SECRET` (hosted, the addressed
|
|
13
|
+
* installation's secret), and an authored name never falls back to it.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolvePagerDutyWebhookSecret(options: Pick<PagerDutyChannelOptions, "webhookSecret">): string | undefined;
|
|
16
|
+
/** One `X-PagerDuty-Signature` entry for a raw body: `v1=<hex>`. */
|
|
17
|
+
export declare function signPagerDutyWebhookBody(input: {
|
|
18
|
+
rawBody: string | Uint8Array;
|
|
19
|
+
secret: string;
|
|
20
|
+
}): string;
|
|
21
|
+
/**
|
|
22
|
+
* True when any `v1=` entry in the header is the body's HMAC-SHA256 under
|
|
23
|
+
* any secret `secret` holds. `secret` is the named secret's value: one
|
|
24
|
+
* signing secret, or one per line when several subscriptions sign the
|
|
25
|
+
* route. Every (secret, entry) pair is compared in constant time with no
|
|
26
|
+
* early exit; malformed entries never match, and a missing header is a
|
|
27
|
+
* plain `false`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function verifyPagerDutyWebhookSignature(input: {
|
|
30
|
+
rawBody: string | Uint8Array;
|
|
31
|
+
signatureHeader: string | null | undefined;
|
|
32
|
+
secret: string;
|
|
33
|
+
}): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* True when the event is the agent's own action echoed back: its `agent`
|
|
36
|
+
* is a PagerDuty user the agent acts as. Service integrations and
|
|
37
|
+
* PagerDuty itself never count, so an alert the agent's own monitor opened
|
|
38
|
+
* still dispatches.
|
|
39
|
+
*/
|
|
40
|
+
export declare function isPagerDutySelfEcho(ctx: Pick<PagerDutyEventContext, "agent">, selfUserIds: ReadonlySet<string>): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Accept a raw v3 body. The event type comes from the signed body's
|
|
43
|
+
* `event.event_type`, never from a header, so a captured delivery cannot be
|
|
44
|
+
* re-dispatched as another event.
|
|
45
|
+
*/
|
|
46
|
+
export declare function parsePagerDutyWebhookPayload(payload: unknown): PagerDutyWebhookDelivery | null;
|
|
47
|
+
export declare function parsePagerDutyEventContext(delivery: PagerDutyWebhookDelivery): Omit<PagerDutyEventContext, "host" | "artifacts" | "send" | "pagerduty"> | null;
|
|
48
|
+
/**
|
|
49
|
+
* Run the authored hooks for one verified PagerDuty delivery and `send()`
|
|
50
|
+
* the turn. Callers own delivery auth: the HTTP route verifies
|
|
51
|
+
* `X-PagerDuty-Signature`; hosted admission arrives verified. The v2
|
|
52
|
+
* mailbox is stamped upstream (local CP or hosted ingress), never here.
|
|
53
|
+
*/
|
|
54
|
+
export declare function dispatchPagerDutyWebhook(input: {
|
|
55
|
+
options: PagerDutyChannelOptions;
|
|
56
|
+
delivery: PagerDutyWebhookDelivery;
|
|
57
|
+
args: ChannelHandlerArgs;
|
|
58
|
+
}): Promise<Response>;
|
|
59
|
+
/**
|
|
60
|
+
* HTTP entry for one agent's PagerDuty channel: the `X-PagerDuty-Signature`
|
|
61
|
+
* check when a secret is configured, then {@link dispatchPagerDutyWebhook}.
|
|
62
|
+
* Without a secret the route auth owns admission (`serve --dev` admits
|
|
63
|
+
* loopback only; production stays loopback-strict).
|
|
64
|
+
*/
|
|
65
|
+
export declare function handlePagerDutyWebhookRequest(input: {
|
|
66
|
+
options: PagerDutyChannelOptions;
|
|
67
|
+
request: Request;
|
|
68
|
+
args: ChannelHandlerArgs;
|
|
69
|
+
}): Promise<Response>;
|
|
70
|
+
//# sourceMappingURL=pagerduty-webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagerduty-webhook.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/pagerduty-webhook.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAiC,MAAM,gBAAgB,CAAC;AA0BxF,OAAO,KAAK,EACV,uBAAuB,EAEvB,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAEpB,4EAA4E;AAC5E,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AACvE,yEAAyE;AACzE,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAClE,eAAO,MAAM,0BAA0B,QAAQ,CAAC;AAChD,0EAA0E;AAC1E,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,eAAe,CAAC,GACtD,MAAM,GAAG,SAAS,CAEpB;AAED,oEAAoE;AACpE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAYV;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC,EACzC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAC/B,OAAO,CAST;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,wBAAwB,GAAG,IAAI,CAO9F;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,wBAAwB,GACjC,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC,GAAG,IAAI,CAmBjF;AA+DD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,OAAO,EAAE,uBAAuB,CAAC;IACjC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,IAAI,EAAE,kBAAkB,CAAC;CAC1B,GAAG,OAAO,CAAC,QAAQ,CAAC,CA2FpB;AAED;;;;;GAKG;AACH,wBAAsB,6BAA6B,CAAC,KAAK,EAAE;IACzD,OAAO,EAAE,uBAAuB,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,kBAAkB,CAAC;CAC1B,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkCpB"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { createHmac } from "node:crypto";
|
|
2
|
+
import { acknowledgeTask, isTaskDispatch, skipped, turnStarted, } from "../../internal/channel-dispatch.js";
|
|
3
|
+
import { continuationSource, mintClaim } from "../../internal/continuation-identity.js";
|
|
4
|
+
import { hmacSignatureMatchesAny, parseHmacSecrets } from "../../internal/hmac-secret-values.js";
|
|
5
|
+
import { bindLocalIngressSend } from "../../internal/local-ingress.js";
|
|
6
|
+
import { defaultPagerDutyIncidentDispatch, defaultPagerDutyIncidentMessage, defaultPagerDutyTitle, } from "./defaults.js";
|
|
7
|
+
import { isPagerDutyIncidentLifecycleEvent, PAGERDUTY_CHANNEL_KIND, PAGERDUTY_NOTE_EVENTS, PAGERDUTY_RESPONDER_EVENTS, } from "./events.js";
|
|
8
|
+
import { asNonEmptyString, pagerDutyAccountSubdomain, pagerDutyEventIncident, pagerDutyEventRecord, pagerDutyIncidentFromData, pagerDutyNoteFromData, pagerDutyReference, pagerDutyResponderFromData, } from "./payload.js";
|
|
9
|
+
import { pagerDutyChannelClient } from "./api.js";
|
|
10
|
+
import { resolvePagerDutySecret } from "./secrets.js";
|
|
11
|
+
import { resolvePagerDutySelfUserIds } from "./self-user.js";
|
|
12
|
+
import { pagerDutyChannelStateForEvent } from "./state.js";
|
|
13
|
+
/** Env var / deployment secret an omitted `webhookSecret` falls back to. */
|
|
14
|
+
export const PAGERDUTY_WEBHOOK_SECRET_ENV = "PAGERDUTY_WEBHOOK_SECRET";
|
|
15
|
+
/** Header PagerDuty signs v3 deliveries with: `v1=<hex>[,v1=<hex>…]`. */
|
|
16
|
+
export const PAGERDUTY_SIGNATURE_HEADER = "x-pagerduty-signature";
|
|
17
|
+
export const PAGERDUTY_SIGNATURE_PREFIX = "v1=";
|
|
18
|
+
/** Separator between signatures while a subscription's secret rotates. */
|
|
19
|
+
export const PAGERDUTY_SIGNATURE_SEPARATOR = ",";
|
|
20
|
+
/**
|
|
21
|
+
* The secret's value for the handler's own signature check, read now: an
|
|
22
|
+
* omitted field names `PAGERDUTY_WEBHOOK_SECRET` (hosted, the addressed
|
|
23
|
+
* installation's secret), and an authored name never falls back to it.
|
|
24
|
+
*/
|
|
25
|
+
export function resolvePagerDutyWebhookSecret(options) {
|
|
26
|
+
return resolvePagerDutySecret(options.webhookSecret, PAGERDUTY_WEBHOOK_SECRET_ENV);
|
|
27
|
+
}
|
|
28
|
+
/** One `X-PagerDuty-Signature` entry for a raw body: `v1=<hex>`. */
|
|
29
|
+
export function signPagerDutyWebhookBody(input) {
|
|
30
|
+
return `${PAGERDUTY_SIGNATURE_PREFIX}${createHmac("sha256", input.secret).update(input.rawBody).digest("hex")}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* True when any `v1=` entry in the header is the body's HMAC-SHA256 under
|
|
34
|
+
* any secret `secret` holds. `secret` is the named secret's value: one
|
|
35
|
+
* signing secret, or one per line when several subscriptions sign the
|
|
36
|
+
* route. Every (secret, entry) pair is compared in constant time with no
|
|
37
|
+
* early exit; malformed entries never match, and a missing header is a
|
|
38
|
+
* plain `false`.
|
|
39
|
+
*/
|
|
40
|
+
export function verifyPagerDutyWebhookSignature(input) {
|
|
41
|
+
const parsed = parseHmacSecrets(input.secret);
|
|
42
|
+
if (input.signatureHeader === null || input.signatureHeader === undefined || !parsed.ok) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return hmacSignatureMatchesAny({
|
|
46
|
+
body: input.rawBody,
|
|
47
|
+
presented: input.signatureHeader,
|
|
48
|
+
secrets: parsed.secrets,
|
|
49
|
+
prefix: PAGERDUTY_SIGNATURE_PREFIX,
|
|
50
|
+
separator: PAGERDUTY_SIGNATURE_SEPARATOR,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* True when the event is the agent's own action echoed back: its `agent`
|
|
55
|
+
* is a PagerDuty user the agent acts as. Service integrations and
|
|
56
|
+
* PagerDuty itself never count, so an alert the agent's own monitor opened
|
|
57
|
+
* still dispatches.
|
|
58
|
+
*/
|
|
59
|
+
export function isPagerDutySelfEcho(ctx, selfUserIds) {
|
|
60
|
+
const agent = ctx.agent;
|
|
61
|
+
if (agent === undefined || selfUserIds.size === 0) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (agent.type !== undefined && agent.type !== "user_reference" && agent.type !== "user") {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return selfUserIds.has(agent.id);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Accept a raw v3 body. The event type comes from the signed body's
|
|
71
|
+
* `event.event_type`, never from a header, so a captured delivery cannot be
|
|
72
|
+
* re-dispatched as another event.
|
|
73
|
+
*/
|
|
74
|
+
export function parsePagerDutyWebhookPayload(payload) {
|
|
75
|
+
const event = pagerDutyEventRecord(payload);
|
|
76
|
+
const eventType = asNonEmptyString(event?.event_type);
|
|
77
|
+
if (event === undefined || eventType === undefined) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return { eventType, payload: payload };
|
|
81
|
+
}
|
|
82
|
+
export function parsePagerDutyEventContext(delivery) {
|
|
83
|
+
const event = pagerDutyEventRecord(delivery.payload);
|
|
84
|
+
const eventId = asNonEmptyString(event?.id);
|
|
85
|
+
if (event === undefined || eventId === undefined) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const incident = pagerDutyEventIncident(event);
|
|
89
|
+
return {
|
|
90
|
+
deliveryId: delivery.deliveryId,
|
|
91
|
+
eventId,
|
|
92
|
+
eventType: delivery.eventType,
|
|
93
|
+
resourceType: asNonEmptyString(event.resource_type),
|
|
94
|
+
occurredAt: asNonEmptyString(event.occurred_at),
|
|
95
|
+
agent: pagerDutyReference(event.agent),
|
|
96
|
+
incidentId: incident?.id,
|
|
97
|
+
incidentKey: incident?.incidentKey,
|
|
98
|
+
accountSubdomain: pagerDutyAccountSubdomain(event),
|
|
99
|
+
payload: event,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function invalidPayload(error) {
|
|
103
|
+
return Response.json({ ok: false, error }, { status: 400 });
|
|
104
|
+
}
|
|
105
|
+
async function applyDispatch(input) {
|
|
106
|
+
const extra = { event: input.ctx.eventType };
|
|
107
|
+
if (input.dispatch === null) {
|
|
108
|
+
return skipped("not_dispatched", extra);
|
|
109
|
+
}
|
|
110
|
+
if (isTaskDispatch(input.dispatch)) {
|
|
111
|
+
return acknowledgeTask(input.args, PAGERDUTY_CHANNEL_KIND, input.dispatch, extra);
|
|
112
|
+
}
|
|
113
|
+
const ctx = input.ctx;
|
|
114
|
+
const state = pagerDutyChannelStateForEvent({
|
|
115
|
+
eventType: ctx.eventType,
|
|
116
|
+
eventId: ctx.eventId,
|
|
117
|
+
incidentId: ctx.incidentId,
|
|
118
|
+
incidentNumber: input.incidentNumber,
|
|
119
|
+
incidentKey: ctx.incidentKey,
|
|
120
|
+
serviceId: input.serviceId,
|
|
121
|
+
deliveryId: ctx.deliveryId,
|
|
122
|
+
occurredAt: ctx.occurredAt,
|
|
123
|
+
});
|
|
124
|
+
// v1 agents (omitted continuation resolves to `none/v1`) keep one
|
|
125
|
+
// engine-minted conversation per incident; v2 takes the CP stamp.
|
|
126
|
+
const engineToken = continuationSource(input.options.continuation, PAGERDUTY_CHANNEL_KIND) === "engine" &&
|
|
127
|
+
ctx.incidentId !== undefined
|
|
128
|
+
? mintClaim({
|
|
129
|
+
type: "pagerduty-incident",
|
|
130
|
+
resource: { incidentId: ctx.incidentId },
|
|
131
|
+
}).slice("cont:".length)
|
|
132
|
+
: undefined;
|
|
133
|
+
const turn = {
|
|
134
|
+
auth: input.dispatch.auth,
|
|
135
|
+
title: input.dispatch.title ?? input.title,
|
|
136
|
+
state: state,
|
|
137
|
+
refreshState: state,
|
|
138
|
+
};
|
|
139
|
+
if (engineToken !== undefined) {
|
|
140
|
+
turn.continuationToken = engineToken;
|
|
141
|
+
}
|
|
142
|
+
if (input.options.cloud !== undefined) {
|
|
143
|
+
turn.cloud = input.options.cloud;
|
|
144
|
+
}
|
|
145
|
+
const session = await input.args.send([input.dispatch.message ?? input.message, ...(input.dispatch.context ?? [])].join("\n"), turn);
|
|
146
|
+
return turnStarted(session);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Run the authored hooks for one verified PagerDuty delivery and `send()`
|
|
150
|
+
* the turn. Callers own delivery auth: the HTTP route verifies
|
|
151
|
+
* `X-PagerDuty-Signature`; hosted admission arrives verified. The v2
|
|
152
|
+
* mailbox is stamped upstream (local CP or hosted ingress), never here.
|
|
153
|
+
*/
|
|
154
|
+
export async function dispatchPagerDutyWebhook(input) {
|
|
155
|
+
const parsed = parsePagerDutyEventContext(input.delivery);
|
|
156
|
+
if (parsed === null) {
|
|
157
|
+
return invalidPayload("invalid_pagerduty_payload");
|
|
158
|
+
}
|
|
159
|
+
const args = input.args;
|
|
160
|
+
const ctx = {
|
|
161
|
+
...parsed,
|
|
162
|
+
pagerduty: pagerDutyChannelClient(input.options),
|
|
163
|
+
host: args.host,
|
|
164
|
+
artifacts: args.artifacts,
|
|
165
|
+
send: args.send,
|
|
166
|
+
};
|
|
167
|
+
const eventType = ctx.eventType;
|
|
168
|
+
if (eventType === "pagey.ping") {
|
|
169
|
+
return skipped("ping");
|
|
170
|
+
}
|
|
171
|
+
if (isPagerDutySelfEcho(ctx, await resolvePagerDutySelfUserIds({ options: input.options }))) {
|
|
172
|
+
return skipped("self_echo", { event: eventType, agent: ctx.agent?.id });
|
|
173
|
+
}
|
|
174
|
+
const data = ctx.payload.data;
|
|
175
|
+
if (isPagerDutyIncidentLifecycleEvent(eventType)) {
|
|
176
|
+
const incident = pagerDutyIncidentFromData(data);
|
|
177
|
+
if (incident === undefined) {
|
|
178
|
+
return invalidPayload("invalid_pagerduty_incident_payload");
|
|
179
|
+
}
|
|
180
|
+
const event = { eventType, action: eventType.slice("incident.".length), incident };
|
|
181
|
+
const dispatch = input.options.onIncident === undefined
|
|
182
|
+
? defaultPagerDutyIncidentDispatch(ctx, event)
|
|
183
|
+
: await input.options.onIncident(ctx, event);
|
|
184
|
+
return applyDispatch({
|
|
185
|
+
options: input.options,
|
|
186
|
+
args,
|
|
187
|
+
ctx,
|
|
188
|
+
dispatch,
|
|
189
|
+
message: defaultPagerDutyIncidentMessage(ctx, event),
|
|
190
|
+
title: defaultPagerDutyTitle(ctx, incident),
|
|
191
|
+
incidentNumber: incident.number,
|
|
192
|
+
serviceId: incident.service?.id,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
if (PAGERDUTY_NOTE_EVENTS.includes(eventType)) {
|
|
196
|
+
if (input.options.onNote === undefined) {
|
|
197
|
+
return skipped("no_handler", { event: eventType });
|
|
198
|
+
}
|
|
199
|
+
const note = pagerDutyNoteFromData(data);
|
|
200
|
+
if (note === undefined) {
|
|
201
|
+
return invalidPayload("invalid_pagerduty_note_payload");
|
|
202
|
+
}
|
|
203
|
+
return applyDispatch({
|
|
204
|
+
options: input.options,
|
|
205
|
+
args,
|
|
206
|
+
ctx,
|
|
207
|
+
dispatch: await input.options.onNote(ctx, note),
|
|
208
|
+
message: `PagerDuty note on incident ${note.incident.id}:\n${note.content}`,
|
|
209
|
+
title: defaultPagerDutyTitle(ctx),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
if (PAGERDUTY_RESPONDER_EVENTS.includes(eventType)) {
|
|
213
|
+
if (input.options.onResponder === undefined) {
|
|
214
|
+
return skipped("no_handler", { event: eventType });
|
|
215
|
+
}
|
|
216
|
+
const responder = pagerDutyResponderFromData(eventType, data);
|
|
217
|
+
if (responder === undefined) {
|
|
218
|
+
return invalidPayload("invalid_pagerduty_responder_payload");
|
|
219
|
+
}
|
|
220
|
+
return applyDispatch({
|
|
221
|
+
options: input.options,
|
|
222
|
+
args,
|
|
223
|
+
ctx,
|
|
224
|
+
dispatch: await input.options.onResponder(ctx, responder),
|
|
225
|
+
message: `PagerDuty ${eventType} on incident ${responder.incident.id}`,
|
|
226
|
+
title: defaultPagerDutyTitle(ctx),
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
if (input.options.onEvent === undefined) {
|
|
230
|
+
return skipped("unsupported_event", { event: eventType });
|
|
231
|
+
}
|
|
232
|
+
return applyDispatch({
|
|
233
|
+
options: input.options,
|
|
234
|
+
args,
|
|
235
|
+
ctx,
|
|
236
|
+
dispatch: await input.options.onEvent(ctx, { eventType, data }),
|
|
237
|
+
message: `PagerDuty ${eventType} event`,
|
|
238
|
+
title: defaultPagerDutyTitle(ctx),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* HTTP entry for one agent's PagerDuty channel: the `X-PagerDuty-Signature`
|
|
243
|
+
* check when a secret is configured, then {@link dispatchPagerDutyWebhook}.
|
|
244
|
+
* Without a secret the route auth owns admission (`serve --dev` admits
|
|
245
|
+
* loopback only; production stays loopback-strict).
|
|
246
|
+
*/
|
|
247
|
+
export async function handlePagerDutyWebhookRequest(input) {
|
|
248
|
+
const bodyText = await input.request.text();
|
|
249
|
+
const secret = resolvePagerDutyWebhookSecret(input.options);
|
|
250
|
+
if (secret !== undefined &&
|
|
251
|
+
!verifyPagerDutyWebhookSignature({
|
|
252
|
+
rawBody: bodyText,
|
|
253
|
+
signatureHeader: input.request.headers.get(PAGERDUTY_SIGNATURE_HEADER),
|
|
254
|
+
secret,
|
|
255
|
+
})) {
|
|
256
|
+
return Response.json({ ok: false, error: "invalid_signature" }, { status: 401 });
|
|
257
|
+
}
|
|
258
|
+
let payload;
|
|
259
|
+
try {
|
|
260
|
+
payload = JSON.parse(bodyText);
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return Response.json({ ok: false, error: "invalid_json" }, { status: 400 });
|
|
264
|
+
}
|
|
265
|
+
const delivery = parsePagerDutyWebhookPayload(payload);
|
|
266
|
+
if (delivery === null) {
|
|
267
|
+
return invalidPayload("invalid_pagerduty_payload");
|
|
268
|
+
}
|
|
269
|
+
delivery.deliveryId = input.request.headers.get("x-webhook-id") ?? undefined;
|
|
270
|
+
return dispatchPagerDutyWebhook({
|
|
271
|
+
options: input.options,
|
|
272
|
+
delivery,
|
|
273
|
+
args: bindLocalIngressSend(input.args, {
|
|
274
|
+
identity: input.options.continuation,
|
|
275
|
+
kind: PAGERDUTY_CHANNEL_KIND,
|
|
276
|
+
eventType: delivery.eventType,
|
|
277
|
+
payload: delivery.payload,
|
|
278
|
+
}),
|
|
279
|
+
});
|
|
280
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed views over a PagerDuty v3 webhook body. Every reader tolerates
|
|
3
|
+
* missing optional fields and returns `undefined` for a shape it does not
|
|
4
|
+
* recognize, so a new PagerDuty field never fails a delivery.
|
|
5
|
+
*/
|
|
6
|
+
import type { PagerDutyIncident, PagerDutyIncidentNote, PagerDutyReference, PagerDutyResponderEvent } from "./types.js";
|
|
7
|
+
export declare function asRecord(value: unknown): Record<string, unknown> | undefined;
|
|
8
|
+
export declare function asNonEmptyString(value: unknown): string | undefined;
|
|
9
|
+
/** The delivery's `event` record, or `undefined` when the body is not a v3 event. */
|
|
10
|
+
export declare function pagerDutyEventRecord(payload: unknown): Record<string, unknown> | undefined;
|
|
11
|
+
export declare function pagerDutyReference(value: unknown): PagerDutyReference | undefined;
|
|
12
|
+
/** `data` of a lifecycle event: the full incident. */
|
|
13
|
+
export declare function pagerDutyIncidentFromData(data: unknown): PagerDutyIncident | undefined;
|
|
14
|
+
/** `data` of `incident.annotated`. */
|
|
15
|
+
export declare function pagerDutyNoteFromData(data: unknown): PagerDutyIncidentNote | undefined;
|
|
16
|
+
/** `data` of `incident.responder.added` / `.replied`. */
|
|
17
|
+
export declare function pagerDutyResponderFromData(eventType: string, data: unknown): PagerDutyResponderEvent | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* The incident any incident event names: `data` itself for lifecycle
|
|
20
|
+
* events, `data.incident` for sub-resources. Mirrors the continuation
|
|
21
|
+
* selector, so a hook's `ctx.incidentId` names the session's incident.
|
|
22
|
+
*/
|
|
23
|
+
export declare function pagerDutyEventIncident(event: Record<string, unknown>): {
|
|
24
|
+
id: string;
|
|
25
|
+
incidentKey?: string;
|
|
26
|
+
} | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* The account subdomain (`acme` for `acme.pagerduty.com` or
|
|
29
|
+
* `acme.eu.pagerduty.com`) from the first PagerDuty web URL the event
|
|
30
|
+
* carries: the incident's, the agent's, or the data's own.
|
|
31
|
+
*/
|
|
32
|
+
export declare function pagerDutyAccountSubdomain(event: Record<string, unknown>): string | undefined;
|
|
33
|
+
//# sourceMappingURL=payload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/payload.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EAErB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAI5E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEnE;AAMD,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAG1F;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAYjF;AAYD,sDAAsD;AACtD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAsBtF;AAUD,sCAAsC;AACtC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,qBAAqB,GAAG,SAAS,CAYtF;AAED,yDAAyD;AACzD,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,GACZ,uBAAuB,GAAG,SAAS,CAcrC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAUlD;AAID;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAuB5F"}
|