@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,744 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `slackChannel()` — platform channel pack for Slack.
|
|
3
|
-
*
|
|
4
|
-
* Local / self-hosted transport is Socket Mode: inbound events arrive over
|
|
5
|
-
* a WebSocket (`SLACK_APP_TOKEN`); no public Request URL or Events HTTP
|
|
6
|
-
* route is required. When `toolApprovals` is enabled, Approve/Deny buttons
|
|
7
|
-
* arrive as Socket Mode `interactive` envelopes.
|
|
8
|
-
*
|
|
9
|
-
* Hosted v2 transport is the control plane's Events API ingest: the CP
|
|
10
|
-
* verifies the managed app's signature, fans out on the declared
|
|
11
|
-
* `slackEventTypes` (`app_mention`, `message`), and delivers the full
|
|
12
|
-
* `event_callback` body through hosted admission — the attached adapter
|
|
13
|
-
* routes it through the same inbound dispatch as Socket Mode. Hosted pods
|
|
14
|
-
* skip Socket Mode entirely, so they never need an app token.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { allowAll, defineChannel } from "../../channels.js";
|
|
18
|
-
import { skipped, withPropagatingBackgroundErrors } from "../../internal/channel-dispatch.js";
|
|
19
|
-
import { continuationSource, normalizeIdentity } from "../../internal/continuation-identity.js";
|
|
20
|
-
import { AGENT_SERVE_GENERATION_ENV_VAR } from "../../internal/cursor-relay-core.js";
|
|
21
|
-
import { attachHostedAdmissionAdapter } from "../../internal/hosted-admission-adapter.js";
|
|
22
|
-
import type { HostedAdmissionPlatformHandoff } from "../../internal/hosted-delivery-protocol.js";
|
|
23
|
-
import type {
|
|
24
|
-
ArtifactsApi,
|
|
25
|
-
ChannelDefinition,
|
|
26
|
-
ChannelEventHandlers,
|
|
27
|
-
ChannelHandlerArgs,
|
|
28
|
-
HostContext,
|
|
29
|
-
JsonValue,
|
|
30
|
-
ReceiveInput,
|
|
31
|
-
SendMessageFn,
|
|
32
|
-
} from "../../types.js";
|
|
33
|
-
import { slackContinuationKey } from "./api.js";
|
|
34
|
-
import { defaultSlackAuth } from "./auth.js";
|
|
35
|
-
import {
|
|
36
|
-
normalizeBotMentionAllowlist,
|
|
37
|
-
SLACK_BOT_MENTION_DEFAULTS,
|
|
38
|
-
SlackBotMentionGate,
|
|
39
|
-
} from "./bot-mentions.js";
|
|
40
|
-
import {
|
|
41
|
-
type ChannelPostWatcher,
|
|
42
|
-
channelPostsWatchEverywhere,
|
|
43
|
-
createChannelPostWatcher,
|
|
44
|
-
resolveChannelNames,
|
|
45
|
-
SlackChannelAllowlist,
|
|
46
|
-
validateChannelPostsAllow,
|
|
47
|
-
} from "./channel-watch.js";
|
|
48
|
-
import {
|
|
49
|
-
credentialsFromEnv,
|
|
50
|
-
slackEnvKeys,
|
|
51
|
-
tryResolveAppToken,
|
|
52
|
-
tryResolveBotToken,
|
|
53
|
-
} from "./credentials.js";
|
|
54
|
-
import {
|
|
55
|
-
buildDefaultEvents,
|
|
56
|
-
createDefaultOnChannelPost,
|
|
57
|
-
createDefaultOnInbound,
|
|
58
|
-
resolveSlackBlockExternals,
|
|
59
|
-
resolveSlackRespondTo,
|
|
60
|
-
} from "./defaults.js";
|
|
61
|
-
import {
|
|
62
|
-
dispatchInboundFromEventBody,
|
|
63
|
-
dispatchInboundMessage,
|
|
64
|
-
emptySlackChannelState,
|
|
65
|
-
type SlackInboundDispatchDeps,
|
|
66
|
-
slackWakeChannelState,
|
|
67
|
-
} from "./dispatch.js";
|
|
68
|
-
import { createEventIdDedupe, type EventIdDedupe } from "./event-id-dedupe.js";
|
|
69
|
-
import { parseChannelMessageEvent, parseEventBodyBotUserId } from "./inbound.js";
|
|
70
|
-
import { dispatchBlockAction, dispatchInteractiveFromPayload } from "./interactive.js";
|
|
71
|
-
import { createSlackLogger, type SlackLog } from "./log.js";
|
|
72
|
-
import { DEFAULT_ACK, resolveSlackReply } from "./reply-options.js";
|
|
73
|
-
import {
|
|
74
|
-
type SlackSocketModeHandle,
|
|
75
|
-
type SlackSocketModeOptions,
|
|
76
|
-
startSlackSocketMode,
|
|
77
|
-
} from "./socket-mode.js";
|
|
78
|
-
import { buildToolApprovalEvents } from "./tool-approval-events.js";
|
|
79
|
-
import type {
|
|
80
|
-
SlackAccessPolicy,
|
|
81
|
-
SlackChannelOptions,
|
|
82
|
-
SlackChannelState,
|
|
83
|
-
SlackCredentials,
|
|
84
|
-
SlackMessageHandler,
|
|
85
|
-
} from "./types.js";
|
|
86
|
-
|
|
87
|
-
/** Options used to construct a slack channel — for host-level credential binding. */
|
|
88
|
-
const slackChannelOptionsByDefinition = new WeakMap<object, SlackChannelOptions>();
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Recover the {@link SlackChannelOptions} used to build a channel definition,
|
|
92
|
-
* if it was created via {@link slackChannel}.
|
|
93
|
-
*/
|
|
94
|
-
export function getSlackChannelOptions(definition: object): SlackChannelOptions | undefined {
|
|
95
|
-
return slackChannelOptionsByDefinition.get(definition);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** Dedicated Socket Mode credentials for `ctx.host.slack.getClient()`. */
|
|
99
|
-
export interface SlackChannelHostBinding {
|
|
100
|
-
credentials: SlackCredentials;
|
|
101
|
-
envPrefix?: string;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* First Slack channel on a project. Used for
|
|
106
|
-
* {@link HostContext.slack.getClient}.
|
|
107
|
-
*/
|
|
108
|
-
export function resolveDedicatedSlackHostBinding(
|
|
109
|
-
channels: ReadonlyArray<{ definition: object }>,
|
|
110
|
-
): SlackChannelHostBinding | undefined {
|
|
111
|
-
for (const channel of channels) {
|
|
112
|
-
const options = slackChannelOptionsByDefinition.get(channel.definition);
|
|
113
|
-
if (options === undefined) {
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
return {
|
|
117
|
-
credentials: options.credentials ?? credentialsFromEnv(options.envPrefix),
|
|
118
|
-
envPrefix: options.envPrefix,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
return undefined;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function authOnlyInbound(
|
|
125
|
-
policy: SlackAccessPolicy | undefined,
|
|
126
|
-
engagement?: "channel_post",
|
|
127
|
-
): SlackMessageHandler {
|
|
128
|
-
const respondTo = resolveSlackRespondTo(policy);
|
|
129
|
-
return async (ctx, message) => {
|
|
130
|
-
const auth = defaultSlackAuth(message, ctx, { engagement, respondTo });
|
|
131
|
-
return auth === null ? null : { auth };
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Create a Slack channel. Author as `agent/channels/slack.ts` default export.
|
|
137
|
-
*
|
|
138
|
-
* Missing credentials are not an error: without a token pair the channel
|
|
139
|
-
* mounts idle and logs `channel idle`, so serving an agent never blocks
|
|
140
|
-
* on Slack setup.
|
|
141
|
-
*/
|
|
142
|
-
export function slackChannel(
|
|
143
|
-
authored: SlackChannelOptions = {},
|
|
144
|
-
): ChannelDefinition<SlackChannelState> {
|
|
145
|
-
const options = { ...authored };
|
|
146
|
-
if (options.continuation !== undefined) {
|
|
147
|
-
options.continuation = normalizeIdentity(options.continuation, "slack");
|
|
148
|
-
}
|
|
149
|
-
const credentials = options.credentials ?? credentialsFromEnv(options.envPrefix);
|
|
150
|
-
const envKeys = slackEnvKeys(options.envPrefix);
|
|
151
|
-
const reply = resolveSlackReply(options);
|
|
152
|
-
const loadingMessages = reply.status.idle;
|
|
153
|
-
const policy = options.policy;
|
|
154
|
-
const blockExternals = resolveSlackBlockExternals(policy);
|
|
155
|
-
const silent = reply.mode === "agentic";
|
|
156
|
-
const defaultInbound = silent
|
|
157
|
-
? authOnlyInbound(policy)
|
|
158
|
-
: createDefaultOnInbound(loadingMessages, policy);
|
|
159
|
-
const onAppMention = options.onAppMention ?? defaultInbound;
|
|
160
|
-
const onDirectMessage = options.onDirectMessage ?? defaultInbound;
|
|
161
|
-
const onReactionAdded = options.onReactionAdded;
|
|
162
|
-
const onChannelPost =
|
|
163
|
-
options.onChannelPost ??
|
|
164
|
-
(silent
|
|
165
|
-
? authOnlyInbound(policy, "channel_post")
|
|
166
|
-
: createDefaultOnChannelPost(loadingMessages, policy));
|
|
167
|
-
const engagement = options.engagement ?? {};
|
|
168
|
-
const mentionsEnabled = engagement.mentions !== false;
|
|
169
|
-
const directMessagesEnabled = engagement.directMessages !== false;
|
|
170
|
-
const evalCommandsEnabled = options.evalCommands !== false;
|
|
171
|
-
const followUpStatus = options.followUpStatus ?? !silent;
|
|
172
|
-
const channelPosts = engagement.channelPosts;
|
|
173
|
-
if (channelPosts !== undefined) {
|
|
174
|
-
const allowError = validateChannelPostsAllow(channelPosts.allow);
|
|
175
|
-
if (allowError !== undefined) {
|
|
176
|
-
throw new Error(`slackChannel engagement.channelPosts.allow ${allowError}`);
|
|
177
|
-
}
|
|
178
|
-
if (channelPostsWatchEverywhere(channelPosts.allow) && channelPosts.posts !== "replies") {
|
|
179
|
-
throw new Error(
|
|
180
|
-
'slackChannel engagement.channelPosts: "*" watches every channel the bot is in, thread replies only. Set posts: "replies".',
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
const botMentions = engagement.botMentions;
|
|
185
|
-
if (botMentions !== undefined) {
|
|
186
|
-
normalizeBotMentionAllowlist(botMentions.allowFrom);
|
|
187
|
-
}
|
|
188
|
-
const eventIds = createEventIdDedupe();
|
|
189
|
-
// Hosted v2 event capability, matching what the engagement flags can
|
|
190
|
-
// dispatch: mentions ride `app_mention`; DMs and watched channel posts
|
|
191
|
-
// both arrive as `message`. Membership of `slack.thread/v2` admits
|
|
192
|
-
// exactly these two, so `reaction_added` (hosted follow-up only inside
|
|
193
|
-
// an existing thread) is deliberately not declared.
|
|
194
|
-
const slackEventTypes: string[] = [];
|
|
195
|
-
if (mentionsEnabled) {
|
|
196
|
-
slackEventTypes.push("app_mention");
|
|
197
|
-
}
|
|
198
|
-
if (directMessagesEnabled || channelPosts !== undefined) {
|
|
199
|
-
slackEventTypes.push("message");
|
|
200
|
-
}
|
|
201
|
-
const toolApprovals = options.toolApprovals === true;
|
|
202
|
-
const interactivity = options.interactivity === true;
|
|
203
|
-
const onBlockAction = options.onBlockAction;
|
|
204
|
-
const routeInteractive = toolApprovals || interactivity || onBlockAction !== undefined;
|
|
205
|
-
|
|
206
|
-
const runtime: { log: SlackLog } = {
|
|
207
|
-
log: createSlackLogger(options.logger),
|
|
208
|
-
};
|
|
209
|
-
const getLog = (): SlackLog => runtime.log;
|
|
210
|
-
|
|
211
|
-
const events: ChannelEventHandlers<SlackChannelState> = {};
|
|
212
|
-
if (options.deliverDefaults !== false) {
|
|
213
|
-
Object.assign(
|
|
214
|
-
events,
|
|
215
|
-
buildDefaultEvents({
|
|
216
|
-
credentials,
|
|
217
|
-
reply: options.reply,
|
|
218
|
-
toolLabels: options.toolLabels,
|
|
219
|
-
streaming: options.streaming,
|
|
220
|
-
thinkingSteps: options.thinkingSteps,
|
|
221
|
-
loadingMessages: options.loadingMessages,
|
|
222
|
-
suggestedPrompts: options.suggestedPrompts,
|
|
223
|
-
suggestedPromptsTitle: options.suggestedPromptsTitle,
|
|
224
|
-
getLog,
|
|
225
|
-
}),
|
|
226
|
-
);
|
|
227
|
-
}
|
|
228
|
-
if (toolApprovals) {
|
|
229
|
-
Object.assign(events, buildToolApprovalEvents({ credentials, getLog, status: !silent }));
|
|
230
|
-
}
|
|
231
|
-
Object.assign(events, options.events);
|
|
232
|
-
|
|
233
|
-
let socketHandle: SlackSocketModeHandle | null = null;
|
|
234
|
-
let channelWatch: ChannelPostWatcher | undefined;
|
|
235
|
-
let botMentionGate: SlackBotMentionGate | undefined;
|
|
236
|
-
|
|
237
|
-
// Hosted admission never runs the Socket Mode branch of `onStart`, so the
|
|
238
|
-
// channel watch is built per delivery there. The allowlist and its `#name`
|
|
239
|
-
// resolution are shared across the pod; the bot's identity comes from the
|
|
240
|
-
// verified envelope.
|
|
241
|
-
let hostedAllowlist: SlackChannelAllowlist | undefined;
|
|
242
|
-
let hostedAllowlistReady: Promise<void> | undefined;
|
|
243
|
-
|
|
244
|
-
async function resolveHostedAllowlistNames(allowlist: SlackChannelAllowlist): Promise<void> {
|
|
245
|
-
const names = allowlist.unresolvedNames();
|
|
246
|
-
if (names.length === 0) {
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
try {
|
|
250
|
-
const botToken = await tryResolveBotToken(credentials);
|
|
251
|
-
if (botToken === undefined) {
|
|
252
|
-
getLog().error("channel watch setup degraded", {
|
|
253
|
-
error: "no bot token; #name entries stay unresolved",
|
|
254
|
-
});
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
const { WebClient } = await import("@slack/web-api");
|
|
258
|
-
allowlist.applyResolvedNames(
|
|
259
|
-
await resolveChannelNames(new WebClient(botToken), names, getLog()),
|
|
260
|
-
);
|
|
261
|
-
} catch (error) {
|
|
262
|
-
getLog().error("channel watch setup degraded", {
|
|
263
|
-
error: error instanceof Error ? error.message : String(error),
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
/**
|
|
269
|
-
* Only a channel post needs the watcher, so mentions and DMs never wait on
|
|
270
|
-
* it, and a channel already matched by id never waits on `#name` resolution.
|
|
271
|
-
*/
|
|
272
|
-
async function hostedChannelWatch(
|
|
273
|
-
payload: unknown,
|
|
274
|
-
args: ChannelHandlerArgs,
|
|
275
|
-
platformHandoff: HostedAdmissionPlatformHandoff | undefined,
|
|
276
|
-
): Promise<ChannelPostWatcher | undefined> {
|
|
277
|
-
if (channelPosts === undefined) {
|
|
278
|
-
return undefined;
|
|
279
|
-
}
|
|
280
|
-
const channelEvent = parseChannelMessageEvent(payload, {
|
|
281
|
-
includeBotAuthored: true,
|
|
282
|
-
});
|
|
283
|
-
if (channelEvent === null || channelEvent.kind === "deleted") {
|
|
284
|
-
return undefined;
|
|
285
|
-
}
|
|
286
|
-
hostedAllowlist ??= new SlackChannelAllowlist(channelPosts.allow);
|
|
287
|
-
if (
|
|
288
|
-
!hostedAllowlist.matches(channelEvent.message.channelId) &&
|
|
289
|
-
hostedAllowlist.unresolvedNames().length > 0
|
|
290
|
-
) {
|
|
291
|
-
hostedAllowlistReady ??= resolveHostedAllowlistNames(hostedAllowlist);
|
|
292
|
-
await hostedAllowlistReady;
|
|
293
|
-
}
|
|
294
|
-
const botUserId = parseEventBodyBotUserId(payload);
|
|
295
|
-
return createChannelPostWatcher({
|
|
296
|
-
// Admission answers before a debounce timer could fire; edits arrive
|
|
297
|
-
// as their own deliveries and the edge drops them.
|
|
298
|
-
options: { ...channelPosts, debounceMs: 0 },
|
|
299
|
-
allowlist: hostedAllowlist,
|
|
300
|
-
getBotUserId: () => botUserId,
|
|
301
|
-
log: getLog(),
|
|
302
|
-
dispatch: (message, eventId) => {
|
|
303
|
-
args.waitUntil(
|
|
304
|
-
dispatchInboundMessage({
|
|
305
|
-
kind: "channel_post",
|
|
306
|
-
message,
|
|
307
|
-
handler: onChannelPost,
|
|
308
|
-
propagateHandlerErrors: true,
|
|
309
|
-
send: args.send,
|
|
310
|
-
credentials,
|
|
311
|
-
host: args.host,
|
|
312
|
-
artifacts: args.artifacts,
|
|
313
|
-
log: getLog(),
|
|
314
|
-
evalCommandsEnabled,
|
|
315
|
-
followUpStatus,
|
|
316
|
-
ack: reply.ack,
|
|
317
|
-
blockExternals,
|
|
318
|
-
continuation: options.continuation,
|
|
319
|
-
...(args.hasContinuationSession === undefined
|
|
320
|
-
? {}
|
|
321
|
-
: { hasContinuationSession: args.hasContinuationSession }),
|
|
322
|
-
...(args.isContinuationBusy === undefined
|
|
323
|
-
? {}
|
|
324
|
-
: { isContinuationBusy: args.isContinuationBusy }),
|
|
325
|
-
...(args.getContinuationLastBotMessageTs === undefined
|
|
326
|
-
? {}
|
|
327
|
-
: {
|
|
328
|
-
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
329
|
-
}),
|
|
330
|
-
...(args.interruptContinuation === undefined
|
|
331
|
-
? {}
|
|
332
|
-
: { interruptContinuation: args.interruptContinuation }),
|
|
333
|
-
...(eventId === undefined ? {} : { eventId }),
|
|
334
|
-
...(platformHandoff === undefined ? {} : { platformHandoff }),
|
|
335
|
-
}),
|
|
336
|
-
);
|
|
337
|
-
},
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
function inboundDeps(args: {
|
|
342
|
-
send: SendMessageFn;
|
|
343
|
-
waitUntil: (promise: Promise<unknown>) => void;
|
|
344
|
-
host: HostContext;
|
|
345
|
-
artifacts: ArtifactsApi;
|
|
346
|
-
/** Override the channel-level dedupe (hosted admission passes a fresh one). */
|
|
347
|
-
eventIds?: EventIdDedupe;
|
|
348
|
-
propagateHandlerErrors?: boolean;
|
|
349
|
-
hasContinuationSession?: (continuationToken: string) => Promise<boolean>;
|
|
350
|
-
isContinuationBusy?: (continuationToken: string) => Promise<boolean>;
|
|
351
|
-
getContinuationLastBotMessageTs?: (continuationToken: string) => Promise<string | undefined>;
|
|
352
|
-
interruptContinuation?: (continuationToken: string) => Promise<boolean>;
|
|
353
|
-
platformHandoff?: SlackInboundDispatchDeps["platformHandoff"];
|
|
354
|
-
/** Per-delivery watcher (hosted); the Socket Mode watcher otherwise. */
|
|
355
|
-
channelWatch?: ChannelPostWatcher;
|
|
356
|
-
}): SlackInboundDispatchDeps {
|
|
357
|
-
const watch = args.channelWatch ?? channelWatch;
|
|
358
|
-
return {
|
|
359
|
-
send: args.send,
|
|
360
|
-
continuation: options.continuation,
|
|
361
|
-
waitUntil: args.waitUntil,
|
|
362
|
-
onAppMention,
|
|
363
|
-
onDirectMessage,
|
|
364
|
-
...(onReactionAdded === undefined ? {} : { onReactionAdded }),
|
|
365
|
-
credentials,
|
|
366
|
-
eventIds: args.eventIds ?? eventIds,
|
|
367
|
-
propagateHandlerErrors: args.propagateHandlerErrors,
|
|
368
|
-
host: args.host,
|
|
369
|
-
artifacts: args.artifacts,
|
|
370
|
-
log: getLog(),
|
|
371
|
-
mentionsEnabled,
|
|
372
|
-
directMessagesEnabled,
|
|
373
|
-
evalCommandsEnabled,
|
|
374
|
-
followUpStatus,
|
|
375
|
-
ack: reply.ack,
|
|
376
|
-
placeholder: reply.placeholder,
|
|
377
|
-
blockExternals,
|
|
378
|
-
...(args.platformHandoff === undefined ? {} : { platformHandoff: args.platformHandoff }),
|
|
379
|
-
...(args.hasContinuationSession === undefined
|
|
380
|
-
? {}
|
|
381
|
-
: { hasContinuationSession: args.hasContinuationSession }),
|
|
382
|
-
...(args.isContinuationBusy === undefined
|
|
383
|
-
? {}
|
|
384
|
-
: { isContinuationBusy: args.isContinuationBusy }),
|
|
385
|
-
...(args.getContinuationLastBotMessageTs === undefined
|
|
386
|
-
? {}
|
|
387
|
-
: {
|
|
388
|
-
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
389
|
-
}),
|
|
390
|
-
...(args.interruptContinuation === undefined
|
|
391
|
-
? {}
|
|
392
|
-
: { interruptContinuation: args.interruptContinuation }),
|
|
393
|
-
...(watch === undefined ? {} : { channelWatch: watch }),
|
|
394
|
-
...(botMentionGate === undefined ? {} : { botMentionGate }),
|
|
395
|
-
suggestedPrompts: options.suggestedPrompts,
|
|
396
|
-
suggestedPromptsTitle: options.suggestedPromptsTitle,
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
const definition = defineChannel({
|
|
401
|
-
auth: [allowAll()],
|
|
402
|
-
state: emptySlackChannelState(),
|
|
403
|
-
routes: [],
|
|
404
|
-
meta: {
|
|
405
|
-
kind: "slack",
|
|
406
|
-
// Omitted (not empty) when nothing dispatches, so fanout never
|
|
407
|
-
// materializes a subscription with no event types.
|
|
408
|
-
slackEventTypes: slackEventTypes.length === 0 ? undefined : slackEventTypes,
|
|
409
|
-
...(reply.mode === "agentic"
|
|
410
|
-
? {
|
|
411
|
-
slackReply: {
|
|
412
|
-
mode: "agentic" as const,
|
|
413
|
-
ack: reply.ack ?? DEFAULT_ACK,
|
|
414
|
-
...(reply.placeholder === undefined
|
|
415
|
-
? {}
|
|
416
|
-
: {
|
|
417
|
-
placeholder: reply.placeholder,
|
|
418
|
-
}),
|
|
419
|
-
},
|
|
420
|
-
}
|
|
421
|
-
: {}),
|
|
422
|
-
// A lone "*" stays off the manifest. Hosting already delivers a reply
|
|
423
|
-
// in a thread a mention started; publishing "*" is what the control
|
|
424
|
-
// plane rejects.
|
|
425
|
-
...(channelPosts === undefined || channelPostsWatchEverywhere(channelPosts.allow)
|
|
426
|
-
? {}
|
|
427
|
-
: { slackChannelPosts: [...channelPosts.allow] }),
|
|
428
|
-
deprecations: reply.deprecations,
|
|
429
|
-
},
|
|
430
|
-
async receive(input: ReceiveInput, { send }) {
|
|
431
|
-
const target = input.target ?? {};
|
|
432
|
-
const channelId = typeof target.channelId === "string" ? target.channelId : "";
|
|
433
|
-
if (channelId === "") {
|
|
434
|
-
throw new Error("slackChannel().receive requires target.channelId (Slack channel id).");
|
|
435
|
-
}
|
|
436
|
-
const threadTs = typeof target.threadTs === "string" ? target.threadTs : "";
|
|
437
|
-
if (threadTs === "") {
|
|
438
|
-
throw new Error("slackChannel().receive requires target.threadTs (Slack thread ts).");
|
|
439
|
-
}
|
|
440
|
-
const teamId = typeof target.teamId === "string" ? target.teamId : undefined;
|
|
441
|
-
|
|
442
|
-
getLog().info("receive handoff", {
|
|
443
|
-
channel: channelId,
|
|
444
|
-
thread_ts: threadTs,
|
|
445
|
-
team: teamId,
|
|
446
|
-
});
|
|
447
|
-
|
|
448
|
-
const state = emptySlackChannelState({
|
|
449
|
-
channelId,
|
|
450
|
-
threadTs,
|
|
451
|
-
teamId: teamId ?? null,
|
|
452
|
-
}) as unknown as JsonValue;
|
|
453
|
-
return send(input.message, {
|
|
454
|
-
auth: input.auth,
|
|
455
|
-
admission: "coalesce",
|
|
456
|
-
...(continuationSource(options.continuation, "slack") === "control-plane"
|
|
457
|
-
? {
|
|
458
|
-
claim: {
|
|
459
|
-
type: "thread" as const,
|
|
460
|
-
resource: { channelId, threadTs },
|
|
461
|
-
},
|
|
462
|
-
}
|
|
463
|
-
: {
|
|
464
|
-
continuationToken: slackContinuationKey(channelId, threadTs),
|
|
465
|
-
}),
|
|
466
|
-
state,
|
|
467
|
-
refreshState: slackWakeChannelState({
|
|
468
|
-
channelId,
|
|
469
|
-
threadTs,
|
|
470
|
-
teamId: teamId ?? null,
|
|
471
|
-
}),
|
|
472
|
-
});
|
|
473
|
-
},
|
|
474
|
-
events,
|
|
475
|
-
async onStart(args) {
|
|
476
|
-
runtime.log = createSlackLogger(args.logger ?? options.logger);
|
|
477
|
-
|
|
478
|
-
// Cursor-managed v2 receives inbound events through the control-plane
|
|
479
|
-
// adapter attached below. Do not also start (or warn about) the local
|
|
480
|
-
// Socket Mode transport: hosted outbound replies need only the bot token.
|
|
481
|
-
if (args.architecture === "v2" && process.env[AGENT_SERVE_GENERATION_ENV_VAR] !== undefined) {
|
|
482
|
-
getLog().info("channel start", { transport: "events-api" });
|
|
483
|
-
return;
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
getLog().info("channel start", { transport: "socket" });
|
|
487
|
-
|
|
488
|
-
const appToken = await tryResolveAppToken(credentials);
|
|
489
|
-
const botToken = await tryResolveBotToken(credentials);
|
|
490
|
-
if (appToken === undefined || botToken === undefined) {
|
|
491
|
-
getLog().info("channel idle", {
|
|
492
|
-
reason: "missing credentials",
|
|
493
|
-
need: `${envKeys.bot} and ${envKeys.app}`,
|
|
494
|
-
});
|
|
495
|
-
return;
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
let botUserId: string | undefined;
|
|
499
|
-
let botId: string | undefined;
|
|
500
|
-
let installTeamId: string | undefined;
|
|
501
|
-
let webClient: InstanceType<typeof import("@slack/web-api").WebClient> | null = null;
|
|
502
|
-
if (channelPosts !== undefined || botMentions !== undefined || routeInteractive) {
|
|
503
|
-
try {
|
|
504
|
-
const { WebClient } = await import("@slack/web-api");
|
|
505
|
-
webClient = new WebClient(botToken);
|
|
506
|
-
const identity = await webClient.auth.test();
|
|
507
|
-
botUserId = typeof identity.user_id === "string" ? identity.user_id : undefined;
|
|
508
|
-
botId = typeof identity.bot_id === "string" ? identity.bot_id : undefined;
|
|
509
|
-
installTeamId = typeof identity.team_id === "string" ? identity.team_id : undefined;
|
|
510
|
-
} catch (error) {
|
|
511
|
-
getLog().error("bot identity lookup degraded", {
|
|
512
|
-
error: error instanceof Error ? error.message : String(error),
|
|
513
|
-
});
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
if (botMentions !== undefined) {
|
|
518
|
-
if (botUserId === undefined && botId === undefined) {
|
|
519
|
-
getLog().error("bot mentions disabled", {
|
|
520
|
-
reason: "engagement.botMentions requires bot identity from auth.test (loop safety)",
|
|
521
|
-
});
|
|
522
|
-
} else {
|
|
523
|
-
botMentionGate = new SlackBotMentionGate(
|
|
524
|
-
botMentions,
|
|
525
|
-
{ botUserId, botId },
|
|
526
|
-
{ log: getLog() },
|
|
527
|
-
);
|
|
528
|
-
getLog().info("bot mentions enabled", {
|
|
529
|
-
allow_from: botMentions.allowFrom.join(","),
|
|
530
|
-
max_depth: botMentions.maxDepth ?? SLACK_BOT_MENTION_DEFAULTS.maxDepth,
|
|
531
|
-
max_per_thread_per_hour:
|
|
532
|
-
botMentions.maxPerThreadPerHour ?? SLACK_BOT_MENTION_DEFAULTS.maxPerThreadPerHour,
|
|
533
|
-
max_per_thread_total:
|
|
534
|
-
botMentions.maxPerThreadTotal ?? SLACK_BOT_MENTION_DEFAULTS.maxPerThreadTotal,
|
|
535
|
-
});
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
if (channelPosts !== undefined) {
|
|
540
|
-
const allowlist = new SlackChannelAllowlist(channelPosts.allow);
|
|
541
|
-
try {
|
|
542
|
-
const names = allowlist.unresolvedNames();
|
|
543
|
-
if (names.length > 0 && webClient !== null) {
|
|
544
|
-
allowlist.applyResolvedNames(await resolveChannelNames(webClient, names, getLog()));
|
|
545
|
-
}
|
|
546
|
-
} catch (error) {
|
|
547
|
-
getLog().error("channel watch setup degraded", {
|
|
548
|
-
error: error instanceof Error ? error.message : String(error),
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
if (
|
|
552
|
-
channelPosts.includeBotPosts === true &&
|
|
553
|
-
botUserId === undefined &&
|
|
554
|
-
botId === undefined
|
|
555
|
-
) {
|
|
556
|
-
getLog().error("channel watch disabled", {
|
|
557
|
-
reason: "includeBotPosts requires bot identity from auth.test (loop safety)",
|
|
558
|
-
});
|
|
559
|
-
} else {
|
|
560
|
-
channelWatch = createChannelPostWatcher({
|
|
561
|
-
options: channelPosts,
|
|
562
|
-
allowlist,
|
|
563
|
-
getBotUserId: () => botUserId,
|
|
564
|
-
getBotId: () => botId,
|
|
565
|
-
log: getLog(),
|
|
566
|
-
dispatch: (message, eventId) => {
|
|
567
|
-
args.waitUntil(
|
|
568
|
-
dispatchInboundMessage({
|
|
569
|
-
kind: "channel_post",
|
|
570
|
-
message,
|
|
571
|
-
handler: onChannelPost,
|
|
572
|
-
send: args.send,
|
|
573
|
-
credentials,
|
|
574
|
-
host: args.host,
|
|
575
|
-
artifacts: args.artifacts,
|
|
576
|
-
log: getLog(),
|
|
577
|
-
evalCommandsEnabled,
|
|
578
|
-
followUpStatus,
|
|
579
|
-
ack: reply.ack,
|
|
580
|
-
blockExternals,
|
|
581
|
-
continuation: options.continuation,
|
|
582
|
-
...(args.hasContinuationSession === undefined
|
|
583
|
-
? {}
|
|
584
|
-
: {
|
|
585
|
-
hasContinuationSession: args.hasContinuationSession,
|
|
586
|
-
}),
|
|
587
|
-
...(args.isContinuationBusy === undefined
|
|
588
|
-
? {}
|
|
589
|
-
: { isContinuationBusy: args.isContinuationBusy }),
|
|
590
|
-
...(args.getContinuationLastBotMessageTs === undefined
|
|
591
|
-
? {}
|
|
592
|
-
: {
|
|
593
|
-
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
594
|
-
}),
|
|
595
|
-
...(args.interruptContinuation === undefined
|
|
596
|
-
? {}
|
|
597
|
-
: {
|
|
598
|
-
interruptContinuation: args.interruptContinuation,
|
|
599
|
-
}),
|
|
600
|
-
...(eventId === undefined ? {} : { eventId }),
|
|
601
|
-
}),
|
|
602
|
-
);
|
|
603
|
-
},
|
|
604
|
-
});
|
|
605
|
-
getLog().info("channel watch enabled", {
|
|
606
|
-
channels: channelPosts.allow.join(","),
|
|
607
|
-
posts: channelPosts.posts ?? "top-level",
|
|
608
|
-
debounce_ms: channelPosts.debounceMs ?? 0,
|
|
609
|
-
});
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
const socketOptions: SlackSocketModeOptions = {
|
|
614
|
-
appToken,
|
|
615
|
-
logger: line => getLog().write(line),
|
|
616
|
-
onEvent: payload => {
|
|
617
|
-
dispatchInboundFromEventBody(
|
|
618
|
-
payload,
|
|
619
|
-
inboundDeps({
|
|
620
|
-
send: args.send,
|
|
621
|
-
waitUntil: args.waitUntil,
|
|
622
|
-
host: args.host,
|
|
623
|
-
artifacts: args.artifacts,
|
|
624
|
-
...(args.hasContinuationSession === undefined
|
|
625
|
-
? {}
|
|
626
|
-
: { hasContinuationSession: args.hasContinuationSession }),
|
|
627
|
-
...(args.isContinuationBusy === undefined
|
|
628
|
-
? {}
|
|
629
|
-
: { isContinuationBusy: args.isContinuationBusy }),
|
|
630
|
-
...(args.getContinuationLastBotMessageTs === undefined
|
|
631
|
-
? {}
|
|
632
|
-
: {
|
|
633
|
-
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
634
|
-
}),
|
|
635
|
-
...(args.interruptContinuation === undefined
|
|
636
|
-
? {}
|
|
637
|
-
: { interruptContinuation: args.interruptContinuation }),
|
|
638
|
-
}),
|
|
639
|
-
);
|
|
640
|
-
},
|
|
641
|
-
};
|
|
642
|
-
if (routeInteractive) {
|
|
643
|
-
socketOptions.onInteractive = async payload => {
|
|
644
|
-
// Framework tool-approval Approve/Deny clicks resolve first;
|
|
645
|
-
// anything else (including approval-shaped clicks whose value
|
|
646
|
-
// fails to parse) falls through to the author's block-action hook.
|
|
647
|
-
const handledAsApproval = await dispatchInteractiveFromPayload(payload, {
|
|
648
|
-
credentials,
|
|
649
|
-
getSession: args.getSession,
|
|
650
|
-
resolveApproval: args.resolveApproval,
|
|
651
|
-
resolveAuth: args.resolveAuth,
|
|
652
|
-
waitUntil: args.waitUntil,
|
|
653
|
-
log: getLog(),
|
|
654
|
-
blockExternals,
|
|
655
|
-
});
|
|
656
|
-
if (handledAsApproval || onBlockAction === undefined) {
|
|
657
|
-
return;
|
|
658
|
-
}
|
|
659
|
-
await dispatchBlockAction(payload, {
|
|
660
|
-
handler: onBlockAction,
|
|
661
|
-
send: args.send,
|
|
662
|
-
credentials,
|
|
663
|
-
host: args.host,
|
|
664
|
-
artifacts: args.artifacts,
|
|
665
|
-
log: getLog(),
|
|
666
|
-
blockExternals,
|
|
667
|
-
installTeamId,
|
|
668
|
-
hasContinuationSession: args.hasContinuationSession,
|
|
669
|
-
isContinuationBusy: args.isContinuationBusy,
|
|
670
|
-
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
671
|
-
interruptContinuation: args.interruptContinuation,
|
|
672
|
-
continuation: options.continuation,
|
|
673
|
-
});
|
|
674
|
-
};
|
|
675
|
-
}
|
|
676
|
-
try {
|
|
677
|
-
socketHandle = await startSlackSocketMode(socketOptions);
|
|
678
|
-
} catch (error) {
|
|
679
|
-
// Bad Vault tokens / revoked apps: Socket Mode fails once with
|
|
680
|
-
// invalid_auth and does not reconnect. Treat as idle so one bad
|
|
681
|
-
// Slack pack does not blow up server start with a stack dump.
|
|
682
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
683
|
-
if (message.includes("invalid_auth") || message.includes("not_authed")) {
|
|
684
|
-
getLog().info("channel idle", {
|
|
685
|
-
reason: "invalid credentials",
|
|
686
|
-
need: `${envKeys.bot} and ${envKeys.app}`,
|
|
687
|
-
});
|
|
688
|
-
return;
|
|
689
|
-
}
|
|
690
|
-
throw error;
|
|
691
|
-
}
|
|
692
|
-
},
|
|
693
|
-
onStop: async () => {
|
|
694
|
-
getLog().info("channel stop");
|
|
695
|
-
channelWatch?.stop();
|
|
696
|
-
channelWatch = undefined;
|
|
697
|
-
botMentionGate = undefined;
|
|
698
|
-
await socketHandle?.stop();
|
|
699
|
-
socketHandle = null;
|
|
700
|
-
await options.onStop?.();
|
|
701
|
-
},
|
|
702
|
-
});
|
|
703
|
-
|
|
704
|
-
slackChannelOptionsByDefinition.set(definition, options);
|
|
705
|
-
attachHostedAdmissionAdapter(definition, {
|
|
706
|
-
kind: "slack",
|
|
707
|
-
prepareArgs: withPropagatingBackgroundErrors,
|
|
708
|
-
// The payload is the full `event_callback` body the CP verified — the
|
|
709
|
-
// same shape Socket Mode unwraps — so it routes through the same
|
|
710
|
-
// inbound dispatch. Outcomes: a captured `send` overrides the fallback
|
|
711
|
-
// tag below, so `skipped` surfaces when the engagement rules declined
|
|
712
|
-
// (`not_engaged`) or no handler takes the shape (`not_dispatchable`);
|
|
713
|
-
// a throwing handler rejects `waitUntil` (propagateHandlerErrors) and
|
|
714
|
-
// hosted admission answers a retryable 503, like the PR adapters.
|
|
715
|
-
// The channel-level event_id dedupe is deliberately bypassed with a
|
|
716
|
-
// fresh instance per delivery: the control plane's app-scoped ingress
|
|
717
|
-
// claim already dedupes Slack retries, and on a warm pod the local set
|
|
718
|
-
// would otherwise swallow the control plane's own retry of a delivery
|
|
719
|
-
// that failed after the id was marked handled.
|
|
720
|
-
dispatch: async ({ payload, args, platformHandoff }) => {
|
|
721
|
-
const hostedWatch = await hostedChannelWatch(payload, args, platformHandoff);
|
|
722
|
-
const dispatched = dispatchInboundFromEventBody(
|
|
723
|
-
payload,
|
|
724
|
-
inboundDeps({
|
|
725
|
-
send: args.send,
|
|
726
|
-
waitUntil: args.waitUntil,
|
|
727
|
-
host: args.host,
|
|
728
|
-
artifacts: args.artifacts,
|
|
729
|
-
eventIds: createEventIdDedupe(),
|
|
730
|
-
propagateHandlerErrors: true,
|
|
731
|
-
hasContinuationSession: args.hasContinuationSession,
|
|
732
|
-
isContinuationBusy: args.isContinuationBusy,
|
|
733
|
-
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
734
|
-
interruptContinuation: args.interruptContinuation,
|
|
735
|
-
...(platformHandoff === undefined ? {} : { platformHandoff }),
|
|
736
|
-
...(hostedWatch === undefined ? {} : { channelWatch: hostedWatch }),
|
|
737
|
-
}),
|
|
738
|
-
);
|
|
739
|
-
return skipped(dispatched ? "not_engaged" : "not_dispatchable");
|
|
740
|
-
},
|
|
741
|
-
});
|
|
742
|
-
|
|
743
|
-
return definition;
|
|
744
|
-
}
|