@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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { bitbucketChannelArchitectureError } from "../channels/bitbucket/bitbucket-channel.js";
|
|
2
2
|
import { githubChannelArchitectureError } from "../channels/github/github-channel.js";
|
|
3
3
|
import { gitlabChannelArchitectureError } from "../channels/gitlab/gitlab-channel.js";
|
|
4
|
+
import { pagerDutyChannelArchitectureError } from "../channels/pagerduty/pagerduty-channel.js";
|
|
4
5
|
/**
|
|
5
6
|
* Per-channel constraints that hold only on one hosted architecture. The
|
|
6
7
|
* channel constructors run at import time, before the agent's
|
|
@@ -8,7 +9,7 @@ import { gitlabChannelArchitectureError } from "../channels/gitlab/gitlab-channe
|
|
|
8
9
|
* these afterwards. Returns the author-facing error, or `undefined` when
|
|
9
10
|
* the channel deploys as authored.
|
|
10
11
|
*
|
|
11
|
-
* On v2 every direct
|
|
12
|
+
* On v2 every direct provider webhook channel must name its secret so the
|
|
12
13
|
* control plane can terminate the provider's check at ingestion.
|
|
13
14
|
*/
|
|
14
15
|
export function channelArchitectureError(architecture, definition) {
|
|
@@ -37,5 +38,6 @@ export function channelArchitectureMigrationWarning(architecture, definition) {
|
|
|
37
38
|
function v2ChannelArchitectureError(definition) {
|
|
38
39
|
return (githubChannelArchitectureError(definition) ??
|
|
39
40
|
gitlabChannelArchitectureError(definition) ??
|
|
40
|
-
bitbucketChannelArchitectureError(definition)
|
|
41
|
+
bitbucketChannelArchitectureError(definition) ??
|
|
42
|
+
pagerDutyChannelArchitectureError(definition));
|
|
41
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-deploy.d.ts","sourceRoot":"","sources":["../../src/internal/cli-deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,OAAO,EAOL,sBAAsB,EAevB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-deploy.d.ts","sourceRoot":"","sources":["../../src/internal/cli-deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,8 @@ import { cursorExternalApiUrl, resolveApiKey, SIGN_IN_HINT } from "./cursor/cred
|
|
|
17
17
|
import { authorizeCursorAccountConnectors } from "./cursor-account-mcp-auth.js";
|
|
18
18
|
import { readDeployTemplate } from "./cursor-agent-template.js";
|
|
19
19
|
import { AgentServeDeployClient, SEVERAL_AGENTS_DEPLOY_ALONE, DeployApiError, deploymentServiceAccountId, TERMINAL_AGENTKIT_DEPLOY_STATUSES, TERMINAL_DEPLOY_STATUSES, validateDeploymentSlug, } from "./deploy-client.js";
|
|
20
|
-
import { channelCatchSecretNames, channelCredentialSecretNames } from "./deploy-manifest.js";
|
|
20
|
+
import { channelCatchSecretNames, channelCredentialSecretNames, channelSecretAlternatives, } from "./deploy-manifest.js";
|
|
21
|
+
import { unmetSecretAlternatives } from "./secret-alternatives.js";
|
|
21
22
|
import { inferDeployGitSource } from "./deploy-source.js";
|
|
22
23
|
import { describeError } from "./describe-error.js";
|
|
23
24
|
import { formatDiagnostics, hasErrorDiagnostics, isAgentProjectDir, listChildAgentDirs, loadAgentProject, } from "./discovery.js";
|
|
@@ -910,6 +911,7 @@ async function readDeployManifest(dir) {
|
|
|
910
911
|
credentialSecretNames: [
|
|
911
912
|
...new Set(project.channels.flatMap((channel) => channelCredentialSecretNames(channel.definition))),
|
|
912
913
|
],
|
|
914
|
+
secretAlternatives: project.channels.flatMap((channel) => channelSecretAlternatives(channel.definition)),
|
|
913
915
|
hasScmChannels: project.channels.some((channel) => {
|
|
914
916
|
const kind = channel.definition.meta?.kind;
|
|
915
917
|
return kind === "github" || kind === "origin";
|
|
@@ -927,28 +929,35 @@ async function readDeployManifest(dir) {
|
|
|
927
929
|
* requests with. Empty when the manifests declare none.
|
|
928
930
|
*/
|
|
929
931
|
function declaredSecretNames(manifests) {
|
|
930
|
-
return
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
932
|
+
return {
|
|
933
|
+
names: [
|
|
934
|
+
...new Set(manifests.flatMap((manifest) => manifest === undefined
|
|
935
|
+
? []
|
|
936
|
+
: [
|
|
937
|
+
...(manifest.hosting?.secretNames ?? []),
|
|
938
|
+
...manifest.catchSecretNames,
|
|
939
|
+
...manifest.credentialSecretNames,
|
|
940
|
+
])),
|
|
941
|
+
],
|
|
942
|
+
alternatives: manifests.flatMap((manifest) => manifest?.secretAlternatives ?? []),
|
|
943
|
+
};
|
|
939
944
|
}
|
|
940
945
|
/**
|
|
941
946
|
* Friendly post-deploy nudge: the manifest declares secrets the agent
|
|
942
947
|
* expects, but the deployment does not have them all set yet.
|
|
943
948
|
*/
|
|
944
949
|
function warnMissingSecrets(ctx, slug, declared, set) {
|
|
945
|
-
|
|
950
|
+
for (const group of unmetSecretAlternatives(declared?.alternatives ?? [], set)) {
|
|
951
|
+
ctx.err(`warning: none of ${group.names.join(", ")} is set on ${slug}: ${group.unsetEffect}\n` +
|
|
952
|
+
` set one with \`${CLI} secrets set ${slug} ${group.names[0]}\`\n`);
|
|
953
|
+
}
|
|
954
|
+
if (declared === undefined || declared.names.length === 0) {
|
|
946
955
|
return;
|
|
947
956
|
}
|
|
948
957
|
const setNames = new Set(set ?? []);
|
|
949
958
|
// Platform-managed names (CURSOR_*, hosted storage) are injected by the
|
|
950
959
|
// control plane and never appear in secrets list — do not warn on them.
|
|
951
|
-
const missing = declared.filter((name) => !setNames.has(name) && !isReservedSecretName(name));
|
|
960
|
+
const missing = declared.names.filter((name) => !setNames.has(name) && !isReservedSecretName(name));
|
|
952
961
|
if (missing.length === 0) {
|
|
953
962
|
return;
|
|
954
963
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `bdk pagerduty …` — replay synthesized PagerDuty v3 webhooks into a
|
|
3
|
+
* local `pagerdutyChannel()` and list the discovered PagerDuty channels.
|
|
4
|
+
*
|
|
5
|
+
* PagerDuty subscriptions POST to a public URL, so live deliveries need a
|
|
6
|
+
* tunnel. Replay covers the local loop without one or a PagerDuty account:
|
|
7
|
+
* it builds v3 bodies for an incident and signs `X-PagerDuty-Signature`
|
|
8
|
+
* from `--secret` / `PAGERDUTY_WEBHOOK_SECRET` (unsigned when neither is
|
|
9
|
+
* set, which `serve --dev` admits from loopback).
|
|
10
|
+
*/
|
|
11
|
+
export interface PagerDutyCliOptions {
|
|
12
|
+
dir: string;
|
|
13
|
+
slug?: string;
|
|
14
|
+
channel?: string;
|
|
15
|
+
host?: string;
|
|
16
|
+
port?: number;
|
|
17
|
+
/** Explicit delivery URL (skips URL derivation). */
|
|
18
|
+
url?: string;
|
|
19
|
+
/** Comma/space-separated event types (`triggered` or `incident.triggered`), or `*`. */
|
|
20
|
+
events?: string;
|
|
21
|
+
/** Signing secret for `X-PagerDuty-Signature` (defaults to PAGERDUTY_WEBHOOK_SECRET). */
|
|
22
|
+
secret?: string;
|
|
23
|
+
json?: boolean;
|
|
24
|
+
/** replay: incident id the events name. */
|
|
25
|
+
incidentId?: string;
|
|
26
|
+
/** replay: note body for `incident.annotated`. */
|
|
27
|
+
comment?: string;
|
|
28
|
+
dryRun?: boolean;
|
|
29
|
+
out?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function cmdPagerDuty(subcommand: string | undefined, options: PagerDutyCliOptions): Promise<number>;
|
|
32
|
+
//# sourceMappingURL=cli-pagerduty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-pagerduty.d.ts","sourceRoot":"","sources":["../../src/internal/cli-pagerduty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA8BH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA4BD,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `bdk pagerduty …` — replay synthesized PagerDuty v3 webhooks into a
|
|
3
|
+
* local `pagerdutyChannel()` and list the discovered PagerDuty channels.
|
|
4
|
+
*
|
|
5
|
+
* PagerDuty subscriptions POST to a public URL, so live deliveries need a
|
|
6
|
+
* tunnel. Replay covers the local loop without one or a PagerDuty account:
|
|
7
|
+
* it builds v3 bodies for an incident and signs `X-PagerDuty-Signature`
|
|
8
|
+
* from `--secret` / `PAGERDUTY_WEBHOOK_SECRET` (unsigned when neither is
|
|
9
|
+
* set, which `serve --dev` admits from loopback).
|
|
10
|
+
*/
|
|
11
|
+
import { randomUUID } from "node:crypto";
|
|
12
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
13
|
+
import { join, resolve as resolvePath } from "node:path";
|
|
14
|
+
import { channelForwardUrl } from "../channels/github/forward.js";
|
|
15
|
+
import { findPagerDutyChannelTargets, } from "../channels/pagerduty/pagerduty-channel.js";
|
|
16
|
+
import { PAGERDUTY_SIGNATURE_HEADER, PAGERDUTY_WEBHOOK_SECRET_ENV, signPagerDutyWebhookBody, } from "../channels/pagerduty/pagerduty-webhook.js";
|
|
17
|
+
import { PAGERDUTY_REPLAY_DEFAULT_INCIDENT_ID, PAGERDUTY_REPLAYABLE_EVENTS, selectPagerDutyReplayEvents, synthesizePagerDutyEvent, } from "../channels/pagerduty/replay.js";
|
|
18
|
+
import { resolveAgentMounts } from "./discovery.js";
|
|
19
|
+
import { parseHmacSecrets } from "./hmac-secret-values.js";
|
|
20
|
+
import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
|
|
21
|
+
import { projectPath, resolveProjectRoot } from "./project-layout.js";
|
|
22
|
+
const DEFAULT_HOST = "127.0.0.1";
|
|
23
|
+
const DEFAULT_PORT = 3000;
|
|
24
|
+
const PAGERDUTY_HELP = `${CLI} pagerduty — replay PagerDuty v3 webhooks into a local agent
|
|
25
|
+
|
|
26
|
+
Usage:
|
|
27
|
+
${CLI} pagerduty replay [incident_id] [--events a,b,c | *] [--comment "…"]
|
|
28
|
+
[--dir .] [--slug S] [--channel C]
|
|
29
|
+
[--host H] [--port N] [--url URL] [--secret S]
|
|
30
|
+
[--dry-run] [--out DIR] [--json]
|
|
31
|
+
${CLI} pagerduty events [--dir .] [--host H] [--port N] [--json]
|
|
32
|
+
|
|
33
|
+
Commands:
|
|
34
|
+
replay Synthesize v3 webhook bodies for one incident (default
|
|
35
|
+
${PAGERDUTY_REPLAY_DEFAULT_INCIDENT_ID}) and POST them, in order, to the discovered
|
|
36
|
+
pagerdutyChannel()s. --events picks them (default triggered;
|
|
37
|
+
\`*\` = every declared event replay supports:
|
|
38
|
+
${PAGERDUTY_REPLAYABLE_EVENTS.join(", ")}).
|
|
39
|
+
A trigger comes from PagerDuty itself; the rest come from a
|
|
40
|
+
person, so they dispatch. --comment is the note body for
|
|
41
|
+
annotated. Signs X-PagerDuty-Signature from --secret /
|
|
42
|
+
${PAGERDUTY_WEBHOOK_SECRET_ENV} (its first line when it lists several).
|
|
43
|
+
--dry-run prints the bodies; --out writes them as fixtures.
|
|
44
|
+
events List discovered PagerDuty channels and the event types each accepts.
|
|
45
|
+
|
|
46
|
+
Prerequisites:
|
|
47
|
+
- The agent already serving (\`${CLI} dev\` or \`${CLI} serve --dir . --dev\`).
|
|
48
|
+
`;
|
|
49
|
+
export async function cmdPagerDuty(subcommand, options) {
|
|
50
|
+
switch (subcommand) {
|
|
51
|
+
case undefined:
|
|
52
|
+
case "help":
|
|
53
|
+
case "--help":
|
|
54
|
+
case "-h":
|
|
55
|
+
process.stdout.write(PAGERDUTY_HELP);
|
|
56
|
+
return subcommand === undefined ? 1 : 0;
|
|
57
|
+
case "replay":
|
|
58
|
+
return cmdPagerDutyReplay(options);
|
|
59
|
+
case "events":
|
|
60
|
+
return cmdPagerDutyEvents(options);
|
|
61
|
+
default:
|
|
62
|
+
process.stderr.write(`Unknown pagerduty subcommand: ${subcommand}\n`);
|
|
63
|
+
process.stdout.write(PAGERDUTY_HELP);
|
|
64
|
+
return 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function targetUrl(target, options) {
|
|
68
|
+
return channelForwardUrl({
|
|
69
|
+
host: options.host ?? DEFAULT_HOST,
|
|
70
|
+
port: options.port ?? DEFAULT_PORT,
|
|
71
|
+
slug: target.slug,
|
|
72
|
+
channelId: target.channelId,
|
|
73
|
+
routePath: target.routePath,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async function resolveTargets(options) {
|
|
77
|
+
const dir = resolvePath(options.dir);
|
|
78
|
+
let candidates = findPagerDutyChannelTargets(await resolveAgentMounts(dir));
|
|
79
|
+
if (options.slug !== undefined) {
|
|
80
|
+
candidates = candidates.filter((c) => c.slug === options.slug);
|
|
81
|
+
}
|
|
82
|
+
if (options.channel !== undefined) {
|
|
83
|
+
candidates = candidates.filter((c) => c.channelId === options.channel);
|
|
84
|
+
}
|
|
85
|
+
if (options.url !== undefined) {
|
|
86
|
+
if (candidates.length > 1) {
|
|
87
|
+
process.stderr.write("--url targets a single channel; narrow with --slug/--channel\n");
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
return [
|
|
91
|
+
{
|
|
92
|
+
slug: candidates[0]?.slug ?? "",
|
|
93
|
+
channelId: candidates[0]?.channelId ?? "",
|
|
94
|
+
url: options.url,
|
|
95
|
+
events: candidates[0]?.events ?? [],
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
}
|
|
99
|
+
if (candidates.length === 0) {
|
|
100
|
+
const channelPath = projectPath(resolveProjectRoot(dir), "channels/pagerduty.ts");
|
|
101
|
+
process.stderr.write(`no PagerDuty channel found. Author ${channelPath} with pagerdutyChannel(), or pass --url.\n`);
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
return candidates.map((c) => ({
|
|
105
|
+
slug: c.slug,
|
|
106
|
+
channelId: c.channelId,
|
|
107
|
+
url: targetUrl(c, options),
|
|
108
|
+
events: c.events,
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
async function cmdPagerDutyReplay(options) {
|
|
112
|
+
const targets = await resolveTargets(options);
|
|
113
|
+
if (targets === undefined) {
|
|
114
|
+
return 1;
|
|
115
|
+
}
|
|
116
|
+
const declared = [...new Set(targets.flatMap((target) => target.events))];
|
|
117
|
+
const { events, unsupported } = selectPagerDutyReplayEvents({
|
|
118
|
+
requested: parseEventList(options.events),
|
|
119
|
+
declared,
|
|
120
|
+
});
|
|
121
|
+
if (unsupported.length > 0) {
|
|
122
|
+
process.stderr.write(`[bdk] cannot synthesize (skipped): ${unsupported.join(", ")}\n`);
|
|
123
|
+
}
|
|
124
|
+
if (events.length === 0) {
|
|
125
|
+
process.stderr.write("no synthesizable events selected\n");
|
|
126
|
+
return 1;
|
|
127
|
+
}
|
|
128
|
+
const incidentId = options.incidentId ?? PAGERDUTY_REPLAY_DEFAULT_INCIDENT_ID;
|
|
129
|
+
// A secret that lists one value per subscription signs with its first.
|
|
130
|
+
const parsedSecret = parseHmacSecrets(options.secret ?? process.env[PAGERDUTY_WEBHOOK_SECRET_ENV]?.trim());
|
|
131
|
+
const secret = parsedSecret.ok ? parsedSecret.secrets[0] : undefined;
|
|
132
|
+
if (options.json !== true) {
|
|
133
|
+
process.stderr.write(`[bdk] replaying incident ${incidentId} (${events.join(", ")}) → ${targets.length} channel${targets.length === 1 ? "" : "s"}${secret === undefined ? " unsigned" : ""}\n`);
|
|
134
|
+
}
|
|
135
|
+
const report = [];
|
|
136
|
+
let anyRejected = false;
|
|
137
|
+
for (const eventType of events) {
|
|
138
|
+
const payload = synthesizePagerDutyEvent({ eventType, incidentId, note: options.comment });
|
|
139
|
+
const body = JSON.stringify(payload);
|
|
140
|
+
const headers = {
|
|
141
|
+
"content-type": "application/json",
|
|
142
|
+
"x-webhook-id": randomUUID(),
|
|
143
|
+
};
|
|
144
|
+
if (secret !== undefined) {
|
|
145
|
+
headers[PAGERDUTY_SIGNATURE_HEADER] = signPagerDutyWebhookBody({ rawBody: body, secret });
|
|
146
|
+
}
|
|
147
|
+
if (options.out !== undefined) {
|
|
148
|
+
const file = await writeReplayFixture(options.out, eventType, payload);
|
|
149
|
+
if (options.json !== true) {
|
|
150
|
+
process.stderr.write(`[bdk] wrote ${file}\n`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (options.dryRun === true) {
|
|
154
|
+
report.push({ event: eventType, payload });
|
|
155
|
+
if (options.json !== true) {
|
|
156
|
+
process.stdout.write(`--- ${eventType} ---\n${JSON.stringify(payload, null, 2)}\n`);
|
|
157
|
+
}
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const deliveries = await deliverReplayEvent(body, headers, eventType, targets);
|
|
161
|
+
if (deliveries.length === 0 || deliveries.some((d) => !d.ok)) {
|
|
162
|
+
anyRejected = true;
|
|
163
|
+
}
|
|
164
|
+
report.push({ event: eventType, deliveries });
|
|
165
|
+
if (options.json !== true) {
|
|
166
|
+
const summary = deliveries
|
|
167
|
+
.map((d) => `${d.label} ${d.status || "ERR"}${d.ok ? "" : " (rejected)"}`)
|
|
168
|
+
.join(", ") || "(no matching channel)";
|
|
169
|
+
process.stderr.write(`[bdk] ${eventType} → ${summary}\n`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (options.json === true) {
|
|
173
|
+
process.stdout.write(`${JSON.stringify({
|
|
174
|
+
incidentId,
|
|
175
|
+
signed: secret !== undefined,
|
|
176
|
+
dryRun: options.dryRun === true,
|
|
177
|
+
events: report,
|
|
178
|
+
}, null, 2)}\n`);
|
|
179
|
+
}
|
|
180
|
+
return anyRejected ? 1 : 0;
|
|
181
|
+
}
|
|
182
|
+
async function deliverReplayEvent(body, headers, eventType, targets) {
|
|
183
|
+
const recipients = targets.filter((target) => target.events.length === 0 || target.events.includes(eventType));
|
|
184
|
+
const deliveries = [];
|
|
185
|
+
// In order, not in parallel: one incident's events must arrive as a sequence.
|
|
186
|
+
for (const target of recipients) {
|
|
187
|
+
const label = target.slug === "" ? target.channelId : `${target.slug}/${target.channelId}`;
|
|
188
|
+
try {
|
|
189
|
+
const response = await fetch(target.url, { method: "POST", headers, body });
|
|
190
|
+
await response.text().catch(() => undefined);
|
|
191
|
+
deliveries.push({ label, status: response.status, ok: response.ok });
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
deliveries.push({
|
|
195
|
+
label,
|
|
196
|
+
status: 0,
|
|
197
|
+
ok: false,
|
|
198
|
+
error: error instanceof Error ? error.message : String(error),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return deliveries;
|
|
203
|
+
}
|
|
204
|
+
async function writeReplayFixture(outDir, eventType, payload) {
|
|
205
|
+
const dir = resolvePath(outDir);
|
|
206
|
+
await mkdir(dir, { recursive: true });
|
|
207
|
+
const file = join(dir, `pagerduty-${eventType.replace(/[^\w-]+/g, "-")}.json`);
|
|
208
|
+
await writeFile(file, `${JSON.stringify(payload, null, 2)}\n`);
|
|
209
|
+
return file;
|
|
210
|
+
}
|
|
211
|
+
async function cmdPagerDutyEvents(options) {
|
|
212
|
+
const dir = resolvePath(options.dir);
|
|
213
|
+
const rows = findPagerDutyChannelTargets(await resolveAgentMounts(dir)).map((c) => ({
|
|
214
|
+
slug: c.slug,
|
|
215
|
+
channelId: c.channelId,
|
|
216
|
+
url: targetUrl(c, options),
|
|
217
|
+
events: c.events,
|
|
218
|
+
}));
|
|
219
|
+
if (options.json === true) {
|
|
220
|
+
process.stdout.write(`${JSON.stringify({ channels: rows }, null, 2)}\n`);
|
|
221
|
+
return 0;
|
|
222
|
+
}
|
|
223
|
+
if (rows.length === 0) {
|
|
224
|
+
process.stdout.write("no PagerDuty channels found\n");
|
|
225
|
+
return 0;
|
|
226
|
+
}
|
|
227
|
+
for (const row of rows) {
|
|
228
|
+
const label = row.slug === "" ? row.channelId : `${row.slug}/${row.channelId}`;
|
|
229
|
+
process.stdout.write(`${label}\n ${row.url}\n ${row.events.join(", ")}\n`);
|
|
230
|
+
}
|
|
231
|
+
return 0;
|
|
232
|
+
}
|
|
233
|
+
function parseEventList(value) {
|
|
234
|
+
if (value === undefined) {
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
const events = value
|
|
238
|
+
.split(/[\s,]+/)
|
|
239
|
+
.map((event) => event.trim())
|
|
240
|
+
.filter(Boolean);
|
|
241
|
+
return events.length === 0 ? undefined : events;
|
|
242
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuation-channel.d.ts","sourceRoot":"","sources":["../../src/internal/continuation-channel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"continuation-channel.d.ts","sourceRoot":"","sources":["../../src/internal/continuation-channel.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,oBAAoB,EAO1B,MAAM,4BAA4B,CAAC;AAyEpC,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,CAWhG;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,qBAAqB,GAAG,SAAS,GAC7C,oBAAoB,CAEtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE;IACtD,KAAK,EAAE;QAAE,YAAY,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAC5C,QAAQ,EAAE,aAAa,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,WAAW,EAAE,qBAAqB,CAAC;CACpC,GAAG,IAAI,CAUP;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,QAAQ,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,GAAG,IAAI,CAwBP;AAyCD,iFAAiF;AACjF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,WAAW,GAAG,SAAS,GAC5B,SAAS,MAAM,EAAE,GAAG,SAAS,CAW/B;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,iBAAiB,CAAC;CAC/B,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAY9C"}
|
|
@@ -6,6 +6,7 @@ import { getGitLabChannelOptions } from "../channels/gitlab/gitlab-channel.js";
|
|
|
6
6
|
import { getIssuesChannelOptions } from "../channels/issues/issues-channel.js";
|
|
7
7
|
import { getRunsChannelOptions } from "../channels/runs/runs-channel.js";
|
|
8
8
|
import { getOriginChannelOptions } from "../channels/origin/origin-channel.js";
|
|
9
|
+
import { getPagerDutyChannelOptions } from "../channels/pagerduty/pagerduty-channel.js";
|
|
9
10
|
import { getSlackChannelOptions } from "../channels/slack/slack-channel.js";
|
|
10
11
|
import { defaultContinuationSelector, handshakeContinuation, normalizeIdentity, omittedV2MembershipDowngrade, omittedV2TypedType, } from "./continuation-identity.js";
|
|
11
12
|
const CONTINUATION_CHANNEL_PACKS = [
|
|
@@ -54,6 +55,11 @@ const CONTINUATION_CHANNEL_PACKS = [
|
|
|
54
55
|
getOptions: getRunsChannelOptions,
|
|
55
56
|
usesDeclaredEvents: true,
|
|
56
57
|
},
|
|
58
|
+
{
|
|
59
|
+
kind: "pagerduty",
|
|
60
|
+
getOptions: getPagerDutyChannelOptions,
|
|
61
|
+
usesDeclaredEvents: true,
|
|
62
|
+
},
|
|
57
63
|
];
|
|
58
64
|
export function channelContinuationIdentity(definition) {
|
|
59
65
|
if (definition === undefined) {
|
|
@@ -144,6 +150,7 @@ export function channelDeclaredEventTypes(meta) {
|
|
|
144
150
|
meta?.originWebhookEvents ??
|
|
145
151
|
meta?.gitlabWebhookEvents ??
|
|
146
152
|
meta?.bitbucketWebhookEvents ??
|
|
153
|
+
meta?.pagerdutyWebhookEvents ??
|
|
147
154
|
meta?.deploymentEventTypes ??
|
|
148
155
|
meta?.factoryEventTypes ??
|
|
149
156
|
meta?.slackEventTypes);
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
* selector. An explicit per-channel selector still overrides. JSONPath
|
|
17
17
|
* and per-agent format strings are rejected.
|
|
18
18
|
*/
|
|
19
|
-
export type ConversationType = "pr" | "issue" | "thread" | "origin-pr" | "gitlab-mr" | "bitbucket-pr" | "deployment" | "change-monitor-checkpoint" | "factory-issue" | "run";
|
|
20
|
-
export type ContinuationKind = "github" | "slack" | "origin" | "gitlab" | "bitbucket" | "deployments" | "change_monitors" | "issues" | "runs" | "http";
|
|
21
|
-
export declare const CONTINUATION_SELECTORS: readonly ["github.pr/v1", "github.pr/v2", "github.issue/v1", "github.issue/v2", "github.none/v2", "slack.thread/v1", "slack.thread/v2", "slack.none/v2", "origin.pr/v1", "origin.pr/v2", "origin.none/v2", "gitlab.mr/v2", "gitlab.none/v2", "bitbucket.pr/v2", "bitbucket.none/v2", "deployments.none/v1", "deployments.none/v2", "deployments.deployment/v2", "change_monitors.checkpoint/v2", "issues.issue/v2", "runs.run/v2", "none/v1", "none/v2"];
|
|
19
|
+
export type ConversationType = "pr" | "issue" | "thread" | "origin-pr" | "gitlab-mr" | "bitbucket-pr" | "deployment" | "change-monitor-checkpoint" | "factory-issue" | "run" | "pagerduty-incident";
|
|
20
|
+
export type ContinuationKind = "github" | "slack" | "origin" | "gitlab" | "bitbucket" | "deployments" | "change_monitors" | "issues" | "runs" | "pagerduty" | "http";
|
|
21
|
+
export declare const CONTINUATION_SELECTORS: readonly ["github.pr/v1", "github.pr/v2", "github.issue/v1", "github.issue/v2", "github.none/v2", "slack.thread/v1", "slack.thread/v2", "slack.none/v2", "origin.pr/v1", "origin.pr/v2", "origin.none/v2", "gitlab.mr/v2", "gitlab.none/v2", "bitbucket.pr/v2", "bitbucket.none/v2", "deployments.none/v1", "deployments.none/v2", "deployments.deployment/v2", "change_monitors.checkpoint/v2", "issues.issue/v2", "runs.run/v2", "pagerduty.incident/v2", "pagerduty.none/v2", "none/v1", "none/v2"];
|
|
22
22
|
export type ContinuationSelector = (typeof CONTINUATION_SELECTORS)[number];
|
|
23
23
|
export type ContinuationIdentity = ContinuationSelector;
|
|
24
24
|
/** Agent-root protocol version. Omit / `"v1"` keeps engine minting. */
|
|
@@ -50,11 +50,19 @@ export type ContinuationClaim = {
|
|
|
50
50
|
} | {
|
|
51
51
|
monitorId: string;
|
|
52
52
|
runId: string;
|
|
53
|
+
} | {
|
|
54
|
+
incidentId: string;
|
|
53
55
|
};
|
|
54
56
|
};
|
|
55
57
|
export type MailboxContinuation = {
|
|
56
58
|
key: string;
|
|
57
59
|
};
|
|
60
|
+
/**
|
|
61
|
+
* PagerDuty v3 webhook event types that carry one incident, either as the
|
|
62
|
+
* event's `data` (lifecycle events) or as `data.incident` (notes,
|
|
63
|
+
* responders, status updates, workflows).
|
|
64
|
+
*/
|
|
65
|
+
export declare const PAGERDUTY_INCIDENT_EVENT_TYPES: readonly ["incident.triggered", "incident.acknowledged", "incident.unacknowledged", "incident.escalated", "incident.reassigned", "incident.delegated", "incident.resolved", "incident.reopened", "incident.priority_updated", "incident.incident_type.changed", "incident.annotated", "incident.responder.added", "incident.responder.replied", "incident.status_update_published", "incident.conference_bridge.updated", "incident.custom_field_values.updated", "incident.workflow.started", "incident.workflow.completed"];
|
|
58
66
|
export type ContinuationBuiltin = {
|
|
59
67
|
type: ConversationType;
|
|
60
68
|
kind: Exclude<ContinuationKind, "http">;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"continuation-identity.d.ts","sourceRoot":"","sources":["../../src/internal/continuation-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,MAAM,gBAAgB,GACxB,IAAI,GACJ,OAAO,GACP,QAAQ,GACR,WAAW,GACX,WAAW,GACX,cAAc,GACd,YAAY,GACZ,2BAA2B,GAC3B,eAAe,GACf,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"continuation-identity.d.ts","sourceRoot":"","sources":["../../src/internal/continuation-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,9 +40,36 @@ export const CONTINUATION_SELECTORS = [
|
|
|
40
40
|
"change_monitors.checkpoint/v2",
|
|
41
41
|
"issues.issue/v2",
|
|
42
42
|
"runs.run/v2",
|
|
43
|
+
"pagerduty.incident/v2",
|
|
44
|
+
"pagerduty.none/v2",
|
|
43
45
|
"none/v1",
|
|
44
46
|
"none/v2",
|
|
45
47
|
];
|
|
48
|
+
/**
|
|
49
|
+
* PagerDuty v3 webhook event types that carry one incident, either as the
|
|
50
|
+
* event's `data` (lifecycle events) or as `data.incident` (notes,
|
|
51
|
+
* responders, status updates, workflows).
|
|
52
|
+
*/
|
|
53
|
+
export const PAGERDUTY_INCIDENT_EVENT_TYPES = [
|
|
54
|
+
"incident.triggered",
|
|
55
|
+
"incident.acknowledged",
|
|
56
|
+
"incident.unacknowledged",
|
|
57
|
+
"incident.escalated",
|
|
58
|
+
"incident.reassigned",
|
|
59
|
+
"incident.delegated",
|
|
60
|
+
"incident.resolved",
|
|
61
|
+
"incident.reopened",
|
|
62
|
+
"incident.priority_updated",
|
|
63
|
+
"incident.incident_type.changed",
|
|
64
|
+
"incident.annotated",
|
|
65
|
+
"incident.responder.added",
|
|
66
|
+
"incident.responder.replied",
|
|
67
|
+
"incident.status_update_published",
|
|
68
|
+
"incident.conference_bridge.updated",
|
|
69
|
+
"incident.custom_field_values.updated",
|
|
70
|
+
"incident.workflow.started",
|
|
71
|
+
"incident.workflow.completed",
|
|
72
|
+
];
|
|
46
73
|
export const BUILTINS = [
|
|
47
74
|
{
|
|
48
75
|
type: "pr",
|
|
@@ -139,6 +166,14 @@ export const BUILTINS = [
|
|
|
139
166
|
events: ["run.created"],
|
|
140
167
|
format: "runs:{monitorId}:{runId}",
|
|
141
168
|
},
|
|
169
|
+
{
|
|
170
|
+
type: "pagerduty-incident",
|
|
171
|
+
kind: "pagerduty",
|
|
172
|
+
// v3 webhook `event.event_type`s that name one incident, keyed on its
|
|
173
|
+
// id; keep in lockstep with the control plane's `conversation/pagerduty.ts`.
|
|
174
|
+
events: PAGERDUTY_INCIDENT_EVENT_TYPES,
|
|
175
|
+
format: "pagerduty:incident:{incidentId}",
|
|
176
|
+
},
|
|
142
177
|
];
|
|
143
178
|
export class V2EngineError extends Error {
|
|
144
179
|
constructor(message) {
|
|
@@ -184,6 +219,12 @@ const SELECTOR_FIELDS = {
|
|
|
184
219
|
type: "run",
|
|
185
220
|
kind: "runs",
|
|
186
221
|
},
|
|
222
|
+
"pagerduty.incident/v2": {
|
|
223
|
+
version: 2,
|
|
224
|
+
type: "pagerduty-incident",
|
|
225
|
+
kind: "pagerduty",
|
|
226
|
+
},
|
|
227
|
+
"pagerduty.none/v2": { version: 2, type: "none", kind: "pagerduty" },
|
|
187
228
|
"none/v1": { version: 1, type: "none", kind: "http" },
|
|
188
229
|
"none/v2": { version: 2, type: "none", kind: "http" },
|
|
189
230
|
};
|
|
@@ -224,6 +265,8 @@ export function defaultContinuationSelector(kind, version = "v1", eventTypes) {
|
|
|
224
265
|
return membershipOrNone(eventTypes, "factory-issue", "issues.issue/v2", "none/v2");
|
|
225
266
|
case "runs":
|
|
226
267
|
return membershipOrNone(eventTypes, "run", "runs.run/v2", "none/v2");
|
|
268
|
+
case "pagerduty":
|
|
269
|
+
return membershipOrNone(eventTypes, "pagerduty-incident", "pagerduty.incident/v2", "pagerduty.none/v2");
|
|
227
270
|
default:
|
|
228
271
|
return "none/v2";
|
|
229
272
|
}
|
|
@@ -255,6 +298,7 @@ const OMITTED_V2_TYPED_TYPE = {
|
|
|
255
298
|
change_monitors: "change-monitor-checkpoint",
|
|
256
299
|
issues: "factory-issue",
|
|
257
300
|
runs: "run",
|
|
301
|
+
pagerduty: "pagerduty-incident",
|
|
258
302
|
};
|
|
259
303
|
/** Typed membership used when an omitted `/v2` selector becomes type `none`. */
|
|
260
304
|
export function omittedV2TypedType(kind) {
|
|
@@ -342,6 +386,8 @@ function formatConversationKey(type, fields) {
|
|
|
342
386
|
return `issues:${fields.issueName}`;
|
|
343
387
|
case "run":
|
|
344
388
|
return `runs:${fields.monitorId}:${fields.runId}`;
|
|
389
|
+
case "pagerduty-incident":
|
|
390
|
+
return `pagerduty:incident:${fields.incidentId}`;
|
|
345
391
|
}
|
|
346
392
|
}
|
|
347
393
|
export function mintClaim(claim) {
|
|
@@ -381,6 +427,15 @@ export function mintClaim(claim) {
|
|
|
381
427
|
}
|
|
382
428
|
return `cont:${formatConversationKey("run", resource)}`;
|
|
383
429
|
}
|
|
430
|
+
case "pagerduty-incident": {
|
|
431
|
+
const resource = claim.resource;
|
|
432
|
+
if (!("incidentId" in resource) || resource.incidentId.trim() === "") {
|
|
433
|
+
throw new V2EngineError("v2: pagerduty-incident claim requires incidentId");
|
|
434
|
+
}
|
|
435
|
+
return `cont:${formatConversationKey("pagerduty-incident", {
|
|
436
|
+
incidentId: resource.incidentId.trim(),
|
|
437
|
+
})}`;
|
|
438
|
+
}
|
|
384
439
|
case "pr":
|
|
385
440
|
case "issue":
|
|
386
441
|
case "origin-pr":
|
|
@@ -480,6 +535,8 @@ export function extractContinuation(type, eventName, payload) {
|
|
|
480
535
|
return extractNamedResource("factory-issue", "issueName", payload, "issue");
|
|
481
536
|
case "run":
|
|
482
537
|
return extractRun(payload);
|
|
538
|
+
case "pagerduty-incident":
|
|
539
|
+
return extractPagerDuty(payload);
|
|
483
540
|
}
|
|
484
541
|
}
|
|
485
542
|
/**
|
|
@@ -761,6 +818,32 @@ function extractRun(payload) {
|
|
|
761
818
|
runId: match[2],
|
|
762
819
|
})}`;
|
|
763
820
|
}
|
|
821
|
+
/**
|
|
822
|
+
* PagerDuty v3 webhook body (`{ event: { event_type, data } }`). Lifecycle
|
|
823
|
+
* events carry the incident as `data`; notes, responders, and other
|
|
824
|
+
* sub-resources carry it as `data.incident`, whose own `id` is the
|
|
825
|
+
* incident's while `data.id` names the sub-resource.
|
|
826
|
+
*/
|
|
827
|
+
function extractPagerDuty(payload) {
|
|
828
|
+
const incidentId = nonEmpty(pagerDutyIncidentRecord(payload)?.id);
|
|
829
|
+
if (incidentId === undefined) {
|
|
830
|
+
return undefined;
|
|
831
|
+
}
|
|
832
|
+
return `cont:${formatConversationKey("pagerduty-incident", { incidentId })}`;
|
|
833
|
+
}
|
|
834
|
+
function pagerDutyIncidentRecord(payload) {
|
|
835
|
+
const record = asRecord(payload);
|
|
836
|
+
const event = asRecord(record?.event) ?? record;
|
|
837
|
+
const data = asRecord(event?.data);
|
|
838
|
+
if (data === undefined) {
|
|
839
|
+
return undefined;
|
|
840
|
+
}
|
|
841
|
+
const nested = asRecord(data.incident);
|
|
842
|
+
if (nested !== undefined) {
|
|
843
|
+
return nested;
|
|
844
|
+
}
|
|
845
|
+
return data.type === "incident" || event?.resource_type === "incident" ? data : undefined;
|
|
846
|
+
}
|
|
764
847
|
function extractNamedResource(type, field, payload, wrapper) {
|
|
765
848
|
const record = asRecord(payload);
|
|
766
849
|
const source = wrapper === undefined ? record : asRecord(record?.[wrapper]);
|