@cursor/bdk 0.2.8 → 0.2.10
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/artifacts.js +3 -5
- package/dist/bin/agent-serve.d.ts +1 -0
- package/dist/bin/agent-serve.d.ts.map +1 -1
- package/dist/bin/agent-serve.js +820 -807
- package/dist/channels/bitbucket/api.js +305 -321
- package/dist/channels/bitbucket/binding.js +97 -61
- package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
- package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
- package/dist/channels/bitbucket/checks.js +9 -21
- package/dist/channels/bitbucket/cursor-account.js +1 -1
- package/dist/channels/bitbucket/defaults.js +14 -4
- package/dist/channels/bitbucket/events.js +1 -2
- package/dist/channels/bitbucket/index.d.ts +6 -2
- package/dist/channels/bitbucket/index.d.ts.map +1 -1
- package/dist/channels/bitbucket/index.js +6 -2
- package/dist/channels/bitbucket/replay.js +80 -56
- package/dist/channels/bitbucket/state.js +16 -7
- package/dist/channels/bitbucket/types.d.ts +11 -2
- package/dist/channels/bitbucket/types.d.ts.map +1 -1
- package/dist/channels/checks.js +18 -28
- package/dist/channels/deployments/deployments-channel.js +26 -34
- package/dist/channels/github/api.js +216 -210
- package/dist/channels/github/auth.d.ts +5 -1
- package/dist/channels/github/auth.d.ts.map +1 -1
- package/dist/channels/github/auth.js +157 -174
- package/dist/channels/github/binding.js +48 -39
- package/dist/channels/github/checks.js +9 -14
- package/dist/channels/github/cursor-account.js +6 -11
- package/dist/channels/github/defaults.js +105 -130
- package/dist/channels/github/forward.js +13 -17
- package/dist/channels/github/github-channel.d.ts +43 -2
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +1228 -958
- package/dist/channels/github/progress.js +145 -146
- package/dist/channels/github/replay.js +30 -39
- package/dist/channels/github/state.js +40 -16
- package/dist/channels/github/types.d.ts +30 -6
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/api.js +100 -114
- package/dist/channels/gitlab/binding.js +52 -33
- package/dist/channels/gitlab/checks.js +28 -29
- package/dist/channels/gitlab/cursor-account.js +1 -1
- package/dist/channels/gitlab/defaults.js +9 -3
- package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
- package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +95 -42
- package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
- package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-webhook.js +282 -249
- package/dist/channels/gitlab/index.d.ts +6 -2
- package/dist/channels/gitlab/index.d.ts.map +1 -1
- package/dist/channels/gitlab/index.js +6 -2
- package/dist/channels/gitlab/replay.js +50 -27
- package/dist/channels/gitlab/state.js +14 -6
- package/dist/channels/gitlab/types.d.ts +13 -2
- package/dist/channels/gitlab/types.d.ts.map +1 -1
- package/dist/channels/origin/api.js +100 -116
- package/dist/channels/origin/binding.js +15 -16
- package/dist/channels/origin/checks.js +30 -28
- package/dist/channels/origin/defaults.js +50 -65
- package/dist/channels/origin/origin-channel.js +266 -272
- package/dist/channels/origin/origin-webhook.js +70 -88
- package/dist/channels/origin/reactions.js +9 -21
- package/dist/channels/origin/state.js +13 -5
- package/dist/channels/slack/agentic-delivery.js +426 -478
- package/dist/channels/slack/agentic-posted.js +9 -10
- package/dist/channels/slack/agentic-signals.js +2 -3
- package/dist/channels/slack/api.js +417 -427
- package/dist/channels/slack/approvals.js +1 -1
- package/dist/channels/slack/assistant.js +37 -47
- package/dist/channels/slack/attachments.js +188 -206
- package/dist/channels/slack/auth.js +8 -6
- package/dist/channels/slack/bot-mentions.js +31 -45
- package/dist/channels/slack/channel-watch.js +42 -48
- package/dist/channels/slack/cli-project.js +112 -137
- package/dist/channels/slack/code-fences.js +3 -5
- package/dist/channels/slack/constants.js +2 -2
- package/dist/channels/slack/credentials.js +23 -38
- package/dist/channels/slack/defaults.js +292 -331
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +533 -460
- package/dist/channels/slack/doctor.js +200 -214
- package/dist/channels/slack/eval-directive.js +79 -96
- package/dist/channels/slack/event-id-dedupe.js +1 -1
- package/dist/channels/slack/external-policy.js +26 -39
- package/dist/channels/slack/footer.js +28 -41
- package/dist/channels/slack/inbound.d.ts +1 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +50 -31
- package/dist/channels/slack/init.d.ts +1 -5
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +42 -59
- package/dist/channels/slack/interactive.d.ts +9 -3
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +160 -162
- package/dist/channels/slack/links.js +1 -2
- package/dist/channels/slack/live-delivery.js +172 -190
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +44 -23
- package/dist/channels/slack/message-body.js +2 -2
- package/dist/channels/slack/nudge-carrier.js +30 -42
- package/dist/channels/slack/nudge-store.js +164 -191
- package/dist/channels/slack/paint-start.js +66 -81
- package/dist/channels/slack/placeholder.js +123 -152
- package/dist/channels/slack/pr-ref.js +1 -1
- package/dist/channels/slack/progress-delivery.js +65 -78
- package/dist/channels/slack/reasoning-card.js +36 -49
- package/dist/channels/slack/recording-sink.js +12 -24
- package/dist/channels/slack/reply-options.js +7 -12
- package/dist/channels/slack/self-identity.js +27 -35
- package/dist/channels/slack/sender-name.d.ts +12 -3
- package/dist/channels/slack/sender-name.d.ts.map +1 -1
- package/dist/channels/slack/sender-name.js +57 -61
- package/dist/channels/slack/setup.js +2 -4
- package/dist/channels/slack/slack-channel.d.ts +6 -4
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +441 -308
- package/dist/channels/slack/socket-mode.js +38 -52
- package/dist/channels/slack/thread-context.js +143 -160
- package/dist/channels/slack/tool-approval-events.js +149 -166
- package/dist/channels/slack/tool-cards.js +6 -11
- package/dist/channels/slack/tool-chip.js +1 -2
- package/dist/channels/slack/types.d.ts +15 -17
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/upload.js +84 -97
- package/dist/channels/slack/user-info.js +27 -41
- package/dist/channels.js +9 -20
- package/dist/dashboard-session-url.js +3 -4
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.oyjtOr3W.js → app.DXI7bwox.js} +4 -4
- package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.D0P6J_UJ.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.B0LY1J1h.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.dPduLUxY.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.B_Ohm21h.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.B4zcanaJ.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D9Iw21nx.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DDVwRShI.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DsYcdn1i.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.BzzQvcYp.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BMiXZ7FX.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.D_mBcLoc.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMVjWVMx.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BG-FrPv9.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CkFE1ap3.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BVNnCTvY.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CDN5PR9l.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DQRUlT-i.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.CoeblYQT.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DW3ymjl0.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.BP0uN4Jw.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DVFUWEn4.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.HU-eHspv.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DHNhXijY.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DkISXcO3.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CCV0fuRR.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.bgILzOoc.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CuryXC0F.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BL1Pr-wu.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BbGjvk4l.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.C4PfdldS.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.C3xD1T6X.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.CzgRAQ9c.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CA9rSWum.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B8MprgJu.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DndDwbKT.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.Zhfgwlnn.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.B6RRm6N5.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Bfmz-1PN.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.gbrdNqgj.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
- package/dist/docs/assets/chunks/{theme.gpWjytMh.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bl1l7M1f.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.Dfle4U0d.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CM_4lmvZ.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CHT5X28R.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
- package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
- package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
- package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
- package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
- package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/building-with-agents.md +2 -0
- package/dist/docs/deployment.html +38 -38
- package/dist/docs/deployment.md +7 -0
- package/dist/docs/evals.html +36 -36
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +38 -38
- package/dist/docs/guides/bitbucket.md +9 -1
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +39 -39
- package/dist/docs/guides/github.md +20 -4
- package/dist/docs/guides/gitlab.html +38 -38
- package/dist/docs/guides/gitlab.md +9 -1
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/migrate.html +66 -0
- package/dist/docs/guides/migrate.md +122 -0
- 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 +214 -6
- package/dist/docs/llms.txt +1 -0
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +39 -38
- package/dist/docs/reference/cli.md +39 -0
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +35 -35
- 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 +38 -38
- 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/grokbot-agents.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/docs/troubleshooting.md +1 -0
- package/dist/evals/assertions.js +20 -34
- package/dist/evals/expect.js +3 -6
- package/dist/evals/judge.js +5 -8
- package/dist/evals/loaders.js +45 -62
- package/dist/evals/matchers.js +2 -3
- package/dist/evals/reporters.js +43 -67
- package/dist/evals/results.js +1 -1
- package/dist/evals/run-facts.js +5 -6
- package/dist/evals.js +27 -15
- package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +0 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +101 -130
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
- package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
- package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
- package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
- package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
- package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/list.js +9 -20
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
- package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
- package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
- package/dist/extensions/jev/extension.js +3 -3
- package/dist/extensions/jev/lib/evaluate.js +43 -60
- package/dist/extensions/jev/tools/evaluate.js +6 -17
- package/dist/extensions/slack-communication/tools/post-file.js +1 -1
- package/dist/extensions.js +3 -5
- package/dist/files-backends/cursor-hosted.js +504 -523
- package/dist/files-backends/local-fs.js +72 -134
- package/dist/files.js +3 -3
- package/dist/filesystem.js +562 -861
- package/dist/index.js +16 -35
- package/dist/internal/advertise-tools.js +74 -86
- package/dist/internal/artifacts-store.js +298 -361
- package/dist/internal/as-of.js +2 -4
- package/dist/internal/authored-alias-hooks.js +6 -4
- package/dist/internal/authored-loaders.js +37 -52
- package/dist/internal/bounded-int.js +1 -2
- package/dist/internal/bounded.js +13 -24
- package/dist/internal/brand.js +1 -1
- package/dist/internal/browser-origin-guard.js +4 -4
- package/dist/internal/builtin-tools/artifacts.js +15 -27
- package/dist/internal/builtin-tools/index.js +2 -3
- package/dist/internal/builtin-tools/reminders.js +33 -52
- package/dist/internal/channel-architecture.d.ts +21 -0
- package/dist/internal/channel-architecture.d.ts.map +1 -0
- package/dist/internal/channel-architecture.js +41 -0
- package/dist/internal/channel-dispatch.js +3 -4
- package/dist/internal/channel-route-dispatch.js +40 -51
- package/dist/internal/channel-state.js +1 -1
- package/dist/internal/chat-client.js +319 -340
- package/dist/internal/cli-ax.js +1262 -1294
- package/dist/internal/cli-bitbucket.js +244 -272
- package/dist/internal/cli-convert-automation.js +137 -151
- package/dist/internal/cli-cursor.js +126 -147
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +1457 -1507
- package/dist/internal/cli-docs.js +130 -147
- package/dist/internal/cli-github.js +437 -476
- package/dist/internal/cli-gitlab.js +259 -288
- package/dist/internal/cli-images.js +266 -334
- package/dist/internal/cli-manifest.js +25 -37
- package/dist/internal/cli-mcp-oauth.js +228 -247
- package/dist/internal/cli-mcp.js +358 -383
- package/dist/internal/cli-migrate.d.ts +18 -0
- package/dist/internal/cli-migrate.d.ts.map +1 -0
- package/dist/internal/cli-migrate.js +136 -0
- package/dist/internal/cli-skills.js +35 -47
- package/dist/internal/cli-slack-manual.d.ts +0 -1
- package/dist/internal/cli-slack-manual.d.ts.map +1 -1
- package/dist/internal/cli-slack-manual.js +175 -204
- package/dist/internal/cli-slack.d.ts +1 -1
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +416 -456
- package/dist/internal/cloud-merge.js +7 -3
- package/dist/internal/cloud-turn-cost.js +8 -1
- package/dist/internal/connection-env.js +5 -6
- package/dist/internal/continuation-channel.js +10 -7
- package/dist/internal/continuation-identity.js +85 -67
- package/dist/internal/conversation-mirror.js +112 -131
- package/dist/internal/convert-automation/convert-workflow.js +21 -31
- package/dist/internal/cron.js +3 -3
- package/dist/internal/cursor/account-mcp.js +147 -146
- package/dist/internal/cursor/backend-client.js +290 -320
- package/dist/internal/cursor/bound-secret-file.js +3 -3
- package/dist/internal/cursor/credentials.d.ts +1 -0
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +130 -142
- package/dist/internal/cursor/cursor-api-transport.js +4 -8
- package/dist/internal/cursor/github-credentials.js +91 -108
- package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
- package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +5 -9
- package/dist/internal/cursor/session-token.js +36 -48
- package/dist/internal/cursor/store-api-client.js +77 -92
- package/dist/internal/cursor-account-mcp-auth.js +132 -149
- package/dist/internal/cursor-agent-template.js +1 -1
- package/dist/internal/cursor-deployment-relay.js +33 -54
- package/dist/internal/cursor-event-relay.js +65 -59
- package/dist/internal/cursor-relay-core.js +258 -286
- package/dist/internal/deferred-channel-session.js +3 -12
- package/dist/internal/deploy-client.js +410 -475
- package/dist/internal/deploy-manifest.d.ts +17 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +71 -21
- package/dist/internal/deploy-source.js +31 -43
- package/dist/internal/discovery/agent-config.js +45 -59
- package/dist/internal/discovery/agent.js +276 -280
- package/dist/internal/discovery/channels.js +67 -80
- package/dist/internal/discovery/connections.js +286 -296
- package/dist/internal/discovery/context.js +2 -13
- package/dist/internal/discovery/cursor-plugin.js +223 -259
- package/dist/internal/discovery/extension-overlay.js +104 -131
- package/dist/internal/discovery/extensions.js +276 -281
- package/dist/internal/discovery/fs.js +56 -79
- package/dist/internal/discovery/hooks.js +39 -50
- package/dist/internal/discovery/info.js +17 -19
- package/dist/internal/discovery/instructions.js +58 -71
- package/dist/internal/discovery/modules.js +45 -58
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +192 -215
- package/dist/internal/discovery/reminders.js +41 -52
- package/dist/internal/discovery/runtime.js +1 -1
- package/dist/internal/discovery/schedules.js +71 -82
- package/dist/internal/discovery/seed-files.js +21 -32
- package/dist/internal/discovery/services.js +74 -96
- package/dist/internal/discovery/skills.js +77 -94
- package/dist/internal/discovery/subagent.js +79 -95
- package/dist/internal/discovery/tools.js +12 -23
- package/dist/internal/distribution.js +2 -2
- package/dist/internal/docs-site.js +30 -45
- package/dist/internal/duration.js +1 -1
- package/dist/internal/env-file.js +48 -64
- package/dist/internal/eval-judge-model.js +17 -28
- package/dist/internal/eval-run-store.js +265 -254
- package/dist/internal/eval-runner.d.ts +8 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +406 -408
- package/dist/internal/eval-transport.d.ts +24 -0
- package/dist/internal/eval-transport.d.ts.map +1 -0
- package/dist/internal/eval-transport.js +22 -0
- package/dist/internal/evals-client.js +242 -246
- package/dist/internal/event-log.js +72 -120
- package/dist/internal/event-mapper.js +30 -31
- package/dist/internal/factory-resource-channel.js +16 -30
- package/dist/internal/filesystem/errors.js +6 -6
- package/dist/internal/filesystem/format.js +10 -13
- package/dist/internal/filesystem/merge.js +52 -94
- package/dist/internal/filesystem/nearest.js +15 -27
- package/dist/internal/filesystem/scratch.js +65 -85
- package/dist/internal/filesystem/tools.js +221 -241
- package/dist/internal/filesystem/walk.js +76 -143
- package/dist/internal/framework-file-storage.js +118 -139
- package/dist/internal/framework-storage-selection.js +21 -13
- package/dist/internal/frontmatter.js +4 -6
- package/dist/internal/github-fanout.js +50 -64
- package/dist/internal/guest-network.js +96 -109
- package/dist/internal/handleAgentServeTrigger.js +121 -126
- package/dist/internal/host-files.js +73 -88
- package/dist/internal/host-kv.js +21 -36
- package/dist/internal/host-otel.js +22 -19
- package/dist/internal/host-platforms.js +49 -63
- package/dist/internal/hosted-catch-protocol.d.ts +1 -0
- package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.js +1 -0
- package/dist/internal/hosted-catch.d.ts +5 -3
- package/dist/internal/hosted-catch.d.ts.map +1 -1
- package/dist/internal/hosted-catch.js +84 -93
- package/dist/internal/hosted-delivery-protocol.js +32 -8
- package/dist/internal/hosted-delivery.d.ts +13 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +614 -584
- package/dist/internal/hosted-eval-cases.d.ts +21 -0
- package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
- package/dist/internal/hosted-eval-cases.js +162 -0
- package/dist/internal/hosted-execution-diag.js +38 -30
- package/dist/internal/hosted-execution-flush.js +75 -66
- package/dist/internal/hosted-execution-latency.js +16 -8
- package/dist/internal/hosted-managed-automation.js +2 -2
- package/dist/internal/hosting.js +2 -3
- package/dist/internal/http-channel-define.js +4 -1
- package/dist/internal/http-channel.js +101 -112
- package/dist/internal/http-control-plane-session.d.ts +18 -1
- package/dist/internal/http-control-plane-session.d.ts.map +1 -1
- package/dist/internal/http-control-plane-session.js +66 -32
- package/dist/internal/incoming-headers-to-fetch.js +1 -2
- package/dist/internal/init-interview.js +73 -93
- package/dist/internal/init-project.js +182 -214
- package/dist/internal/init-scaffold.js +10 -21
- package/dist/internal/inline-stdio-mcp.js +80 -86
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +238 -274
- package/dist/internal/legacy-command-guard.js +18 -31
- package/dist/internal/listen-port.js +34 -45
- package/dist/internal/local-control-plane.js +293 -307
- package/dist/internal/local-env.js +1 -1
- package/dist/internal/local-ingress.js +15 -9
- package/dist/internal/log-ring.js +1 -2
- package/dist/internal/logs-client.js +207 -227
- package/dist/internal/map-pool.js +24 -38
- package/dist/internal/mcp-endpoint.js +204 -180
- package/dist/internal/mcp-host.js +165 -168
- package/dist/internal/mcp-oauth-on-demand.js +170 -207
- package/dist/internal/mcp-oauth-persist.js +15 -29
- package/dist/internal/mcp-oauth.js +209 -266
- package/dist/internal/named-webhook-secret.d.ts +39 -0
- package/dist/internal/named-webhook-secret.d.ts.map +1 -0
- package/dist/internal/named-webhook-secret.js +47 -0
- package/dist/internal/open-browser.js +2 -3
- package/dist/internal/otel/collector.js +104 -68
- package/dist/internal/otel/config.js +24 -37
- package/dist/internal/otel/http.js +5 -7
- package/dist/internal/otel/mcp.js +3 -12
- package/dist/internal/otel/runtime.js +69 -83
- package/dist/internal/package-inline-stdio.js +57 -65
- package/dist/internal/peer-connections.js +9 -5
- package/dist/internal/platform-schedule-sync.js +39 -54
- package/dist/internal/platform-timers.js +176 -210
- package/dist/internal/playground/static.js +1 -2
- package/dist/internal/playground/toolchain.js +37 -53
- package/dist/internal/playground-proxy.js +230 -270
- package/dist/internal/process-memory-telemetry.js +33 -51
- package/dist/internal/prompt-context.js +3 -6
- package/dist/internal/reminder-control-plane-protocol.js +46 -13
- package/dist/internal/reminder-runner.js +770 -785
- package/dist/internal/reminder-schedule.js +1 -1
- package/dist/internal/reminder-store.js +57 -78
- package/dist/internal/request-error-status.js +1 -3
- package/dist/internal/request-headers.js +2 -2
- package/dist/internal/resolve-prod-target.js +119 -135
- package/dist/internal/resolved-connections.js +16 -6
- package/dist/internal/run-client.js +221 -229
- package/dist/internal/runtime-dispatch-runner.js +18 -43
- package/dist/internal/schedule-runner.js +49 -58
- package/dist/internal/scm/pr-url.js +7 -6
- package/dist/internal/sdk-runner.js +388 -363
- package/dist/internal/serve-restart.js +26 -39
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +1283 -1244
- package/dist/internal/session-cost.js +7 -9
- package/dist/internal/session-engine.d.ts +3 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +2801 -2777
- package/dist/internal/session-links.js +12 -16
- package/dist/internal/session-run-log.js +134 -82
- package/dist/internal/session-store.js +133 -164
- package/dist/internal/sessions-client.js +97 -118
- package/dist/internal/skill-catalog.js +18 -23
- package/dist/internal/skills-sync.js +16 -30
- package/dist/internal/slack-provision-client.js +90 -116
- package/dist/internal/start-log-store.js +48 -67
- package/dist/internal/steering.js +1 -2
- package/dist/internal/storage-coordinator.js +160 -196
- package/dist/internal/store-mirror.js +16 -30
- package/dist/internal/stream-progress.js +6 -8
- package/dist/internal/terminal-style.js +3 -4
- package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
- package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
- package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
- package/dist/internal/tool-catalog.js +11 -5
- package/dist/internal/tool-result.js +1 -1
- package/dist/internal/trajectory.js +19 -22
- package/dist/internal/turn-cost.js +52 -62
- package/dist/internal/turn-governor.js +5 -8
- package/dist/internal/turn-lease-store.js +85 -105
- package/dist/internal/turn-outbox.js +28 -43
- package/dist/internal/update-check.js +231 -259
- package/dist/internal/v2-hosting.js +1 -2
- package/dist/internal/workspace-sync.js +25 -41
- package/dist/internal/workspace.js +111 -139
- package/dist/kv/memory-kv.js +27 -51
- package/dist/memory.js +106 -148
- package/dist/otel.js +5 -8
- package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
- package/dist/playground/assets/{index-MijLHTbB.js → index-JekUQERK.js} +45 -45
- package/dist/playground/index.html +2 -2
- package/dist/prompt.js +2 -4
- package/dist/storage-backends/cursor-hosted-v2.js +53 -83
- package/dist/storage-backends/cursor-hosted.js +105 -145
- package/dist/storage-backends/file-kv.js +100 -128
- package/dist/storage-protocol.js +3 -5
- package/dist/storage.js +17 -26
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -18
- package/docs/building-with-agents.md +2 -0
- package/docs/deployment.md +7 -0
- package/docs/guides/bitbucket.md +9 -1
- package/docs/guides/github.md +20 -4
- package/docs/guides/gitlab.md +9 -1
- package/docs/guides/migrate.md +127 -0
- package/docs/reference/cli.md +39 -0
- package/docs/troubleshooting.md +1 -0
- package/package.json +1 -1
- package/skills/debug/SKILL.md +1 -0
- package/skills/github/SKILL.md +23 -0
- package/skills/migrate-v2/SKILL.md +264 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +0 -1
- package/dist/docs/assets/chunks/channel.CRUyWDV-.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CG_UObcQ.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CG_UObcQ.js +0 -1
- package/dist/docs/assets/chunks/clone.NYSZ9qZN.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DOOmulfQ.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.BJrCW6xc.js +0 -162
- package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
- package/dist/playground/assets/index-DPKLl4C_.css +0 -1
- /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
- /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
|
@@ -8,20 +8,13 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Hosted v2 transport is the control plane's Events API ingest: the CP
|
|
10
10
|
* verifies the managed app's signature, fans out on the declared
|
|
11
|
-
* `slackEventTypes` (`app_mention`, `message`
|
|
12
|
-
* `
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* `slackEventTypes` (`app_mention`, `message`, plus `reaction_added` and
|
|
12
|
+
* `block_actions` when their handlers are set), and delivers the full
|
|
13
|
+
* `event_callback` body — or, for a Block Kit click, the interactivity
|
|
14
|
+
* payload — through hosted admission. The attached adapter routes it
|
|
15
|
+
* through the same inbound and Block Kit dispatch as Socket Mode. Hosted
|
|
16
|
+
* pods skip Socket Mode entirely, so they never need an app token.
|
|
15
17
|
*/
|
|
16
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
17
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
18
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
19
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
20
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
21
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
22
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
23
|
-
});
|
|
24
|
-
};
|
|
25
18
|
import { allowAll, defineChannel } from "../../channels.js";
|
|
26
19
|
import { skipped, withPropagatingBackgroundErrors } from "../../internal/channel-dispatch.js";
|
|
27
20
|
import { continuationSource, normalizeIdentity } from "../../internal/continuation-identity.js";
|
|
@@ -36,7 +29,8 @@ import { buildDefaultEvents, createDefaultOnChannelPost, createDefaultOnInbound,
|
|
|
36
29
|
import { dispatchInboundFromEventBody, dispatchInboundMessage, emptySlackChannelState, slackWakeChannelState, } from "./dispatch.js";
|
|
37
30
|
import { createEventIdDedupe } from "./event-id-dedupe.js";
|
|
38
31
|
import { parseChannelMessageEvent, parseEventBodyBotUserId } from "./inbound.js";
|
|
39
|
-
import {
|
|
32
|
+
import { decisionFromActionId, decisionFromAuthActionId, parseApprovalActionValue, } from "./approvals.js";
|
|
33
|
+
import { dispatchBlockAction, dispatchInteractiveFromPayload, parseSlackBlockAction, } from "./interactive.js";
|
|
40
34
|
import { createSlackLogger } from "./log.js";
|
|
41
35
|
import { DEFAULT_ACK, resolveSlackReply } from "./reply-options.js";
|
|
42
36
|
import { startSlackSocketMode, } from "./socket-mode.js";
|
|
@@ -55,14 +49,13 @@ export function getSlackChannelOptions(definition) {
|
|
|
55
49
|
* {@link HostContext.slack.getClient}.
|
|
56
50
|
*/
|
|
57
51
|
export function resolveDedicatedSlackHostBinding(channels) {
|
|
58
|
-
var _a;
|
|
59
52
|
for (const channel of channels) {
|
|
60
53
|
const options = slackChannelOptionsByDefinition.get(channel.definition);
|
|
61
54
|
if (options === undefined) {
|
|
62
55
|
continue;
|
|
63
56
|
}
|
|
64
57
|
return {
|
|
65
|
-
credentials:
|
|
58
|
+
credentials: options.credentials ?? credentialsFromEnv(options.envPrefix),
|
|
66
59
|
envPrefix: options.envPrefix,
|
|
67
60
|
};
|
|
68
61
|
}
|
|
@@ -70,10 +63,10 @@ export function resolveDedicatedSlackHostBinding(channels) {
|
|
|
70
63
|
}
|
|
71
64
|
function authOnlyInbound(policy, engagement) {
|
|
72
65
|
const respondTo = resolveSlackRespondTo(policy);
|
|
73
|
-
return (ctx, message) =>
|
|
66
|
+
return async (ctx, message) => {
|
|
74
67
|
const auth = defaultSlackAuth(message, ctx, { engagement, respondTo });
|
|
75
68
|
return auth === null ? null : { auth };
|
|
76
|
-
}
|
|
69
|
+
};
|
|
77
70
|
}
|
|
78
71
|
/**
|
|
79
72
|
* Create a Slack channel. Author as `agent/channels/slack.ts` default export.
|
|
@@ -83,12 +76,11 @@ function authOnlyInbound(policy, engagement) {
|
|
|
83
76
|
* on Slack setup.
|
|
84
77
|
*/
|
|
85
78
|
export function slackChannel(authored = {}) {
|
|
86
|
-
|
|
87
|
-
const options = Object.assign({}, authored);
|
|
79
|
+
const options = { ...authored };
|
|
88
80
|
if (options.continuation !== undefined) {
|
|
89
81
|
options.continuation = normalizeIdentity(options.continuation, "slack");
|
|
90
82
|
}
|
|
91
|
-
const credentials =
|
|
83
|
+
const credentials = options.credentials ?? credentialsFromEnv(options.envPrefix);
|
|
92
84
|
const envKeys = slackEnvKeys(options.envPrefix);
|
|
93
85
|
const reply = resolveSlackReply(options);
|
|
94
86
|
const loadingMessages = reply.status.idle;
|
|
@@ -98,17 +90,18 @@ export function slackChannel(authored = {}) {
|
|
|
98
90
|
const defaultInbound = silent
|
|
99
91
|
? authOnlyInbound(policy)
|
|
100
92
|
: createDefaultOnInbound(loadingMessages, policy);
|
|
101
|
-
const onAppMention =
|
|
102
|
-
const onDirectMessage =
|
|
93
|
+
const onAppMention = options.onAppMention ?? defaultInbound;
|
|
94
|
+
const onDirectMessage = options.onDirectMessage ?? defaultInbound;
|
|
103
95
|
const onReactionAdded = options.onReactionAdded;
|
|
104
|
-
const onChannelPost =
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
96
|
+
const onChannelPost = options.onChannelPost ??
|
|
97
|
+
(silent
|
|
98
|
+
? authOnlyInbound(policy, "channel_post")
|
|
99
|
+
: createDefaultOnChannelPost(loadingMessages, policy));
|
|
100
|
+
const engagement = options.engagement ?? {};
|
|
108
101
|
const mentionsEnabled = engagement.mentions !== false;
|
|
109
102
|
const directMessagesEnabled = engagement.directMessages !== false;
|
|
110
103
|
const evalCommandsEnabled = options.evalCommands !== false;
|
|
111
|
-
const followUpStatus =
|
|
104
|
+
const followUpStatus = options.followUpStatus ?? !silent;
|
|
112
105
|
const channelPosts = engagement.channelPosts;
|
|
113
106
|
if (channelPosts !== undefined) {
|
|
114
107
|
const allowError = validateChannelPostsAllow(channelPosts.allow);
|
|
@@ -124,11 +117,15 @@ export function slackChannel(authored = {}) {
|
|
|
124
117
|
normalizeBotMentionAllowlist(botMentions.allowFrom);
|
|
125
118
|
}
|
|
126
119
|
const eventIds = createEventIdDedupe();
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
//
|
|
120
|
+
const toolApprovals = options.toolApprovals === true;
|
|
121
|
+
const interactivity = options.interactivity === true;
|
|
122
|
+
const onBlockAction = options.onBlockAction;
|
|
123
|
+
const routeInteractive = toolApprovals || interactivity || onBlockAction !== undefined;
|
|
124
|
+
// Hosted v2 event capability, matching what the channel can dispatch:
|
|
125
|
+
// mentions ride `app_mention`; DMs and watched channel posts both arrive
|
|
126
|
+
// as `message`; reactions and Block Kit clicks only with their handlers.
|
|
127
|
+
// Tool-approval clicks are not declared: a parked approval lives in the
|
|
128
|
+
// executing fork, which hosted admission cannot reach.
|
|
132
129
|
const slackEventTypes = [];
|
|
133
130
|
if (mentionsEnabled) {
|
|
134
131
|
slackEventTypes.push("app_mention");
|
|
@@ -136,10 +133,12 @@ export function slackChannel(authored = {}) {
|
|
|
136
133
|
if (directMessagesEnabled || channelPosts !== undefined) {
|
|
137
134
|
slackEventTypes.push("message");
|
|
138
135
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
136
|
+
if (onReactionAdded !== undefined) {
|
|
137
|
+
slackEventTypes.push("reaction_added");
|
|
138
|
+
}
|
|
139
|
+
if (onBlockAction !== undefined) {
|
|
140
|
+
slackEventTypes.push("block_actions");
|
|
141
|
+
}
|
|
143
142
|
const runtime = {
|
|
144
143
|
log: createSlackLogger(options.logger),
|
|
145
144
|
};
|
|
@@ -171,137 +170,228 @@ export function slackChannel(authored = {}) {
|
|
|
171
170
|
// verified envelope.
|
|
172
171
|
let hostedAllowlist;
|
|
173
172
|
let hostedAllowlistReady;
|
|
174
|
-
function resolveHostedAllowlistNames(allowlist) {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if (botToken === undefined) {
|
|
183
|
-
getLog().error("channel watch setup degraded", {
|
|
184
|
-
error: "no bot token; #name entries stay unresolved",
|
|
185
|
-
});
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
const { WebClient } = yield import("@slack/web-api");
|
|
189
|
-
allowlist.applyResolvedNames(yield resolveChannelNames(new WebClient(botToken), names, getLog()));
|
|
190
|
-
}
|
|
191
|
-
catch (error) {
|
|
173
|
+
async function resolveHostedAllowlistNames(allowlist) {
|
|
174
|
+
const names = allowlist.unresolvedNames();
|
|
175
|
+
if (names.length === 0) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
const botToken = await tryResolveBotToken(credentials);
|
|
180
|
+
if (botToken === undefined) {
|
|
192
181
|
getLog().error("channel watch setup degraded", {
|
|
193
|
-
error:
|
|
182
|
+
error: "no bot token; #name entries stay unresolved",
|
|
194
183
|
});
|
|
184
|
+
return;
|
|
195
185
|
}
|
|
196
|
-
|
|
186
|
+
const { WebClient } = await import("@slack/web-api");
|
|
187
|
+
allowlist.applyResolvedNames(await resolveChannelNames(new WebClient(botToken), names, getLog()));
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
getLog().error("channel watch setup degraded", {
|
|
191
|
+
error: error instanceof Error ? error.message : String(error),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
197
194
|
}
|
|
198
195
|
/**
|
|
199
196
|
* Only a channel post needs the watcher, so mentions and DMs never wait on
|
|
200
197
|
* it, and a channel already matched by id never waits on `#name` resolution.
|
|
201
198
|
*/
|
|
202
|
-
function hostedChannelWatch(payload, args, platformHandoff) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
199
|
+
async function hostedChannelWatch(payload, args, platformHandoff) {
|
|
200
|
+
if (channelPosts === undefined) {
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
const channelEvent = parseChannelMessageEvent(payload, {
|
|
204
|
+
includeBotAuthored: true,
|
|
205
|
+
});
|
|
206
|
+
if (channelEvent === null || channelEvent.kind === "deleted") {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
hostedAllowlist ??= new SlackChannelAllowlist(channelPosts.allow);
|
|
210
|
+
if (!hostedAllowlist.matches(channelEvent.message.channelId) &&
|
|
211
|
+
hostedAllowlist.unresolvedNames().length > 0) {
|
|
212
|
+
hostedAllowlistReady ??= resolveHostedAllowlistNames(hostedAllowlist);
|
|
213
|
+
await hostedAllowlistReady;
|
|
214
|
+
}
|
|
215
|
+
const botUserId = parseEventBodyBotUserId(payload);
|
|
216
|
+
return createChannelPostWatcher({
|
|
217
|
+
// Admission answers before a debounce timer could fire; edits arrive
|
|
218
|
+
// as their own deliveries and the edge drops them.
|
|
219
|
+
options: { ...channelPosts, debounceMs: 0 },
|
|
220
|
+
allowlist: hostedAllowlist,
|
|
221
|
+
getBotUserId: () => botUserId,
|
|
222
|
+
log: getLog(),
|
|
223
|
+
dispatch: (message, eventId) => {
|
|
224
|
+
args.waitUntil(dispatchInboundMessage({
|
|
225
|
+
kind: "channel_post",
|
|
226
|
+
message,
|
|
227
|
+
handler: onChannelPost,
|
|
228
|
+
propagateHandlerErrors: true,
|
|
229
|
+
send: args.send,
|
|
230
|
+
credentials,
|
|
231
|
+
host: args.host,
|
|
232
|
+
artifacts: args.artifacts,
|
|
233
|
+
log: getLog(),
|
|
234
|
+
evalCommandsEnabled,
|
|
235
|
+
followUpStatus,
|
|
236
|
+
ack: reply.ack,
|
|
237
|
+
blockExternals,
|
|
238
|
+
continuation: options.continuation,
|
|
239
|
+
...(args.hasContinuationSession === undefined
|
|
230
240
|
? {}
|
|
231
|
-
: { hasContinuationSession: args.hasContinuationSession })
|
|
241
|
+
: { hasContinuationSession: args.hasContinuationSession }),
|
|
242
|
+
...(args.isContinuationBusy === undefined
|
|
232
243
|
? {}
|
|
233
|
-
: { isContinuationBusy: args.isContinuationBusy })
|
|
244
|
+
: { isContinuationBusy: args.isContinuationBusy }),
|
|
245
|
+
...(args.getContinuationLastBotMessageTs === undefined
|
|
234
246
|
? {}
|
|
235
247
|
: {
|
|
236
248
|
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
237
|
-
})
|
|
249
|
+
}),
|
|
250
|
+
...(args.interruptContinuation === undefined
|
|
238
251
|
? {}
|
|
239
|
-
: { interruptContinuation: args.interruptContinuation })
|
|
240
|
-
|
|
241
|
-
|
|
252
|
+
: { interruptContinuation: args.interruptContinuation }),
|
|
253
|
+
...(eventId === undefined ? {} : { eventId }),
|
|
254
|
+
...(platformHandoff === undefined ? {} : { platformHandoff }),
|
|
255
|
+
}));
|
|
256
|
+
},
|
|
242
257
|
});
|
|
243
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* A hosted Block Kit click: the control plane verified the interactivity
|
|
261
|
+
* payload and pinned its `team.id` to the app's install workspace, which is
|
|
262
|
+
* the baseline the external-sender gate needs (Socket Mode reads it from
|
|
263
|
+
* `auth.test`). Tool-approval clicks skip: their parked call lives in the
|
|
264
|
+
* executing fork, queued ahead of this delivery on the same thread lane.
|
|
265
|
+
*/
|
|
266
|
+
function dispatchHostedBlockAction(payload, args) {
|
|
267
|
+
const action = parseSlackBlockAction(payload);
|
|
268
|
+
if (action === null || onBlockAction === undefined) {
|
|
269
|
+
return skipped("not_dispatchable");
|
|
270
|
+
}
|
|
271
|
+
const approvalDecision = decisionFromActionId(action.actionId) ?? decisionFromAuthActionId(action.actionId);
|
|
272
|
+
if (approvalDecision !== null && parseApprovalActionValue(action.value) !== null) {
|
|
273
|
+
getLog().info("block action skipped (tool approvals are not resolved on hosted v2)", {
|
|
274
|
+
action_id: action.actionId,
|
|
275
|
+
channel: action.channelId,
|
|
276
|
+
});
|
|
277
|
+
return skipped("not_dispatchable");
|
|
278
|
+
}
|
|
279
|
+
args.waitUntil(dispatchBlockAction(payload, {
|
|
280
|
+
handler: onBlockAction,
|
|
281
|
+
send: args.send,
|
|
282
|
+
credentials,
|
|
283
|
+
host: args.host,
|
|
284
|
+
artifacts: args.artifacts,
|
|
285
|
+
log: getLog(),
|
|
286
|
+
blockExternals,
|
|
287
|
+
installTeamId: action.teamId,
|
|
288
|
+
hasContinuationSession: args.hasContinuationSession,
|
|
289
|
+
isContinuationBusy: args.isContinuationBusy,
|
|
290
|
+
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
291
|
+
interruptContinuation: args.interruptContinuation,
|
|
292
|
+
continuation: options.continuation,
|
|
293
|
+
propagateHandlerErrors: true,
|
|
294
|
+
}));
|
|
295
|
+
return skipped("not_engaged");
|
|
296
|
+
}
|
|
244
297
|
function inboundDeps(args) {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
298
|
+
const watch = args.channelWatch ?? channelWatch;
|
|
299
|
+
return {
|
|
300
|
+
send: args.send,
|
|
301
|
+
continuation: options.continuation,
|
|
302
|
+
waitUntil: args.waitUntil,
|
|
303
|
+
onAppMention,
|
|
304
|
+
onDirectMessage,
|
|
305
|
+
...(onReactionAdded === undefined ? {} : { onReactionAdded }),
|
|
306
|
+
credentials,
|
|
307
|
+
eventIds: args.eventIds ?? eventIds,
|
|
308
|
+
propagateHandlerErrors: args.propagateHandlerErrors,
|
|
309
|
+
host: args.host,
|
|
310
|
+
artifacts: args.artifacts,
|
|
311
|
+
log: getLog(),
|
|
312
|
+
mentionsEnabled,
|
|
249
313
|
directMessagesEnabled,
|
|
250
314
|
evalCommandsEnabled,
|
|
251
|
-
followUpStatus,
|
|
252
|
-
|
|
253
|
-
:
|
|
254
|
-
|
|
255
|
-
: {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
315
|
+
followUpStatus,
|
|
316
|
+
ack: reply.ack,
|
|
317
|
+
placeholder: reply.placeholder,
|
|
318
|
+
blockExternals,
|
|
319
|
+
...(args.platformHandoff === undefined ? {} : { platformHandoff: args.platformHandoff }),
|
|
320
|
+
...(args.hasContinuationSession === undefined
|
|
321
|
+
? {}
|
|
322
|
+
: { hasContinuationSession: args.hasContinuationSession }),
|
|
323
|
+
...(args.isContinuationBusy === undefined
|
|
324
|
+
? {}
|
|
325
|
+
: { isContinuationBusy: args.isContinuationBusy }),
|
|
326
|
+
...(args.getContinuationLastBotMessageTs === undefined
|
|
327
|
+
? {}
|
|
328
|
+
: {
|
|
329
|
+
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
330
|
+
}),
|
|
331
|
+
...(args.interruptContinuation === undefined
|
|
332
|
+
? {}
|
|
333
|
+
: { interruptContinuation: args.interruptContinuation }),
|
|
334
|
+
...(watch === undefined ? {} : { channelWatch: watch }),
|
|
335
|
+
...(botMentionGate === undefined ? {} : { botMentionGate }),
|
|
336
|
+
suggestedPrompts: options.suggestedPrompts,
|
|
337
|
+
suggestedPromptsTitle: options.suggestedPromptsTitle,
|
|
338
|
+
};
|
|
262
339
|
}
|
|
263
340
|
const definition = defineChannel({
|
|
264
341
|
auth: [allowAll()],
|
|
265
342
|
state: emptySlackChannelState(),
|
|
266
343
|
routes: [],
|
|
267
|
-
meta:
|
|
344
|
+
meta: {
|
|
345
|
+
kind: "slack",
|
|
268
346
|
// Omitted (not empty) when nothing dispatches, so fanout never
|
|
269
347
|
// materializes a subscription with no event types.
|
|
270
|
-
slackEventTypes: slackEventTypes.length === 0 ? undefined : slackEventTypes
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
return __awaiter(this, arguments, void 0, function* (input, { send }) {
|
|
283
|
-
var _b;
|
|
284
|
-
const target = (_b = input.target) !== null && _b !== void 0 ? _b : {};
|
|
285
|
-
const channelId = typeof target.channelId === "string" ? target.channelId : "";
|
|
286
|
-
if (channelId === "") {
|
|
287
|
-
throw new Error("slackChannel().receive requires target.channelId (Slack channel id).");
|
|
288
|
-
}
|
|
289
|
-
const threadTs = typeof target.threadTs === "string" ? target.threadTs : "";
|
|
290
|
-
if (threadTs === "") {
|
|
291
|
-
throw new Error("slackChannel().receive requires target.threadTs (Slack thread ts).");
|
|
348
|
+
slackEventTypes: slackEventTypes.length === 0 ? undefined : slackEventTypes,
|
|
349
|
+
...(reply.mode === "agentic"
|
|
350
|
+
? {
|
|
351
|
+
slackReply: {
|
|
352
|
+
mode: "agentic",
|
|
353
|
+
ack: reply.ack ?? DEFAULT_ACK,
|
|
354
|
+
...(reply.placeholder === undefined
|
|
355
|
+
? {}
|
|
356
|
+
: {
|
|
357
|
+
placeholder: reply.placeholder,
|
|
358
|
+
}),
|
|
359
|
+
},
|
|
292
360
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
361
|
+
: {}),
|
|
362
|
+
// A lone "*" stays off the manifest. Hosting already delivers a reply
|
|
363
|
+
// in a thread a mention started; publishing "*" is what the control
|
|
364
|
+
// plane rejects.
|
|
365
|
+
...(channelPosts === undefined || channelPostsWatchEverywhere(channelPosts.allow)
|
|
366
|
+
? {}
|
|
367
|
+
: { slackChannelPosts: [...channelPosts.allow] }),
|
|
368
|
+
deprecations: reply.deprecations,
|
|
369
|
+
},
|
|
370
|
+
async receive(input, { send }) {
|
|
371
|
+
const target = input.target ?? {};
|
|
372
|
+
const channelId = typeof target.channelId === "string" ? target.channelId : "";
|
|
373
|
+
if (channelId === "") {
|
|
374
|
+
throw new Error("slackChannel().receive requires target.channelId (Slack channel id).");
|
|
375
|
+
}
|
|
376
|
+
const threadTs = typeof target.threadTs === "string" ? target.threadTs : "";
|
|
377
|
+
if (threadTs === "") {
|
|
378
|
+
throw new Error("slackChannel().receive requires target.threadTs (Slack thread ts).");
|
|
379
|
+
}
|
|
380
|
+
const teamId = typeof target.teamId === "string" ? target.teamId : undefined;
|
|
381
|
+
getLog().info("receive handoff", {
|
|
382
|
+
channel: channelId,
|
|
383
|
+
thread_ts: threadTs,
|
|
384
|
+
team: teamId,
|
|
385
|
+
});
|
|
386
|
+
const state = emptySlackChannelState({
|
|
387
|
+
channelId,
|
|
388
|
+
threadTs,
|
|
389
|
+
teamId: teamId ?? null,
|
|
390
|
+
});
|
|
391
|
+
return send(input.message, {
|
|
392
|
+
auth: input.auth,
|
|
393
|
+
admission: "coalesce",
|
|
394
|
+
...(continuationSource(options.continuation, "slack") === "control-plane"
|
|
305
395
|
? {
|
|
306
396
|
claim: {
|
|
307
397
|
type: "thread",
|
|
@@ -310,203 +400,228 @@ export function slackChannel(authored = {}) {
|
|
|
310
400
|
}
|
|
311
401
|
: {
|
|
312
402
|
continuationToken: slackContinuationKey(channelId, threadTs),
|
|
313
|
-
})
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
403
|
+
}),
|
|
404
|
+
state,
|
|
405
|
+
refreshState: slackWakeChannelState({
|
|
406
|
+
channelId,
|
|
407
|
+
threadTs,
|
|
408
|
+
teamId: teamId ?? null,
|
|
409
|
+
}),
|
|
318
410
|
});
|
|
319
411
|
},
|
|
320
412
|
events,
|
|
321
|
-
onStart(args) {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
413
|
+
async onStart(args) {
|
|
414
|
+
runtime.log = createSlackLogger(args.logger ?? options.logger);
|
|
415
|
+
// Cursor-managed v2 receives inbound events through the control-plane
|
|
416
|
+
// adapter attached below. Do not also start (or warn about) the local
|
|
417
|
+
// Socket Mode transport: hosted outbound replies need only the bot token.
|
|
418
|
+
if (args.architecture === "v2" && process.env[AGENT_SERVE_GENERATION_ENV_VAR] !== undefined) {
|
|
419
|
+
getLog().info("channel start", { transport: "events-api" });
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
getLog().info("channel start", { transport: "socket" });
|
|
423
|
+
const appToken = await tryResolveAppToken(credentials);
|
|
424
|
+
const botToken = await tryResolveBotToken(credentials);
|
|
425
|
+
if (appToken === undefined || botToken === undefined) {
|
|
426
|
+
getLog().info("channel idle", {
|
|
427
|
+
reason: "missing credentials",
|
|
428
|
+
need: `${envKeys.bot} and ${envKeys.app}`,
|
|
429
|
+
});
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
let botUserId;
|
|
433
|
+
let botId;
|
|
434
|
+
let installTeamId;
|
|
435
|
+
let webClient = null;
|
|
436
|
+
if (channelPosts !== undefined || botMentions !== undefined || routeInteractive) {
|
|
437
|
+
try {
|
|
438
|
+
const { WebClient } = await import("@slack/web-api");
|
|
439
|
+
webClient = new WebClient(botToken);
|
|
440
|
+
const identity = await webClient.auth.test();
|
|
441
|
+
botUserId = typeof identity.user_id === "string" ? identity.user_id : undefined;
|
|
442
|
+
botId = typeof identity.bot_id === "string" ? identity.bot_id : undefined;
|
|
443
|
+
installTeamId = typeof identity.team_id === "string" ? identity.team_id : undefined;
|
|
331
444
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
if (appToken === undefined || botToken === undefined) {
|
|
336
|
-
getLog().info("channel idle", {
|
|
337
|
-
reason: "missing credentials",
|
|
338
|
-
need: `${envKeys.bot} and ${envKeys.app}`,
|
|
445
|
+
catch (error) {
|
|
446
|
+
getLog().error("bot identity lookup degraded", {
|
|
447
|
+
error: error instanceof Error ? error.message : String(error),
|
|
339
448
|
});
|
|
340
|
-
return;
|
|
341
449
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
const { WebClient } = yield import("@slack/web-api");
|
|
349
|
-
webClient = new WebClient(botToken);
|
|
350
|
-
const identity = yield webClient.auth.test();
|
|
351
|
-
botUserId = typeof identity.user_id === "string" ? identity.user_id : undefined;
|
|
352
|
-
botId = typeof identity.bot_id === "string" ? identity.bot_id : undefined;
|
|
353
|
-
installTeamId = typeof identity.team_id === "string" ? identity.team_id : undefined;
|
|
354
|
-
}
|
|
355
|
-
catch (error) {
|
|
356
|
-
getLog().error("bot identity lookup degraded", {
|
|
357
|
-
error: error instanceof Error ? error.message : String(error),
|
|
358
|
-
});
|
|
359
|
-
}
|
|
450
|
+
}
|
|
451
|
+
if (botMentions !== undefined) {
|
|
452
|
+
if (botUserId === undefined && botId === undefined) {
|
|
453
|
+
getLog().error("bot mentions disabled", {
|
|
454
|
+
reason: "engagement.botMentions requires bot identity from auth.test (loop safety)",
|
|
455
|
+
});
|
|
360
456
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
getLog().info("bot mentions enabled", {
|
|
370
|
-
allow_from: botMentions.allowFrom.join(","),
|
|
371
|
-
max_depth: (_b = botMentions.maxDepth) !== null && _b !== void 0 ? _b : SLACK_BOT_MENTION_DEFAULTS.maxDepth,
|
|
372
|
-
max_per_thread_per_hour: (_c = botMentions.maxPerThreadPerHour) !== null && _c !== void 0 ? _c : SLACK_BOT_MENTION_DEFAULTS.maxPerThreadPerHour,
|
|
373
|
-
max_per_thread_total: (_d = botMentions.maxPerThreadTotal) !== null && _d !== void 0 ? _d : SLACK_BOT_MENTION_DEFAULTS.maxPerThreadTotal,
|
|
374
|
-
});
|
|
375
|
-
}
|
|
457
|
+
else {
|
|
458
|
+
botMentionGate = new SlackBotMentionGate(botMentions, { botUserId, botId }, { log: getLog() });
|
|
459
|
+
getLog().info("bot mentions enabled", {
|
|
460
|
+
allow_from: botMentions.allowFrom.join(","),
|
|
461
|
+
max_depth: botMentions.maxDepth ?? SLACK_BOT_MENTION_DEFAULTS.maxDepth,
|
|
462
|
+
max_per_thread_per_hour: botMentions.maxPerThreadPerHour ?? SLACK_BOT_MENTION_DEFAULTS.maxPerThreadPerHour,
|
|
463
|
+
max_per_thread_total: botMentions.maxPerThreadTotal ?? SLACK_BOT_MENTION_DEFAULTS.maxPerThreadTotal,
|
|
464
|
+
});
|
|
376
465
|
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
}
|
|
385
|
-
catch (error) {
|
|
386
|
-
getLog().error("channel watch setup degraded", {
|
|
387
|
-
error: error instanceof Error ? error.message : String(error),
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
if (channelPosts.includeBotPosts === true &&
|
|
391
|
-
botUserId === undefined &&
|
|
392
|
-
botId === undefined) {
|
|
393
|
-
getLog().error("channel watch disabled", {
|
|
394
|
-
reason: "includeBotPosts requires bot identity from auth.test (loop safety)",
|
|
395
|
-
});
|
|
466
|
+
}
|
|
467
|
+
if (channelPosts !== undefined) {
|
|
468
|
+
const allowlist = new SlackChannelAllowlist(channelPosts.allow);
|
|
469
|
+
try {
|
|
470
|
+
const names = allowlist.unresolvedNames();
|
|
471
|
+
if (names.length > 0 && webClient !== null) {
|
|
472
|
+
allowlist.applyResolvedNames(await resolveChannelNames(webClient, names, getLog()));
|
|
396
473
|
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
474
|
+
}
|
|
475
|
+
catch (error) {
|
|
476
|
+
getLog().error("channel watch setup degraded", {
|
|
477
|
+
error: error instanceof Error ? error.message : String(error),
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
if (channelPosts.includeBotPosts === true &&
|
|
481
|
+
botUserId === undefined &&
|
|
482
|
+
botId === undefined) {
|
|
483
|
+
getLog().error("channel watch disabled", {
|
|
484
|
+
reason: "includeBotPosts requires bot identity from auth.test (loop safety)",
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
channelWatch = createChannelPostWatcher({
|
|
489
|
+
options: channelPosts,
|
|
490
|
+
allowlist,
|
|
491
|
+
getBotUserId: () => botUserId,
|
|
492
|
+
getBotId: () => botId,
|
|
493
|
+
log: getLog(),
|
|
494
|
+
dispatch: (message, eventId) => {
|
|
495
|
+
args.waitUntil(dispatchInboundMessage({
|
|
496
|
+
kind: "channel_post",
|
|
497
|
+
message,
|
|
498
|
+
handler: onChannelPost,
|
|
499
|
+
send: args.send,
|
|
500
|
+
credentials,
|
|
501
|
+
host: args.host,
|
|
502
|
+
artifacts: args.artifacts,
|
|
503
|
+
log: getLog(),
|
|
504
|
+
evalCommandsEnabled,
|
|
505
|
+
followUpStatus,
|
|
506
|
+
ack: reply.ack,
|
|
507
|
+
blockExternals,
|
|
508
|
+
continuation: options.continuation,
|
|
509
|
+
...(args.hasContinuationSession === undefined
|
|
407
510
|
? {}
|
|
408
511
|
: {
|
|
409
512
|
hasContinuationSession: args.hasContinuationSession,
|
|
410
|
-
})
|
|
513
|
+
}),
|
|
514
|
+
...(args.isContinuationBusy === undefined
|
|
411
515
|
? {}
|
|
412
|
-
: { isContinuationBusy: args.isContinuationBusy })
|
|
516
|
+
: { isContinuationBusy: args.isContinuationBusy }),
|
|
517
|
+
...(args.getContinuationLastBotMessageTs === undefined
|
|
413
518
|
? {}
|
|
414
519
|
: {
|
|
415
520
|
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
416
|
-
})
|
|
521
|
+
}),
|
|
522
|
+
...(args.interruptContinuation === undefined
|
|
417
523
|
? {}
|
|
418
524
|
: {
|
|
419
525
|
interruptContinuation: args.interruptContinuation,
|
|
420
|
-
})
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
526
|
+
}),
|
|
527
|
+
...(eventId === undefined ? {} : { eventId }),
|
|
528
|
+
}));
|
|
529
|
+
},
|
|
530
|
+
});
|
|
531
|
+
getLog().info("channel watch enabled", {
|
|
532
|
+
channels: channelPosts.allow.join(","),
|
|
533
|
+
posts: channelPosts.posts ?? "top-level",
|
|
534
|
+
debounce_ms: channelPosts.debounceMs ?? 0,
|
|
535
|
+
});
|
|
429
536
|
}
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
537
|
+
}
|
|
538
|
+
const socketOptions = {
|
|
539
|
+
appToken,
|
|
540
|
+
logger: line => getLog().write(line),
|
|
541
|
+
onEvent: payload => {
|
|
542
|
+
dispatchInboundFromEventBody(payload, inboundDeps({
|
|
543
|
+
send: args.send,
|
|
544
|
+
waitUntil: args.waitUntil,
|
|
545
|
+
host: args.host,
|
|
546
|
+
artifacts: args.artifacts,
|
|
547
|
+
...(args.hasContinuationSession === undefined
|
|
435
548
|
? {}
|
|
436
|
-
: { hasContinuationSession: args.hasContinuationSession })
|
|
549
|
+
: { hasContinuationSession: args.hasContinuationSession }),
|
|
550
|
+
...(args.isContinuationBusy === undefined
|
|
437
551
|
? {}
|
|
438
|
-
: { isContinuationBusy: args.isContinuationBusy })
|
|
552
|
+
: { isContinuationBusy: args.isContinuationBusy }),
|
|
553
|
+
...(args.getContinuationLastBotMessageTs === undefined
|
|
439
554
|
? {}
|
|
440
555
|
: {
|
|
441
556
|
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
442
|
-
})
|
|
557
|
+
}),
|
|
558
|
+
...(args.interruptContinuation === undefined
|
|
443
559
|
? {}
|
|
444
|
-
: { interruptContinuation: args.interruptContinuation })
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
if (handledAsApproval || onBlockAction === undefined) {
|
|
462
|
-
return;
|
|
463
|
-
}
|
|
464
|
-
yield dispatchBlockAction(payload, {
|
|
465
|
-
handler: onBlockAction,
|
|
466
|
-
send: args.send,
|
|
467
|
-
credentials,
|
|
468
|
-
host: args.host,
|
|
469
|
-
artifacts: args.artifacts,
|
|
470
|
-
log: getLog(),
|
|
471
|
-
blockExternals,
|
|
472
|
-
installTeamId,
|
|
473
|
-
hasContinuationSession: args.hasContinuationSession,
|
|
474
|
-
isContinuationBusy: args.isContinuationBusy,
|
|
475
|
-
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
476
|
-
interruptContinuation: args.interruptContinuation,
|
|
477
|
-
continuation: options.continuation,
|
|
478
|
-
});
|
|
560
|
+
: { interruptContinuation: args.interruptContinuation }),
|
|
561
|
+
}));
|
|
562
|
+
},
|
|
563
|
+
};
|
|
564
|
+
if (routeInteractive) {
|
|
565
|
+
socketOptions.onInteractive = async (payload) => {
|
|
566
|
+
// Framework tool-approval Approve/Deny clicks resolve first;
|
|
567
|
+
// anything else (including approval-shaped clicks whose value
|
|
568
|
+
// fails to parse) falls through to the author's block-action hook.
|
|
569
|
+
const handledAsApproval = await dispatchInteractiveFromPayload(payload, {
|
|
570
|
+
credentials,
|
|
571
|
+
getSession: args.getSession,
|
|
572
|
+
resolveApproval: args.resolveApproval,
|
|
573
|
+
resolveAuth: args.resolveAuth,
|
|
574
|
+
waitUntil: args.waitUntil,
|
|
575
|
+
log: getLog(),
|
|
576
|
+
blockExternals,
|
|
479
577
|
});
|
|
480
|
-
|
|
481
|
-
try {
|
|
482
|
-
socketHandle = yield startSlackSocketMode(socketOptions);
|
|
483
|
-
}
|
|
484
|
-
catch (error) {
|
|
485
|
-
// Bad Vault tokens / revoked apps: Socket Mode fails once with
|
|
486
|
-
// invalid_auth and does not reconnect. Treat as idle so one bad
|
|
487
|
-
// Slack pack does not blow up server start with a stack dump.
|
|
488
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
489
|
-
if (message.includes("invalid_auth") || message.includes("not_authed")) {
|
|
490
|
-
getLog().info("channel idle", {
|
|
491
|
-
reason: "invalid credentials",
|
|
492
|
-
need: `${envKeys.bot} and ${envKeys.app}`,
|
|
493
|
-
});
|
|
578
|
+
if (handledAsApproval || onBlockAction === undefined) {
|
|
494
579
|
return;
|
|
495
580
|
}
|
|
496
|
-
|
|
581
|
+
await dispatchBlockAction(payload, {
|
|
582
|
+
handler: onBlockAction,
|
|
583
|
+
send: args.send,
|
|
584
|
+
credentials,
|
|
585
|
+
host: args.host,
|
|
586
|
+
artifacts: args.artifacts,
|
|
587
|
+
log: getLog(),
|
|
588
|
+
blockExternals,
|
|
589
|
+
installTeamId,
|
|
590
|
+
hasContinuationSession: args.hasContinuationSession,
|
|
591
|
+
isContinuationBusy: args.isContinuationBusy,
|
|
592
|
+
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
593
|
+
interruptContinuation: args.interruptContinuation,
|
|
594
|
+
continuation: options.continuation,
|
|
595
|
+
});
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
try {
|
|
599
|
+
socketHandle = await startSlackSocketMode(socketOptions);
|
|
600
|
+
}
|
|
601
|
+
catch (error) {
|
|
602
|
+
// Bad Vault tokens / revoked apps: Socket Mode fails once with
|
|
603
|
+
// invalid_auth and does not reconnect. Treat as idle so one bad
|
|
604
|
+
// Slack pack does not blow up server start with a stack dump.
|
|
605
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
606
|
+
if (message.includes("invalid_auth") || message.includes("not_authed")) {
|
|
607
|
+
getLog().info("channel idle", {
|
|
608
|
+
reason: "invalid credentials",
|
|
609
|
+
need: `${envKeys.bot} and ${envKeys.app}`,
|
|
610
|
+
});
|
|
611
|
+
return;
|
|
497
612
|
}
|
|
498
|
-
|
|
613
|
+
throw error;
|
|
614
|
+
}
|
|
499
615
|
},
|
|
500
|
-
onStop: () =>
|
|
501
|
-
var _a;
|
|
616
|
+
onStop: async () => {
|
|
502
617
|
getLog().info("channel stop");
|
|
503
|
-
channelWatch
|
|
618
|
+
channelWatch?.stop();
|
|
504
619
|
channelWatch = undefined;
|
|
505
620
|
botMentionGate = undefined;
|
|
506
|
-
|
|
621
|
+
await socketHandle?.stop();
|
|
507
622
|
socketHandle = null;
|
|
508
|
-
|
|
509
|
-
}
|
|
623
|
+
await options.onStop?.();
|
|
624
|
+
},
|
|
510
625
|
});
|
|
511
626
|
slackChannelOptionsByDefinition.set(definition, options);
|
|
512
627
|
attachHostedAdmissionAdapter(definition, {
|
|
@@ -523,12 +638,30 @@ export function slackChannel(authored = {}) {
|
|
|
523
638
|
// fresh instance per delivery: the control plane's app-scoped ingress
|
|
524
639
|
// claim already dedupes Slack retries, and on a warm pod the local set
|
|
525
640
|
// would otherwise swallow the control plane's own retry of a delivery
|
|
526
|
-
// that failed after the id was marked handled.
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
641
|
+
// that failed after the id was marked handled. A `block_actions`
|
|
642
|
+
// delivery carries the interactivity payload instead and takes the
|
|
643
|
+
// Socket Mode Block Kit path.
|
|
644
|
+
dispatch: async ({ eventType, payload, args, platformHandoff }) => {
|
|
645
|
+
if (eventType === "block_actions") {
|
|
646
|
+
return dispatchHostedBlockAction(payload, args);
|
|
647
|
+
}
|
|
648
|
+
const hostedWatch = await hostedChannelWatch(payload, args, platformHandoff);
|
|
649
|
+
const dispatched = dispatchInboundFromEventBody(payload, inboundDeps({
|
|
650
|
+
send: args.send,
|
|
651
|
+
waitUntil: args.waitUntil,
|
|
652
|
+
host: args.host,
|
|
653
|
+
artifacts: args.artifacts,
|
|
654
|
+
eventIds: createEventIdDedupe(),
|
|
655
|
+
propagateHandlerErrors: true,
|
|
656
|
+
hasContinuationSession: args.hasContinuationSession,
|
|
657
|
+
isContinuationBusy: args.isContinuationBusy,
|
|
658
|
+
getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
|
|
659
|
+
interruptContinuation: args.interruptContinuation,
|
|
660
|
+
...(platformHandoff === undefined ? {} : { platformHandoff }),
|
|
661
|
+
...(hostedWatch === undefined ? {} : { channelWatch: hostedWatch }),
|
|
662
|
+
}));
|
|
530
663
|
return skipped(dispatched ? "not_engaged" : "not_dispatchable");
|
|
531
|
-
}
|
|
664
|
+
},
|
|
532
665
|
});
|
|
533
666
|
return definition;
|
|
534
667
|
}
|