@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.
- package/AGENTS.md +1 -0
- package/dist/bin/agent-serve.d.ts +1 -1
- package/dist/bin/agent-serve.js +48 -12
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +3 -2
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +14 -9
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +9 -18
- 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.d.ts +6 -0
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +11 -23
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.DTIg0uKK.js → app.BjS1QEI4.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.oGqZumnJ.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BpJoSaxi.js → VPLocalSearchBox.BOuvjb5Y.js} +1 -1
- package/dist/docs/assets/chunks/{arc.ylgNvRNq.js → arc.3WR6Jf-y.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.BMrNJqYk.js → architectureDiagram-Q4EWVU46.Dtb6Dqh6.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.BBWUEqf9.js → baseUniq.BUyrgrZE.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DFMu-Vza.js → blockDiagram-DXYQGD6D.BVLV_voZ.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.8nkAAxWv.js → c4Diagram-AHTNJAMY.jXJ1q70M.js} +1 -1
- package/dist/docs/assets/chunks/channel.Dt4aweTm.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.sO-z2Bag.js → chunk-4BX2VUAB.zz1SMBvK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.BMROzTMq.js → chunk-4TB4RGXK.CzYKuv3I.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.X81urwg7.js → chunk-55IACEB6.C7_tcJZD.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.eaZVFLZM.js → chunk-EDXVE4YY.DeTwQPVO.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CmZhzstR.js → chunk-FMBD7UC4.DhMTl7ut.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CTezt9Lc.js → chunk-OYMX7WX6.Me7f5hEp.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.s-T8zukB.js → chunk-QZHKN3VN.D0E0Bb6g.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.DN4Nhy-D.js → chunk-YZCP3GAM.CdOOBFYL.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DGUHZs6j.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DGUHZs6j.js +1 -0
- package/dist/docs/assets/chunks/clone.DWf3k0Z0.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Cqyp4BUH.js → cose-bilkent-S5V4N54A.BNbGESzN.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.BIECOiqR.js → dagre-KV5264BT.zU7Lu_xJ.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.1tLyWoTg.js → diagram-5BDNPKRD.B9qOdE5h.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.BVY_6VMO.js → diagram-G4DWMVQ6.D8X-sf77.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BSZ7xiBB.js → diagram-MMDJMWI5.CW7MvMlE.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.Bho6GmLh.js → diagram-TYMM5635.J489G0Nd.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.A0yVIANn.js → erDiagram-SMLLAGMA.BkW7tGfs.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.ZMgbllH6.js → flowDiagram-DWJPFMVM.jc9iWORD.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.BCCPBhXo.js → ganttDiagram-T4ZO3ILL.B-UQfd9E.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.BOkL0BbA.js → gitGraphDiagram-UUTBAWPF.DFzrTSlJ.js} +1 -1
- package/dist/docs/assets/chunks/{graph.DMyZPu86.js → graph.C5IB6_e_.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.CjG1IiEw.js → infoDiagram-42DDH7IO.DwF0-c8L.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.UCe-kq9g.js → ishikawaDiagram-UXIWVN3A.fBaTqzE7.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.3WyOK_eY.js → journeyDiagram-VCZTEJTY.CM8gDVJy.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.WoRG2qY1.js → kanban-definition-6JOO6SKY.YiD1p0LB.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DV07xDd5.js → layout.6Um-DVJT.js} +1 -1
- package/dist/docs/assets/chunks/{linear.CTO8mN6o.js → linear.DcTeg4Hn.js} +1 -1
- package/dist/docs/assets/chunks/{min.SvTtcKuZ.js → min.CIxkY8Fe.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.DMGgQ-HB.js → mindmap-definition-QFDTVHPH.D4QM_voR.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B7851apI.js → pieDiagram-DEJITSTG.nmB309G1.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CEqyypIX.js → quadrantDiagram-34T5L4WZ.D1HtZR3C.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.C3Mwsw-H.js → requirementDiagram-MS252O5E.CZgQWob-.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DyYK0XxY.js → sankeyDiagram-XADWPNL6.DtiBfU-P.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.SiQPH-XM.js → sequenceDiagram-FGHM5R23.Cld4gDSt.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CTJMsP4p.js → stateDiagram-FHFEXIEX.DatP823_.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C0571l4D.js +1 -0
- package/dist/docs/assets/chunks/{theme.DJo4my9R.js → theme.D5jbBys7.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.CxSNRlQ6.js → timeline-definition-GMOUNBTQ.DwQLI2be.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BdoJskyD.js → vennDiagram-DHZGUBPP.a5yMfnsa.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.B-FXivgT.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.IjIbFn_F.js → wardleyDiagram-NUSXRM2D.Dz--Opy3.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CPUxDZLH.js → xychartDiagram-5P7HB3ND.Dl8w8TeT.js} +1 -1
- package/dist/docs/assets/{guides_opentelemetry.md.Ck1o2frw.js → guides_opentelemetry.md.DBQtp7_V.js} +4 -4
- package/dist/docs/assets/{guides_opentelemetry.md.Ck1o2frw.lean.js → guides_opentelemetry.md.DBQtp7_V.lean.js} +1 -1
- 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/{reference_channels.md.DYg0CLud.js → reference_channels.md.Bxaa020x.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_tools.md.08XR7lIl.js → reference_tools.md.-6pypsWt.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +35 -35
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +36 -36
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/export-grokbot.html +35 -35
- package/dist/docs/guides/github.html +35 -35
- package/dist/docs/guides/gitlab.html +35 -35
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/migrate.html +35 -35
- package/dist/docs/guides/opentelemetry.html +39 -39
- package/dist/docs/guides/opentelemetry.md +10 -5
- package/dist/docs/guides/pagerduty.html +119 -0
- package/dist/docs/guides/pagerduty.md +336 -0
- package/dist/docs/guides/slack.html +35 -35
- package/dist/docs/guides/webhooks.html +35 -35
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +35 -35
- package/dist/docs/index.html +35 -35
- package/dist/docs/llms-full.txt +381 -6
- package/dist/docs/llms.txt +1 -0
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +37 -37
- package/dist/docs/reference/channels.md +2 -1
- package/dist/docs/reference/cli.html +42 -37
- package/dist/docs/reference/cli.md +27 -0
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +36 -36
- package/dist/docs/reference/hooks.html +35 -35
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/memory.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +35 -35
- package/dist/docs/reference/skills.html +35 -35
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +37 -37
- package/dist/docs/reference/tools.md +1 -0
- package/dist/docs/templates/agentic-owners.html +35 -35
- package/dist/docs/templates/grokbot-agents.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +35 -35
- 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/builtin-tools/artifacts.d.ts.map +1 -1
- package/dist/internal/builtin-tools/artifacts.js +45 -12
- 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 +21 -12
- 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/deploy-manifest.d.ts +11 -4
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +17 -5
- 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 +66 -0
- package/dist/internal/discovery/extension-overlay.d.ts.map +1 -1
- package/dist/internal/discovery/extension-overlay.js +2 -6
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +3 -0
- package/dist/internal/discovery/instructions.d.ts.map +1 -1
- package/dist/internal/discovery/instructions.js +3 -6
- package/dist/internal/discovery/modules.d.ts.map +1 -1
- package/dist/internal/discovery/modules.js +3 -6
- 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 +27 -5
- package/dist/internal/discovery/runtime.d.ts.map +1 -1
- package/dist/internal/discovery/runtime.js +8 -8
- 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/expected-delivery-failure.d.ts.map +1 -1
- package/dist/internal/expected-delivery-failure.js +6 -0
- package/dist/internal/filesystem/sdk-schemas.d.ts.map +1 -1
- package/dist/internal/filesystem/sdk-schemas.js +4 -3
- 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-platforms.d.ts.map +1 -1
- package/dist/internal/host-platforms.js +8 -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 +13 -16
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +3 -1
- package/dist/internal/otel/config.d.ts +6 -1
- package/dist/internal/otel/config.d.ts.map +1 -1
- package/dist/internal/otel/config.js +27 -1
- package/dist/internal/otel/runtime.d.ts.map +1 -1
- package/dist/internal/otel/runtime.js +26 -3
- package/dist/internal/package-inline-stdio.d.ts.map +1 -1
- package/dist/internal/package-inline-stdio.js +21 -6
- package/dist/internal/sdk-runner.d.ts +2 -3
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +8 -4
- 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.js +2 -2
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +5 -4
- 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/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/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/playground/assets/cursor-icons-16-DmHBTm1-.woff2 +0 -0
- package/dist/playground/assets/index-BdMwybMt.css +1 -0
- package/dist/playground/assets/{index-DKKdkF29.js → index-CHk6O92d.js} +38 -38
- package/dist/playground/index.html +2 -2
- package/dist/tools.d.ts +13 -10
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +3 -2
- package/dist/types.d.ts +67 -16
- package/dist/types.d.ts.map +1 -1
- package/docs/guides/opentelemetry.md +10 -5
- package/docs/guides/pagerduty.md +341 -0
- package/docs/reference/channels.md +2 -1
- package/docs/reference/cli.md +27 -0
- package/docs/reference/tools.md +1 -0
- package/package.json +10 -3
- package/skills/migrate-v2/SKILL.md +1 -1
- package/skills/otel/SKILL.md +7 -3
- 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/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/playground/assets/cursor-icons-16-gwXtdAvu.woff2 +0 -0
- package/dist/playground/assets/index-DpKinTMs.css +0 -1
- /package/dist/docs/assets/{reference_channels.md.DYg0CLud.lean.js → reference_channels.md.Bxaa020x.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.08XR7lIl.lean.js → reference_tools.md.-6pypsWt.lean.js} +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { PAGERDUTY_INCIDENT_EVENT_TYPES } from "../../internal/continuation-identity.js";
|
|
2
|
+
/** {@link ChannelMeta.kind} value used by {@link pagerdutyChannel}. */
|
|
3
|
+
export declare const PAGERDUTY_CHANNEL_KIND = "pagerduty";
|
|
4
|
+
/** Every v3 `event_type` that names one incident; the selector's membership. */
|
|
5
|
+
export { PAGERDUTY_INCIDENT_EVENT_TYPES };
|
|
6
|
+
/** Lifecycle events whose `data` is the full incident; `onIncident` receives them. */
|
|
7
|
+
export declare const PAGERDUTY_INCIDENT_LIFECYCLE_EVENTS: readonly ["incident.triggered", "incident.acknowledged", "incident.unacknowledged", "incident.escalated", "incident.reassigned", "incident.delegated", "incident.resolved", "incident.reopened", "incident.priority_updated", "incident.incident_type.changed"];
|
|
8
|
+
export type PagerDutyIncidentLifecycleEvent = (typeof PAGERDUTY_INCIDENT_LIFECYCLE_EVENTS)[number];
|
|
9
|
+
/** `incident.annotated`: a note on the incident; `onNote` receives it. */
|
|
10
|
+
export declare const PAGERDUTY_NOTE_EVENTS: readonly ["incident.annotated"];
|
|
11
|
+
/** Responder requests and replies; `onResponder` receives them. */
|
|
12
|
+
export declare const PAGERDUTY_RESPONDER_EVENTS: readonly ["incident.responder.added", "incident.responder.replied"];
|
|
13
|
+
export interface PagerDutyWebhookEventOptions {
|
|
14
|
+
webhookEvents?: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The event types the channel publishes as `meta.pagerdutyWebhookEvents`
|
|
18
|
+
* and the deploy manifest's `eventTypes`: a pinned list, or every incident
|
|
19
|
+
* event. Every typed hook and the default dispatch fall inside that set, so
|
|
20
|
+
* an omitted selector defaults to `pagerduty.incident/v2`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function derivePagerDutyWebhookEvents(options: PagerDutyWebhookEventOptions): string[];
|
|
23
|
+
export declare function isPagerDutyIncidentLifecycleEvent(eventType: string): eventType is PagerDutyIncidentLifecycleEvent;
|
|
24
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAEzF,uEAAuE;AACvE,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAElD,gFAAgF;AAChF,OAAO,EAAE,8BAA8B,EAAE,CAAC;AAE1C,sFAAsF;AACtF,eAAO,MAAM,mCAAmC,YAC9C,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,EAC3B,gCAAgC,CACxB,CAAC;AAEX,MAAM,MAAM,+BAA+B,GAAG,CAAC,OAAO,mCAAmC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnG,0EAA0E;AAC1E,eAAO,MAAM,qBAAqB,YAAI,oBAAoB,CAAU,CAAC;AAErE,mEAAmE;AACnE,eAAO,MAAM,0BAA0B,YACrC,0BAA0B,EAC1B,4BAA4B,CACpB,CAAC;AAEX,MAAM,WAAW,4BAA4B;IAC3C,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,EAAE,CAG5F;AAED,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,MAAM,GAChB,SAAS,IAAI,+BAA+B,CAE9C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { PAGERDUTY_INCIDENT_EVENT_TYPES } from "../../internal/continuation-identity.js";
|
|
2
|
+
/** {@link ChannelMeta.kind} value used by {@link pagerdutyChannel}. */
|
|
3
|
+
export const PAGERDUTY_CHANNEL_KIND = "pagerduty";
|
|
4
|
+
/** Every v3 `event_type` that names one incident; the selector's membership. */
|
|
5
|
+
export { PAGERDUTY_INCIDENT_EVENT_TYPES };
|
|
6
|
+
/** Lifecycle events whose `data` is the full incident; `onIncident` receives them. */
|
|
7
|
+
export const PAGERDUTY_INCIDENT_LIFECYCLE_EVENTS = [
|
|
8
|
+
"incident.triggered",
|
|
9
|
+
"incident.acknowledged",
|
|
10
|
+
"incident.unacknowledged",
|
|
11
|
+
"incident.escalated",
|
|
12
|
+
"incident.reassigned",
|
|
13
|
+
"incident.delegated",
|
|
14
|
+
"incident.resolved",
|
|
15
|
+
"incident.reopened",
|
|
16
|
+
"incident.priority_updated",
|
|
17
|
+
"incident.incident_type.changed",
|
|
18
|
+
];
|
|
19
|
+
/** `incident.annotated`: a note on the incident; `onNote` receives it. */
|
|
20
|
+
export const PAGERDUTY_NOTE_EVENTS = ["incident.annotated"];
|
|
21
|
+
/** Responder requests and replies; `onResponder` receives them. */
|
|
22
|
+
export const PAGERDUTY_RESPONDER_EVENTS = [
|
|
23
|
+
"incident.responder.added",
|
|
24
|
+
"incident.responder.replied",
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* The event types the channel publishes as `meta.pagerdutyWebhookEvents`
|
|
28
|
+
* and the deploy manifest's `eventTypes`: a pinned list, or every incident
|
|
29
|
+
* event. Every typed hook and the default dispatch fall inside that set, so
|
|
30
|
+
* an omitted selector defaults to `pagerduty.incident/v2`.
|
|
31
|
+
*/
|
|
32
|
+
export function derivePagerDutyWebhookEvents(options) {
|
|
33
|
+
const events = options.webhookEvents ?? PAGERDUTY_INCIDENT_EVENT_TYPES;
|
|
34
|
+
return [...new Set(events.map((event) => event.trim()).filter(Boolean))];
|
|
35
|
+
}
|
|
36
|
+
export function isPagerDutyIncidentLifecycleEvent(eventType) {
|
|
37
|
+
return PAGERDUTY_INCIDENT_LIFECYCLE_EVENTS.includes(eventType);
|
|
38
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PagerDuty v3 webhook channel pack.
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* import { defaultPagerDutyAuth, pagerdutyChannel } from "@cursor/bdk/channels/pagerduty";
|
|
6
|
+
*
|
|
7
|
+
* // Verifies against the PAGERDUTY_WEBHOOK_SECRET deployment secret and skips
|
|
8
|
+
* // the agent's own actions: PAGERDUTY_USER_ID, else the user PAGERDUTY_TOKEN
|
|
9
|
+
* // acts as.
|
|
10
|
+
* export default pagerdutyChannel({
|
|
11
|
+
* onIncident: (ctx) => ({ auth: defaultPagerDutyAuth(ctx) }),
|
|
12
|
+
* });
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* The route verifies `X-PagerDuty-Signature` (one `v1=` HMAC-SHA256 entry
|
|
16
|
+
* per active subscription secret; any match admits). Every event for one
|
|
17
|
+
* incident key, the dedup key of the alert that opened the incident, joins
|
|
18
|
+
* one session; an incident without a key joins on its id. The agent's own
|
|
19
|
+
* actions, echoed back with its PagerDuty user as `agent`, are acknowledged
|
|
20
|
+
* without a turn.
|
|
21
|
+
*/
|
|
22
|
+
export * from "./api.js";
|
|
23
|
+
export * from "./defaults.js";
|
|
24
|
+
export * from "./events.js";
|
|
25
|
+
export { pagerDutyAccountSubdomain, pagerDutyEventIncident, pagerDutyIncidentFromData, pagerDutyNoteFromData, pagerDutyResponderFromData, } from "./payload.js";
|
|
26
|
+
export * from "./pagerduty-channel.js";
|
|
27
|
+
export * from "./pagerduty-webhook.js";
|
|
28
|
+
export { inferPagerDutySelfUserId, PAGERDUTY_USER_ID_ENV, type PagerDutySelfUserDeps, pagerDutySelfUserIdSecretName, resolvePagerDutySelfUserIds, } from "./self-user.js";
|
|
29
|
+
export * from "./state.js";
|
|
30
|
+
export * from "./types.js";
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AACtB,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,KAAK,qBAAqB,EAC1B,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PagerDuty v3 webhook channel pack.
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* import { defaultPagerDutyAuth, pagerdutyChannel } from "@cursor/bdk/channels/pagerduty";
|
|
6
|
+
*
|
|
7
|
+
* // Verifies against the PAGERDUTY_WEBHOOK_SECRET deployment secret and skips
|
|
8
|
+
* // the agent's own actions: PAGERDUTY_USER_ID, else the user PAGERDUTY_TOKEN
|
|
9
|
+
* // acts as.
|
|
10
|
+
* export default pagerdutyChannel({
|
|
11
|
+
* onIncident: (ctx) => ({ auth: defaultPagerDutyAuth(ctx) }),
|
|
12
|
+
* });
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* The route verifies `X-PagerDuty-Signature` (one `v1=` HMAC-SHA256 entry
|
|
16
|
+
* per active subscription secret; any match admits). Every event for one
|
|
17
|
+
* incident key, the dedup key of the alert that opened the incident, joins
|
|
18
|
+
* one session; an incident without a key joins on its id. The agent's own
|
|
19
|
+
* actions, echoed back with its PagerDuty user as `agent`, are acknowledged
|
|
20
|
+
* without a turn.
|
|
21
|
+
*/
|
|
22
|
+
export * from "./api.js";
|
|
23
|
+
export * from "./defaults.js";
|
|
24
|
+
export * from "./events.js";
|
|
25
|
+
export { pagerDutyAccountSubdomain, pagerDutyEventIncident, pagerDutyIncidentFromData, pagerDutyNoteFromData, pagerDutyResponderFromData, } from "./payload.js";
|
|
26
|
+
export * from "./pagerduty-channel.js";
|
|
27
|
+
export * from "./pagerduty-webhook.js";
|
|
28
|
+
export { inferPagerDutySelfUserId, PAGERDUTY_USER_ID_ENV, pagerDutySelfUserIdSecretName, resolvePagerDutySelfUserIds, } from "./self-user.js";
|
|
29
|
+
export * from "./state.js";
|
|
30
|
+
export * from "./types.js";
|
|
@@ -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 | Buffer;
|
|
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 | Buffer;
|
|
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,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,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"}
|