@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,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Slack auth helpers — AuthContext builders for thread-scoped sessions.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { samePrincipal } from "../../internal/auth.js";
|
|
6
|
-
import { slackThreadKey } from "../../internal/slack-thread-key.js";
|
|
7
|
-
import type { AuthContext } from "../../types.js";
|
|
8
|
-
import type { SlackBinding, SlackBlockAction, SlackMessage, SlackRespondTo } from "./types.js";
|
|
9
|
-
|
|
10
|
-
export type BuildSlackAuthArgs = {
|
|
11
|
-
channelId: string;
|
|
12
|
-
threadTs: string;
|
|
13
|
-
teamId?: string;
|
|
14
|
-
userId?: string;
|
|
15
|
-
userName?: string;
|
|
16
|
-
isBot?: boolean;
|
|
17
|
-
engagement?: string;
|
|
18
|
-
/** Defaults to `"thread"`. `"author"` appends `:{userId}` to the principal. */
|
|
19
|
-
respondTo?: SlackRespondTo;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Build a Slack session principal.
|
|
24
|
-
*
|
|
25
|
-
* - `"thread"` (default): any participant can continue.
|
|
26
|
-
* - `"author"`: only the starter (`…:{userId}`), same shape approvals already honor.
|
|
27
|
-
*/
|
|
28
|
-
export function buildSlackAuthContext(args: BuildSlackAuthArgs): AuthContext {
|
|
29
|
-
const team = args.teamId ?? "unknown";
|
|
30
|
-
const respondTo = args.respondTo ?? "thread";
|
|
31
|
-
const conversation = slackThreadKey(args.channelId, args.threadTs);
|
|
32
|
-
const base = `slack:${team}:${conversation}`;
|
|
33
|
-
const authorScoped = respondTo === "author" && args.userId !== undefined && args.userId !== "";
|
|
34
|
-
const principalId = authorScoped ? `${base}:${args.userId}` : base;
|
|
35
|
-
|
|
36
|
-
const attributes: Record<string, string> = {
|
|
37
|
-
channel_id: args.channelId,
|
|
38
|
-
thread_ts: args.threadTs,
|
|
39
|
-
};
|
|
40
|
-
if (args.teamId !== undefined) {
|
|
41
|
-
attributes.team_id = args.teamId;
|
|
42
|
-
}
|
|
43
|
-
if (args.userId !== undefined) {
|
|
44
|
-
attributes.user_id = args.userId;
|
|
45
|
-
}
|
|
46
|
-
if (args.userName !== undefined) {
|
|
47
|
-
attributes.user_name = args.userName;
|
|
48
|
-
}
|
|
49
|
-
if (args.isBot === true) {
|
|
50
|
-
attributes.author_type = "bot";
|
|
51
|
-
}
|
|
52
|
-
if (args.engagement !== undefined) {
|
|
53
|
-
attributes.engagement = args.engagement;
|
|
54
|
-
}
|
|
55
|
-
return {
|
|
56
|
-
authenticator: "slack",
|
|
57
|
-
principalId,
|
|
58
|
-
principalType: "user",
|
|
59
|
-
attributes,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Auth for a Slack user clicking an interactive Approve/Deny button.
|
|
65
|
-
* Uses the clicker's identity for {@link SessionEngine.resolveApproval},
|
|
66
|
-
* not the stored session principal (which would bypass ownership checks).
|
|
67
|
-
*/
|
|
68
|
-
export function buildSlackInteractiveApprovalAuth(args: {
|
|
69
|
-
sessionAuth: AuthContext;
|
|
70
|
-
channelId: string;
|
|
71
|
-
threadTs: string;
|
|
72
|
-
teamId?: string;
|
|
73
|
-
clickingUserId: string;
|
|
74
|
-
}): AuthContext {
|
|
75
|
-
const clickerAuth = buildSlackAuthContext({
|
|
76
|
-
channelId: args.channelId,
|
|
77
|
-
threadTs: args.threadTs,
|
|
78
|
-
teamId: args.teamId,
|
|
79
|
-
userId: args.clickingUserId,
|
|
80
|
-
});
|
|
81
|
-
if (samePrincipal(args.sessionAuth, clickerAuth)) {
|
|
82
|
-
return clickerAuth;
|
|
83
|
-
}
|
|
84
|
-
const userSuffix = `:${args.clickingUserId}`;
|
|
85
|
-
if (args.clickingUserId !== "" && args.sessionAuth.principalId.endsWith(userSuffix)) {
|
|
86
|
-
return {
|
|
87
|
-
...clickerAuth,
|
|
88
|
-
principalId: args.sessionAuth.principalId,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
return clickerAuth;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Default auth for an `onBlockAction` dispatch: the click's thread-scoped
|
|
96
|
-
* principal with the clicker in attributes, so replies in the same thread
|
|
97
|
-
* continue the session and the clicker is the attributable user.
|
|
98
|
-
*/
|
|
99
|
-
export function blockActionAuth(action: SlackBlockAction): AuthContext {
|
|
100
|
-
return buildSlackAuthContext({
|
|
101
|
-
channelId: action.channelId,
|
|
102
|
-
threadTs: action.threadTs,
|
|
103
|
-
teamId: action.teamId,
|
|
104
|
-
userId: action.userId,
|
|
105
|
-
userName: action.userName,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export function defaultSlackAuth(
|
|
110
|
-
message: SlackMessage,
|
|
111
|
-
ctx: SlackBinding,
|
|
112
|
-
options?: { engagement?: string; respondTo?: SlackRespondTo },
|
|
113
|
-
): AuthContext | null {
|
|
114
|
-
if (message.author === undefined) {
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
return buildSlackAuthContext({
|
|
118
|
-
channelId: ctx.slack.channelId,
|
|
119
|
-
threadTs: ctx.slack.threadTs,
|
|
120
|
-
teamId: message.teamId,
|
|
121
|
-
userId: message.author.userId,
|
|
122
|
-
userName: message.author.userName,
|
|
123
|
-
isBot: message.author.isBot,
|
|
124
|
-
engagement: options?.engagement,
|
|
125
|
-
respondTo: options?.respondTo,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Block Kit building helpers shared by card-building agents.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
/** Slack cap for one section block's mrkdwn text. */
|
|
6
|
-
export const SLACK_SECTION_MRKDWN_MAX = 3000;
|
|
7
|
-
|
|
8
|
-
/** Slack caps for a native `table` block (one table per message). */
|
|
9
|
-
export const SLACK_TABLE_MAX_ROWS = 100;
|
|
10
|
-
export const SLACK_TABLE_MAX_COLUMNS = 20;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Pack lines into as few mrkdwn section blocks as fit the 3000-char cap,
|
|
14
|
-
* preserving order. Long lists (a full service fleet, a file inventory)
|
|
15
|
-
* overflow a single section and make `chat.postMessage` refuse the whole
|
|
16
|
-
* card with `invalid_blocks`.
|
|
17
|
-
*/
|
|
18
|
-
export function mrkdwnSections(lines: readonly string[]): unknown[] {
|
|
19
|
-
const texts: string[] = [];
|
|
20
|
-
let current = "";
|
|
21
|
-
for (const raw of lines) {
|
|
22
|
-
// A single oversized line (one huge blob) hard-splits at the cap.
|
|
23
|
-
const parts: string[] = [];
|
|
24
|
-
for (let i = 0; i < Math.max(raw.length, 1); i += SLACK_SECTION_MRKDWN_MAX) {
|
|
25
|
-
parts.push(raw.slice(i, i + SLACK_SECTION_MRKDWN_MAX));
|
|
26
|
-
}
|
|
27
|
-
for (const line of parts) {
|
|
28
|
-
const next = current === "" ? line : `${current}\n${line}`;
|
|
29
|
-
if (next.length > SLACK_SECTION_MRKDWN_MAX && current !== "") {
|
|
30
|
-
texts.push(current);
|
|
31
|
-
current = line;
|
|
32
|
-
} else {
|
|
33
|
-
current = next;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (current !== "") {
|
|
38
|
-
texts.push(current);
|
|
39
|
-
}
|
|
40
|
-
return texts.map(text => ({
|
|
41
|
-
type: "section",
|
|
42
|
-
text: { type: "mrkdwn", text },
|
|
43
|
-
}));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export type SlackTableAlign = "left" | "center" | "right";
|
|
47
|
-
|
|
48
|
-
export type SlackTableColumnSetting = {
|
|
49
|
-
align?: SlackTableAlign;
|
|
50
|
-
is_wrapped?: boolean;
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
/** Cell types accepted by Slack's native `table` block. */
|
|
54
|
-
export type SlackTableCell =
|
|
55
|
-
| { type: "raw_text"; text: string }
|
|
56
|
-
| {
|
|
57
|
-
type: "rich_text";
|
|
58
|
-
elements: Array<{
|
|
59
|
-
type: "rich_text_section";
|
|
60
|
-
elements: Array<
|
|
61
|
-
{ type: "text"; text: string } | { type: "link"; url: string; text: string }
|
|
62
|
-
>;
|
|
63
|
-
}>;
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
export type SlackTableBlock = {
|
|
67
|
-
type: "table";
|
|
68
|
-
rows: SlackTableCell[][];
|
|
69
|
-
column_settings?: SlackTableColumnSetting[];
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
/** Plain text cell (header or body). */
|
|
73
|
-
export function slackRawTextCell(text: string): SlackTableCell {
|
|
74
|
-
return { type: "raw_text", text };
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** Linked cell via rich_text (preferred over mrkdwn `<url|label>` in tables). */
|
|
78
|
-
export function slackLinkCell(args: { url: string; text: string }): SlackTableCell {
|
|
79
|
-
return {
|
|
80
|
-
type: "rich_text",
|
|
81
|
-
elements: [
|
|
82
|
-
{
|
|
83
|
-
type: "rich_text_section",
|
|
84
|
-
elements: [{ type: "link", url: args.url, text: args.text }],
|
|
85
|
-
},
|
|
86
|
-
],
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Build a native Slack `table` block. First row is the header. Slack allows
|
|
92
|
-
* at most one table block per message, 100 rows, and 20 columns — callers
|
|
93
|
-
* should keep tables short.
|
|
94
|
-
*/
|
|
95
|
-
export function slackTableBlock(args: {
|
|
96
|
-
headers: readonly string[];
|
|
97
|
-
rows: readonly (readonly SlackTableCell[])[];
|
|
98
|
-
columnSettings?: readonly SlackTableColumnSetting[];
|
|
99
|
-
}): SlackTableBlock | undefined {
|
|
100
|
-
if (args.headers.length === 0) {
|
|
101
|
-
return undefined;
|
|
102
|
-
}
|
|
103
|
-
if (args.headers.length > SLACK_TABLE_MAX_COLUMNS) {
|
|
104
|
-
throw new Error(
|
|
105
|
-
`slackTableBlock: ${args.headers.length} columns exceeds Slack cap of ${SLACK_TABLE_MAX_COLUMNS}`,
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
// Header + body rows share the 100-row cap.
|
|
109
|
-
if (args.rows.length + 1 > SLACK_TABLE_MAX_ROWS) {
|
|
110
|
-
throw new Error(
|
|
111
|
-
`slackTableBlock: ${args.rows.length + 1} rows exceeds Slack cap of ${SLACK_TABLE_MAX_ROWS}`,
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
const columnCount = args.headers.length;
|
|
115
|
-
for (const [index, row] of args.rows.entries()) {
|
|
116
|
-
if (row.length !== columnCount) {
|
|
117
|
-
throw new Error(
|
|
118
|
-
`slackTableBlock: row ${index} has ${row.length} cells; expected ${columnCount}`,
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
const headerRow = args.headers.map(header => slackRawTextCell(header));
|
|
123
|
-
const block: SlackTableBlock = {
|
|
124
|
-
type: "table",
|
|
125
|
-
rows: [headerRow, ...args.rows.map(row => [...row])],
|
|
126
|
-
};
|
|
127
|
-
if (args.columnSettings !== undefined && args.columnSettings.length > 0) {
|
|
128
|
-
block.column_settings = [...args.columnSettings];
|
|
129
|
-
}
|
|
130
|
-
return block;
|
|
131
|
-
}
|
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Opt-in bot-to-bot mention wake (`engagement.botMentions`).
|
|
3
|
-
*
|
|
4
|
-
* Layered loop protection, any one of which blocks a runaway chain:
|
|
5
|
-
* 1. Allowlist — only mentions from explicitly trusted bots wake the agent.
|
|
6
|
-
* 2. Own-post filter — the agent's own posts never wake it (always on).
|
|
7
|
-
* 3. Depth budget — delegation metadata carries a hop count; mentions
|
|
8
|
-
* without metadata count as depth 1. Default max is 2.
|
|
9
|
-
* 4. Thread budgets — a sliding-window rate cap plus a lifetime total per
|
|
10
|
-
* thread, so undetected ping-pong between trusted bots terminates
|
|
11
|
-
* instead of merely slowing down.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { postMessage } from "./api.js";
|
|
15
|
-
import { defaultSlackLog, type SlackLog } from "./log.js";
|
|
16
|
-
import type {
|
|
17
|
-
SlackBotMentionsOptions,
|
|
18
|
-
SlackBotToken,
|
|
19
|
-
SlackDelegationInfo,
|
|
20
|
-
SlackMessage,
|
|
21
|
-
} from "./types.js";
|
|
22
|
-
|
|
23
|
-
/** Slack message `metadata.event_type` for Agent SDK delegation posts. */
|
|
24
|
-
export const SLACK_DELEGATION_METADATA_EVENT_TYPE = "agentkit_delegation";
|
|
25
|
-
|
|
26
|
-
/** Default budgets for {@link SlackBotMentionsOptions}. */
|
|
27
|
-
export const SLACK_BOT_MENTION_DEFAULTS = {
|
|
28
|
-
maxDepth: 2,
|
|
29
|
-
maxPerThreadPerHour: 5,
|
|
30
|
-
maxPerThreadTotal: 20,
|
|
31
|
-
} as const;
|
|
32
|
-
|
|
33
|
-
const THREAD_BUDGET_WINDOW_MS = 60 * 60 * 1000;
|
|
34
|
-
/** Threads idle this long are evicted (their lifetime budget resets). */
|
|
35
|
-
const THREAD_IDLE_EVICT_MS = 24 * 60 * 60 * 1000;
|
|
36
|
-
/** Eviction sweep runs when the thread map grows past this many keys. */
|
|
37
|
-
const THREAD_SWEEP_THRESHOLD = 512;
|
|
38
|
-
|
|
39
|
-
function asRecord(value: unknown): Record<string, unknown> | null {
|
|
40
|
-
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
return value as Record<string, unknown>;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Parse delegation metadata off a raw Slack event (`event.metadata`).
|
|
48
|
-
* Returns undefined for absent, foreign, or malformed metadata.
|
|
49
|
-
*/
|
|
50
|
-
export function parseDelegationMetadata(event: unknown): SlackDelegationInfo | undefined {
|
|
51
|
-
const root = asRecord(event);
|
|
52
|
-
const metadata = asRecord(root?.metadata);
|
|
53
|
-
if (metadata === null || metadata.event_type !== SLACK_DELEGATION_METADATA_EVENT_TYPE) {
|
|
54
|
-
return undefined;
|
|
55
|
-
}
|
|
56
|
-
const payload = asRecord(metadata.event_payload);
|
|
57
|
-
if (payload === null) {
|
|
58
|
-
return undefined;
|
|
59
|
-
}
|
|
60
|
-
const depth =
|
|
61
|
-
typeof payload.depth === "number" && Number.isFinite(payload.depth)
|
|
62
|
-
? Math.floor(payload.depth)
|
|
63
|
-
: undefined;
|
|
64
|
-
if (depth === undefined || depth < 1) {
|
|
65
|
-
return undefined;
|
|
66
|
-
}
|
|
67
|
-
const info: SlackDelegationInfo = { depth };
|
|
68
|
-
if (typeof payload.from_agent === "string" && payload.from_agent !== "") {
|
|
69
|
-
info.fromAgent = payload.from_agent;
|
|
70
|
-
}
|
|
71
|
-
if (typeof payload.origin_session_id === "string" && payload.origin_session_id !== "") {
|
|
72
|
-
info.originSessionId = payload.origin_session_id;
|
|
73
|
-
}
|
|
74
|
-
return info;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** Build the Slack `metadata` body for an outbound delegation post. */
|
|
78
|
-
export function buildDelegationMetadata(args: {
|
|
79
|
-
depth: number;
|
|
80
|
-
fromAgent?: string;
|
|
81
|
-
originSessionId?: string;
|
|
82
|
-
}): Record<string, unknown> {
|
|
83
|
-
const payload: Record<string, unknown> = { depth: args.depth };
|
|
84
|
-
if (args.fromAgent !== undefined && args.fromAgent !== "") {
|
|
85
|
-
payload.from_agent = args.fromAgent;
|
|
86
|
-
}
|
|
87
|
-
if (args.originSessionId !== undefined && args.originSessionId !== "") {
|
|
88
|
-
payload.origin_session_id = args.originSessionId;
|
|
89
|
-
}
|
|
90
|
-
return {
|
|
91
|
-
event_type: SLACK_DELEGATION_METADATA_EVENT_TYPE,
|
|
92
|
-
event_payload: payload,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Validate and normalize a `botMentions.allowFrom` list. Shared by channel
|
|
98
|
-
* construction (fail at definition time) and the gate (fail at start).
|
|
99
|
-
*/
|
|
100
|
-
export function normalizeBotMentionAllowlist(allowFrom: readonly string[]): string[] {
|
|
101
|
-
const entries = allowFrom.map(entry => entry.trim()).filter(entry => entry !== "");
|
|
102
|
-
if (entries.length === 0) {
|
|
103
|
-
throw new Error(
|
|
104
|
-
"slackChannel engagement.botMentions.allowFrom must list at least one bot id (B…) or bot user id (U…); there is no wildcard.",
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
return entries;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Read `engagement.botMentions` options from the environment: a
|
|
112
|
-
* comma-separated bot-id allowlist in `AGENT_DELEGATOR_SLACK_BOT_IDS` (or a
|
|
113
|
-
* custom var). Returns undefined when unset, so channels can pass the
|
|
114
|
-
* result straight through and stay bot-mention-free by default:
|
|
115
|
-
*
|
|
116
|
-
* ```ts
|
|
117
|
-
* engagement: { botMentions: botMentionsFromEnv() }
|
|
118
|
-
* ```
|
|
119
|
-
*/
|
|
120
|
-
export function botMentionsFromEnv(
|
|
121
|
-
envVar = "AGENT_DELEGATOR_SLACK_BOT_IDS",
|
|
122
|
-
): SlackBotMentionsOptions | undefined {
|
|
123
|
-
const allowFrom = (process.env[envVar] ?? "")
|
|
124
|
-
.split(",")
|
|
125
|
-
.map(entry => entry.trim())
|
|
126
|
-
.filter(entry => entry !== "");
|
|
127
|
-
return allowFrom.length === 0 ? undefined : { allowFrom };
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export type SlackBotMentionVerdict =
|
|
131
|
-
| { allow: true; depth: number }
|
|
132
|
-
| { allow: false; reason: string };
|
|
133
|
-
|
|
134
|
-
interface ThreadBudget {
|
|
135
|
-
/** Lifetime admitted wakes for this thread (until idle eviction). */
|
|
136
|
-
total: number;
|
|
137
|
-
/** Timestamps of recent admitted wakes (pruned to the window). */
|
|
138
|
-
recent: number[];
|
|
139
|
-
lastAtMs: number;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Admission gate for bot-authored mentions. One instance per channel;
|
|
144
|
-
* thread budgets are in-memory (reset on restart — acceptable, the depth
|
|
145
|
-
* and allowlist layers do not depend on process state). Threads idle for
|
|
146
|
-
* 24h are evicted, which also resets their lifetime budget.
|
|
147
|
-
*/
|
|
148
|
-
export class SlackBotMentionGate {
|
|
149
|
-
private readonly allowFrom: Set<string>;
|
|
150
|
-
/** Compound entries: posting `bot_id` → allowed lowercase usernames. */
|
|
151
|
-
private readonly allowFromCompound: Map<string, Set<string>>;
|
|
152
|
-
private readonly maxDepth: number;
|
|
153
|
-
private readonly maxPerThreadPerHour: number;
|
|
154
|
-
private readonly maxPerThreadTotal: number;
|
|
155
|
-
private readonly windowMs: number;
|
|
156
|
-
private readonly threadBudgets = new Map<string, ThreadBudget>();
|
|
157
|
-
private readonly log: SlackLog;
|
|
158
|
-
|
|
159
|
-
constructor(
|
|
160
|
-
options: SlackBotMentionsOptions,
|
|
161
|
-
private readonly identity: { botUserId?: string; botId?: string },
|
|
162
|
-
args?: { log?: SlackLog; windowMs?: number },
|
|
163
|
-
) {
|
|
164
|
-
if (identity.botUserId === undefined && identity.botId === undefined) {
|
|
165
|
-
throw new Error(
|
|
166
|
-
"SlackBotMentionGate requires the agent's own bot identity (auth.test) for loop safety.",
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
this.allowFrom = new Set();
|
|
170
|
-
this.allowFromCompound = new Map();
|
|
171
|
-
for (const entry of normalizeBotMentionAllowlist(options.allowFrom)) {
|
|
172
|
-
const separator = entry.indexOf(":");
|
|
173
|
-
if (separator <= 0 || separator === entry.length - 1) {
|
|
174
|
-
this.allowFrom.add(entry);
|
|
175
|
-
continue;
|
|
176
|
-
}
|
|
177
|
-
const botId = entry.slice(0, separator);
|
|
178
|
-
const username = entry.slice(separator + 1).toLowerCase();
|
|
179
|
-
const usernames = this.allowFromCompound.get(botId) ?? new Set();
|
|
180
|
-
usernames.add(username);
|
|
181
|
-
this.allowFromCompound.set(botId, usernames);
|
|
182
|
-
}
|
|
183
|
-
this.maxDepth = options.maxDepth ?? SLACK_BOT_MENTION_DEFAULTS.maxDepth;
|
|
184
|
-
this.maxPerThreadPerHour =
|
|
185
|
-
options.maxPerThreadPerHour ?? SLACK_BOT_MENTION_DEFAULTS.maxPerThreadPerHour;
|
|
186
|
-
this.maxPerThreadTotal =
|
|
187
|
-
options.maxPerThreadTotal ?? SLACK_BOT_MENTION_DEFAULTS.maxPerThreadTotal;
|
|
188
|
-
this.windowMs = args?.windowMs ?? THREAD_BUDGET_WINDOW_MS;
|
|
189
|
-
this.log = args?.log ?? defaultSlackLog;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Evaluate a bot-authored mention. Callers must only pass messages whose
|
|
194
|
-
* author `isBot`; human mentions never consult the gate. An `allow`
|
|
195
|
-
* verdict consumes thread budget.
|
|
196
|
-
*/
|
|
197
|
-
evaluate(message: SlackMessage, nowMs: number = Date.now()): SlackBotMentionVerdict {
|
|
198
|
-
const author = message.author;
|
|
199
|
-
if (author === undefined || !author.isBot) {
|
|
200
|
-
return { allow: false, reason: "not bot-authored" };
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// Own posts never wake the agent, allowlisted or not.
|
|
204
|
-
if (
|
|
205
|
-
(this.identity.botId !== undefined && author.botId === this.identity.botId) ||
|
|
206
|
-
(this.identity.botUserId !== undefined &&
|
|
207
|
-
author.userId !== "" &&
|
|
208
|
-
author.userId === this.identity.botUserId)
|
|
209
|
-
) {
|
|
210
|
-
return { allow: false, reason: "own post (loop safety)" };
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
const compoundUsernames =
|
|
214
|
-
author.botId === undefined ? undefined : this.allowFromCompound.get(author.botId);
|
|
215
|
-
const allowed =
|
|
216
|
-
(author.botId !== undefined && this.allowFrom.has(author.botId)) ||
|
|
217
|
-
(author.userId !== "" && this.allowFrom.has(author.userId)) ||
|
|
218
|
-
// Compound entry: shared app bot_id + server-pinned username. Fails
|
|
219
|
-
// closed when the event carries no username.
|
|
220
|
-
(compoundUsernames !== undefined &&
|
|
221
|
-
author.userName !== undefined &&
|
|
222
|
-
compoundUsernames.has(author.userName.toLowerCase()));
|
|
223
|
-
if (!allowed) {
|
|
224
|
-
return { allow: false, reason: "author not in botMentions.allowFrom" };
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
const depth = message.delegation?.depth ?? 1;
|
|
228
|
-
if (depth > this.maxDepth) {
|
|
229
|
-
return {
|
|
230
|
-
allow: false,
|
|
231
|
-
reason: `delegation depth ${depth} exceeds max ${this.maxDepth}`,
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
this.maybeEvictIdleThreads(nowMs);
|
|
236
|
-
const key = `${message.channelId}:${message.threadTs}`;
|
|
237
|
-
const budget = this.threadBudgets.get(key) ?? {
|
|
238
|
-
total: 0,
|
|
239
|
-
recent: [],
|
|
240
|
-
lastAtMs: nowMs,
|
|
241
|
-
};
|
|
242
|
-
budget.recent = budget.recent.filter(atMs => atMs > nowMs - this.windowMs);
|
|
243
|
-
if (budget.total >= this.maxPerThreadTotal) {
|
|
244
|
-
return {
|
|
245
|
-
allow: false,
|
|
246
|
-
reason: `thread lifetime budget exhausted (${this.maxPerThreadTotal})`,
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
if (budget.recent.length >= this.maxPerThreadPerHour) {
|
|
250
|
-
return {
|
|
251
|
-
allow: false,
|
|
252
|
-
reason: `thread rate budget exhausted (${this.maxPerThreadPerHour}/window)`,
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
budget.total += 1;
|
|
256
|
-
budget.recent.push(nowMs);
|
|
257
|
-
budget.lastAtMs = nowMs;
|
|
258
|
-
this.threadBudgets.set(key, budget);
|
|
259
|
-
this.log.info("bot mention admitted", {
|
|
260
|
-
channel: message.channelId,
|
|
261
|
-
thread_ts: message.threadTs,
|
|
262
|
-
from_bot: author.botId ?? author.userId,
|
|
263
|
-
depth,
|
|
264
|
-
thread_total: budget.total,
|
|
265
|
-
});
|
|
266
|
-
return { allow: true, depth };
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
private maybeEvictIdleThreads(nowMs: number): void {
|
|
270
|
-
if (this.threadBudgets.size < THREAD_SWEEP_THRESHOLD) {
|
|
271
|
-
return;
|
|
272
|
-
}
|
|
273
|
-
for (const [key, budget] of this.threadBudgets) {
|
|
274
|
-
if (nowMs - budget.lastAtMs > THREAD_IDLE_EVICT_MS) {
|
|
275
|
-
this.threadBudgets.delete(key);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* Post an @mention of another bot with delegation metadata attached, so the
|
|
283
|
-
* target's `engagement.botMentions` gate can read the hop count. Use this
|
|
284
|
-
* from dispatcher tools instead of a bare `chat.postMessage`.
|
|
285
|
-
*/
|
|
286
|
-
export async function postDelegationMention(args: {
|
|
287
|
-
botToken: SlackBotToken | undefined;
|
|
288
|
-
channelId: string;
|
|
289
|
-
/** Target bot's Slack *user* id (`U…`) — what `<@…>` mentions require. */
|
|
290
|
-
targetUserId: string;
|
|
291
|
-
text: string;
|
|
292
|
-
threadTs?: string;
|
|
293
|
-
/** Defaults to 1 (dispatcher woken by a human). */
|
|
294
|
-
depth?: number;
|
|
295
|
-
fromAgent?: string;
|
|
296
|
-
originSessionId?: string;
|
|
297
|
-
}): Promise<{ ts: string }> {
|
|
298
|
-
const posted = await postMessage({
|
|
299
|
-
botToken: args.botToken,
|
|
300
|
-
channel: args.channelId,
|
|
301
|
-
text: `<@${args.targetUserId}> ${args.text}`.trim(),
|
|
302
|
-
threadTs: args.threadTs,
|
|
303
|
-
// Mention markup only notifies via mrkdwn `text`, and metadata must
|
|
304
|
-
// ride the same chat.postMessage call.
|
|
305
|
-
plainText: true,
|
|
306
|
-
metadata: buildDelegationMetadata({
|
|
307
|
-
depth: args.depth ?? 1,
|
|
308
|
-
fromAgent: args.fromAgent,
|
|
309
|
-
originSessionId: args.originSessionId,
|
|
310
|
-
}),
|
|
311
|
-
});
|
|
312
|
-
if (posted.ts === "") {
|
|
313
|
-
throw new Error(
|
|
314
|
-
"Slack delegation mention posted without a message ts; cannot track the handoff.",
|
|
315
|
-
);
|
|
316
|
-
}
|
|
317
|
-
return { ts: posted.ts };
|
|
318
|
-
}
|