@cursor/bdk 0.2.24 → 0.2.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -18
- package/CHANGELOG.md +3 -0
- package/dist/artifacts.d.ts +1 -1
- package/dist/artifacts.js +1 -1
- package/dist/bin/agent-serve.d.ts +1 -1
- package/dist/bin/agent-serve.js +71 -31
- package/dist/channels/bitbucket/api.d.ts +2 -2
- package/dist/channels/bitbucket/api.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-channel.js +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +5 -4
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +14 -9
- package/dist/channels/change-monitors/change-monitors-channel.js +1 -1
- package/dist/channels/deployments/deployments-channel.js +1 -1
- package/dist/channels/github/cursor-account.d.ts +7 -0
- package/dist/channels/github/cursor-account.d.ts.map +1 -1
- package/dist/channels/github/cursor-account.js +22 -5
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +10 -19
- package/dist/channels/github/replay.d.ts +1 -1
- package/dist/channels/github/replay.d.ts.map +1 -1
- package/dist/channels/gitlab/api.d.ts +2 -2
- package/dist/channels/gitlab/api.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +1 -1
- package/dist/channels/issues/issues-channel.js +1 -1
- package/dist/channels/origin/api.d.ts +4 -4
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +1 -1
- package/dist/channels/origin/origin-webhook.d.ts +3 -3
- package/dist/channels/origin/origin-webhook.d.ts.map +1 -1
- package/dist/channels/pagerduty/api.d.ts +74 -0
- package/dist/channels/pagerduty/api.d.ts.map +1 -0
- package/dist/channels/pagerduty/api.js +101 -0
- package/dist/channels/pagerduty/defaults.d.ts +42 -0
- package/dist/channels/pagerduty/defaults.d.ts.map +1 -0
- package/dist/channels/pagerduty/defaults.js +132 -0
- package/dist/channels/pagerduty/events.d.ts +24 -0
- package/dist/channels/pagerduty/events.d.ts.map +1 -0
- package/dist/channels/pagerduty/events.js +38 -0
- package/dist/channels/pagerduty/index.d.ts +31 -0
- package/dist/channels/pagerduty/index.d.ts.map +1 -0
- package/dist/channels/pagerduty/index.js +30 -0
- package/dist/channels/pagerduty/pagerduty-channel.d.ts +64 -0
- package/dist/channels/pagerduty/pagerduty-channel.d.ts.map +1 -0
- package/dist/channels/pagerduty/pagerduty-channel.js +195 -0
- package/dist/channels/pagerduty/pagerduty-webhook.d.ts +70 -0
- package/dist/channels/pagerduty/pagerduty-webhook.d.ts.map +1 -0
- package/dist/channels/pagerduty/pagerduty-webhook.js +280 -0
- package/dist/channels/pagerduty/payload.d.ts +33 -0
- package/dist/channels/pagerduty/payload.d.ts.map +1 -0
- package/dist/channels/pagerduty/payload.js +150 -0
- package/dist/channels/pagerduty/replay.d.ts +35 -0
- package/dist/channels/pagerduty/replay.d.ts.map +1 -0
- package/dist/channels/pagerduty/replay.js +115 -0
- package/dist/channels/pagerduty/secrets.d.ts +16 -0
- package/dist/channels/pagerduty/secrets.d.ts.map +1 -0
- package/dist/channels/pagerduty/secrets.js +23 -0
- package/dist/channels/pagerduty/self-user.d.ts +51 -0
- package/dist/channels/pagerduty/self-user.d.ts.map +1 -0
- package/dist/channels/pagerduty/self-user.js +157 -0
- package/dist/channels/pagerduty/state.d.ts +31 -0
- package/dist/channels/pagerduty/state.d.ts.map +1 -0
- package/dist/channels/pagerduty/state.js +30 -0
- package/dist/channels/pagerduty/types.d.ts +217 -0
- package/dist/channels/pagerduty/types.d.ts.map +1 -0
- package/dist/channels/pagerduty/types.js +1 -0
- package/dist/channels/runs/runs-channel.js +1 -1
- package/dist/channels/slack/agentic-delivery.d.ts +2 -1
- package/dist/channels/slack/agentic-delivery.d.ts.map +1 -1
- package/dist/channels/slack/agentic-delivery.js +6 -10
- package/dist/channels/slack/agentic-signals.d.ts +2 -7
- package/dist/channels/slack/agentic-signals.d.ts.map +1 -1
- package/dist/channels/slack/agentic-signals.js +4 -3
- package/dist/channels/slack/api.d.ts +1 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +3 -0
- package/dist/channels/slack/constants.d.ts +2 -0
- package/dist/channels/slack/constants.d.ts.map +1 -1
- package/dist/channels/slack/constants.js +2 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +3 -2
- package/dist/channels/slack/dispatch.d.ts +9 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +3 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +24 -20
- package/dist/channels/slack/interactive.d.ts +2 -0
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +1 -0
- package/dist/channels/slack/live-delivery.d.ts +3 -0
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +5 -0
- package/dist/channels/slack/reply-options.d.ts +9 -0
- package/dist/channels/slack/reply-options.d.ts.map +1 -1
- package/dist/channels/slack/reply-options.js +31 -1
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +7 -0
- package/dist/channels/slack/stream.d.ts +5 -1
- package/dist/channels/slack/stream.d.ts.map +1 -1
- package/dist/channels/slack/types.d.ts +29 -0
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels.d.ts +7 -1
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +12 -24
- package/dist/docs/404.html +3 -3
- package/dist/docs/assets/{app.DTIg0uKK.js → app.BITbgXMP.js} +4 -4
- package/dist/docs/assets/changelog.md.sdD6ctqK.js +1 -0
- package/dist/docs/assets/changelog.md.sdD6ctqK.lean.js +1 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.B45uCZp9.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BpJoSaxi.js → VPLocalSearchBox.3qo4-bX9.js} +2 -2
- package/dist/docs/assets/chunks/{arc.ylgNvRNq.js → arc.CTrZocKU.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.BMrNJqYk.js → architectureDiagram-Q4EWVU46.BkgIqxrv.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.BBWUEqf9.js → baseUniq.5w0JfVgo.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DFMu-Vza.js → blockDiagram-DXYQGD6D.BVLtPjQc.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.8nkAAxWv.js → c4Diagram-AHTNJAMY.CQ7neZTW.js} +1 -1
- package/dist/docs/assets/chunks/channel.Cv2w64wj.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.sO-z2Bag.js → chunk-4BX2VUAB.D-hJ7uKM.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.BMROzTMq.js → chunk-4TB4RGXK.RBYX5ywX.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.X81urwg7.js → chunk-55IACEB6.Br05HoEb.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.eaZVFLZM.js → chunk-EDXVE4YY.BD_7QS60.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.CmZhzstR.js → chunk-FMBD7UC4.BOPnMabX.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CTezt9Lc.js → chunk-OYMX7WX6.DmGIdP8i.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.s-T8zukB.js → chunk-QZHKN3VN.CGHmolCB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.DN4Nhy-D.js → chunk-YZCP3GAM.C_Uhs25v.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CtO2atCr.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CtO2atCr.js +1 -0
- package/dist/docs/assets/chunks/clone.hfsCtgP4.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Cqyp4BUH.js → cose-bilkent-S5V4N54A.DsU6xpcZ.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.BIECOiqR.js → dagre-KV5264BT.BqQLDcoU.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.1tLyWoTg.js → diagram-5BDNPKRD.Cgv8uUNF.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.BVY_6VMO.js → diagram-G4DWMVQ6.BXHPSXh_.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BSZ7xiBB.js → diagram-MMDJMWI5.CgJzo8f_.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.Bho6GmLh.js → diagram-TYMM5635.CfiN6lgT.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.A0yVIANn.js → erDiagram-SMLLAGMA.8n_hHzAd.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.ZMgbllH6.js → flowDiagram-DWJPFMVM.B2pb1Dv_.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.BCCPBhXo.js → ganttDiagram-T4ZO3ILL.BFih4ucI.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.BOkL0BbA.js → gitGraphDiagram-UUTBAWPF.CqZ8PTl8.js} +1 -1
- package/dist/docs/assets/chunks/{graph.DMyZPu86.js → graph.0ufsI9gu.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.CjG1IiEw.js → infoDiagram-42DDH7IO.BkPRFww4.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.UCe-kq9g.js → ishikawaDiagram-UXIWVN3A.DCRK-cVX.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.3WyOK_eY.js → journeyDiagram-VCZTEJTY.BFyAJo33.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.WoRG2qY1.js → kanban-definition-6JOO6SKY.CmA2SoGc.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DV07xDd5.js → layout.CYY-CbMr.js} +1 -1
- package/dist/docs/assets/chunks/{linear.CTO8mN6o.js → linear.DeeDV4Oq.js} +1 -1
- package/dist/docs/assets/chunks/{min.SvTtcKuZ.js → min.BL3XTBN2.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.DMGgQ-HB.js → mindmap-definition-QFDTVHPH.BcbY-G6H.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B7851apI.js → pieDiagram-DEJITSTG.dzDcQnPE.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CEqyypIX.js → quadrantDiagram-34T5L4WZ.RxR0m5iK.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.C3Mwsw-H.js → requirementDiagram-MS252O5E.DflaXb6Q.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DyYK0XxY.js → sankeyDiagram-XADWPNL6.BteLKQAe.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.SiQPH-XM.js → sequenceDiagram-FGHM5R23.BD8jM8oz.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CTJMsP4p.js → stateDiagram-FHFEXIEX.C8SBkbPH.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BLz7Qyo3.js +1 -0
- package/dist/docs/assets/chunks/{theme.DJo4my9R.js → theme.DiViIOLe.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.CxSNRlQ6.js → timeline-definition-GMOUNBTQ.D64XF5dV.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.BdoJskyD.js → vennDiagram-DHZGUBPP.CwmeYan-.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.DmAlXlpu.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.IjIbFn_F.js → wardleyDiagram-NUSXRM2D.5VJ2-5K0.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CPUxDZLH.js → xychartDiagram-5P7HB3ND.Cl6_fZVC.js} +1 -1
- package/dist/docs/assets/{guides_hooks.md.Bfj0pK91.js → guides_hooks.md.B2XfGX50.js} +7 -3
- package/dist/docs/assets/{guides_mcp-oauth.md.BM_eFC0L.js → guides_mcp-oauth.md.Cxq2TxBB.js} +3 -3
- package/dist/docs/assets/{guides_mcp-oauth.md.BM_eFC0L.lean.js → guides_mcp-oauth.md.Cxq2TxBB.lean.js} +1 -1
- package/dist/docs/assets/guides_opentelemetry.md.D4wO7_8v.js +37 -0
- package/dist/docs/assets/guides_opentelemetry.md.D4wO7_8v.lean.js +1 -0
- package/dist/docs/assets/guides_pagerduty.md.BHXMcMtx.js +60 -0
- package/dist/docs/assets/guides_pagerduty.md.BHXMcMtx.lean.js +1 -0
- package/dist/docs/assets/{guides_slack.md.Bn-WupSE.js → guides_slack.md.ClIyi7FI.js} +8 -3
- package/dist/docs/assets/{guides_slack.md.Bn-WupSE.lean.js → guides_slack.md.ClIyi7FI.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.IplwL25I.js → reference_agent-config.md.CGSx8COP.js} +6 -2
- package/dist/docs/assets/{reference_agent-config.md.IplwL25I.lean.js → reference_agent-config.md.CGSx8COP.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.DYg0CLud.js → reference_channels.md.CNNIS6K7.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.DB7Llw3T.js → reference_cli.md.1o_TqKdt.js} +7 -2
- package/dist/docs/assets/{reference_cli.md.DB7Llw3T.lean.js → reference_cli.md.1o_TqKdt.lean.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.B1jq3oGl.js → reference_hooks.md.CROr0QgC.js} +13 -7
- package/dist/docs/assets/{reference_hooks.md.B1jq3oGl.lean.js → reference_hooks.md.CROr0QgC.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.03Ryy9ca.js → reference_schedules.md.BqWnJES4.js} +3 -3
- package/dist/docs/assets/reference_sessions.md.Bi6lHttM.js +22 -0
- package/dist/docs/assets/reference_sessions.md.Bi6lHttM.lean.js +1 -0
- package/dist/docs/assets/{reference_skills.md.C2GWh7g8.js → reference_skills.md.Ckddg6KX.js} +3 -3
- package/dist/docs/assets/{reference_tools.md.08XR7lIl.js → reference_tools.md.Bo0UfT0a.js} +1 -1
- package/dist/docs/assets/{style.nMsabY-V.css → style.B9o0luvp.css} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/changelog.html +60 -0
- package/dist/docs/changelog.md +86 -0
- package/dist/docs/deployment.html +37 -37
- package/dist/docs/evals.html +37 -37
- package/dist/docs/guides/agent-to-agent.html +37 -37
- package/dist/docs/guides/bitbucket.html +37 -37
- package/dist/docs/guides/cloud-agents.html +37 -37
- package/dist/docs/guides/convert-automation.html +37 -37
- package/dist/docs/guides/export-grokbot.html +37 -37
- package/dist/docs/guides/github.html +37 -37
- package/dist/docs/guides/gitlab.html +37 -37
- package/dist/docs/guides/grokbot-agents.html +37 -37
- package/dist/docs/guides/hooks.html +45 -41
- package/dist/docs/guides/hooks.md +7 -3
- package/dist/docs/guides/improve.html +37 -37
- package/dist/docs/guides/jev.html +37 -37
- package/dist/docs/guides/mcp-oauth.html +39 -39
- package/dist/docs/guides/mcp-oauth.md +12 -0
- package/dist/docs/guides/migrate.html +37 -37
- package/dist/docs/guides/opentelemetry.html +62 -70
- package/dist/docs/guides/opentelemetry.md +150 -175
- package/dist/docs/guides/pagerduty.html +119 -0
- package/dist/docs/guides/pagerduty.md +336 -0
- package/dist/docs/guides/slack.html +44 -39
- package/dist/docs/guides/slack.md +41 -0
- package/dist/docs/guides/webhooks.html +37 -37
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +37 -37
- package/dist/docs/index.html +37 -37
- package/dist/docs/llms-full.txt +730 -163
- package/dist/docs/llms.txt +3 -1
- package/dist/docs/quickstart.html +37 -37
- package/dist/docs/reference/agent-config.html +42 -38
- package/dist/docs/reference/agent-config.md +21 -1
- package/dist/docs/reference/artifacts.html +37 -37
- package/dist/docs/reference/channels.html +38 -38
- package/dist/docs/reference/channels.md +7 -2
- package/dist/docs/reference/cli.html +43 -38
- package/dist/docs/reference/cli.md +27 -0
- package/dist/docs/reference/connections.html +37 -37
- package/dist/docs/reference/evals.html +37 -37
- package/dist/docs/reference/extensions.html +37 -37
- package/dist/docs/reference/hooks.html +49 -43
- package/dist/docs/reference/hooks.md +10 -5
- package/dist/docs/reference/http-api.html +37 -37
- package/dist/docs/reference/instructions.html +37 -37
- package/dist/docs/reference/memory.html +37 -37
- package/dist/docs/reference/playground.html +36 -36
- package/dist/docs/reference/project-layout.html +37 -37
- package/dist/docs/reference/prompt.html +37 -37
- package/dist/docs/reference/schedules.html +40 -40
- package/dist/docs/reference/sessions.html +58 -37
- package/dist/docs/reference/sessions.md +46 -1
- package/dist/docs/reference/skills.html +40 -40
- package/dist/docs/reference/subagents.html +37 -37
- package/dist/docs/reference/tools.html +39 -39
- package/dist/docs/reference/tools.md +4 -3
- package/dist/docs/templates/agentic-owners.html +37 -37
- package/dist/docs/templates/grokbot-agents.html +37 -37
- package/dist/docs/templates/security-reviewer.html +37 -37
- package/dist/docs/templates/thermo-quality-review.html +37 -37
- package/dist/docs/templates/thermo-review.html +37 -37
- package/dist/docs/templates/triage.html +37 -37
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/extension.js +15 -15
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/inputs.js +1 -1
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-grokbot-agents/extension.js +7 -3
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts.map +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +1 -1
- package/dist/extensions/improve/extension.js +1 -1
- package/dist/extensions/jev/extension.js +2 -2
- package/dist/extensions/jev/tools/evaluate.js +3 -3
- package/dist/extensions/slack-communication/extension.js +1 -1
- package/dist/extensions/slack-communication/tools/delete-message.js +1 -1
- package/dist/extensions/slack-communication/tools/edit-message.d.ts.map +1 -1
- package/dist/extensions/slack-communication/tools/edit-message.js +3 -6
- package/dist/extensions/slack-communication/tools/post-card.js +1 -1
- package/dist/extensions/slack-communication/tools/post-file.js +1 -1
- package/dist/extensions/slack-communication/tools/post-update.d.ts.map +1 -1
- package/dist/extensions/slack-communication/tools/post-update.js +3 -6
- package/dist/extensions/slack-communication/tools/react.js +1 -1
- package/dist/extensions/slack-communication/tools/set-status.js +1 -1
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +1 -1
- package/dist/index.d.ts +14 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/internal/approval-gate.d.ts +4 -2
- package/dist/internal/approval-gate.d.ts.map +1 -1
- package/dist/internal/approval-gate.js +2 -1
- package/dist/internal/as-of.d.ts +2 -0
- package/dist/internal/as-of.d.ts.map +1 -1
- package/dist/internal/as-of.js +2 -0
- package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -1
- package/dist/internal/builtin-tools/artifacts.js +45 -12
- package/dist/internal/builtin-tools/reminders.js +1 -1
- package/dist/internal/channel-architecture.d.ts +1 -1
- package/dist/internal/channel-architecture.d.ts.map +1 -1
- package/dist/internal/channel-architecture.js +4 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +39 -22
- package/dist/internal/cli-pagerduty.d.ts +32 -0
- package/dist/internal/cli-pagerduty.d.ts.map +1 -0
- package/dist/internal/cli-pagerduty.js +242 -0
- package/dist/internal/continuation-channel.d.ts.map +1 -1
- package/dist/internal/continuation-channel.js +7 -0
- package/dist/internal/continuation-identity.d.ts +11 -3
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +83 -0
- package/dist/internal/continuation.d.ts +3 -0
- package/dist/internal/continuation.d.ts.map +1 -0
- package/dist/internal/continuation.js +1 -0
- package/dist/internal/conversation-mirror.d.ts +5 -0
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +12 -1
- package/dist/internal/convert-automation/convert-workflow.js +1 -1
- package/dist/internal/convert-grokbot/answers.d.ts.map +1 -1
- package/dist/internal/convert-grokbot/answers.js +10 -8
- package/dist/internal/convert-grokbot/recipe.d.ts +1 -1
- package/dist/internal/convert-grokbot/recipe.d.ts.map +1 -1
- package/dist/internal/convert-grokbot/recipe.js +1 -1
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +2 -0
- package/dist/internal/cursor/backend-client.d.ts +8 -3
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +8 -3
- package/dist/internal/cursor/credentials.d.ts +2 -2
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +1 -1
- package/dist/internal/cursor-account-mcp-auth.d.ts +6 -2
- package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
- package/dist/internal/cursor-account-mcp-auth.js +15 -6
- package/dist/internal/deferred-channel-session.d.ts +5 -4
- package/dist/internal/deferred-channel-session.d.ts.map +1 -1
- package/dist/internal/deferred-channel-session.js +6 -4
- package/dist/internal/deploy-client.d.ts +5 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +3 -3
- package/dist/internal/deploy-manifest.d.ts +11 -4
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +19 -7
- package/dist/internal/describe-error.d.ts +2 -0
- package/dist/internal/describe-error.d.ts.map +1 -1
- package/dist/internal/describe-error.js +2 -0
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +10 -10
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +10 -10
- package/dist/internal/discovery/channels.d.ts.map +1 -1
- package/dist/internal/discovery/channels.js +20 -16
- package/dist/internal/discovery/context.d.ts +16 -0
- package/dist/internal/discovery/context.d.ts.map +1 -1
- package/dist/internal/discovery/context.js +67 -2
- package/dist/internal/discovery/cursor-plugin.js +8 -8
- package/dist/internal/discovery/extension-overlay.d.ts.map +1 -1
- package/dist/internal/discovery/extension-overlay.js +2 -6
- package/dist/internal/discovery/extensions.js +15 -8
- package/dist/internal/discovery/info.d.ts +2 -2
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +9 -9
- package/dist/internal/discovery/instructions.d.ts.map +1 -1
- package/dist/internal/discovery/instructions.js +3 -6
- package/dist/internal/discovery/instrumentation.d.ts +10 -0
- package/dist/internal/discovery/instrumentation.d.ts.map +1 -0
- package/dist/internal/discovery/instrumentation.js +29 -0
- package/dist/internal/discovery/modules.d.ts.map +1 -1
- package/dist/internal/discovery/modules.js +7 -10
- package/dist/internal/discovery/project-public.d.ts +16 -0
- package/dist/internal/discovery/project-public.d.ts.map +1 -0
- package/dist/internal/discovery/project-public.js +54 -0
- package/dist/internal/discovery/project.d.ts +6 -0
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +40 -8
- package/dist/internal/discovery/runtime.d.ts.map +1 -1
- package/dist/internal/discovery/runtime.js +8 -8
- package/dist/internal/discovery/services.d.ts +5 -4
- package/dist/internal/discovery/services.d.ts.map +1 -1
- package/dist/internal/discovery/services.js +12 -6
- package/dist/internal/discovery.d.ts +1 -1
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +1 -1
- package/dist/internal/event-mapper.d.ts.map +1 -1
- package/dist/internal/event-mapper.js +1 -0
- package/dist/internal/expected-delivery-failure.d.ts.map +1 -1
- package/dist/internal/expected-delivery-failure.js +6 -0
- package/dist/internal/factory-resource-channel.d.ts +1 -1
- package/dist/internal/factory-resource-channel.d.ts.map +1 -1
- package/dist/internal/filesystem/nearest.d.ts +1 -0
- package/dist/internal/filesystem/nearest.d.ts.map +1 -1
- package/dist/internal/filesystem/nearest.js +1 -0
- package/dist/internal/filesystem/sdk-schemas.d.ts.map +1 -1
- package/dist/internal/filesystem/sdk-schemas.js +4 -3
- package/dist/internal/filesystem/tools.d.ts.map +1 -1
- package/dist/internal/filesystem/tools.js +1 -1
- package/dist/internal/handleAgentServeTrigger.d.ts +10 -0
- package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -1
- package/dist/internal/handleAgentServeTrigger.js +3 -0
- package/dist/internal/hmac-secret-values.d.ts +48 -0
- package/dist/internal/hmac-secret-values.d.ts.map +1 -0
- package/dist/internal/hmac-secret-values.js +68 -0
- package/dist/internal/host-otel.d.ts +1 -1
- package/dist/internal/host-otel.d.ts.map +1 -1
- package/dist/internal/host-otel.js +5 -0
- package/dist/internal/host-platforms.d.ts.map +1 -1
- package/dist/internal/host-platforms.js +8 -2
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +6 -2
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +1 -0
- package/dist/internal/ids.d.ts +8 -0
- package/dist/internal/ids.d.ts.map +1 -1
- package/dist/internal/ids.js +20 -0
- package/dist/internal/init-scaffold.js +1 -1
- package/dist/internal/interview/agent-questions.d.ts +1 -1
- package/dist/internal/interview/agent-questions.d.ts.map +1 -1
- package/dist/internal/interview/agent-questions.js +1 -1
- package/dist/internal/interview/question.d.ts +2 -2
- package/dist/internal/interview/question.d.ts.map +1 -1
- package/dist/internal/interview/question.js +2 -2
- package/dist/internal/json-schema.d.ts +7 -7
- package/dist/internal/json-schema.d.ts.map +1 -1
- package/dist/internal/json-schema.js +16 -23
- package/dist/internal/mcp-endpoint.d.ts +16 -4
- package/dist/internal/mcp-endpoint.d.ts.map +1 -1
- package/dist/internal/mcp-endpoint.js +18 -6
- package/dist/internal/mcp-host.d.ts +9 -0
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +15 -0
- package/dist/internal/otel/collector.d.ts +5 -0
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +27 -6
- package/dist/internal/otel/config.d.ts +37 -22
- package/dist/internal/otel/config.d.ts.map +1 -1
- package/dist/internal/otel/config.js +132 -125
- package/dist/internal/otel/conversation-span-processor.d.ts +9 -0
- package/dist/internal/otel/conversation-span-processor.d.ts.map +1 -0
- package/dist/internal/otel/conversation-span-processor.js +34 -0
- package/dist/internal/otel/customer.d.ts +52 -0
- package/dist/internal/otel/customer.d.ts.map +1 -0
- package/dist/internal/otel/customer.js +727 -0
- package/dist/internal/otel/runtime.d.ts +12 -16
- package/dist/internal/otel/runtime.d.ts.map +1 -1
- package/dist/internal/otel/runtime.js +37 -218
- package/dist/internal/otel-env.d.ts +6 -0
- package/dist/internal/otel-env.d.ts.map +1 -0
- package/dist/internal/otel-env.js +5 -0
- package/dist/internal/package-inline-stdio.d.ts.map +1 -1
- package/dist/internal/package-inline-stdio.js +21 -6
- package/dist/internal/reminder-runner.d.ts +9 -4
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +12 -10
- package/dist/internal/reminder-schedule.d.ts +1 -0
- package/dist/internal/reminder-schedule.d.ts.map +1 -1
- package/dist/internal/reminder-schedule.js +1 -0
- package/dist/internal/sdk-runner.d.ts +4 -3
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +157 -17
- package/dist/internal/secret-alternatives.d.ts +11 -0
- package/dist/internal/secret-alternatives.d.ts.map +1 -0
- package/dist/internal/secret-alternatives.js +13 -0
- package/dist/internal/server.d.ts +4 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +27 -26
- package/dist/internal/session-engine.d.ts +27 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +154 -25
- package/dist/internal/slack-provision-client.js +1 -1
- package/dist/internal/sqlite-experimental-warning.d.ts +2 -0
- package/dist/internal/sqlite-experimental-warning.d.ts.map +1 -0
- package/dist/internal/sqlite-experimental-warning.js +22 -0
- package/dist/internal/store-api-protocol.d.ts +1 -1
- package/dist/internal/store-api-protocol.d.ts.map +1 -1
- package/dist/internal/store-api-protocol.js +1 -1
- package/dist/internal/testing/conversation-identity-vectors.d.ts +6 -1
- package/dist/internal/testing/conversation-identity-vectors.d.ts.map +1 -1
- package/dist/internal/testing/conversation-identity-vectors.js +34 -0
- package/dist/internal/testing/hmac-secret-vectors.d.ts +38 -0
- package/dist/internal/testing/hmac-secret-vectors.d.ts.map +1 -0
- package/dist/internal/testing/hmac-secret-vectors.js +89 -0
- package/dist/internal/testing/pagerduty-continuation-fixtures.d.ts +42 -0
- package/dist/internal/testing/pagerduty-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/pagerduty-continuation-fixtures.js +175 -0
- package/dist/internal/update-check.d.ts +2 -2
- package/dist/internal/update-check.d.ts.map +1 -1
- package/dist/internal/update-check.js +3 -3
- package/dist/internal/zod-schema.d.ts +14 -0
- package/dist/internal/zod-schema.d.ts.map +1 -0
- package/dist/internal/zod-schema.js +22 -0
- package/dist/internal/zod3-datetime.d.ts +12 -0
- package/dist/internal/zod3-datetime.d.ts.map +1 -0
- package/dist/internal/zod3-datetime.js +17 -0
- package/dist/otel-public.d.ts +2 -3
- package/dist/otel-public.d.ts.map +1 -1
- package/dist/otel-public.js +2 -2
- package/dist/otel.d.ts +3 -102
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +61 -97
- package/dist/playground/assets/cursor-icons-16-DmHBTm1-.woff2 +0 -0
- package/dist/playground/assets/index-CyPkf2y7.css +1 -0
- package/dist/playground/assets/index-DpbzbqFY.js +62 -0
- package/dist/playground/index.html +2 -2
- package/dist/public-deprecated.d.ts +36 -0
- package/dist/public-deprecated.d.ts.map +1 -0
- package/dist/public-deprecated.js +39 -0
- package/dist/tools.d.ts +16 -13
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +4 -3
- package/dist/types.d.ts +286 -104
- package/dist/types.d.ts.map +1 -1
- package/docs/changelog.md +91 -0
- package/docs/guides/hooks.md +7 -3
- package/docs/guides/mcp-oauth.md +12 -0
- package/docs/guides/opentelemetry.md +150 -180
- package/docs/guides/pagerduty.md +341 -0
- package/docs/guides/slack.md +41 -0
- package/docs/reference/agent-config.md +21 -1
- package/docs/reference/channels.md +7 -2
- package/docs/reference/cli.md +27 -0
- package/docs/reference/hooks.md +10 -5
- package/docs/reference/sessions.md +46 -1
- package/docs/reference/tools.md +4 -3
- package/package.json +39 -8
- package/schemas/grokbot-answers.schema.json +11 -0
- package/skills/framework-map/SKILL.md +2 -1
- package/skills/migrate-v2/SKILL.md +1 -1
- package/skills/otel/SKILL.md +30 -46
- package/templates/agentic-owners/README.md +6 -1
- package/templates/agentic-owners/bot/lib/owners/decision.ts +31 -5
- package/templates/agentic-owners/bot/lib/owners/globalOverride.ts +60 -0
- package/templates/agentic-owners/bot/lib/owners/match.ts +85 -19
- package/templates/agentic-owners/bot/lib/owners/parse.ts +133 -2
- package/templates/agentic-owners/bot/lib/owners/types.ts +23 -0
- package/templates/code-wiki/evals/wiki.eval.ts +2 -2
- package/dist/docs/assets/chunks/@localSearchIndexroot.3ebvCWKy.js +0 -1
- package/dist/docs/assets/chunks/channel.BOebySCN.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C55IaN-T.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C55IaN-T.js +0 -1
- package/dist/docs/assets/chunks/clone.D06pA7ML.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DddRVjeq.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.CVCRSuQK.js +0 -162
- package/dist/docs/assets/guides_opentelemetry.md.Ck1o2frw.js +0 -45
- package/dist/docs/assets/guides_opentelemetry.md.Ck1o2frw.lean.js +0 -1
- package/dist/docs/assets/reference_sessions.md.C8FXuGwk.js +0 -1
- package/dist/docs/assets/reference_sessions.md.C8FXuGwk.lean.js +0 -1
- package/dist/playground/assets/cursor-icons-16-gwXtdAvu.woff2 +0 -0
- package/dist/playground/assets/index-DKKdkF29.js +0 -62
- package/dist/playground/assets/index-DpKinTMs.css +0 -1
- package/templates/grokbot-agents/.gitignore +0 -4
- package/templates/security-help/.gitignore +0 -4
- /package/dist/docs/assets/{guides_hooks.md.Bfj0pK91.lean.js → guides_hooks.md.B2XfGX50.lean.js} +0 -0
- /package/dist/docs/assets/{reference_channels.md.DYg0CLud.lean.js → reference_channels.md.CNNIS6K7.lean.js} +0 -0
- /package/dist/docs/assets/{reference_schedules.md.03Ryy9ca.lean.js → reference_schedules.md.BqWnJES4.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.C2GWh7g8.lean.js → reference_skills.md.Ckddg6KX.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.08XR7lIl.lean.js → reference_tools.md.Bo0UfT0a.lean.js} +0 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed views over a PagerDuty v3 webhook body. Every reader tolerates
|
|
3
|
+
* missing optional fields and returns `undefined` for a shape it does not
|
|
4
|
+
* recognize, so a new PagerDuty field never fails a delivery.
|
|
5
|
+
*/
|
|
6
|
+
export function asRecord(value) {
|
|
7
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
8
|
+
? value
|
|
9
|
+
: undefined;
|
|
10
|
+
}
|
|
11
|
+
export function asNonEmptyString(value) {
|
|
12
|
+
return typeof value === "string" && value.trim() !== "" ? value.trim() : undefined;
|
|
13
|
+
}
|
|
14
|
+
function asPositiveInt(value) {
|
|
15
|
+
return typeof value === "number" && Number.isInteger(value) && value > 0 ? value : undefined;
|
|
16
|
+
}
|
|
17
|
+
/** The delivery's `event` record, or `undefined` when the body is not a v3 event. */
|
|
18
|
+
export function pagerDutyEventRecord(payload) {
|
|
19
|
+
const event = asRecord(asRecord(payload)?.event);
|
|
20
|
+
return asNonEmptyString(event?.event_type) === undefined ? undefined : event;
|
|
21
|
+
}
|
|
22
|
+
export function pagerDutyReference(value) {
|
|
23
|
+
const record = asRecord(value);
|
|
24
|
+
const id = asNonEmptyString(record?.id);
|
|
25
|
+
if (record === undefined || id === undefined) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
id,
|
|
30
|
+
type: asNonEmptyString(record.type),
|
|
31
|
+
summary: asNonEmptyString(record.summary),
|
|
32
|
+
htmlUrl: asNonEmptyString(record.html_url),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function references(value) {
|
|
36
|
+
if (!Array.isArray(value)) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
return value.flatMap((entry) => {
|
|
40
|
+
const reference = pagerDutyReference(entry);
|
|
41
|
+
return reference === undefined ? [] : [reference];
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** `data` of a lifecycle event: the full incident. */
|
|
45
|
+
export function pagerDutyIncidentFromData(data) {
|
|
46
|
+
const record = asRecord(data);
|
|
47
|
+
const id = asNonEmptyString(record?.id);
|
|
48
|
+
if (record === undefined || id === undefined || record.type !== "incident") {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
id,
|
|
53
|
+
number: asPositiveInt(record.number),
|
|
54
|
+
title: asNonEmptyString(record.title),
|
|
55
|
+
status: asNonEmptyString(record.status),
|
|
56
|
+
urgency: asNonEmptyString(record.urgency),
|
|
57
|
+
incidentKey: asNonEmptyString(record.incident_key),
|
|
58
|
+
htmlUrl: asNonEmptyString(record.html_url),
|
|
59
|
+
createdAt: asNonEmptyString(record.created_at),
|
|
60
|
+
service: pagerDutyReference(record.service),
|
|
61
|
+
escalationPolicy: pagerDutyReference(record.escalation_policy),
|
|
62
|
+
priority: pagerDutyReference(record.priority),
|
|
63
|
+
assignees: references(record.assignees),
|
|
64
|
+
teams: references(record.teams),
|
|
65
|
+
resolveReason: asNonEmptyString(record.resolve_reason),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function incidentRef(value) {
|
|
69
|
+
const reference = pagerDutyReference(value);
|
|
70
|
+
if (reference === undefined) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
return { ...reference, incidentKey: asNonEmptyString(asRecord(value)?.incident_key) };
|
|
74
|
+
}
|
|
75
|
+
/** `data` of `incident.annotated`. */
|
|
76
|
+
export function pagerDutyNoteFromData(data) {
|
|
77
|
+
const record = asRecord(data);
|
|
78
|
+
const incident = incidentRef(record?.incident);
|
|
79
|
+
if (record === undefined || incident === undefined || typeof record.content !== "string") {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
id: asNonEmptyString(record.id),
|
|
84
|
+
content: record.content,
|
|
85
|
+
trimmed: record.trimmed === true,
|
|
86
|
+
incident,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** `data` of `incident.responder.added` / `.replied`. */
|
|
90
|
+
export function pagerDutyResponderFromData(eventType, data) {
|
|
91
|
+
const record = asRecord(data);
|
|
92
|
+
const incident = incidentRef(record?.incident);
|
|
93
|
+
if (record === undefined || incident === undefined) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
action: eventType === "incident.responder.replied" ? "replied" : "added",
|
|
98
|
+
incident,
|
|
99
|
+
user: pagerDutyReference(record.user),
|
|
100
|
+
escalationPolicy: pagerDutyReference(record.escalation_policy),
|
|
101
|
+
message: asNonEmptyString(record.message),
|
|
102
|
+
state: asNonEmptyString(record.state),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The incident any incident event names: `data` itself for lifecycle
|
|
107
|
+
* events, `data.incident` for sub-resources. Mirrors the continuation
|
|
108
|
+
* selector, so a hook's `ctx.incidentId` names the session's incident.
|
|
109
|
+
*/
|
|
110
|
+
export function pagerDutyEventIncident(event) {
|
|
111
|
+
const data = asRecord(event.data);
|
|
112
|
+
const record = asRecord(data?.incident) ??
|
|
113
|
+
(data?.type === "incident" || event.resource_type === "incident" ? data : undefined);
|
|
114
|
+
const id = asNonEmptyString(record?.id);
|
|
115
|
+
if (id === undefined) {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
return { id, incidentKey: asNonEmptyString(record?.incident_key) };
|
|
119
|
+
}
|
|
120
|
+
const PAGERDUTY_HOST = /^([a-z0-9][a-z0-9-]*)\.(?:[a-z]{2}\.)?pagerduty\.com$/i;
|
|
121
|
+
/**
|
|
122
|
+
* The account subdomain (`acme` for `acme.pagerduty.com` or
|
|
123
|
+
* `acme.eu.pagerduty.com`) from the first PagerDuty web URL the event
|
|
124
|
+
* carries: the incident's, the agent's, or the data's own.
|
|
125
|
+
*/
|
|
126
|
+
export function pagerDutyAccountSubdomain(event) {
|
|
127
|
+
const data = asRecord(event.data);
|
|
128
|
+
const candidates = [
|
|
129
|
+
asRecord(data?.incident)?.html_url,
|
|
130
|
+
data?.html_url,
|
|
131
|
+
asRecord(event.agent)?.html_url,
|
|
132
|
+
asRecord(data?.service)?.html_url,
|
|
133
|
+
];
|
|
134
|
+
for (const candidate of candidates) {
|
|
135
|
+
const url = asNonEmptyString(candidate);
|
|
136
|
+
if (url === undefined) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const match = PAGERDUTY_HOST.exec(new URL(url).hostname);
|
|
141
|
+
if (match?.[1] !== undefined) {
|
|
142
|
+
return match[1].toLowerCase();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Not a URL; try the next one.
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthesize PagerDuty v3 webhook bodies for `bdk pagerduty replay`, so a
|
|
3
|
+
* local `pagerdutyChannel()` can be exercised without a PagerDuty account
|
|
4
|
+
* or tunnel. The bodies follow PagerDuty's documented v3 shapes: lifecycle
|
|
5
|
+
* events carry the incident as `data`, notes carry it as `data.incident`.
|
|
6
|
+
*/
|
|
7
|
+
/** Event types `replay` can synthesize, in the order an incident usually sees them. */
|
|
8
|
+
export declare const PAGERDUTY_REPLAYABLE_EVENTS: readonly ["incident.triggered", "incident.acknowledged", "incident.annotated", "incident.escalated", "incident.resolved", "incident.reopened"];
|
|
9
|
+
export type PagerDutyReplayableEvent = (typeof PAGERDUTY_REPLAYABLE_EVENTS)[number];
|
|
10
|
+
export declare const PAGERDUTY_REPLAY_DEFAULT_INCIDENT_ID = "PREPLAY1";
|
|
11
|
+
/**
|
|
12
|
+
* Pick the events to replay. Accepts full names (`incident.resolved`) or
|
|
13
|
+
* the action alone (`resolved`); `*` selects every declared event that can
|
|
14
|
+
* be synthesized. Defaults to `incident.triggered`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function selectPagerDutyReplayEvents(input: {
|
|
17
|
+
/** Event names from `--events`; omitted selects the default. */
|
|
18
|
+
requested: readonly string[] | undefined;
|
|
19
|
+
/** The event types the target channels declare. */
|
|
20
|
+
declared: readonly string[];
|
|
21
|
+
}): {
|
|
22
|
+
events: PagerDutyReplayableEvent[];
|
|
23
|
+
unsupported: string[];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* One v3 delivery body for `eventType` on `incidentId`. A trigger comes
|
|
27
|
+
* from PagerDuty itself (no `agent`); every other event is a person's
|
|
28
|
+
* action, so it dispatches rather than being skipped as the agent's echo.
|
|
29
|
+
*/
|
|
30
|
+
export declare function synthesizePagerDutyEvent(input: {
|
|
31
|
+
eventType: PagerDutyReplayableEvent;
|
|
32
|
+
incidentId?: string;
|
|
33
|
+
note?: string;
|
|
34
|
+
}): Record<string, unknown>;
|
|
35
|
+
//# sourceMappingURL=replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/replay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,uFAAuF;AACvF,eAAO,MAAM,2BAA2B,YACtC,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,CACX,CAAC;AAEX,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC;AAWpF,eAAO,MAAM,oCAAoC,aAAa,CAAC;AAe/D;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,gEAAgE;IAChE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACzC,mDAAmD;IACnD,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,GAAG;IAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAwBhE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,SAAS,EAAE,wBAAwB,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyC1B"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthesize PagerDuty v3 webhook bodies for `bdk pagerduty replay`, so a
|
|
3
|
+
* local `pagerdutyChannel()` can be exercised without a PagerDuty account
|
|
4
|
+
* or tunnel. The bodies follow PagerDuty's documented v3 shapes: lifecycle
|
|
5
|
+
* events carry the incident as `data`, notes carry it as `data.incident`.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from "node:crypto";
|
|
8
|
+
/** Event types `replay` can synthesize, in the order an incident usually sees them. */
|
|
9
|
+
export const PAGERDUTY_REPLAYABLE_EVENTS = [
|
|
10
|
+
"incident.triggered",
|
|
11
|
+
"incident.acknowledged",
|
|
12
|
+
"incident.annotated",
|
|
13
|
+
"incident.escalated",
|
|
14
|
+
"incident.resolved",
|
|
15
|
+
"incident.reopened",
|
|
16
|
+
];
|
|
17
|
+
const STATUS_BY_EVENT = {
|
|
18
|
+
"incident.triggered": "triggered",
|
|
19
|
+
"incident.acknowledged": "acknowledged",
|
|
20
|
+
"incident.annotated": "triggered",
|
|
21
|
+
"incident.escalated": "triggered",
|
|
22
|
+
"incident.resolved": "resolved",
|
|
23
|
+
"incident.reopened": "triggered",
|
|
24
|
+
};
|
|
25
|
+
export const PAGERDUTY_REPLAY_DEFAULT_INCIDENT_ID = "PREPLAY1";
|
|
26
|
+
const SUBDOMAIN = "example";
|
|
27
|
+
const SERVICE = {
|
|
28
|
+
id: "PSVCREP",
|
|
29
|
+
type: "service_reference",
|
|
30
|
+
summary: "replayed-service",
|
|
31
|
+
html_url: `https://${SUBDOMAIN}.pagerduty.com/service-directory/PSVCREP`,
|
|
32
|
+
};
|
|
33
|
+
const RESPONDER = {
|
|
34
|
+
id: "PUSERREP",
|
|
35
|
+
type: "user_reference",
|
|
36
|
+
summary: "Replay Responder",
|
|
37
|
+
html_url: `https://${SUBDOMAIN}.pagerduty.com/users/PUSERREP`,
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Pick the events to replay. Accepts full names (`incident.resolved`) or
|
|
41
|
+
* the action alone (`resolved`); `*` selects every declared event that can
|
|
42
|
+
* be synthesized. Defaults to `incident.triggered`.
|
|
43
|
+
*/
|
|
44
|
+
export function selectPagerDutyReplayEvents(input) {
|
|
45
|
+
const { requested, declared } = input;
|
|
46
|
+
const replayable = new Set(PAGERDUTY_REPLAYABLE_EVENTS);
|
|
47
|
+
if (requested === undefined) {
|
|
48
|
+
return { events: ["incident.triggered"], unsupported: [] };
|
|
49
|
+
}
|
|
50
|
+
if (requested.length === 1 && requested[0] === "*") {
|
|
51
|
+
const pool = declared.length === 0 ? PAGERDUTY_REPLAYABLE_EVENTS : declared;
|
|
52
|
+
return {
|
|
53
|
+
events: PAGERDUTY_REPLAYABLE_EVENTS.filter((event) => pool.includes(event)),
|
|
54
|
+
unsupported: [],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const events = [];
|
|
58
|
+
const unsupported = [];
|
|
59
|
+
for (const raw of requested) {
|
|
60
|
+
const name = raw.startsWith("incident.") ? raw : `incident.${raw}`;
|
|
61
|
+
if (replayable.has(name)) {
|
|
62
|
+
events.push(name);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
unsupported.push(raw);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { events, unsupported };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* One v3 delivery body for `eventType` on `incidentId`. A trigger comes
|
|
72
|
+
* from PagerDuty itself (no `agent`); every other event is a person's
|
|
73
|
+
* action, so it dispatches rather than being skipped as the agent's echo.
|
|
74
|
+
*/
|
|
75
|
+
export function synthesizePagerDutyEvent(input) {
|
|
76
|
+
const incidentId = input.incidentId ?? PAGERDUTY_REPLAY_DEFAULT_INCIDENT_ID;
|
|
77
|
+
const incidentUrl = `https://${SUBDOMAIN}.pagerduty.com/incidents/${incidentId}`;
|
|
78
|
+
const data = input.eventType === "incident.annotated"
|
|
79
|
+
? {
|
|
80
|
+
id: `PNOTE${randomUUID().slice(0, 6).toUpperCase()}`,
|
|
81
|
+
type: "incident_note",
|
|
82
|
+
content: input.note ?? "Replayed note from bdk pagerduty replay.",
|
|
83
|
+
trimmed: false,
|
|
84
|
+
incident: {
|
|
85
|
+
id: incidentId,
|
|
86
|
+
type: "incident_reference",
|
|
87
|
+
html_url: incidentUrl,
|
|
88
|
+
},
|
|
89
|
+
}
|
|
90
|
+
: {
|
|
91
|
+
id: incidentId,
|
|
92
|
+
type: "incident",
|
|
93
|
+
number: 1,
|
|
94
|
+
title: "Replayed incident from bdk pagerduty replay",
|
|
95
|
+
status: STATUS_BY_EVENT[input.eventType],
|
|
96
|
+
urgency: "high",
|
|
97
|
+
incident_key: `replay-${incidentId}`,
|
|
98
|
+
html_url: incidentUrl,
|
|
99
|
+
created_at: new Date().toISOString(),
|
|
100
|
+
service: SERVICE,
|
|
101
|
+
assignees: [RESPONDER],
|
|
102
|
+
teams: [],
|
|
103
|
+
};
|
|
104
|
+
return {
|
|
105
|
+
event: {
|
|
106
|
+
id: randomUUID(),
|
|
107
|
+
event_type: input.eventType,
|
|
108
|
+
resource_type: "incident",
|
|
109
|
+
occurred_at: new Date().toISOString(),
|
|
110
|
+
agent: input.eventType === "incident.triggered" ? null : RESPONDER,
|
|
111
|
+
client: { name: "bdk pagerduty replay" },
|
|
112
|
+
data,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a PagerDuty setting turns into a value. An omitted setting reads its
|
|
3
|
+
* well-known env var / deployment secret, which on Cursor hosting is the
|
|
4
|
+
* addressed installation's own secret of that name. An authored
|
|
5
|
+
* `{ secretName }` reads that secret instead and never falls back.
|
|
6
|
+
*/
|
|
7
|
+
import { type WebhookSecretValue } from "../../internal/named-webhook-secret.js";
|
|
8
|
+
/**
|
|
9
|
+
* The secret name a setting reads: the authored `{ secretName }`, the
|
|
10
|
+
* default name when the setting is omitted, or `undefined` for a literal
|
|
11
|
+
* or getter authored in code.
|
|
12
|
+
*/
|
|
13
|
+
export declare function pagerDutySecretName(value: WebhookSecretValue | undefined, defaultName: string): string | undefined;
|
|
14
|
+
/** The setting's value, read now; blank counts as unset. */
|
|
15
|
+
export declare function resolvePagerDutySecret(value: WebhookSecretValue | undefined, defaultName: string): string | undefined;
|
|
16
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/secrets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,wCAAwC,CAAC;AAGhD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,kBAAkB,GAAG,SAAS,EACrC,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAKpB;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,kBAAkB,GAAG,SAAS,EACrC,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,SAAS,CAEpB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a PagerDuty setting turns into a value. An omitted setting reads its
|
|
3
|
+
* well-known env var / deployment secret, which on Cursor hosting is the
|
|
4
|
+
* addressed installation's own secret of that name. An authored
|
|
5
|
+
* `{ secretName }` reads that secret instead and never falls back.
|
|
6
|
+
*/
|
|
7
|
+
import { resolveWebhookSecretValue, } from "../../internal/named-webhook-secret.js";
|
|
8
|
+
import { isSecretRef } from "../../types.js";
|
|
9
|
+
/**
|
|
10
|
+
* The secret name a setting reads: the authored `{ secretName }`, the
|
|
11
|
+
* default name when the setting is omitted, or `undefined` for a literal
|
|
12
|
+
* or getter authored in code.
|
|
13
|
+
*/
|
|
14
|
+
export function pagerDutySecretName(value, defaultName) {
|
|
15
|
+
if (value === undefined) {
|
|
16
|
+
return defaultName;
|
|
17
|
+
}
|
|
18
|
+
return isSecretRef(value) ? value.secretName : undefined;
|
|
19
|
+
}
|
|
20
|
+
/** The setting's value, read now; blank counts as unset. */
|
|
21
|
+
export function resolvePagerDutySecret(value, defaultName) {
|
|
22
|
+
return resolveWebhookSecretValue(value ?? { secretName: defaultName });
|
|
23
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The PagerDuty user the agent acts as, for skipping its own echoed
|
|
3
|
+
* actions. Precedence: the authored `selfUserIds`, then the
|
|
4
|
+
* `PAGERDUTY_USER_ID` env var / deployment secret, then inference from the
|
|
5
|
+
* deployment's `PAGERDUTY_TOKEN`.
|
|
6
|
+
*
|
|
7
|
+
* Inference asks `GET /users/me`, which PagerDuty serves only to a
|
|
8
|
+
* user-level REST API key or an OAuth user token. An account-level REST
|
|
9
|
+
* API key or an OAuth app token has no user of its own; with
|
|
10
|
+
* `PAGERDUTY_FROM_EMAIL` set, the user whose email matches it exactly (the
|
|
11
|
+
* `From` user those tokens write as) is used instead. Results are cached
|
|
12
|
+
* in memory per credential set, never in agent storage.
|
|
13
|
+
*/
|
|
14
|
+
import { type PagerDutyClientOptions } from "./api.js";
|
|
15
|
+
import type { PagerDutyChannelOptions } from "./types.js";
|
|
16
|
+
/** Env var / deployment secret naming the agent's own PagerDuty user id. */
|
|
17
|
+
export declare const PAGERDUTY_USER_ID_ENV = "PAGERDUTY_USER_ID";
|
|
18
|
+
export interface PagerDutySelfUserDeps {
|
|
19
|
+
fetch?: typeof fetch;
|
|
20
|
+
now?: () => number;
|
|
21
|
+
warn?: (line: string) => void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The secret the agent's user id is read from: a named `selfUserIds`, else
|
|
25
|
+
* `PAGERDUTY_USER_ID`. `undefined` when the ids are authored in code.
|
|
26
|
+
*/
|
|
27
|
+
export declare function pagerDutySelfUserIdSecretName(options: Pick<PagerDutyChannelOptions, "selfUserIds">): string | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* The user ids the agent acts as, resolved per delivery. Authored ids, a
|
|
30
|
+
* getter, or a named secret are used as given and never fall back. With
|
|
31
|
+
* nothing authored, `PAGERDUTY_USER_ID` (one id) wins, else the id inferred
|
|
32
|
+
* from the channel's token (`PAGERDUTY_TOKEN` unless `token` is set).
|
|
33
|
+
* Empty when none resolves, which turns echo skip off.
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolvePagerDutySelfUserIds(input: {
|
|
36
|
+
options: Pick<PagerDutyChannelOptions, "selfUserIds" | "token" | "from" | "apiBaseUrl">;
|
|
37
|
+
deps?: PagerDutySelfUserDeps;
|
|
38
|
+
}): Promise<ReadonlySet<string>>;
|
|
39
|
+
/**
|
|
40
|
+
* The user the channel's token acts as (`token`, else `PAGERDUTY_TOKEN`),
|
|
41
|
+
* cached for an hour per base URL, token, and `From` email (an unresolved
|
|
42
|
+
* answer for five minutes). `undefined` without a token or when PagerDuty
|
|
43
|
+
* names no single user.
|
|
44
|
+
*/
|
|
45
|
+
export declare function inferPagerDutySelfUserId(input?: {
|
|
46
|
+
credentials?: Pick<PagerDutyClientOptions, "token" | "from" | "apiBaseUrl">;
|
|
47
|
+
deps?: PagerDutySelfUserDeps;
|
|
48
|
+
}): Promise<string | undefined>;
|
|
49
|
+
/** Forget every inferred user, so the next delivery asks PagerDuty again. */
|
|
50
|
+
export declare function clearPagerDutySelfUserCache(): void;
|
|
51
|
+
//# sourceMappingURL=self-user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-user.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/self-user.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAKL,KAAK,sBAAsB,EAC5B,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAWzD,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,aAAa,CAAC,GACpD,MAAM,GAAG,SAAS,CAKpB;AAED;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE;IACvD,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC;IACxF,IAAI,CAAC,EAAE,qBAAqB,CAAC;CAC9B,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAiB/B;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,GAAE;IACL,WAAW,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC;IAC5E,IAAI,CAAC,EAAE,qBAAqB,CAAC;CACzB,GACL,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAiD7B;AAED,6EAA6E;AAC7E,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The PagerDuty user the agent acts as, for skipping its own echoed
|
|
3
|
+
* actions. Precedence: the authored `selfUserIds`, then the
|
|
4
|
+
* `PAGERDUTY_USER_ID` env var / deployment secret, then inference from the
|
|
5
|
+
* deployment's `PAGERDUTY_TOKEN`.
|
|
6
|
+
*
|
|
7
|
+
* Inference asks `GET /users/me`, which PagerDuty serves only to a
|
|
8
|
+
* user-level REST API key or an OAuth user token. An account-level REST
|
|
9
|
+
* API key or an OAuth app token has no user of its own; with
|
|
10
|
+
* `PAGERDUTY_FROM_EMAIL` set, the user whose email matches it exactly (the
|
|
11
|
+
* `From` user those tokens write as) is used instead. Results are cached
|
|
12
|
+
* in memory per credential set, never in agent storage.
|
|
13
|
+
*/
|
|
14
|
+
import { createHash } from "node:crypto";
|
|
15
|
+
import { isSecretRef } from "../../types.js";
|
|
16
|
+
import { PAGERDUTY_FROM_EMAIL_ENV, PAGERDUTY_TOKEN_ENV, pagerDutyApiBaseUrl, pagerDutyAuthorizationHeader, } from "./api.js";
|
|
17
|
+
import { resolvePagerDutySecret } from "./secrets.js";
|
|
18
|
+
/** Env var / deployment secret naming the agent's own PagerDuty user id. */
|
|
19
|
+
export const PAGERDUTY_USER_ID_ENV = "PAGERDUTY_USER_ID";
|
|
20
|
+
const RESOLVED_TTL_MS = 60 * 60 * 1000;
|
|
21
|
+
const UNRESOLVED_TTL_MS = 5 * 60 * 1000;
|
|
22
|
+
const LOOKUP_TIMEOUT_MS = 5_000;
|
|
23
|
+
const MAX_CACHED_CREDENTIALS = 256;
|
|
24
|
+
const inferredSelfUsers = new Map();
|
|
25
|
+
/**
|
|
26
|
+
* The secret the agent's user id is read from: a named `selfUserIds`, else
|
|
27
|
+
* `PAGERDUTY_USER_ID`. `undefined` when the ids are authored in code.
|
|
28
|
+
*/
|
|
29
|
+
export function pagerDutySelfUserIdSecretName(options) {
|
|
30
|
+
if (options.selfUserIds === undefined) {
|
|
31
|
+
return PAGERDUTY_USER_ID_ENV;
|
|
32
|
+
}
|
|
33
|
+
return isSecretRef(options.selfUserIds) ? options.selfUserIds.secretName : undefined;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The user ids the agent acts as, resolved per delivery. Authored ids, a
|
|
37
|
+
* getter, or a named secret are used as given and never fall back. With
|
|
38
|
+
* nothing authored, `PAGERDUTY_USER_ID` (one id) wins, else the id inferred
|
|
39
|
+
* from the channel's token (`PAGERDUTY_TOKEN` unless `token` is set).
|
|
40
|
+
* Empty when none resolves, which turns echo skip off.
|
|
41
|
+
*/
|
|
42
|
+
export async function resolvePagerDutySelfUserIds(input) {
|
|
43
|
+
const options = input.options;
|
|
44
|
+
const selfUserIds = options.selfUserIds;
|
|
45
|
+
if (selfUserIds !== undefined) {
|
|
46
|
+
const ids = isSecretRef(selfUserIds)
|
|
47
|
+
? [resolvePagerDutySecret(selfUserIds, selfUserIds.secretName) ?? ""]
|
|
48
|
+
: typeof selfUserIds === "function"
|
|
49
|
+
? (selfUserIds() ?? [])
|
|
50
|
+
: selfUserIds;
|
|
51
|
+
return new Set(ids.map((id) => id.trim()).filter(Boolean));
|
|
52
|
+
}
|
|
53
|
+
const configured = resolvePagerDutySecret(undefined, PAGERDUTY_USER_ID_ENV);
|
|
54
|
+
if (configured !== undefined) {
|
|
55
|
+
return new Set([configured]);
|
|
56
|
+
}
|
|
57
|
+
const inferred = await inferPagerDutySelfUserId({ credentials: options, deps: input.deps });
|
|
58
|
+
return new Set(inferred === undefined ? [] : [inferred]);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The user the channel's token acts as (`token`, else `PAGERDUTY_TOKEN`),
|
|
62
|
+
* cached for an hour per base URL, token, and `From` email (an unresolved
|
|
63
|
+
* answer for five minutes). `undefined` without a token or when PagerDuty
|
|
64
|
+
* names no single user.
|
|
65
|
+
*/
|
|
66
|
+
export async function inferPagerDutySelfUserId(input = {}) {
|
|
67
|
+
const credentials = input.credentials ?? {};
|
|
68
|
+
const deps = input.deps ?? {};
|
|
69
|
+
const token = resolvePagerDutySecret(credentials.token, PAGERDUTY_TOKEN_ENV);
|
|
70
|
+
if (token === undefined) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
const from = resolvePagerDutySecret(credentials.from, PAGERDUTY_FROM_EMAIL_ENV);
|
|
74
|
+
const baseUrl = pagerDutyApiBaseUrl(credentials.apiBaseUrl);
|
|
75
|
+
const key = createHash("sha256")
|
|
76
|
+
.update(`${baseUrl}\n${token}\n${from ?? ""}`)
|
|
77
|
+
.digest("hex");
|
|
78
|
+
const now = deps.now ?? Date.now;
|
|
79
|
+
const cached = inferredSelfUsers.get(key);
|
|
80
|
+
if (cached !== undefined && cached.expiresAt > now()) {
|
|
81
|
+
return cached.userId;
|
|
82
|
+
}
|
|
83
|
+
const entry = {
|
|
84
|
+
expiresAt: now() + UNRESOLVED_TTL_MS,
|
|
85
|
+
userId: lookUpSelfUser({ baseUrl, token, from, fetch: deps.fetch ?? fetch }).then((userId) => {
|
|
86
|
+
if (userId === undefined) {
|
|
87
|
+
(deps.warn ?? console.warn)(`[bdk/pagerduty] warn ${PAGERDUTY_TOKEN_ENV} names no single PagerDuty user (an account-level key or app token needs ${PAGERDUTY_FROM_EMAIL_ENV} set to one user's email); set ${PAGERDUTY_USER_ID_ENV} to skip the agent's own actions`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
entry.expiresAt = now() + RESOLVED_TTL_MS;
|
|
91
|
+
}
|
|
92
|
+
return userId;
|
|
93
|
+
}, (error) => {
|
|
94
|
+
(deps.warn ?? console.warn)(`[bdk/pagerduty] warn could not look up the agent's PagerDuty user; echo skip is off until it resolves: ${error instanceof Error ? error.message : String(error)}`);
|
|
95
|
+
return undefined;
|
|
96
|
+
}),
|
|
97
|
+
};
|
|
98
|
+
inferredSelfUsers.delete(key);
|
|
99
|
+
inferredSelfUsers.set(key, entry);
|
|
100
|
+
while (inferredSelfUsers.size > MAX_CACHED_CREDENTIALS) {
|
|
101
|
+
const oldest = inferredSelfUsers.keys().next().value;
|
|
102
|
+
if (oldest === undefined) {
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
inferredSelfUsers.delete(oldest);
|
|
106
|
+
}
|
|
107
|
+
return entry.userId;
|
|
108
|
+
}
|
|
109
|
+
/** Forget every inferred user, so the next delivery asks PagerDuty again. */
|
|
110
|
+
export function clearPagerDutySelfUserCache() {
|
|
111
|
+
inferredSelfUsers.clear();
|
|
112
|
+
}
|
|
113
|
+
async function lookUpSelfUser(input) {
|
|
114
|
+
const get = async (path) => input.fetch(`${input.baseUrl}${path}`, {
|
|
115
|
+
method: "GET",
|
|
116
|
+
headers: {
|
|
117
|
+
Accept: "application/vnd.pagerduty+json;version=2",
|
|
118
|
+
Authorization: pagerDutyAuthorizationHeader(input.token),
|
|
119
|
+
},
|
|
120
|
+
signal: AbortSignal.timeout(LOOKUP_TIMEOUT_MS),
|
|
121
|
+
});
|
|
122
|
+
const me = await get("/users/me");
|
|
123
|
+
if (me.ok) {
|
|
124
|
+
const id = userIdOf((await me.json()).user);
|
|
125
|
+
if (id !== undefined) {
|
|
126
|
+
return id;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
await me.body?.cancel();
|
|
131
|
+
if (me.status === 401 || me.status >= 500) {
|
|
132
|
+
throw new Error(`GET /users/me answered ${me.status}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (input.from === undefined) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
const email = input.from.toLowerCase();
|
|
139
|
+
const found = await get(`/users?query=${encodeURIComponent(input.from)}&limit=100`);
|
|
140
|
+
if (!found.ok) {
|
|
141
|
+
await found.body?.cancel();
|
|
142
|
+
throw new Error(`GET /users?query= answered ${found.status}`);
|
|
143
|
+
}
|
|
144
|
+
const users = (await found.json()).users;
|
|
145
|
+
const matches = (Array.isArray(users) ? users : []).filter((user) => typeof user === "object" &&
|
|
146
|
+
user !== null &&
|
|
147
|
+
typeof user.email === "string" &&
|
|
148
|
+
user.email.toLowerCase() === email);
|
|
149
|
+
return matches.length === 1 ? userIdOf(matches[0]) : undefined;
|
|
150
|
+
}
|
|
151
|
+
function userIdOf(user) {
|
|
152
|
+
if (typeof user !== "object" || user === null) {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
const id = user.id;
|
|
156
|
+
return typeof id === "string" && id.trim() !== "" ? id.trim() : undefined;
|
|
157
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable per-session PagerDuty channel state, persisted with the turn so
|
|
3
|
+
* stream-event handlers can address the incident without re-parsing the
|
|
4
|
+
* webhook.
|
|
5
|
+
*/
|
|
6
|
+
export interface PagerDutyChannelState {
|
|
7
|
+
/** Incident the latest dispatched event named. */
|
|
8
|
+
incidentId: string | null;
|
|
9
|
+
incidentNumber: number | null;
|
|
10
|
+
/** That incident's dedup key, when the event carried one. */
|
|
11
|
+
incidentKey: string | null;
|
|
12
|
+
serviceId: string | null;
|
|
13
|
+
/** v3 `event_type` that woke the turn. */
|
|
14
|
+
eventType: string | null;
|
|
15
|
+
/** v3 `event.id` that woke the turn. */
|
|
16
|
+
eventId: string | null;
|
|
17
|
+
deliveryId: string | null;
|
|
18
|
+
occurredAt: string | null;
|
|
19
|
+
}
|
|
20
|
+
export declare function emptyPagerDutyChannelState(overrides?: Partial<PagerDutyChannelState>): PagerDutyChannelState;
|
|
21
|
+
export declare function pagerDutyChannelStateForEvent(input: {
|
|
22
|
+
eventType: string;
|
|
23
|
+
eventId: string;
|
|
24
|
+
incidentId?: string;
|
|
25
|
+
incidentNumber?: number;
|
|
26
|
+
incidentKey?: string;
|
|
27
|
+
serviceId?: string;
|
|
28
|
+
deliveryId?: string;
|
|
29
|
+
occurredAt?: string;
|
|
30
|
+
}): PagerDutyChannelState;
|
|
31
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/channels/pagerduty/state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,6DAA6D;IAC7D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,wCAAwC;IACxC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,qBAAqB,CAAM,GAC7C,qBAAqB,CAYvB;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,qBAAqB,CAWxB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable per-session PagerDuty channel state, persisted with the turn so
|
|
3
|
+
* stream-event handlers can address the incident without re-parsing the
|
|
4
|
+
* webhook.
|
|
5
|
+
*/
|
|
6
|
+
export function emptyPagerDutyChannelState(overrides = {}) {
|
|
7
|
+
return {
|
|
8
|
+
incidentId: null,
|
|
9
|
+
incidentNumber: null,
|
|
10
|
+
incidentKey: null,
|
|
11
|
+
serviceId: null,
|
|
12
|
+
eventType: null,
|
|
13
|
+
eventId: null,
|
|
14
|
+
deliveryId: null,
|
|
15
|
+
occurredAt: null,
|
|
16
|
+
...overrides,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function pagerDutyChannelStateForEvent(input) {
|
|
20
|
+
return emptyPagerDutyChannelState({
|
|
21
|
+
incidentId: input.incidentId ?? null,
|
|
22
|
+
incidentNumber: input.incidentNumber ?? null,
|
|
23
|
+
incidentKey: input.incidentKey ?? null,
|
|
24
|
+
serviceId: input.serviceId ?? null,
|
|
25
|
+
eventType: input.eventType,
|
|
26
|
+
eventId: input.eventId,
|
|
27
|
+
deliveryId: input.deliveryId ?? null,
|
|
28
|
+
occurredAt: input.occurredAt ?? null,
|
|
29
|
+
});
|
|
30
|
+
}
|