@cursor/bdk 0.2.3 → 0.2.4
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/dist/bin/agent-serve.js +9 -1
- package/dist/channels/slack/attachments.d.ts +2 -1
- package/dist/channels/slack/attachments.d.ts.map +1 -1
- package/dist/channels/slack/attachments.js +19 -9
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +26 -24
- package/dist/channels/slack/thread-context.d.ts +21 -11
- package/dist/channels/slack/thread-context.d.ts.map +1 -1
- package/dist/channels/slack/thread-context.js +75 -27
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.BOIHhrKi.js → app.4kQ8Db_q.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.CvuAJ0My.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.D49zVZqM.js → VPLocalSearchBox.DY1RwB8Q.js} +1 -1
- package/dist/docs/assets/chunks/{arc.hmjb-sc4.js → arc.CxE_fSPK.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CxEI1KqM.js → architectureDiagram-Q4EWVU46.CPX426ui.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.DHHvBWoV.js → baseUniq.CB52JrKG.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DnXW-3bu.js → blockDiagram-DXYQGD6D.J0cNaQCL.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.e-47O2jM.js → c4Diagram-AHTNJAMY.DJn3vEGT.js} +1 -1
- package/dist/docs/assets/chunks/channel.BoNycAoN.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.3ry4pYXB.js → chunk-4BX2VUAB.Dao618F6.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DGIZFRx6.js → chunk-4TB4RGXK.QW8Rhjai.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.DKBnqg9U.js → chunk-55IACEB6.DfRLLKF_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BIU8Ue5k.js → chunk-EDXVE4YY.CIV2ApKQ.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DP-TFhjI.js → chunk-FMBD7UC4.BEheSuxp.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Ux0OYj5v.js → chunk-OYMX7WX6.CUN88ENB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BzHMwYox.js → chunk-QZHKN3VN.CgqCs8b_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.D4OGAsSP.js → chunk-YZCP3GAM.iCH0nnTJ.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/clone.Db22cH_-.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Jq_7BUNx.js → cose-bilkent-S5V4N54A.BLcUxhWE.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.Di-skR2x.js → dagre-KV5264BT.Ep7LofOm.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DeREHIdH.js → diagram-5BDNPKRD.Bzf4GSQ4.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.C7Kcqxro.js → diagram-G4DWMVQ6.DD6Jh-eM.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BK3eohyo.js → diagram-MMDJMWI5.oOIl8bWd.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.C6TyymXT.js → diagram-TYMM5635.DHs85Ade.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DYGG-gGx.js → erDiagram-SMLLAGMA.BIb5ghCk.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.C9nBcSV4.js → flowDiagram-DWJPFMVM.DV4paY9k.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.wAg_ymsp.js → ganttDiagram-T4ZO3ILL.AyEKA6_v.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.B87j9Oeg.js → gitGraphDiagram-UUTBAWPF.BltiCDFo.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CuFMj31w.js → graph.DzuEYGdC.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.P_mLGumP.js → infoDiagram-42DDH7IO.BV2l981J.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DyuL_MsT.js → ishikawaDiagram-UXIWVN3A.BA4Izf-m.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CtP09IoJ.js → journeyDiagram-VCZTEJTY.DjaFbFS3.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BoeSYPZo.js → kanban-definition-6JOO6SKY.CfTFieDs.js} +1 -1
- package/dist/docs/assets/chunks/{layout.B0lMMtNo.js → layout.DzfWqTBV.js} +1 -1
- package/dist/docs/assets/chunks/{linear.HxRBiAFX.js → linear.BO6mpulV.js} +1 -1
- package/dist/docs/assets/chunks/{min.BGlFFHwS.js → min.BGgTadgT.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.JyLBD9M8.js → mindmap-definition-QFDTVHPH.DPuIXVWY.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DnSmNZF8.js → pieDiagram-DEJITSTG.BOnl3bBg.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CUCnbfCa.js → quadrantDiagram-34T5L4WZ.DNB6Ckdc.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.py0IVUn5.js → requirementDiagram-MS252O5E.D5-Qo7vb.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.Bkc-HWYp.js → sankeyDiagram-XADWPNL6.8t65cesf.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Dqn8Mlv2.js → sequenceDiagram-FGHM5R23.CaG07BdS.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.JikkoQUU.js → stateDiagram-FHFEXIEX.TKOweTB6.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CuqmyQc4.js +1 -0
- package/dist/docs/assets/chunks/{theme.b6HQ6zG_.js → theme.Dx-JhpTB.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BvpSXiBj.js → timeline-definition-GMOUNBTQ.fE53zQ2s.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CU7MVnZx.js → vennDiagram-DHZGUBPP.DJsZZaJg.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.BKwC4ctG.js → wardley-RL74JXVD.844kyrjl.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.BfaF6Uhe.js → wardleyDiagram-NUSXRM2D.CMZ-Ru_t.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.Bg5dcpj4.js → xychartDiagram-5P7HB3ND.XXrhBc7a.js} +1 -1
- package/dist/docs/assets/{deployment.md.BJ8i7Q6p.js → deployment.md.UhnJIMr-.js} +2 -2
- package/dist/docs/assets/{deployment.md.BJ8i7Q6p.lean.js → deployment.md.UhnJIMr-.lean.js} +1 -1
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.js → guides_jev.md.CRcgmjDb.js} +2 -2
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.lean.js → guides_jev.md.CRcgmjDb.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.DzGI777n.js → reference_agent-config.md.Cj5uBKp4.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.js → reference_extensions.md.pa2tN-e4.js} +4 -3
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.lean.js → reference_extensions.md.pa2tN-e4.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +37 -37
- package/dist/docs/deployment.md +4 -1
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +35 -35
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.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 +37 -37
- package/dist/docs/guides/jev.md +7 -0
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/opentelemetry.html +35 -35
- 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 +25 -2
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +37 -37
- package/dist/docs/reference/agent-config.md +1 -1
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +35 -35
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +39 -38
- package/dist/docs/reference/extensions.md +13 -0
- 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/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 +35 -35
- package/dist/docs/templates/agentic-owners.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/extensions/jev/extension.d.ts +3 -0
- package/dist/extensions/jev/extension.d.ts.map +1 -1
- package/dist/extensions/jev/extension.js +10 -1
- package/dist/extensions/jev/lib/evaluate.d.ts +4 -0
- package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -1
- package/dist/extensions/jev/lib/evaluate.js +6 -2
- package/dist/extensions.d.ts +4 -2
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +5 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +19 -5
- package/dist/internal/discovery/agent-config.d.ts +6 -5
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +29 -28
- package/dist/internal/discovery/agent.js +1 -1
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +12 -0
- package/dist/internal/hosting.d.ts +8 -0
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +24 -0
- package/dist/types.d.ts +18 -2
- package/dist/types.d.ts.map +1 -1
- package/docs/deployment.md +4 -1
- package/docs/guides/jev.md +7 -0
- package/docs/reference/agent-config.md +1 -1
- package/docs/reference/extensions.md +13 -0
- package/package.json +1 -9
- package/dist/docs/assets/chunks/@localSearchIndexroot.D5L-b34G.js +0 -1
- package/dist/docs/assets/chunks/channel.BbOGaJQP.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Db58HCb1.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Db58HCb1.js +0 -1
- package/dist/docs/assets/chunks/clone.Co4MBflG.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CMsKhrW0.js +0 -1
- package/src/artifacts.ts +0 -68
- package/src/bin/agent-serve.ts +0 -1854
- package/src/channels/bitbucket/api.ts +0 -891
- package/src/channels/bitbucket/binding.ts +0 -417
- package/src/channels/bitbucket/bitbucket-channel.ts +0 -162
- package/src/channels/bitbucket/bitbucket-webhook.ts +0 -519
- package/src/channels/bitbucket/checks.ts +0 -146
- package/src/channels/bitbucket/cursor-account.ts +0 -106
- package/src/channels/bitbucket/defaults.ts +0 -100
- package/src/channels/bitbucket/events.ts +0 -74
- package/src/channels/bitbucket/index.ts +0 -51
- package/src/channels/bitbucket/replay.ts +0 -421
- package/src/channels/bitbucket/state.ts +0 -59
- package/src/channels/bitbucket/types.ts +0 -261
- package/src/channels/change-monitors/change-monitors-channel.ts +0 -63
- package/src/channels/change-monitors/index.ts +0 -8
- package/src/channels/change-monitors/types.ts +0 -42
- package/src/channels/checks.ts +0 -185
- package/src/channels/deployments/deployments-channel.ts +0 -224
- package/src/channels/deployments/index.ts +0 -25
- package/src/channels/deployments/types.ts +0 -92
- package/src/channels/github/api.ts +0 -526
- package/src/channels/github/auth.ts +0 -293
- package/src/channels/github/binding.ts +0 -233
- package/src/channels/github/checks.ts +0 -145
- package/src/channels/github/cursor-account.ts +0 -303
- package/src/channels/github/defaults.ts +0 -168
- package/src/channels/github/events.ts +0 -67
- package/src/channels/github/forward.ts +0 -359
- package/src/channels/github/github-channel.ts +0 -2334
- package/src/channels/github/index.ts +0 -54
- package/src/channels/github/progress.ts +0 -365
- package/src/channels/github/replay.ts +0 -372
- package/src/channels/github/state.ts +0 -124
- package/src/channels/github/types.ts +0 -590
- package/src/channels/gitlab/api.ts +0 -329
- package/src/channels/gitlab/binding.ts +0 -231
- package/src/channels/gitlab/checks.ts +0 -228
- package/src/channels/gitlab/cursor-account.ts +0 -105
- package/src/channels/gitlab/defaults.ts +0 -80
- package/src/channels/gitlab/events.ts +0 -37
- package/src/channels/gitlab/gitlab-channel.ts +0 -160
- package/src/channels/gitlab/gitlab-webhook.ts +0 -509
- package/src/channels/gitlab/index.ts +0 -44
- package/src/channels/gitlab/replay.ts +0 -328
- package/src/channels/gitlab/state.ts +0 -55
- package/src/channels/gitlab/types.ts +0 -247
- package/src/channels/issues/index.ts +0 -9
- package/src/channels/issues/issues-channel.ts +0 -45
- package/src/channels/issues/types.ts +0 -38
- package/src/channels/origin/api.ts +0 -507
- package/src/channels/origin/binding.ts +0 -114
- package/src/channels/origin/checks.ts +0 -250
- package/src/channels/origin/cursor-account.ts +0 -58
- package/src/channels/origin/defaults.ts +0 -140
- package/src/channels/origin/events.ts +0 -35
- package/src/channels/origin/index.ts +0 -35
- package/src/channels/origin/origin-channel.ts +0 -815
- package/src/channels/origin/origin-webhook.ts +0 -296
- package/src/channels/origin/reactions.ts +0 -72
- package/src/channels/origin/state.ts +0 -54
- package/src/channels/origin/types.ts +0 -295
- package/src/channels/slack/agentic-delivery.ts +0 -634
- package/src/channels/slack/agentic-posted.ts +0 -135
- package/src/channels/slack/agentic-signals.ts +0 -231
- package/src/channels/slack/api.ts +0 -761
- package/src/channels/slack/approvals.ts +0 -279
- package/src/channels/slack/assistant.ts +0 -76
- package/src/channels/slack/attachments.ts +0 -596
- package/src/channels/slack/auth.ts +0 -127
- package/src/channels/slack/blocks.ts +0 -131
- package/src/channels/slack/bot-mentions.ts +0 -318
- package/src/channels/slack/channel-watch.ts +0 -314
- package/src/channels/slack/cli-project.ts +0 -249
- package/src/channels/slack/code-fences.ts +0 -171
- package/src/channels/slack/constants.ts +0 -38
- package/src/channels/slack/credentials.ts +0 -88
- package/src/channels/slack/defaults.ts +0 -714
- package/src/channels/slack/dispatch.ts +0 -1060
- package/src/channels/slack/doctor.ts +0 -338
- package/src/channels/slack/eval-directive.ts +0 -306
- package/src/channels/slack/event-id-dedupe.ts +0 -30
- package/src/channels/slack/external-policy.ts +0 -75
- package/src/channels/slack/footer.ts +0 -106
- package/src/channels/slack/inbound.ts +0 -416
- package/src/channels/slack/index.ts +0 -53
- package/src/channels/slack/init.ts +0 -169
- package/src/channels/slack/interactive.ts +0 -406
- package/src/channels/slack/links.ts +0 -23
- package/src/channels/slack/live-delivery.ts +0 -489
- package/src/channels/slack/log.ts +0 -70
- package/src/channels/slack/manifest.ts +0 -240
- package/src/channels/slack/message-body.ts +0 -82
- package/src/channels/slack/nudge-carrier.ts +0 -224
- package/src/channels/slack/nudge-store.ts +0 -334
- package/src/channels/slack/paint-start.ts +0 -93
- package/src/channels/slack/placeholder.ts +0 -358
- package/src/channels/slack/pr-ref.ts +0 -74
- package/src/channels/slack/progress-delivery.ts +0 -138
- package/src/channels/slack/reasoning-card.ts +0 -125
- package/src/channels/slack/reasoning-chip.ts +0 -41
- package/src/channels/slack/recording-sink.ts +0 -167
- package/src/channels/slack/redact.ts +0 -6
- package/src/channels/slack/reply-options.ts +0 -279
- package/src/channels/slack/setup.ts +0 -125
- package/src/channels/slack/slack-channel.ts +0 -744
- package/src/channels/slack/socket-mode.ts +0 -140
- package/src/channels/slack/stop.ts +0 -25
- package/src/channels/slack/stream.ts +0 -66
- package/src/channels/slack/thread-context.ts +0 -485
- package/src/channels/slack/tool-approval-events.ts +0 -233
- package/src/channels/slack/tool-cards.ts +0 -198
- package/src/channels/slack/tool-chip.ts +0 -34
- package/src/channels/slack/types.ts +0 -787
- package/src/channels/slack/upload.ts +0 -137
- package/src/channels.ts +0 -543
- package/src/connections.ts +0 -153
- package/src/dashboard-session-url.ts +0 -30
- package/src/evals/assertions.ts +0 -688
- package/src/evals/expect.ts +0 -250
- package/src/evals/judge.ts +0 -329
- package/src/evals/loaders.ts +0 -111
- package/src/evals/matchers.ts +0 -223
- package/src/evals/reporters.ts +0 -257
- package/src/evals/results.ts +0 -130
- package/src/evals/run-facts.ts +0 -306
- package/src/evals.ts +0 -709
- package/src/extensions/cursor-cloud-agents/extension.ts +0 -131
- package/src/extensions/cursor-cloud-agents/lib/backend.ts +0 -386
- package/src/extensions/cursor-cloud-agents/lib/channels.ts +0 -11
- package/src/extensions/cursor-cloud-agents/lib/fleet.ts +0 -98
- package/src/extensions/cursor-cloud-agents/lib/inputs.ts +0 -5
- package/src/extensions/cursor-cloud-agents/lib/repos.ts +0 -80
- package/src/extensions/cursor-cloud-agents/lib/transcript.ts +0 -19
- package/src/extensions/cursor-cloud-agents/skills/handoff.md +0 -37
- package/src/extensions/cursor-cloud-agents/tools/cancel.ts +0 -21
- package/src/extensions/cursor-cloud-agents/tools/dump.ts +0 -47
- package/src/extensions/cursor-cloud-agents/tools/get.ts +0 -18
- package/src/extensions/cursor-cloud-agents/tools/launch.ts +0 -62
- package/src/extensions/cursor-cloud-agents/tools/list.ts +0 -31
- package/src/extensions/cursor-cloud-agents/tools/reply.ts +0 -36
- package/src/extensions/cursor-grokbot-agents/extension.ts +0 -132
- package/src/extensions/cursor-grokbot-agents/lib/agents.ts +0 -42
- package/src/extensions/cursor-grokbot-agents/lib/backend.ts +0 -208
- package/src/extensions/cursor-grokbot-agents/lib/contacts.ts +0 -74
- package/src/extensions/cursor-grokbot-agents/lib/conversation.ts +0 -260
- package/src/extensions/cursor-grokbot-agents/lib/inputs.ts +0 -21
- package/src/extensions/cursor-grokbot-agents/lib/lock.ts +0 -26
- package/src/extensions/cursor-grokbot-agents/skills/consult.md +0 -40
- package/src/extensions/cursor-grokbot-agents/tools/ask.ts +0 -32
- package/src/extensions/cursor-grokbot-agents/tools/check.ts +0 -25
- package/src/extensions/cursor-grokbot-agents/tools/interrupt.ts +0 -17
- package/src/extensions/cursor-grokbot-agents/tools/list.ts +0 -26
- package/src/extensions/improve/extension.ts +0 -69
- package/src/extensions/improve/skills/yourself.ts +0 -50
- package/src/extensions/jev/extension.ts +0 -95
- package/src/extensions/jev/lib/evaluate.ts +0 -266
- package/src/extensions/jev/skills/gated-write.md +0 -25
- package/src/extensions/jev/skills/questions.md +0 -33
- package/src/extensions/jev/tools/evaluate.ts +0 -82
- package/src/extensions/slack-communication/evals/harness.ts +0 -705
- package/src/extensions/slack-communication/evals/slack-communication.eval.ts +0 -830
- package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +0 -172
- package/src/extensions/slack-communication/extension.ts +0 -44
- package/src/extensions/slack-communication/skills/slack-voice.ts +0 -56
- package/src/extensions/slack-communication/tools/delete-message.ts +0 -33
- package/src/extensions/slack-communication/tools/edit-message.ts +0 -42
- package/src/extensions/slack-communication/tools/post-card.ts +0 -28
- package/src/extensions/slack-communication/tools/post-file.ts +0 -82
- package/src/extensions/slack-communication/tools/post-update.ts +0 -40
- package/src/extensions/slack-communication/tools/react.ts +0 -30
- package/src/extensions/slack-communication/tools/set-status.ts +0 -21
- package/src/extensions.ts +0 -179
- package/src/files-backends/agent-store-presigned-url.ts +0 -11
- package/src/files-backends/cursor-hosted.ts +0 -1212
- package/src/files-backends/local-fs.ts +0 -163
- package/src/files.ts +0 -293
- package/src/filesystem.ts +0 -2005
- package/src/hooks.ts +0 -30
- package/src/index.ts +0 -259
- package/src/internal/advertise-tools.ts +0 -370
- package/src/internal/approval-gate.ts +0 -103
- package/src/internal/artifacts-store.ts +0 -836
- package/src/internal/as-of.ts +0 -257
- package/src/internal/auth.ts +0 -46
- package/src/internal/authored-alias-hooks.ts +0 -138
- package/src/internal/authored-loaders.ts +0 -188
- package/src/internal/bounded-int.ts +0 -24
- package/src/internal/bounded.ts +0 -25
- package/src/internal/brand.ts +0 -28
- package/src/internal/browser-origin-guard.ts +0 -67
- package/src/internal/builtin-tools/artifacts.ts +0 -62
- package/src/internal/builtin-tools/index.ts +0 -53
- package/src/internal/builtin-tools/reminders.ts +0 -145
- package/src/internal/channel-dispatch.ts +0 -129
- package/src/internal/channel-route-dispatch.ts +0 -58
- package/src/internal/channel-state.ts +0 -83
- package/src/internal/chat-client.ts +0 -594
- package/src/internal/cli-ax.ts +0 -2318
- package/src/internal/cli-bitbucket.ts +0 -438
- package/src/internal/cli-convert-automation.ts +0 -335
- package/src/internal/cli-cursor.ts +0 -282
- package/src/internal/cli-deploy.ts +0 -2519
- package/src/internal/cli-docs.ts +0 -192
- package/src/internal/cli-github.ts +0 -806
- package/src/internal/cli-gitlab.ts +0 -452
- package/src/internal/cli-images.ts +0 -672
- package/src/internal/cli-manifest.ts +0 -56
- package/src/internal/cli-mcp-oauth.ts +0 -396
- package/src/internal/cli-mcp.ts +0 -808
- package/src/internal/cli-skills.ts +0 -98
- package/src/internal/cli-slack-manual.ts +0 -418
- package/src/internal/cli-slack.ts +0 -874
- package/src/internal/cloud-merge.ts +0 -51
- package/src/internal/cloud-turn-cost.ts +0 -159
- package/src/internal/connection-env.ts +0 -106
- package/src/internal/continuation-channel.ts +0 -233
- package/src/internal/continuation-identity.ts +0 -935
- package/src/internal/conversation-mirror.ts +0 -423
- package/src/internal/convert-automation/convert-workflow.ts +0 -1377
- package/src/internal/convert-automation/slug.ts +0 -29
- package/src/internal/convert-automation/types.ts +0 -212
- package/src/internal/cron.ts +0 -76
- package/src/internal/cursor/account-mcp.ts +0 -692
- package/src/internal/cursor/backend-client.ts +0 -984
- package/src/internal/cursor/bound-secret-file.ts +0 -101
- package/src/internal/cursor/credentials.ts +0 -560
- package/src/internal/cursor/cursor-api-transport.ts +0 -65
- package/src/internal/cursor/github-credentials.ts +0 -228
- package/src/internal/cursor/hosted-bound-secrets.ts +0 -71
- package/src/internal/cursor/hosted-deployment-secrets.ts +0 -100
- package/src/internal/cursor/hosted-store-secrets.ts +0 -152
- package/src/internal/cursor/session-token.ts +0 -111
- package/src/internal/cursor/store-api-client.ts +0 -323
- package/src/internal/cursor-account-mcp-auth.ts +0 -303
- package/src/internal/cursor-agent-template.ts +0 -50
- package/src/internal/cursor-deployment-relay.ts +0 -315
- package/src/internal/cursor-event-relay.ts +0 -675
- package/src/internal/cursor-relay-core.ts +0 -563
- package/src/internal/deferred-channel-session.ts +0 -61
- package/src/internal/deploy-client.ts +0 -1574
- package/src/internal/deploy-manifest.ts +0 -361
- package/src/internal/deploy-source.ts +0 -144
- package/src/internal/describe-error.ts +0 -32
- package/src/internal/dev-mode.ts +0 -20
- package/src/internal/discovery/agent-config.ts +0 -288
- package/src/internal/discovery/agent.ts +0 -381
- package/src/internal/discovery/channels.ts +0 -100
- package/src/internal/discovery/connections.ts +0 -516
- package/src/internal/discovery/context.ts +0 -38
- package/src/internal/discovery/cursor-plugin.ts +0 -628
- package/src/internal/discovery/extension-overlay.ts +0 -247
- package/src/internal/discovery/extensions.ts +0 -490
- package/src/internal/discovery/fs.ts +0 -103
- package/src/internal/discovery/hooks.ts +0 -63
- package/src/internal/discovery/info.ts +0 -174
- package/src/internal/discovery/instructions.ts +0 -98
- package/src/internal/discovery/modules.ts +0 -107
- package/src/internal/discovery/names.ts +0 -45
- package/src/internal/discovery/project.ts +0 -319
- package/src/internal/discovery/reminders.ts +0 -65
- package/src/internal/discovery/runtime.ts +0 -158
- package/src/internal/discovery/schedules.ts +0 -120
- package/src/internal/discovery/seed-files.ts +0 -34
- package/src/internal/discovery/services.ts +0 -151
- package/src/internal/discovery/skills.ts +0 -174
- package/src/internal/discovery/subagent.ts +0 -138
- package/src/internal/discovery/tools.ts +0 -170
- package/src/internal/discovery.ts +0 -27
- package/src/internal/distribution.ts +0 -126
- package/src/internal/docs-site.ts +0 -248
- package/src/internal/duration.ts +0 -37
- package/src/internal/env-file.ts +0 -83
- package/src/internal/eval-judge-model.ts +0 -142
- package/src/internal/eval-run-store.ts +0 -585
- package/src/internal/eval-runner.ts +0 -823
- package/src/internal/evals-client.ts +0 -475
- package/src/internal/event-log.ts +0 -342
- package/src/internal/event-mapper.ts +0 -811
- package/src/internal/expected-delivery-failure.ts +0 -34
- package/src/internal/factory-resource-channel.ts +0 -103
- package/src/internal/filesystem/errors.ts +0 -207
- package/src/internal/filesystem/format.ts +0 -253
- package/src/internal/filesystem/merge.ts +0 -192
- package/src/internal/filesystem/nearest.ts +0 -112
- package/src/internal/filesystem/scratch.ts +0 -239
- package/src/internal/filesystem/sdk-schemas.ts +0 -204
- package/src/internal/filesystem/tools.ts +0 -804
- package/src/internal/filesystem/walk.ts +0 -366
- package/src/internal/fixtures/units-server.ts +0 -52
- package/src/internal/framework-file-storage.ts +0 -357
- package/src/internal/framework-storage-selection.ts +0 -156
- package/src/internal/frontmatter.ts +0 -108
- package/src/internal/github-fanout.ts +0 -144
- package/src/internal/guest-network.ts +0 -391
- package/src/internal/handleAgentServeTrigger.ts +0 -286
- package/src/internal/host-files.ts +0 -341
- package/src/internal/host-kv.ts +0 -81
- package/src/internal/host-otel.ts +0 -231
- package/src/internal/host-platforms.ts +0 -170
- package/src/internal/hosted-admission-adapter.ts +0 -47
- package/src/internal/hosted-admission-context.ts +0 -37
- package/src/internal/hosted-catch-protocol.ts +0 -112
- package/src/internal/hosted-catch.ts +0 -179
- package/src/internal/hosted-delivery-protocol.ts +0 -824
- package/src/internal/hosted-delivery.ts +0 -1410
- package/src/internal/hosted-execution-diag.ts +0 -291
- package/src/internal/hosted-execution-flush.ts +0 -136
- package/src/internal/hosted-execution-latency.ts +0 -301
- package/src/internal/hosted-managed-automation.ts +0 -116
- package/src/internal/hosting.ts +0 -114
- package/src/internal/http-channel-define.ts +0 -25
- package/src/internal/http-channel.ts +0 -669
- package/src/internal/http-control-plane-session.ts +0 -110
- package/src/internal/ids.ts +0 -39
- package/src/internal/incoming-headers-to-fetch.ts +0 -45
- package/src/internal/init-interview.ts +0 -360
- package/src/internal/init-project.ts +0 -711
- package/src/internal/init-scaffold.ts +0 -182
- package/src/internal/inline-stdio-define-stub.ts +0 -4
- package/src/internal/inline-stdio-mcp.ts +0 -230
- package/src/internal/install-cursor-skills.ts +0 -604
- package/src/internal/is-record.ts +0 -3
- package/src/internal/json-schema.ts +0 -95
- package/src/internal/legacy-command-guard.ts +0 -66
- package/src/internal/listen-port.ts +0 -85
- package/src/internal/local-control-plane.ts +0 -442
- package/src/internal/local-env.ts +0 -59
- package/src/internal/local-ingress.ts +0 -90
- package/src/internal/log-ring.ts +0 -59
- package/src/internal/logs-client.ts +0 -477
- package/src/internal/map-pool.ts +0 -39
- package/src/internal/mcp-endpoint.ts +0 -747
- package/src/internal/mcp-host.ts +0 -509
- package/src/internal/mcp-oauth-on-demand.ts +0 -337
- package/src/internal/mcp-oauth-persist.ts +0 -118
- package/src/internal/mcp-oauth.ts +0 -549
- package/src/internal/net.ts +0 -29
- package/src/internal/open-browser.ts +0 -41
- package/src/internal/otel/attrs.ts +0 -16
- package/src/internal/otel/collector.ts +0 -937
- package/src/internal/otel/config.ts +0 -287
- package/src/internal/otel/http.ts +0 -122
- package/src/internal/otel/mcp.ts +0 -56
- package/src/internal/otel/propagation.ts +0 -17
- package/src/internal/otel/runtime.ts +0 -441
- package/src/internal/package-inline-stdio.ts +0 -114
- package/src/internal/peer-connections.ts +0 -96
- package/src/internal/platform-schedule-sync.ts +0 -75
- package/src/internal/platform-timers.ts +0 -365
- package/src/internal/playground/static.ts +0 -278
- package/src/internal/playground/toolchain.ts +0 -270
- package/src/internal/playground-proxy.ts +0 -564
- package/src/internal/process-memory-telemetry.ts +0 -334
- package/src/internal/project-layout.ts +0 -31
- package/src/internal/prompt-context.ts +0 -116
- package/src/internal/reminder-control-plane-protocol.ts +0 -482
- package/src/internal/reminder-runner.ts +0 -1559
- package/src/internal/reminder-schedule.ts +0 -104
- package/src/internal/reminder-store.ts +0 -176
- package/src/internal/request-error-status.ts +0 -95
- package/src/internal/request-headers.ts +0 -21
- package/src/internal/resolve-prod-target.ts +0 -334
- package/src/internal/resolved-connections.ts +0 -190
- package/src/internal/router.ts +0 -143
- package/src/internal/run-client.ts +0 -354
- package/src/internal/runtime-dispatch-runner.ts +0 -50
- package/src/internal/sanitize-mcp-tool-name.ts +0 -31
- package/src/internal/schedule-runner.ts +0 -154
- package/src/internal/scm/pr-url.ts +0 -245
- package/src/internal/sdk-runner.ts +0 -959
- package/src/internal/serve-restart.ts +0 -113
- package/src/internal/server.ts +0 -3147
- package/src/internal/session-cost.ts +0 -208
- package/src/internal/session-engine.ts +0 -5622
- package/src/internal/session-links.ts +0 -84
- package/src/internal/session-run-log.ts +0 -535
- package/src/internal/session-store.ts +0 -307
- package/src/internal/session-urls.ts +0 -32
- package/src/internal/sessions-client.ts +0 -239
- package/src/internal/skill-catalog.ts +0 -66
- package/src/internal/skills-sync.ts +0 -55
- package/src/internal/slack-provision-client.ts +0 -544
- package/src/internal/slack-thread-key.ts +0 -11
- package/src/internal/sleep.ts +0 -3
- package/src/internal/start-log-store.ts +0 -164
- package/src/internal/steering.ts +0 -17
- package/src/internal/storage-coordinator.ts +0 -800
- package/src/internal/storage-roles.ts +0 -86
- package/src/internal/storage.ts +0 -1
- package/src/internal/store-api-protocol.ts +0 -205
- package/src/internal/store-mirror.ts +0 -73
- package/src/internal/stream-progress.ts +0 -294
- package/src/internal/terminal-style.ts +0 -133
- package/src/internal/testing/factory-resource-fixtures.ts +0 -84
- package/src/internal/testing/scm-continuation-fixtures.ts +0 -285
- package/src/internal/tool-catalog.ts +0 -104
- package/src/internal/tool-policy.ts +0 -222
- package/src/internal/tool-result.ts +0 -50
- package/src/internal/trajectory.ts +0 -418
- package/src/internal/turn-cost.ts +0 -136
- package/src/internal/turn-governor.ts +0 -145
- package/src/internal/turn-lease-store.ts +0 -144
- package/src/internal/turn-outbox.ts +0 -77
- package/src/internal/update-check.ts +0 -517
- package/src/internal/v2-hosting.ts +0 -52
- package/src/internal/workspace-sync.ts +0 -114
- package/src/internal/workspace.ts +0 -505
- package/src/kv/memory-kv.ts +0 -94
- package/src/kv.ts +0 -18
- package/src/memory.ts +0 -487
- package/src/otel-public.ts +0 -24
- package/src/otel.ts +0 -320
- package/src/prompt.ts +0 -80
- package/src/reminders.ts +0 -65
- package/src/schedules.ts +0 -31
- package/src/skills.ts +0 -27
- package/src/storage-backends/cursor-hosted-v2.ts +0 -204
- package/src/storage-backends/cursor-hosted.ts +0 -388
- package/src/storage-backends/file-kv.ts +0 -276
- package/src/storage-protocol.ts +0 -261
- package/src/storage.ts +0 -408
- package/src/tools.ts +0 -166
- package/src/types.ts +0 -3776
- /package/dist/docs/assets/{reference_agent-config.md.DzGI777n.lean.js → reference_agent-config.md.Cj5uBKp4.lean.js} +0 -0
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { constants } from "node:fs";
|
|
2
|
-
import { lstat, open, realpath } from "node:fs/promises";
|
|
3
|
-
import { extname, sep } from "node:path";
|
|
4
|
-
import { callSlackApiSoft } from "./api.js";
|
|
5
|
-
import type { SlackBotToken } from "./types.js";
|
|
6
|
-
|
|
7
|
-
const ALLOWED = new Set([
|
|
8
|
-
".png",
|
|
9
|
-
".jpg",
|
|
10
|
-
".jpeg",
|
|
11
|
-
".gif",
|
|
12
|
-
".webp",
|
|
13
|
-
".svg",
|
|
14
|
-
".pdf",
|
|
15
|
-
".html",
|
|
16
|
-
".txt",
|
|
17
|
-
".log",
|
|
18
|
-
".json",
|
|
19
|
-
".csv",
|
|
20
|
-
".md",
|
|
21
|
-
".mp4",
|
|
22
|
-
".mov",
|
|
23
|
-
".webm",
|
|
24
|
-
]);
|
|
25
|
-
|
|
26
|
-
const MAX_BYTES = 50 * 1024 * 1024;
|
|
27
|
-
|
|
28
|
-
export interface ThreadFile {
|
|
29
|
-
path: string;
|
|
30
|
-
name: string;
|
|
31
|
-
workspace: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
async function readJailed(file: ThreadFile): Promise<Buffer | string> {
|
|
35
|
-
if (file.workspace === "") {
|
|
36
|
-
return `${file.name}: missing workspace`;
|
|
37
|
-
}
|
|
38
|
-
const info = await lstat(file.path);
|
|
39
|
-
if (info.isSymbolicLink() || !info.isFile()) {
|
|
40
|
-
return `${file.name}: not a regular file`;
|
|
41
|
-
}
|
|
42
|
-
const real = await realpath(file.path);
|
|
43
|
-
const root = await realpath(file.workspace);
|
|
44
|
-
if (real !== root && !real.startsWith(`${root}${sep}`)) {
|
|
45
|
-
return `${file.name}: outside workspace`;
|
|
46
|
-
}
|
|
47
|
-
const nofollow = constants.O_NOFOLLOW;
|
|
48
|
-
const flags = nofollow === undefined ? constants.O_RDONLY : constants.O_RDONLY | nofollow;
|
|
49
|
-
const handle = await open(file.path, flags);
|
|
50
|
-
try {
|
|
51
|
-
const bytes = await handle.readFile();
|
|
52
|
-
if (bytes.byteLength > MAX_BYTES) {
|
|
53
|
-
return `${file.name}: over the upload cap`;
|
|
54
|
-
}
|
|
55
|
-
const extension = extname(file.path).toLowerCase();
|
|
56
|
-
if (!ALLOWED.has(extension)) {
|
|
57
|
-
return `${file.name}: type Slack does not render`;
|
|
58
|
-
}
|
|
59
|
-
return bytes;
|
|
60
|
-
} finally {
|
|
61
|
-
await handle.close();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export async function uploadThreadFiles(args: {
|
|
66
|
-
botToken: SlackBotToken | undefined;
|
|
67
|
-
channelId: string;
|
|
68
|
-
threadTs?: string;
|
|
69
|
-
files: readonly ThreadFile[];
|
|
70
|
-
}): Promise<string[]> {
|
|
71
|
-
if (args.files.length === 0) {
|
|
72
|
-
return [];
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const failures: string[] = [];
|
|
76
|
-
const uploaded: Array<{ id: string; title: string }> = [];
|
|
77
|
-
for (const file of args.files) {
|
|
78
|
-
let bytes: Buffer;
|
|
79
|
-
try {
|
|
80
|
-
const read = await readJailed(file);
|
|
81
|
-
if (typeof read === "string") {
|
|
82
|
-
failures.push(read);
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
bytes = read;
|
|
86
|
-
} catch (error) {
|
|
87
|
-
failures.push(`${file.name}: gone before upload (${String(error)})`);
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
const reserved = await callSlackApiSoft({
|
|
91
|
-
botToken: args.botToken,
|
|
92
|
-
operation: "files.getUploadURLExternal",
|
|
93
|
-
body: { filename: file.name, length: bytes.byteLength },
|
|
94
|
-
});
|
|
95
|
-
if (!reserved.ok) {
|
|
96
|
-
failures.push(`${file.name}: could not reserve upload (${reserved.error})`);
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
const uploadUrl = reserved.upload_url;
|
|
100
|
-
const fileId = reserved.file_id;
|
|
101
|
-
if (typeof uploadUrl !== "string" || typeof fileId !== "string") {
|
|
102
|
-
failures.push(`${file.name}: could not reserve upload (malformed reserve response)`);
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
try {
|
|
106
|
-
const put = await fetch(uploadUrl, {
|
|
107
|
-
method: "POST",
|
|
108
|
-
body: bytes as unknown as BodyInit,
|
|
109
|
-
});
|
|
110
|
-
if (!put.ok) {
|
|
111
|
-
failures.push(`${file.name}: upload returned ${put.status}`);
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
} catch (error) {
|
|
115
|
-
failures.push(`${file.name}: upload failed (${String(error)})`);
|
|
116
|
-
continue;
|
|
117
|
-
}
|
|
118
|
-
uploaded.push({ id: fileId, title: file.name });
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
if (uploaded.length === 0) {
|
|
122
|
-
return failures;
|
|
123
|
-
}
|
|
124
|
-
const shared = await callSlackApiSoft({
|
|
125
|
-
botToken: args.botToken,
|
|
126
|
-
operation: "files.completeUploadExternal",
|
|
127
|
-
body: {
|
|
128
|
-
files: uploaded,
|
|
129
|
-
channel_id: args.channelId,
|
|
130
|
-
thread_ts: args.threadTs,
|
|
131
|
-
},
|
|
132
|
-
});
|
|
133
|
-
if (!shared.ok) {
|
|
134
|
-
failures.push(`${uploaded.length} file(s): ${String(shared.error)}`);
|
|
135
|
-
}
|
|
136
|
-
return failures;
|
|
137
|
-
}
|
package/src/channels.ts
DELETED
|
@@ -1,543 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `defineChannel` — authored at `agent/channels/<name>.ts`.
|
|
3
|
-
*
|
|
4
|
-
* A channel is the surface an agent lives on. The built-in HTTP session
|
|
5
|
-
* channel (session create / follow-up / NDJSON stream routes under
|
|
6
|
-
* `/v1/session*`) is always mounted. Custom channels declare their own
|
|
7
|
-
* routes and are mounted under `/v1/channels/<name>`:
|
|
8
|
-
*
|
|
9
|
-
* ```ts
|
|
10
|
-
* import { defineChannel, POST } from "@cursor/bdk/channels";
|
|
11
|
-
* import { z } from "zod";
|
|
12
|
-
*
|
|
13
|
-
* export default defineChannel({
|
|
14
|
-
* routes: [
|
|
15
|
-
* POST("/message", {
|
|
16
|
-
* bodySchema: z.object({
|
|
17
|
-
* message: z.string(),
|
|
18
|
-
* token: z.string().optional(),
|
|
19
|
-
* }),
|
|
20
|
-
* handler: async (_req, { send, body }) => {
|
|
21
|
-
* const { message, token } = body as {
|
|
22
|
-
* message: string;
|
|
23
|
-
* token?: string;
|
|
24
|
-
* };
|
|
25
|
-
* const session = await send(message, {
|
|
26
|
-
* continuationToken: token,
|
|
27
|
-
* });
|
|
28
|
-
* return Response.json({ sessionId: session.id });
|
|
29
|
-
* },
|
|
30
|
-
* }),
|
|
31
|
-
* ],
|
|
32
|
-
* events: {
|
|
33
|
-
* "message.completed"(event, channel, ctx) {
|
|
34
|
-
* // deliver completed messages back to the surface that owns this
|
|
35
|
-
* // channel (post to a webhook, reply in a thread, ...)
|
|
36
|
-
* },
|
|
37
|
-
* },
|
|
38
|
-
* });
|
|
39
|
-
* ```
|
|
40
|
-
*
|
|
41
|
-
* Route helpers are typed so HTTP channels must declare **Zod** schemas at
|
|
42
|
-
* compile time: `GET` requires `querySchema`, `POST`/`PUT`/`PATCH` require
|
|
43
|
-
* `bodySchema`. Plain JSON Schema objects will not type-check. Use
|
|
44
|
-
* `z.object({})` / `z.unknown()` when the surface is intentionally open.
|
|
45
|
-
* Handlers receive `args.body` / `args.query` inferred from those schemas.
|
|
46
|
-
*/
|
|
47
|
-
|
|
48
|
-
export {
|
|
49
|
-
type CiCheck,
|
|
50
|
-
type CiCheckConcludeInput,
|
|
51
|
-
type CiCheckConclusion,
|
|
52
|
-
type CiCheckCreateInput,
|
|
53
|
-
type CiCheckOutput,
|
|
54
|
-
type CiCheckRef,
|
|
55
|
-
type CiCheckStatus,
|
|
56
|
-
type CiChecksClient,
|
|
57
|
-
type CiCheckUpdateInput,
|
|
58
|
-
type CiCheckWrite,
|
|
59
|
-
type CiCheckWriter,
|
|
60
|
-
openCiCheck,
|
|
61
|
-
resumeCiCheck,
|
|
62
|
-
} from "./channels/checks.js";
|
|
63
|
-
|
|
64
|
-
import { Buffer } from "node:buffer";
|
|
65
|
-
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
66
|
-
import { brandDefinition } from "./internal/brand.js";
|
|
67
|
-
import { attachCatchAdmission } from "./internal/hosted-catch.js";
|
|
68
|
-
import { isLoopbackAddress, isLoopbackHostname } from "./internal/net.js";
|
|
69
|
-
import type {
|
|
70
|
-
AuthContext,
|
|
71
|
-
AuthPolicy,
|
|
72
|
-
ChannelBodyRouteSpec,
|
|
73
|
-
ChannelConfig,
|
|
74
|
-
ChannelDefinition,
|
|
75
|
-
ChannelDeleteRouteSpec,
|
|
76
|
-
ChannelGetRouteSpec,
|
|
77
|
-
ChannelRoute,
|
|
78
|
-
ChannelRouteHandler,
|
|
79
|
-
ChannelRouteSchema,
|
|
80
|
-
HttpChannelConfig,
|
|
81
|
-
HttpChannelDefinition,
|
|
82
|
-
JsonValue,
|
|
83
|
-
RouteMethod,
|
|
84
|
-
} from "./types.js";
|
|
85
|
-
|
|
86
|
-
/** Configure the built-in HTTP session channel at `agent/channels/http.ts`. */
|
|
87
|
-
export { httpChannel } from "./internal/http-channel-define.js";
|
|
88
|
-
export type {
|
|
89
|
-
AuthContext,
|
|
90
|
-
AuthPolicy,
|
|
91
|
-
ChannelBodyRouteSpec,
|
|
92
|
-
ChannelConfig,
|
|
93
|
-
ChannelDefinition,
|
|
94
|
-
ChannelDeleteRouteSpec,
|
|
95
|
-
ChannelEventContext,
|
|
96
|
-
ChannelEventHandler,
|
|
97
|
-
ChannelEventHandlers,
|
|
98
|
-
ChannelGetRouteSpec,
|
|
99
|
-
ChannelHandlerArgs,
|
|
100
|
-
ChannelHandlerArgsWithBody,
|
|
101
|
-
ChannelHandlerArgsWithBodyAndQuery,
|
|
102
|
-
ChannelHandlerArgsWithQuery,
|
|
103
|
-
ChannelRoute,
|
|
104
|
-
ChannelRouteHandler,
|
|
105
|
-
ChannelRouteSchema,
|
|
106
|
-
ChannelSession,
|
|
107
|
-
ChannelStartArgs,
|
|
108
|
-
HttpChannelConfig,
|
|
109
|
-
HttpChannelDefinition,
|
|
110
|
-
HttpSessionAdmitInfo,
|
|
111
|
-
ReceiveInput,
|
|
112
|
-
RouteMethod,
|
|
113
|
-
SendMessageFn,
|
|
114
|
-
SendMessageOptions,
|
|
115
|
-
} from "./types.js";
|
|
116
|
-
export { HttpSessionAdmitError } from "./types.js";
|
|
117
|
-
|
|
118
|
-
/** Define a custom channel. */
|
|
119
|
-
export function defineChannel<TState = JsonValue>(
|
|
120
|
-
config: ChannelConfig<TState>,
|
|
121
|
-
): ChannelDefinition<TState> {
|
|
122
|
-
const definition = brandDefinition("channel", config);
|
|
123
|
-
if (config.routes !== undefined && config.routes.length > 0) {
|
|
124
|
-
// Hosted: the control plane catches declared routes and replays them
|
|
125
|
-
// here. Provider packs attach their own admission afterwards.
|
|
126
|
-
attachCatchAdmission(definition as ChannelDefinition<unknown>, config.routes);
|
|
127
|
-
}
|
|
128
|
-
return definition;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// ============================================================================
|
|
132
|
-
// Route verbs
|
|
133
|
-
// ============================================================================
|
|
134
|
-
|
|
135
|
-
function route(
|
|
136
|
-
method: RouteMethod,
|
|
137
|
-
path: string,
|
|
138
|
-
spec: {
|
|
139
|
-
description?: string;
|
|
140
|
-
bodySchema?: ChannelRouteSchema;
|
|
141
|
-
querySchema?: ChannelRouteSchema;
|
|
142
|
-
handler: ChannelRouteHandler;
|
|
143
|
-
},
|
|
144
|
-
): ChannelRoute {
|
|
145
|
-
if (!path.startsWith("/")) {
|
|
146
|
-
throw new Error(`Channel route path must start with "/": ${path}`);
|
|
147
|
-
}
|
|
148
|
-
const result: ChannelRoute = {
|
|
149
|
-
method,
|
|
150
|
-
path,
|
|
151
|
-
handler: spec.handler,
|
|
152
|
-
};
|
|
153
|
-
if (spec.description !== undefined) {
|
|
154
|
-
result.description = spec.description;
|
|
155
|
-
}
|
|
156
|
-
if (spec.bodySchema !== undefined) {
|
|
157
|
-
result.bodySchema = spec.bodySchema;
|
|
158
|
-
}
|
|
159
|
-
if (spec.querySchema !== undefined) {
|
|
160
|
-
result.querySchema = spec.querySchema;
|
|
161
|
-
}
|
|
162
|
-
return result;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/** GET — Zod `querySchema` is required (use `z.object({})` when unused). */
|
|
166
|
-
export function GET<TQuery extends ChannelRouteSchema>(
|
|
167
|
-
path: string,
|
|
168
|
-
spec: ChannelGetRouteSpec<TQuery>,
|
|
169
|
-
): ChannelRoute {
|
|
170
|
-
return route("GET", path, {
|
|
171
|
-
description: spec.description,
|
|
172
|
-
querySchema: spec.querySchema,
|
|
173
|
-
handler: spec.handler as ChannelRouteHandler,
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/** POST — Zod `bodySchema` is required. */
|
|
178
|
-
export function POST<
|
|
179
|
-
TBody extends ChannelRouteSchema,
|
|
180
|
-
TQuery extends ChannelRouteSchema | undefined = undefined,
|
|
181
|
-
>(path: string, spec: ChannelBodyRouteSpec<TBody, TQuery>): ChannelRoute {
|
|
182
|
-
return route("POST", path, {
|
|
183
|
-
description: spec.description,
|
|
184
|
-
bodySchema: spec.bodySchema,
|
|
185
|
-
querySchema: spec.querySchema,
|
|
186
|
-
handler: spec.handler as ChannelRouteHandler,
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/** PUT — Zod `bodySchema` is required. */
|
|
191
|
-
export function PUT<
|
|
192
|
-
TBody extends ChannelRouteSchema,
|
|
193
|
-
TQuery extends ChannelRouteSchema | undefined = undefined,
|
|
194
|
-
>(path: string, spec: ChannelBodyRouteSpec<TBody, TQuery>): ChannelRoute {
|
|
195
|
-
return route("PUT", path, {
|
|
196
|
-
description: spec.description,
|
|
197
|
-
bodySchema: spec.bodySchema,
|
|
198
|
-
querySchema: spec.querySchema,
|
|
199
|
-
handler: spec.handler as ChannelRouteHandler,
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/** PATCH — Zod `bodySchema` is required. */
|
|
204
|
-
export function PATCH<
|
|
205
|
-
TBody extends ChannelRouteSchema,
|
|
206
|
-
TQuery extends ChannelRouteSchema | undefined = undefined,
|
|
207
|
-
>(path: string, spec: ChannelBodyRouteSpec<TBody, TQuery>): ChannelRoute {
|
|
208
|
-
return route("PATCH", path, {
|
|
209
|
-
description: spec.description,
|
|
210
|
-
bodySchema: spec.bodySchema,
|
|
211
|
-
querySchema: spec.querySchema,
|
|
212
|
-
handler: spec.handler as ChannelRouteHandler,
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/** DELETE — Zod schemas optional. */
|
|
217
|
-
export function DELETE<
|
|
218
|
-
TBody extends ChannelRouteSchema | undefined = undefined,
|
|
219
|
-
TQuery extends ChannelRouteSchema | undefined = undefined,
|
|
220
|
-
>(path: string, spec: ChannelDeleteRouteSpec<TBody, TQuery>): ChannelRoute {
|
|
221
|
-
return route("DELETE", path, {
|
|
222
|
-
description: spec.description,
|
|
223
|
-
bodySchema: spec.bodySchema,
|
|
224
|
-
querySchema: spec.querySchema,
|
|
225
|
-
handler: spec.handler,
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// ============================================================================
|
|
230
|
-
// Auth policies
|
|
231
|
-
// ============================================================================
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* Admit requests that arrive over the loopback interface with no proxy
|
|
235
|
-
* forwarding headers. The default route policy: local tooling works out of
|
|
236
|
-
* the box while remote (or reverse-proxied) callers are rejected until you
|
|
237
|
-
* wire real auth (e.g. {@link bearerAuth}).
|
|
238
|
-
*
|
|
239
|
-
* Requests carrying `X-Forwarded-For`, `X-Real-IP`, `Forwarded`, or
|
|
240
|
-
* `X-Forwarded-Host` are denied even when the TCP peer is 127.0.0.1 — that
|
|
241
|
-
* pattern is how tunnels and same-host reverse proxies re-expose loopback.
|
|
242
|
-
*/
|
|
243
|
-
export function localDev(): AuthPolicy {
|
|
244
|
-
return (request, info) => {
|
|
245
|
-
if (hasProxyForwardingHeaders(request)) {
|
|
246
|
-
return null;
|
|
247
|
-
}
|
|
248
|
-
if (info.requestIp !== null && isLoopbackAddress(info.requestIp)) {
|
|
249
|
-
return {
|
|
250
|
-
authenticator: "local-dev",
|
|
251
|
-
principalId: "local",
|
|
252
|
-
principalType: "user",
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
return null;
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Like {@link localDev} but also requires the request URL hostname to be
|
|
261
|
-
* loopback. Rejects DNS-rebinding callers that reach 127.0.0.1 with a remote
|
|
262
|
-
* `Host` header (e.g. attacker.example after rebinding to localhost).
|
|
263
|
-
*/
|
|
264
|
-
export function localDevStrict(): AuthPolicy {
|
|
265
|
-
return (request, info) => {
|
|
266
|
-
if (localDev()(request, info) === null) {
|
|
267
|
-
return null;
|
|
268
|
-
}
|
|
269
|
-
let hostname: string;
|
|
270
|
-
try {
|
|
271
|
-
hostname = new URL(request.url).hostname;
|
|
272
|
-
} catch {
|
|
273
|
-
return null;
|
|
274
|
-
}
|
|
275
|
-
if (!isLoopbackHostname(hostname)) {
|
|
276
|
-
return null;
|
|
277
|
-
}
|
|
278
|
-
return {
|
|
279
|
-
authenticator: "local-dev-strict",
|
|
280
|
-
principalId: "local",
|
|
281
|
-
principalType: "user",
|
|
282
|
-
};
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* Admit requests whose TCP peer is loopback, ignoring `Host` and
|
|
288
|
-
* proxy-forwarding headers. The peer address (`req.socket.remoteAddress`) is
|
|
289
|
-
* the real boundary: a loopback-bound server only accepts local processes, and
|
|
290
|
-
* a LAN caller's peer IP is non-loopback and rejected. Unlike {@link localDev},
|
|
291
|
-
* this does not veto on `X-Forwarded-*` headers — so it admits loopback clients
|
|
292
|
-
* that legitimately relay them, e.g. `gh webhook forward`, which forwards
|
|
293
|
-
* GitHub's edge `X-Forwarded-For` / `X-Real-Ip`. Intended for dev-only relaxed
|
|
294
|
-
* auth where remote exposure is still refused.
|
|
295
|
-
*/
|
|
296
|
-
export function loopbackOnly(): AuthPolicy {
|
|
297
|
-
return (_request, info) => {
|
|
298
|
-
if (info.requestIp !== null && isLoopbackAddress(info.requestIp)) {
|
|
299
|
-
return {
|
|
300
|
-
authenticator: "loopback-only",
|
|
301
|
-
principalId: "local",
|
|
302
|
-
principalType: "user",
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
return null;
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
function hasGitHubWebhookDeliveryHeaders(request: Request): boolean {
|
|
310
|
-
const event = request.headers.get("x-github-event");
|
|
311
|
-
return event !== null && event.trim() !== "";
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Dev-only GitHub channel auth without a webhook secret: loopback peer
|
|
316
|
-
* required. Plain local fixtures (no proxy headers) are admitted; deliveries
|
|
317
|
-
* relayed through `gh webhook forward` carry GitHub's `X-Forwarded-*` headers
|
|
318
|
-
* and are admitted only when `X-GitHub-Event` is present (GitHub deliveries
|
|
319
|
-
* always include it). Loopback tunnels that relay arbitrary remote traffic
|
|
320
|
-
* without those delivery headers stay rejected.
|
|
321
|
-
*/
|
|
322
|
-
export function loopbackGitHubDev(): AuthPolicy {
|
|
323
|
-
return (request, info) => {
|
|
324
|
-
if (info.requestIp === null || !isLoopbackAddress(info.requestIp)) {
|
|
325
|
-
return null;
|
|
326
|
-
}
|
|
327
|
-
if (hasProxyForwardingHeaders(request) && !hasGitHubWebhookDeliveryHeaders(request)) {
|
|
328
|
-
return null;
|
|
329
|
-
}
|
|
330
|
-
return {
|
|
331
|
-
authenticator: "loopback-github-dev",
|
|
332
|
-
principalId: "local",
|
|
333
|
-
principalType: "user",
|
|
334
|
-
};
|
|
335
|
-
};
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
function hasProxyForwardingHeaders(request: Request): boolean {
|
|
339
|
-
return (
|
|
340
|
-
request.headers.has("x-forwarded-for") ||
|
|
341
|
-
request.headers.has("x-forwarded-host") ||
|
|
342
|
-
request.headers.has("x-real-ip") ||
|
|
343
|
-
request.headers.has("forwarded")
|
|
344
|
-
);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Admit requests carrying `Authorization: Bearer <token>`. Pass the expected
|
|
349
|
-
* token (compared in constant time) or a verifier that maps a presented
|
|
350
|
-
* token to an {@link AuthContext}.
|
|
351
|
-
*/
|
|
352
|
-
export function bearerAuth(
|
|
353
|
-
tokenOrVerify: string | ((token: string) => AuthContext | null | Promise<AuthContext | null>),
|
|
354
|
-
): AuthPolicy {
|
|
355
|
-
return async request => {
|
|
356
|
-
const header = request.headers.get("authorization");
|
|
357
|
-
if (header === null || !header.toLowerCase().startsWith("bearer ")) {
|
|
358
|
-
return null;
|
|
359
|
-
}
|
|
360
|
-
const presented = header.slice("bearer ".length).trim();
|
|
361
|
-
if (typeof tokenOrVerify === "function") {
|
|
362
|
-
return await tokenOrVerify(presented);
|
|
363
|
-
}
|
|
364
|
-
if (tokenOrVerify !== "" && constantTimeEquals(presented, tokenOrVerify)) {
|
|
365
|
-
return {
|
|
366
|
-
authenticator: "bearer",
|
|
367
|
-
principalId: "bearer",
|
|
368
|
-
principalType: "service",
|
|
369
|
-
};
|
|
370
|
-
}
|
|
371
|
-
return null;
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
function constantTimeEquals(a: string, b: string): boolean {
|
|
376
|
-
const aBytes = Buffer.from(a);
|
|
377
|
-
const bBytes = Buffer.from(b);
|
|
378
|
-
if (aBytes.length !== bBytes.length) {
|
|
379
|
-
return false;
|
|
380
|
-
}
|
|
381
|
-
return timingSafeEqual(aBytes, bBytes);
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Admit every request as an anonymous principal. Only for surfaces that are
|
|
386
|
-
* intentionally public or protected upstream.
|
|
387
|
-
*/
|
|
388
|
-
export function allowAll(): AuthPolicy {
|
|
389
|
-
return () => ({
|
|
390
|
-
authenticator: "allow-all",
|
|
391
|
-
principalId: "anonymous",
|
|
392
|
-
principalType: "user",
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* `Symbol.for` so the marker survives duplicated copies of the framework in
|
|
398
|
-
* one process (e.g. a monorepo agent resolving its own `@cursor/bdk`).
|
|
399
|
-
*/
|
|
400
|
-
const PUBLIC_ENDPOINT_MARKER = Symbol.for("agent-serve.public-endpoint");
|
|
401
|
-
|
|
402
|
-
/**
|
|
403
|
-
* Like {@link allowAll}, but ALSO declares the channel publicly reachable on
|
|
404
|
-
* Cursor's managed hosting: `deploy` collects every channel whose auth chain
|
|
405
|
-
* contains this policy and the platform serves that channel's routes
|
|
406
|
-
* (`/v1/channels/<id>/…`) through the stable alias WITHOUT
|
|
407
|
-
* `X-Agent-Alias-Token`.
|
|
408
|
-
*
|
|
409
|
-
* Use it for webhook senders that cannot attach custom headers (Linear,
|
|
410
|
-
* Stripe, …) — **the handler must authenticate deliveries itself**, e.g. by
|
|
411
|
-
* verifying the provider's HMAC signature over the raw body. Everything
|
|
412
|
-
* else (sessions, MCP, playground) stays behind platform auth.
|
|
413
|
-
*
|
|
414
|
-
* Locally this admits every caller, exactly like `allowAll()`.
|
|
415
|
-
*/
|
|
416
|
-
export function publicEndpoint(): AuthPolicy {
|
|
417
|
-
const policy: AuthPolicy = () => ({
|
|
418
|
-
authenticator: "public-endpoint",
|
|
419
|
-
principalId: "anonymous",
|
|
420
|
-
principalType: "user",
|
|
421
|
-
});
|
|
422
|
-
// On the v2 control plane this also makes the channel's routes catchable
|
|
423
|
-
// with handler-side verification (the v1 alias posture): the CP admits
|
|
424
|
-
// every request on a declared route and the handler rejects bad ones.
|
|
425
|
-
return markCatchAuth(Object.assign(policy, { [PUBLIC_ENDPOINT_MARKER]: true as const }), {
|
|
426
|
-
kind: "public",
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
/** True when a policy was created by {@link publicEndpoint}. */
|
|
431
|
-
export function isPublicEndpointPolicy(policy: AuthPolicy): boolean {
|
|
432
|
-
return (policy as { [PUBLIC_ENDPOINT_MARKER]?: unknown })[PUBLIC_ENDPOINT_MARKER] === true;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
const CATCH_AUTH_MARKER = Symbol.for("agent-serve.catch-auth");
|
|
436
|
-
|
|
437
|
-
/**
|
|
438
|
-
* What `deploy` extracts from a {@link sharedSecretAuth} /
|
|
439
|
-
* {@link hmacSignatureAuth} policy into the manifest: the control plane runs
|
|
440
|
-
* the same check with the deployment secret of the same name before any
|
|
441
|
-
* compute starts. `secret` is a name, never a value.
|
|
442
|
-
*/
|
|
443
|
-
export type CatchAuthDeclaration =
|
|
444
|
-
| { kind: "header"; header: string; secret: string }
|
|
445
|
-
| { kind: "hmac-sha256"; header: string; secret: string; prefix?: string }
|
|
446
|
-
/** `publicEndpoint()`: the handler verifies; the control plane only rate limits. */
|
|
447
|
-
| { kind: "public" };
|
|
448
|
-
|
|
449
|
-
function markCatchAuth(policy: AuthPolicy, declaration: CatchAuthDeclaration): AuthPolicy {
|
|
450
|
-
return Object.assign(policy, { [CATCH_AUTH_MARKER]: declaration });
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
/** The catch declaration a policy carries, if it is a catch-capable policy. */
|
|
454
|
-
export function catchAuthDeclaration(policy: AuthPolicy): CatchAuthDeclaration | undefined {
|
|
455
|
-
const declaration = (policy as { [CATCH_AUTH_MARKER]?: unknown })[CATCH_AUTH_MARKER];
|
|
456
|
-
return typeof declaration === "object" && declaration !== null
|
|
457
|
-
? (declaration as CatchAuthDeclaration)
|
|
458
|
-
: undefined;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
function presentedHeaderSecret(headerName: string, value: string): string {
|
|
462
|
-
if (headerName === "authorization" && value.toLowerCase().startsWith("bearer ")) {
|
|
463
|
-
return value.slice("bearer ".length).trim();
|
|
464
|
-
}
|
|
465
|
-
return value.trim();
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
/**
|
|
469
|
-
* Admit requests whose `header` equals the secret named `secret` (an
|
|
470
|
-
* `Authorization: Bearer <secret>` header also matches). Locally the value
|
|
471
|
-
* is `process.env[secret]`; hosted, the deployment secret of that name. On
|
|
472
|
-
* Cursor hosting this ALSO declares the channel's routes reachable through
|
|
473
|
-
* the control-plane catch API, which runs the same comparison before any
|
|
474
|
-
* compute exists. An unset secret admits nothing.
|
|
475
|
-
*/
|
|
476
|
-
export function sharedSecretAuth(options: { header: string; secret: string }): AuthPolicy {
|
|
477
|
-
const header = options.header.toLowerCase();
|
|
478
|
-
const policy: AuthPolicy = request => {
|
|
479
|
-
const expected = process.env[options.secret];
|
|
480
|
-
const presented = request.headers.get(header);
|
|
481
|
-
if (
|
|
482
|
-
expected === undefined ||
|
|
483
|
-
expected.length === 0 ||
|
|
484
|
-
presented === null ||
|
|
485
|
-
!constantTimeEquals(presentedHeaderSecret(header, presented), expected)
|
|
486
|
-
) {
|
|
487
|
-
return null;
|
|
488
|
-
}
|
|
489
|
-
return {
|
|
490
|
-
authenticator: "shared-secret",
|
|
491
|
-
principalId: "webhook",
|
|
492
|
-
principalType: "service",
|
|
493
|
-
};
|
|
494
|
-
};
|
|
495
|
-
return markCatchAuth(policy, {
|
|
496
|
-
kind: "header",
|
|
497
|
-
header,
|
|
498
|
-
secret: options.secret,
|
|
499
|
-
});
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
/**
|
|
503
|
-
* Admit requests whose `header` carries the hex HMAC-SHA256 of the raw body
|
|
504
|
-
* under the secret named `secret` (optionally behind a literal `prefix`
|
|
505
|
-
* such as `sha256=`). Same local / hosted / catch semantics as
|
|
506
|
-
* {@link sharedSecretAuth}.
|
|
507
|
-
*/
|
|
508
|
-
export function hmacSignatureAuth(options: {
|
|
509
|
-
header: string;
|
|
510
|
-
secret: string;
|
|
511
|
-
prefix?: string;
|
|
512
|
-
}): AuthPolicy {
|
|
513
|
-
const header = options.header.toLowerCase();
|
|
514
|
-
const prefix = options.prefix ?? "";
|
|
515
|
-
const policy: AuthPolicy = async request => {
|
|
516
|
-
const secret = process.env[options.secret];
|
|
517
|
-
const presented = request.headers.get(header)?.trim();
|
|
518
|
-
if (
|
|
519
|
-
secret === undefined ||
|
|
520
|
-
secret.length === 0 ||
|
|
521
|
-
presented === undefined ||
|
|
522
|
-
!presented.startsWith(prefix)
|
|
523
|
-
) {
|
|
524
|
-
return null;
|
|
525
|
-
}
|
|
526
|
-
const body = Buffer.from(await request.clone().arrayBuffer());
|
|
527
|
-
const expected = createHmac("sha256", secret).update(body).digest("hex");
|
|
528
|
-
if (!constantTimeEquals(presented.slice(prefix.length).toLowerCase(), expected)) {
|
|
529
|
-
return null;
|
|
530
|
-
}
|
|
531
|
-
return {
|
|
532
|
-
authenticator: "hmac-signature",
|
|
533
|
-
principalId: "webhook",
|
|
534
|
-
principalType: "service",
|
|
535
|
-
};
|
|
536
|
-
};
|
|
537
|
-
return markCatchAuth(policy, {
|
|
538
|
-
kind: "hmac-sha256",
|
|
539
|
-
header,
|
|
540
|
-
secret: options.secret,
|
|
541
|
-
prefix: options.prefix,
|
|
542
|
-
});
|
|
543
|
-
}
|