@cursor/bdk 0.2.9 → 0.2.11
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.js +803 -812
- 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.BNhEdGa8.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.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.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.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.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.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.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/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 +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/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.js +100 -126
- 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.js +8 -19
- 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.js +73 -90
- 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.js +127 -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.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +413 -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.js +231 -273
- 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-Co4CUVTQ.js → index-Be0-1hw2.js} +45 -45
- package/dist/playground/assets/index-Clz6uHj9.css +1 -0
- 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 +51 -10
- package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
- package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
- 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-C1g_PTTZ.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
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared inbound dispatch for Slack Events API bodies and Socket Mode.
|
|
3
3
|
*/
|
|
4
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
5
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
6
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
7
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
8
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
9
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
10
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
11
|
-
});
|
|
12
|
-
};
|
|
13
4
|
import { continuationSource, normalizeIdentity, } from "../../internal/continuation-identity.js";
|
|
14
5
|
import { isDeferredChannelSession } from "../../internal/deferred-channel-session.js";
|
|
15
6
|
import { routeLocalIngressContinuation } from "../../internal/local-ingress.js";
|
|
@@ -26,7 +17,7 @@ import { defaultSlackLog } from "./log.js";
|
|
|
26
17
|
import { paintTurnStart, retractTurnStart } from "./paint-start.js";
|
|
27
18
|
import { adoptPlaceholder, retractPlaceholderMessage, retractPlaceholderSlot, startPlaceholder, } from "./placeholder.js";
|
|
28
19
|
import { resolveSlackSelfIdentity } from "./self-identity.js";
|
|
29
|
-
import {
|
|
20
|
+
import { resolveSlackSender } from "./sender-name.js";
|
|
30
21
|
import { isWholeMessageStop } from "./stop.js";
|
|
31
22
|
import { EMPTY_SLACK_THREAD_CONTEXT, loadSlackThreadContext, loadSlackThreadDelta, } from "./thread-context.js";
|
|
32
23
|
const FOLLOWUP_TYPING = "Saw your follow-up…";
|
|
@@ -42,38 +33,61 @@ function slackUserText(message, override) {
|
|
|
42
33
|
}
|
|
43
34
|
return message.markdown;
|
|
44
35
|
}
|
|
45
|
-
function slackTurnMedia(args) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
36
|
+
async function slackTurnMedia(args) {
|
|
37
|
+
const messageFiles = args.message.files ?? [];
|
|
38
|
+
const prepared = messageFiles.length > 0 || args.threadFiles.length > 0
|
|
39
|
+
? await prepareSlackAttachments({
|
|
40
|
+
botToken: args.botToken,
|
|
41
|
+
files: messageFiles,
|
|
42
|
+
threadFiles: args.threadFiles,
|
|
43
|
+
log: args.log,
|
|
44
|
+
})
|
|
45
|
+
: undefined;
|
|
46
|
+
const workspaceFiles = {
|
|
47
|
+
...args.decision.workspaceFiles,
|
|
48
|
+
...prepared?.workspaceFiles,
|
|
49
|
+
};
|
|
50
|
+
const images = [...(args.decision.images ?? []), ...(prepared?.images ?? [])];
|
|
51
|
+
return {
|
|
52
|
+
userText: appendSlackAttachmentAnnotations(slackUserText(args.message, args.decision.message), prepared?.annotations ?? [], messageFiles.length > 0 ? SLACK_ATTACHMENT_ONLY_PROMPT : ""),
|
|
53
|
+
workspaceFiles: Object.keys(workspaceFiles).length > 0 ? workspaceFiles : undefined,
|
|
54
|
+
images: images.length > 0 ? images : undefined,
|
|
55
|
+
};
|
|
65
56
|
}
|
|
66
57
|
/** Blank per-session adapter state. */
|
|
67
58
|
export function emptySlackChannelState(patch = {}) {
|
|
68
|
-
return
|
|
59
|
+
return {
|
|
60
|
+
channelId: null,
|
|
61
|
+
threadTs: null,
|
|
62
|
+
teamId: null,
|
|
63
|
+
triggeringUserId: null,
|
|
64
|
+
pendingToolCallMessage: null,
|
|
65
|
+
lastReasoningTypingAtMs: null,
|
|
66
|
+
lastReasoningTypingStatus: null,
|
|
67
|
+
streamTs: null,
|
|
68
|
+
streamChannelId: null,
|
|
69
|
+
lastPostedText: null,
|
|
70
|
+
streamBlockText: null,
|
|
71
|
+
lastBotMessageTs: null,
|
|
72
|
+
streamingUnavailable: false,
|
|
73
|
+
streamFull: false,
|
|
74
|
+
streamAppendedChunks: 0,
|
|
75
|
+
progressTs: null,
|
|
76
|
+
approvalMessageByCallId: {},
|
|
77
|
+
reasoningCard: undefined,
|
|
78
|
+
toolCardCounts: {},
|
|
79
|
+
agenticFiles: [],
|
|
80
|
+
startPainted: false,
|
|
81
|
+
turnStartedAtMs: null,
|
|
82
|
+
...patch,
|
|
83
|
+
};
|
|
69
84
|
}
|
|
70
85
|
export function slackWakeChannelState(args) {
|
|
71
|
-
var _a, _b;
|
|
72
86
|
const wake = {
|
|
73
87
|
channelId: args.channelId,
|
|
74
88
|
threadTs: args.threadTs,
|
|
75
|
-
teamId:
|
|
76
|
-
triggeringUserId:
|
|
89
|
+
teamId: args.teamId ?? null,
|
|
90
|
+
triggeringUserId: args.triggeringUserId ?? null,
|
|
77
91
|
placeholderPosted: args.placeholderPosted === true,
|
|
78
92
|
};
|
|
79
93
|
if (args.startPainted === true) {
|
|
@@ -82,32 +96,59 @@ export function slackWakeChannelState(args) {
|
|
|
82
96
|
return wake;
|
|
83
97
|
}
|
|
84
98
|
function triggeringMergeMessage(message) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
99
|
+
return {
|
|
100
|
+
ts: message.ts,
|
|
101
|
+
...(message.author?.userId === undefined || message.author.userId === ""
|
|
102
|
+
? {}
|
|
103
|
+
: { user: message.author.userId }),
|
|
104
|
+
...(message.author?.botId === undefined ? {} : { bot_id: message.author.botId }),
|
|
89
105
|
// Flattened body, so this stand-in matches what the real API record
|
|
90
106
|
// reduces to and is not dropped as empty by the thread-context filters.
|
|
91
|
-
text: message.body
|
|
107
|
+
text: message.body,
|
|
108
|
+
};
|
|
92
109
|
}
|
|
93
110
|
function continuationArg(identity) {
|
|
94
111
|
return identity === undefined ? {} : { continuation: identity };
|
|
95
112
|
}
|
|
96
113
|
function inboundContinuation(deps) {
|
|
97
|
-
return
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
114
|
+
return {
|
|
115
|
+
...continuationArg(deps.continuation),
|
|
116
|
+
...(deps.hasContinuationSession === undefined
|
|
117
|
+
? {}
|
|
118
|
+
: { hasContinuationSession: deps.hasContinuationSession }),
|
|
119
|
+
...(deps.isContinuationBusy === undefined
|
|
120
|
+
? {}
|
|
121
|
+
: { isContinuationBusy: deps.isContinuationBusy }),
|
|
122
|
+
...(deps.getContinuationLastBotMessageTs === undefined
|
|
123
|
+
? {}
|
|
124
|
+
: {
|
|
125
|
+
getContinuationLastBotMessageTs: deps.getContinuationLastBotMessageTs,
|
|
126
|
+
}),
|
|
127
|
+
...(deps.interruptContinuation === undefined
|
|
128
|
+
? {}
|
|
129
|
+
: { interruptContinuation: deps.interruptContinuation }),
|
|
130
|
+
};
|
|
108
131
|
}
|
|
109
132
|
function scheduleInbound(deps, log, args) {
|
|
110
|
-
deps.waitUntil(dispatchInboundMessage(
|
|
133
|
+
deps.waitUntil(dispatchInboundMessage({
|
|
134
|
+
kind: args.kind,
|
|
135
|
+
message: args.message,
|
|
136
|
+
handler: args.handler,
|
|
137
|
+
propagateHandlerErrors: deps.propagateHandlerErrors,
|
|
138
|
+
send: deps.send,
|
|
139
|
+
credentials: deps.credentials,
|
|
140
|
+
host: deps.host,
|
|
141
|
+
artifacts: deps.artifacts,
|
|
142
|
+
log,
|
|
143
|
+
evalCommandsEnabled: args.evalCommandsEnabled,
|
|
144
|
+
followUpStatus: deps.followUpStatus,
|
|
145
|
+
ack: deps.ack,
|
|
146
|
+
placeholder: deps.placeholder,
|
|
147
|
+
blockExternals: deps.blockExternals,
|
|
148
|
+
...inboundContinuation(deps),
|
|
149
|
+
...(args.eventId === undefined ? {} : { eventId: args.eventId }),
|
|
150
|
+
...(args.platformHandoff === undefined ? {} : { platformHandoff: args.platformHandoff }),
|
|
151
|
+
}));
|
|
111
152
|
}
|
|
112
153
|
function slackSessionContinuation(identity, channelId, threadTs) {
|
|
113
154
|
if (continuationSource(identity, "slack") === "engine") {
|
|
@@ -126,457 +167,489 @@ function slackSessionContinuation(identity, channelId, threadTs) {
|
|
|
126
167
|
}
|
|
127
168
|
return { probeKey: mailbox.key, sendPatch: { mailboxContinuation: mailbox } };
|
|
128
169
|
}
|
|
129
|
-
export function dispatchInboundMessage(args) {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
170
|
+
export async function dispatchInboundMessage(args) {
|
|
171
|
+
const { message, kind } = args;
|
|
172
|
+
const log = args.log ?? defaultSlackLog;
|
|
173
|
+
const binding = buildSlackBinding({
|
|
174
|
+
botToken: args.credentials?.botToken,
|
|
175
|
+
channelId: message.channelId,
|
|
176
|
+
threadTs: message.threadTs,
|
|
177
|
+
host: args.host,
|
|
178
|
+
artifacts: args.artifacts,
|
|
179
|
+
log,
|
|
180
|
+
teamId: message.teamId,
|
|
181
|
+
});
|
|
182
|
+
log.info("inbound", {
|
|
183
|
+
kind,
|
|
184
|
+
event_id: args.eventId,
|
|
185
|
+
channel: message.channelId,
|
|
186
|
+
thread_ts: message.threadTs,
|
|
187
|
+
message_ts: message.ts,
|
|
188
|
+
user: message.author?.userId,
|
|
189
|
+
team: message.teamId,
|
|
190
|
+
});
|
|
191
|
+
const handoff = args.platformHandoff?.slackPlaceholder;
|
|
192
|
+
const handoffInThread = kind !== "channel_post" &&
|
|
193
|
+
handoff !== undefined &&
|
|
194
|
+
handoff.channelId === message.channelId &&
|
|
195
|
+
handoff.threadTs === message.threadTs
|
|
196
|
+
? handoff
|
|
197
|
+
: undefined;
|
|
198
|
+
const matchedHandoff = args.placeholder !== undefined ? handoffInThread : undefined;
|
|
199
|
+
let adoptedPlaceholder = false;
|
|
200
|
+
let handoffRetracted = false;
|
|
201
|
+
const retractUnadoptedHandoff = async () => {
|
|
202
|
+
if (matchedHandoff === undefined || handoffRetracted) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
handoffRetracted = true;
|
|
206
|
+
await retractPlaceholderMessage({
|
|
207
|
+
botToken: args.credentials?.botToken,
|
|
208
|
+
channelId: matchedHandoff.channelId,
|
|
209
|
+
ts: matchedHandoff.messageTs,
|
|
210
|
+
streamed: matchedHandoff.streamed,
|
|
141
211
|
log,
|
|
142
|
-
teamId: message.teamId,
|
|
143
|
-
});
|
|
144
|
-
log.info("inbound", {
|
|
145
|
-
kind,
|
|
146
|
-
event_id: args.eventId,
|
|
147
|
-
channel: message.channelId,
|
|
148
|
-
thread_ts: message.threadTs,
|
|
149
|
-
message_ts: message.ts,
|
|
150
|
-
user: (_b = message.author) === null || _b === void 0 ? void 0 : _b.userId,
|
|
151
|
-
team: message.teamId,
|
|
152
212
|
});
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
handoff.channelId === message.channelId &&
|
|
157
|
-
handoff.threadTs === message.threadTs
|
|
158
|
-
? handoff
|
|
159
|
-
: undefined;
|
|
160
|
-
const matchedHandoff = args.placeholder !== undefined ? handoffInThread : undefined;
|
|
161
|
-
let adoptedPlaceholder = false;
|
|
162
|
-
let handoffRetracted = false;
|
|
163
|
-
const retractUnadoptedHandoff = () => __awaiter(this, void 0, void 0, function* () {
|
|
164
|
-
var _a;
|
|
165
|
-
if (matchedHandoff === undefined || handoffRetracted) {
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
handoffRetracted = true;
|
|
169
|
-
yield retractPlaceholderMessage({
|
|
170
|
-
botToken: (_a = args.credentials) === null || _a === void 0 ? void 0 : _a.botToken,
|
|
171
|
-
channelId: matchedHandoff.channelId,
|
|
172
|
-
ts: matchedHandoff.messageTs,
|
|
173
|
-
streamed: matchedHandoff.streamed,
|
|
174
|
-
log,
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
const adoptMatchedHandoff = () => __awaiter(this, void 0, void 0, function* () {
|
|
178
|
-
if (matchedHandoff === undefined) {
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
const adoption = adoptPlaceholder({
|
|
182
|
-
channelId: matchedHandoff.channelId,
|
|
183
|
-
threadTs: matchedHandoff.threadTs,
|
|
184
|
-
ts: matchedHandoff.messageTs,
|
|
185
|
-
streamed: matchedHandoff.streamed,
|
|
186
|
-
});
|
|
187
|
-
if (adoption === "adopted") {
|
|
188
|
-
adoptedPlaceholder = true;
|
|
189
|
-
log.info("placeholder adopted from control-plane handoff", {
|
|
190
|
-
channel: message.channelId,
|
|
191
|
-
thread_ts: message.threadTs,
|
|
192
|
-
message_ts: matchedHandoff.messageTs,
|
|
193
|
-
});
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
if (adoption === "occupied") {
|
|
197
|
-
// Another delivery owns this thread's slot. Remove only this delivery's
|
|
198
|
-
// redundant CP post.
|
|
199
|
-
yield retractUnadoptedHandoff();
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
const retractAdoptedPlaceholder = () => __awaiter(this, void 0, void 0, function* () {
|
|
203
|
-
var _a;
|
|
204
|
-
if (!adoptedPlaceholder) {
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
adoptedPlaceholder = false;
|
|
208
|
-
yield retractPlaceholderSlot({
|
|
209
|
-
channelId: message.channelId,
|
|
210
|
-
threadTs: message.threadTs,
|
|
211
|
-
botToken: (_a = args.credentials) === null || _a === void 0 ? void 0 : _a.botToken,
|
|
212
|
-
log,
|
|
213
|
-
});
|
|
214
|
-
});
|
|
215
|
-
const userId = (_7 = (_d = message.author) === null || _d === void 0 ? void 0 : _d.userId) !== null && _7 !== void 0 ? _7 : "";
|
|
216
|
-
const teamId = message.teamId;
|
|
217
|
-
let membership;
|
|
218
|
-
if (args.blockExternals !== false && ((_e = message.author) === null || _e === void 0 ? void 0 : _e.isBot) !== true) {
|
|
219
|
-
if (teamId === undefined || teamId === "") {
|
|
220
|
-
log.info("inbound dropped (missing team)", {
|
|
221
|
-
kind,
|
|
222
|
-
channel: message.channelId,
|
|
223
|
-
thread_ts: message.threadTs,
|
|
224
|
-
user: userId,
|
|
225
|
-
event_id: args.eventId,
|
|
226
|
-
});
|
|
227
|
-
yield retractUnadoptedHandoff();
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
membership = isExternalSlackSender({
|
|
231
|
-
botToken: (_f = args.credentials) === null || _f === void 0 ? void 0 : _f.botToken,
|
|
232
|
-
slackTeamId: teamId,
|
|
233
|
-
userId,
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
const dropExternal = () => {
|
|
237
|
-
log.info("inbound dropped (external sender)", {
|
|
238
|
-
kind,
|
|
239
|
-
channel: message.channelId,
|
|
240
|
-
thread_ts: message.threadTs,
|
|
241
|
-
user: userId,
|
|
242
|
-
team: teamId,
|
|
243
|
-
event_id: args.eventId,
|
|
244
|
-
});
|
|
245
|
-
};
|
|
246
|
-
const { probeKey: continuation, sendPatch } = slackSessionContinuation(args.continuation, message.channelId, message.threadTs);
|
|
247
|
-
const loadThread = !isSlackImChannel(message.channelId);
|
|
248
|
-
const hosted = args.propagateHandlerErrors === true;
|
|
249
|
-
const existsP = args.hasContinuationSession === undefined || (!loadThread && !hosted)
|
|
250
|
-
? undefined
|
|
251
|
-
: args.hasContinuationSession(continuation);
|
|
252
|
-
// Whole-message stop: cancel active turn + clear nudges (Benny parity).
|
|
253
|
-
if (isWholeMessageStop(message.text) || isWholeMessageStop(message.markdown)) {
|
|
254
|
-
if (membership !== undefined && (yield membership)) {
|
|
255
|
-
dropExternal();
|
|
256
|
-
yield retractUnadoptedHandoff();
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
log.info("stop directive", {
|
|
260
|
-
kind,
|
|
261
|
-
channel: message.channelId,
|
|
262
|
-
thread_ts: message.threadTs,
|
|
263
|
-
continuation,
|
|
264
|
-
event_id: args.eventId,
|
|
265
|
-
});
|
|
266
|
-
yield (_g = args.host.slackNudges) === null || _g === void 0 ? void 0 : _g.clear(continuation);
|
|
267
|
-
const interrupted = args.interruptContinuation === undefined
|
|
268
|
-
? false
|
|
269
|
-
: yield args.interruptContinuation(continuation);
|
|
270
|
-
try {
|
|
271
|
-
yield binding.thread.startTyping(interrupted ? "Stopped." : "Nothing to stop.");
|
|
272
|
-
}
|
|
273
|
-
catch (_21) {
|
|
274
|
-
// best-effort status
|
|
275
|
-
}
|
|
276
|
-
yield retractUnadoptedHandoff();
|
|
213
|
+
};
|
|
214
|
+
const adoptMatchedHandoff = async () => {
|
|
215
|
+
if (matchedHandoff === undefined) {
|
|
277
216
|
return;
|
|
278
217
|
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
dropExternal();
|
|
289
|
-
yield retractUnadoptedHandoff();
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
log.info("eval directive", {
|
|
293
|
-
kind,
|
|
218
|
+
const adoption = adoptPlaceholder({
|
|
219
|
+
channelId: matchedHandoff.channelId,
|
|
220
|
+
threadTs: matchedHandoff.threadTs,
|
|
221
|
+
ts: matchedHandoff.messageTs,
|
|
222
|
+
streamed: matchedHandoff.streamed,
|
|
223
|
+
});
|
|
224
|
+
if (adoption === "adopted") {
|
|
225
|
+
adoptedPlaceholder = true;
|
|
226
|
+
log.info("placeholder adopted from control-plane handoff", {
|
|
294
227
|
channel: message.channelId,
|
|
295
228
|
thread_ts: message.threadTs,
|
|
296
|
-
|
|
297
|
-
event_id: args.eventId,
|
|
298
|
-
directive: evalDirective.kind,
|
|
229
|
+
message_ts: matchedHandoff.messageTs,
|
|
299
230
|
});
|
|
300
|
-
yield handleSlackEvalDirective({
|
|
301
|
-
directive: evalDirective,
|
|
302
|
-
evals: args.host.evals,
|
|
303
|
-
binding,
|
|
304
|
-
});
|
|
305
|
-
yield retractUnadoptedHandoff();
|
|
306
231
|
return;
|
|
307
232
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
233
|
+
if (adoption === "occupied") {
|
|
234
|
+
// Another delivery owns this thread's slot. Remove only this delivery's
|
|
235
|
+
// redundant CP post.
|
|
236
|
+
await retractUnadoptedHandoff();
|
|
311
237
|
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
channel: message.channelId,
|
|
316
|
-
thread_ts: message.threadTs,
|
|
317
|
-
event_id: args.eventId,
|
|
318
|
-
});
|
|
319
|
-
if (args.propagateHandlerErrors === true) {
|
|
320
|
-
if (((_h = mapThrownRequestError(error)) === null || _h === void 0 ? void 0 : _h.retry) !== "transient") {
|
|
321
|
-
yield retractUnadoptedHandoff();
|
|
322
|
-
}
|
|
323
|
-
throw error;
|
|
324
|
-
}
|
|
325
|
-
yield retractUnadoptedHandoff();
|
|
238
|
+
};
|
|
239
|
+
const retractAdoptedPlaceholder = async () => {
|
|
240
|
+
if (!adoptedPlaceholder) {
|
|
326
241
|
return;
|
|
327
242
|
}
|
|
328
|
-
|
|
329
|
-
|
|
243
|
+
adoptedPlaceholder = false;
|
|
244
|
+
await retractPlaceholderSlot({
|
|
245
|
+
channelId: message.channelId,
|
|
246
|
+
threadTs: message.threadTs,
|
|
247
|
+
botToken: args.credentials?.botToken,
|
|
248
|
+
log,
|
|
249
|
+
});
|
|
250
|
+
};
|
|
251
|
+
const userId = message.author?.userId ?? "";
|
|
252
|
+
const teamId = message.teamId;
|
|
253
|
+
let membership;
|
|
254
|
+
if (args.blockExternals !== false && message.author?.isBot !== true) {
|
|
255
|
+
if (teamId === undefined || teamId === "") {
|
|
256
|
+
log.info("inbound dropped (missing team)", {
|
|
330
257
|
kind,
|
|
331
258
|
channel: message.channelId,
|
|
332
259
|
thread_ts: message.threadTs,
|
|
260
|
+
user: userId,
|
|
333
261
|
event_id: args.eventId,
|
|
334
262
|
});
|
|
335
|
-
|
|
263
|
+
await retractUnadoptedHandoff();
|
|
336
264
|
return;
|
|
337
265
|
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
266
|
+
membership = isExternalSlackSender({
|
|
267
|
+
botToken: args.credentials?.botToken,
|
|
268
|
+
slackTeamId: teamId,
|
|
269
|
+
userId,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
const dropExternal = () => {
|
|
273
|
+
log.info("inbound dropped (external sender)", {
|
|
274
|
+
kind,
|
|
275
|
+
channel: message.channelId,
|
|
276
|
+
thread_ts: message.threadTs,
|
|
277
|
+
user: userId,
|
|
278
|
+
team: teamId,
|
|
279
|
+
event_id: args.eventId,
|
|
280
|
+
});
|
|
281
|
+
};
|
|
282
|
+
const { probeKey: continuation, sendPatch } = slackSessionContinuation(args.continuation, message.channelId, message.threadTs);
|
|
283
|
+
const loadThread = !isSlackImChannel(message.channelId);
|
|
284
|
+
const hosted = args.propagateHandlerErrors === true;
|
|
285
|
+
const existsP = args.hasContinuationSession === undefined || (!loadThread && !hosted)
|
|
286
|
+
? undefined
|
|
287
|
+
: args.hasContinuationSession(continuation);
|
|
288
|
+
// Whole-message stop: cancel active turn + clear nudges (Benny parity).
|
|
289
|
+
if (isWholeMessageStop(message.text) || isWholeMessageStop(message.markdown)) {
|
|
290
|
+
if (membership !== undefined && (await membership)) {
|
|
291
|
+
dropExternal();
|
|
292
|
+
await retractUnadoptedHandoff();
|
|
348
293
|
return;
|
|
349
294
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
:
|
|
354
|
-
|
|
295
|
+
log.info("stop directive", {
|
|
296
|
+
kind,
|
|
297
|
+
channel: message.channelId,
|
|
298
|
+
thread_ts: message.threadTs,
|
|
299
|
+
continuation,
|
|
300
|
+
event_id: args.eventId,
|
|
301
|
+
});
|
|
302
|
+
await args.host.slackNudges?.clear(continuation);
|
|
303
|
+
const interrupted = args.interruptContinuation === undefined
|
|
304
|
+
? false
|
|
305
|
+
: await args.interruptContinuation(continuation);
|
|
306
|
+
try {
|
|
307
|
+
await binding.thread.startTyping(interrupted ? "Stopped." : "Nothing to stop.");
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
// best-effort status
|
|
311
|
+
}
|
|
312
|
+
await retractUnadoptedHandoff();
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
// Built-in eval directive: run playground batches without an agent turn.
|
|
316
|
+
// Only when the bot is addressed — a watched channel post is dispatched
|
|
317
|
+
// whatever it says, and may open with `eval` while talking to someone else.
|
|
318
|
+
const evalCommandsEnabled = args.evalCommandsEnabled !== false && (kind === "app_mention" || kind === "direct_message");
|
|
319
|
+
const evalDirective = evalCommandsEnabled && args.host.evals !== undefined
|
|
320
|
+
? (parseSlackEvalDirective(message.text) ?? parseSlackEvalDirective(message.markdown))
|
|
321
|
+
: null;
|
|
322
|
+
if (evalDirective !== null && args.host.evals !== undefined) {
|
|
323
|
+
if (membership !== undefined && (await membership)) {
|
|
324
|
+
dropExternal();
|
|
325
|
+
await retractUnadoptedHandoff();
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
log.info("eval directive", {
|
|
329
|
+
kind,
|
|
330
|
+
channel: message.channelId,
|
|
331
|
+
thread_ts: message.threadTs,
|
|
332
|
+
continuation,
|
|
333
|
+
event_id: args.eventId,
|
|
334
|
+
directive: evalDirective.kind,
|
|
335
|
+
});
|
|
336
|
+
await handleSlackEvalDirective({
|
|
337
|
+
directive: evalDirective,
|
|
338
|
+
evals: args.host.evals,
|
|
339
|
+
binding,
|
|
340
|
+
});
|
|
341
|
+
await retractUnadoptedHandoff();
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
let decision;
|
|
345
|
+
try {
|
|
346
|
+
decision = await args.handler(binding, message);
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
log.error(`${kind} handler failed`, {
|
|
350
|
+
error: error instanceof Error ? error.message : String(error),
|
|
351
|
+
channel: message.channelId,
|
|
352
|
+
thread_ts: message.threadTs,
|
|
353
|
+
event_id: args.eventId,
|
|
354
|
+
});
|
|
355
|
+
if (args.propagateHandlerErrors === true) {
|
|
356
|
+
if (mapThrownRequestError(error)?.retry !== "transient") {
|
|
357
|
+
await retractUnadoptedHandoff();
|
|
358
|
+
}
|
|
359
|
+
throw error;
|
|
360
|
+
}
|
|
361
|
+
await retractUnadoptedHandoff();
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
if (decision === null || decision === undefined) {
|
|
365
|
+
log.info("inbound skipped (handler returned null)", {
|
|
366
|
+
kind,
|
|
367
|
+
channel: message.channelId,
|
|
368
|
+
thread_ts: message.threadTs,
|
|
369
|
+
event_id: args.eventId,
|
|
370
|
+
});
|
|
371
|
+
await retractUnadoptedHandoff();
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
// Reply-once / delayed parent: claim channel:ts after the handler accepts.
|
|
375
|
+
const claimed = await args.host.slackNudges?.tryClaimAsk(message.channelId, message.ts);
|
|
376
|
+
if (claimed === false) {
|
|
377
|
+
log.info("inbound ask dedupe drop", {
|
|
378
|
+
kind,
|
|
379
|
+
channel: message.channelId,
|
|
380
|
+
message_ts: message.ts,
|
|
381
|
+
continuation,
|
|
382
|
+
event_id: args.eventId,
|
|
383
|
+
});
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
await adoptMatchedHandoff();
|
|
387
|
+
const painted = args.ack === undefined
|
|
388
|
+
? undefined
|
|
389
|
+
: paintTurnStart({
|
|
390
|
+
botToken: args.credentials?.botToken,
|
|
391
|
+
channelId: message.channelId,
|
|
392
|
+
threadTs: message.threadTs,
|
|
393
|
+
ack: args.ack,
|
|
394
|
+
log,
|
|
395
|
+
});
|
|
396
|
+
if (message.ts === message.threadTs && !isSlackImChannel(message.channelId)) {
|
|
397
|
+
void maybeSetThreadTitle({
|
|
398
|
+
botToken: args.credentials?.botToken,
|
|
399
|
+
channelId: message.channelId,
|
|
400
|
+
threadTs: message.threadTs,
|
|
401
|
+
title: firstLineTitle(message.markdown),
|
|
402
|
+
log,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
// A control-plane placeholder is turn scaffolding, not thread history: the
|
|
406
|
+
// guest posts the reply over that exact ts, so hydrating it would feed the
|
|
407
|
+
// model its own "still working" line as an already-sent reply.
|
|
408
|
+
const excludeThreadTimestamps = [
|
|
409
|
+
message.ts,
|
|
410
|
+
...(handoffInThread === undefined ? [] : [handoffInThread.messageTs]),
|
|
411
|
+
...(decision.excludeThreadTimestamps ?? []),
|
|
412
|
+
];
|
|
413
|
+
const mergeMessages = [triggeringMergeMessage(message)];
|
|
414
|
+
const continuationExists = existsP === undefined ? false : await existsP;
|
|
415
|
+
const hasSession = loadThread && continuationExists;
|
|
416
|
+
const afterTs = loadThread && hasSession && args.getContinuationLastBotMessageTs !== undefined
|
|
417
|
+
? await args.getContinuationLastBotMessageTs(continuation)
|
|
418
|
+
: undefined;
|
|
419
|
+
const selfIdentity = resolveSlackSelfIdentity(args.credentials?.botToken);
|
|
420
|
+
const senderTask = resolveSlackSender({
|
|
421
|
+
botToken: args.credentials?.botToken,
|
|
422
|
+
author: message.author,
|
|
423
|
+
});
|
|
424
|
+
// Channel mentions: cold <slack_thread>, warm <slack_thread_delta>.
|
|
425
|
+
const threadTask = !loadThread
|
|
426
|
+
? Promise.resolve(EMPTY_SLACK_THREAD_CONTEXT)
|
|
427
|
+
: hasSession
|
|
428
|
+
? loadSlackThreadDelta({
|
|
429
|
+
botToken: args.credentials?.botToken,
|
|
355
430
|
channelId: message.channelId,
|
|
356
431
|
threadTs: message.threadTs,
|
|
357
|
-
|
|
432
|
+
...(afterTs === undefined ? {} : { afterTs }),
|
|
433
|
+
excludeTs: excludeThreadTimestamps,
|
|
434
|
+
mergeMessages,
|
|
435
|
+
log,
|
|
436
|
+
})
|
|
437
|
+
: loadSlackThreadContext({
|
|
438
|
+
botToken: args.credentials?.botToken,
|
|
439
|
+
channelId: message.channelId,
|
|
440
|
+
threadTs: message.threadTs,
|
|
441
|
+
excludeTs: excludeThreadTimestamps,
|
|
442
|
+
mergeMessages,
|
|
358
443
|
log,
|
|
359
444
|
});
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
445
|
+
const [thread, external] = await Promise.all([threadTask, membership ?? Promise.resolve(false)]);
|
|
446
|
+
if (external === true) {
|
|
447
|
+
dropExternal();
|
|
448
|
+
if (painted !== undefined) {
|
|
449
|
+
await painted;
|
|
450
|
+
await retractTurnStart({
|
|
451
|
+
botToken: args.credentials?.botToken,
|
|
363
452
|
channelId: message.channelId,
|
|
364
453
|
threadTs: message.threadTs,
|
|
365
|
-
|
|
454
|
+
ack: args.ack ?? "",
|
|
366
455
|
log,
|
|
367
456
|
});
|
|
368
457
|
}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
458
|
+
await args.host.slackNudges?.releaseAsk(message.channelId, message.ts);
|
|
459
|
+
await retractAdoptedPlaceholder();
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
const threadContext = thread.block;
|
|
463
|
+
const threadFileCount = thread.files.length;
|
|
464
|
+
const media = await slackTurnMedia({
|
|
465
|
+
message,
|
|
466
|
+
threadFiles: thread.files,
|
|
467
|
+
decision,
|
|
468
|
+
botToken: args.credentials?.botToken,
|
|
469
|
+
log,
|
|
470
|
+
});
|
|
471
|
+
if ((message.files !== undefined && message.files.length > 0) || threadFileCount > 0) {
|
|
472
|
+
log.info("slack attachments prepared", {
|
|
473
|
+
kind,
|
|
474
|
+
channel: message.channelId,
|
|
475
|
+
thread_ts: message.threadTs,
|
|
476
|
+
thread_files: threadFileCount,
|
|
477
|
+
images: media.images?.length ?? 0,
|
|
478
|
+
workspace_files: Object.keys(media.workspaceFiles ?? {}).length,
|
|
479
|
+
event_id: args.eventId,
|
|
387
480
|
});
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
threadTs: message.threadTs,
|
|
398
|
-
excludeTs: excludeThreadTimestamps,
|
|
399
|
-
mergeMessages,
|
|
400
|
-
log,
|
|
401
|
-
});
|
|
402
|
-
const [thread, external] = yield Promise.all([threadTask, membership !== null && membership !== void 0 ? membership : Promise.resolve(false)]);
|
|
403
|
-
if (external === true) {
|
|
404
|
-
dropExternal();
|
|
405
|
-
if (painted !== undefined) {
|
|
406
|
-
yield painted;
|
|
407
|
-
yield retractTurnStart({
|
|
408
|
-
botToken: (_r = args.credentials) === null || _r === void 0 ? void 0 : _r.botToken,
|
|
409
|
-
channelId: message.channelId,
|
|
410
|
-
threadTs: message.threadTs,
|
|
411
|
-
ack: (_10 = args.ack) !== null && _10 !== void 0 ? _10 : "",
|
|
412
|
-
log,
|
|
413
|
-
});
|
|
414
|
-
}
|
|
415
|
-
yield (_s = args.host.slackNudges) === null || _s === void 0 ? void 0 : _s.releaseAsk(message.channelId, message.ts);
|
|
416
|
-
yield retractAdoptedPlaceholder();
|
|
417
|
-
return;
|
|
418
|
-
}
|
|
419
|
-
const threadContext = thread.block;
|
|
420
|
-
const threadFileCount = thread.files.length;
|
|
421
|
-
const media = yield slackTurnMedia({
|
|
422
|
-
message,
|
|
423
|
-
threadFiles: thread.files,
|
|
424
|
-
decision,
|
|
425
|
-
botToken: (_t = args.credentials) === null || _t === void 0 ? void 0 : _t.botToken,
|
|
426
|
-
log,
|
|
481
|
+
}
|
|
482
|
+
if (threadContext !== undefined) {
|
|
483
|
+
log.info(hasSession ? "thread delta loaded" : "thread context loaded", {
|
|
484
|
+
kind,
|
|
485
|
+
channel: message.channelId,
|
|
486
|
+
thread_ts: message.threadTs,
|
|
487
|
+
chars: threadContext.length,
|
|
488
|
+
event_id: args.eventId,
|
|
489
|
+
...(afterTs === undefined ? {} : { after_ts: afterTs }),
|
|
427
490
|
});
|
|
428
|
-
|
|
429
|
-
|
|
491
|
+
}
|
|
492
|
+
const [self, sender] = await Promise.all([selfIdentity, senderTask]);
|
|
493
|
+
const prompt = [
|
|
494
|
+
formatSlackContextBlock({
|
|
495
|
+
userId: message.author?.userId ?? "",
|
|
496
|
+
channelId: message.channelId,
|
|
497
|
+
threadTs: message.threadTs,
|
|
498
|
+
userName: sender.name,
|
|
499
|
+
userTz: sender.tz,
|
|
500
|
+
...(message.author?.isBot === true ? { userIsBot: true } : {}),
|
|
501
|
+
...(message.author?.botId === undefined ? {} : { userBotId: message.author.botId }),
|
|
502
|
+
...(message.teamId === undefined ? {} : { teamId: message.teamId }),
|
|
503
|
+
...(self === undefined ? {} : { selfUserId: self.userId }),
|
|
504
|
+
...(self?.name === undefined ? {} : { selfName: self.name }),
|
|
505
|
+
}),
|
|
506
|
+
...(threadContext === undefined ? [] : [threadContext]),
|
|
507
|
+
...(decision.context ?? []),
|
|
508
|
+
"",
|
|
509
|
+
media.userText,
|
|
510
|
+
]
|
|
511
|
+
.filter(part => part.length > 0)
|
|
512
|
+
.join("\n");
|
|
513
|
+
const paintedStart = painted !== undefined;
|
|
514
|
+
const placeholderLine = args.placeholder;
|
|
515
|
+
const hasPlaceholder = placeholderLine !== undefined && kind !== "channel_post";
|
|
516
|
+
const hostedFollowup = hosted && hasPlaceholder && (message.ts !== message.threadTs || continuationExists);
|
|
517
|
+
// Adopted slots already exist in Slack; skip a second post. Cold hosted
|
|
518
|
+
// without a handoff still defers to `turn.started`.
|
|
519
|
+
const placeholder = !adoptedPlaceholder && hasPlaceholder && (!hosted || hostedFollowup)
|
|
520
|
+
? startPlaceholder({
|
|
521
|
+
line: placeholderLine,
|
|
522
|
+
botToken: args.credentials?.botToken,
|
|
523
|
+
channelId: message.channelId,
|
|
524
|
+
threadTs: message.threadTs,
|
|
525
|
+
log,
|
|
526
|
+
recipientUserId: message.author?.userId,
|
|
527
|
+
recipientTeamId: message.teamId,
|
|
528
|
+
})
|
|
529
|
+
: undefined;
|
|
530
|
+
const posted = adoptedPlaceholder || placeholder !== undefined;
|
|
531
|
+
const state = emptySlackChannelState({
|
|
532
|
+
channelId: message.channelId,
|
|
533
|
+
threadTs: message.threadTs,
|
|
534
|
+
teamId: message.teamId ?? null,
|
|
535
|
+
triggeringUserId: message.author?.userId ?? null,
|
|
536
|
+
startPainted: paintedStart,
|
|
537
|
+
placeholderPosted: posted,
|
|
538
|
+
});
|
|
539
|
+
const sendOptions = {
|
|
540
|
+
auth: decision.auth,
|
|
541
|
+
...sendPatch,
|
|
542
|
+
admission: "coalesce",
|
|
543
|
+
coalesceSourceTs: message.ts,
|
|
544
|
+
state: state,
|
|
545
|
+
refreshState: slackWakeChannelState({
|
|
546
|
+
channelId: message.channelId,
|
|
547
|
+
threadTs: message.threadTs,
|
|
548
|
+
teamId: message.teamId ?? null,
|
|
549
|
+
triggeringUserId: message.author?.userId ?? null,
|
|
550
|
+
startPainted: paintedStart,
|
|
551
|
+
placeholderPosted: posted,
|
|
552
|
+
}),
|
|
553
|
+
title: decision.title ?? `slack:${message.channelId}:${message.threadTs}`,
|
|
554
|
+
workspaceDir: decision.workspaceDir,
|
|
555
|
+
workspaceFiles: media.workspaceFiles,
|
|
556
|
+
images: media.images,
|
|
557
|
+
cloud: decision.cloud,
|
|
558
|
+
sdkAgentId: decision.sdkAgentId,
|
|
559
|
+
};
|
|
560
|
+
try {
|
|
561
|
+
const session = await args.send(prompt, sendOptions);
|
|
562
|
+
if (isDeferredChannelSession(session)) {
|
|
563
|
+
log.info("session send captured (hosted admission)", {
|
|
430
564
|
kind,
|
|
565
|
+
continuation,
|
|
431
566
|
channel: message.channelId,
|
|
432
567
|
thread_ts: message.threadTs,
|
|
433
|
-
thread_files: threadFileCount,
|
|
434
|
-
images: (_11 = (_u = media.images) === null || _u === void 0 ? void 0 : _u.length) !== null && _11 !== void 0 ? _11 : 0,
|
|
435
|
-
workspace_files: Object.keys((_12 = media.workspaceFiles) !== null && _12 !== void 0 ? _12 : {}).length,
|
|
436
568
|
event_id: args.eventId,
|
|
437
569
|
});
|
|
570
|
+
return;
|
|
438
571
|
}
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
media.userText,
|
|
449
|
-
]
|
|
450
|
-
.filter(part => part.length > 0)
|
|
451
|
-
.join("\n");
|
|
452
|
-
const paintedStart = painted !== undefined;
|
|
453
|
-
const placeholderLine = args.placeholder;
|
|
454
|
-
const hasPlaceholder = placeholderLine !== undefined && kind !== "channel_post";
|
|
455
|
-
const hostedFollowup = hosted && hasPlaceholder && (message.ts !== message.threadTs || continuationExists);
|
|
456
|
-
// Adopted slots already exist in Slack; skip a second post. Cold hosted
|
|
457
|
-
// without a handoff still defers to `turn.started`.
|
|
458
|
-
const placeholder = !adoptedPlaceholder && hasPlaceholder && (!hosted || hostedFollowup)
|
|
459
|
-
? startPlaceholder({
|
|
460
|
-
line: placeholderLine,
|
|
461
|
-
botToken: (_y = args.credentials) === null || _y === void 0 ? void 0 : _y.botToken,
|
|
462
|
-
channelId: message.channelId,
|
|
463
|
-
threadTs: message.threadTs,
|
|
464
|
-
log,
|
|
465
|
-
recipientUserId: (_z = message.author) === null || _z === void 0 ? void 0 : _z.userId,
|
|
466
|
-
recipientTeamId: message.teamId,
|
|
467
|
-
})
|
|
468
|
-
: undefined;
|
|
469
|
-
const posted = adoptedPlaceholder || placeholder !== undefined;
|
|
470
|
-
const state = emptySlackChannelState({
|
|
471
|
-
channelId: message.channelId,
|
|
472
|
-
threadTs: message.threadTs,
|
|
473
|
-
teamId: (_15 = message.teamId) !== null && _15 !== void 0 ? _15 : null,
|
|
474
|
-
triggeringUserId: (_16 = (_0 = message.author) === null || _0 === void 0 ? void 0 : _0.userId) !== null && _16 !== void 0 ? _16 : null,
|
|
475
|
-
startPainted: paintedStart,
|
|
476
|
-
placeholderPosted: posted,
|
|
572
|
+
log.info(session.coalesced === true ? "session coalesced" : "session start", {
|
|
573
|
+
kind,
|
|
574
|
+
session: session.id,
|
|
575
|
+
is_new: session.isNew,
|
|
576
|
+
coalesced: session.coalesced === true,
|
|
577
|
+
continuation,
|
|
578
|
+
channel: message.channelId,
|
|
579
|
+
thread_ts: message.threadTs,
|
|
580
|
+
event_id: args.eventId,
|
|
477
581
|
});
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
placeholderPosted: posted,
|
|
485
|
-
}), title: (_19 = decision.title) !== null && _19 !== void 0 ? _19 : `slack:${message.channelId}:${message.threadTs}`, workspaceDir: decision.workspaceDir, workspaceFiles: media.workspaceFiles, images: media.images, cloud: decision.cloud, sdkAgentId: decision.sdkAgentId });
|
|
486
|
-
try {
|
|
487
|
-
const session = yield args.send(prompt, sendOptions);
|
|
488
|
-
if (isDeferredChannelSession(session)) {
|
|
489
|
-
log.info("session send captured (hosted admission)", {
|
|
490
|
-
kind,
|
|
491
|
-
continuation,
|
|
492
|
-
channel: message.channelId,
|
|
493
|
-
thread_ts: message.threadTs,
|
|
494
|
-
event_id: args.eventId,
|
|
495
|
-
});
|
|
496
|
-
return;
|
|
497
|
-
}
|
|
498
|
-
log.info(session.coalesced === true ? "session coalesced" : "session start", {
|
|
582
|
+
// Coalesce admits leave the active turn running: the follow-up is queued
|
|
583
|
+
// for the carrier to inject at the next tool boundary, and anything it
|
|
584
|
+
// does not reach in time drains into the boundary turn instead.
|
|
585
|
+
// Keep the placeholder; a new DM ts cannot overlay the carrier turn.
|
|
586
|
+
if (session.coalesced === true) {
|
|
587
|
+
log.info("session busy; coalescing follow-up", {
|
|
499
588
|
kind,
|
|
500
|
-
session: session.id,
|
|
501
|
-
is_new: session.isNew,
|
|
502
|
-
coalesced: session.coalesced === true,
|
|
503
|
-
continuation,
|
|
504
589
|
channel: message.channelId,
|
|
505
590
|
thread_ts: message.threadTs,
|
|
591
|
+
continuation,
|
|
506
592
|
event_id: args.eventId,
|
|
507
593
|
});
|
|
508
|
-
|
|
509
|
-
// for the carrier to inject at the next tool boundary, and anything it
|
|
510
|
-
// does not reach in time drains into the boundary turn instead.
|
|
511
|
-
// Keep the placeholder; a new DM ts cannot overlay the carrier turn.
|
|
512
|
-
if (session.coalesced === true) {
|
|
513
|
-
log.info("session busy; coalescing follow-up", {
|
|
514
|
-
kind,
|
|
515
|
-
channel: message.channelId,
|
|
516
|
-
thread_ts: message.threadTs,
|
|
517
|
-
continuation,
|
|
518
|
-
event_id: args.eventId,
|
|
519
|
-
});
|
|
520
|
-
if (!steeringEnabled()) {
|
|
521
|
-
try {
|
|
522
|
-
yield (_2 = args.host.slackNudges) === null || _2 === void 0 ? void 0 : _2.append({
|
|
523
|
-
continuationKey: continuation,
|
|
524
|
-
sourceTs: message.ts,
|
|
525
|
-
text: media.userText,
|
|
526
|
-
author: (_3 = message.author) === null || _3 === void 0 ? void 0 : _3.userName,
|
|
527
|
-
});
|
|
528
|
-
}
|
|
529
|
-
catch (nudgeError) {
|
|
530
|
-
log.warn("nudge append failed", {
|
|
531
|
-
error: nudgeError instanceof Error ? nudgeError.message : String(nudgeError),
|
|
532
|
-
continuation,
|
|
533
|
-
event_id: args.eventId,
|
|
534
|
-
});
|
|
535
|
-
}
|
|
536
|
-
}
|
|
594
|
+
if (!steeringEnabled()) {
|
|
537
595
|
try {
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
596
|
+
await args.host.slackNudges?.append({
|
|
597
|
+
continuationKey: continuation,
|
|
598
|
+
sourceTs: message.ts,
|
|
599
|
+
text: media.userText,
|
|
600
|
+
author: message.author?.userName,
|
|
601
|
+
});
|
|
541
602
|
}
|
|
542
|
-
catch (
|
|
543
|
-
log.
|
|
544
|
-
|
|
545
|
-
|
|
603
|
+
catch (nudgeError) {
|
|
604
|
+
log.warn("nudge append failed", {
|
|
605
|
+
error: nudgeError instanceof Error ? nudgeError.message : String(nudgeError),
|
|
606
|
+
continuation,
|
|
546
607
|
event_id: args.eventId,
|
|
547
608
|
});
|
|
548
609
|
}
|
|
549
610
|
}
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
yield placeholder.retract();
|
|
611
|
+
try {
|
|
612
|
+
if (args.followUpStatus !== false) {
|
|
613
|
+
await binding.thread.startTyping(FOLLOWUP_TYPING);
|
|
614
|
+
}
|
|
555
615
|
}
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
channelId: message.channelId,
|
|
562
|
-
threadTs: message.threadTs,
|
|
563
|
-
ack: (_20 = args.ack) !== null && _20 !== void 0 ? _20 : "",
|
|
564
|
-
log,
|
|
616
|
+
catch (typingError) {
|
|
617
|
+
log.error(`follow-up typing failed: ${typingError instanceof Error ? typingError.message : String(typingError)}`, {
|
|
618
|
+
channel: message.channelId,
|
|
619
|
+
thread_ts: message.threadTs,
|
|
620
|
+
event_id: args.eventId,
|
|
565
621
|
});
|
|
566
622
|
}
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
catch (error) {
|
|
626
|
+
await args.host.slackNudges?.releaseAsk(message.channelId, message.ts);
|
|
627
|
+
if (placeholder !== undefined) {
|
|
628
|
+
await placeholder.retract();
|
|
629
|
+
}
|
|
630
|
+
await retractAdoptedPlaceholder();
|
|
631
|
+
if (painted !== undefined) {
|
|
632
|
+
await painted;
|
|
633
|
+
await retractTurnStart({
|
|
634
|
+
botToken: args.credentials?.botToken,
|
|
635
|
+
channelId: message.channelId,
|
|
636
|
+
threadTs: message.threadTs,
|
|
637
|
+
ack: args.ack ?? "",
|
|
638
|
+
log,
|
|
572
639
|
});
|
|
573
640
|
}
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
641
|
+
log.error(`${kind} delivery failed: ${error instanceof Error ? error.message : String(error)}`, {
|
|
642
|
+
channel: message.channelId,
|
|
643
|
+
thread_ts: message.threadTs,
|
|
644
|
+
continuation,
|
|
645
|
+
event_id: args.eventId,
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
finally {
|
|
649
|
+
if (placeholder !== undefined) {
|
|
650
|
+
await placeholder.done;
|
|
578
651
|
}
|
|
579
|
-
}
|
|
652
|
+
}
|
|
580
653
|
}
|
|
581
654
|
/**
|
|
582
655
|
* Parse an Events API body (or Socket Mode `events_api` payload) and dispatch
|
|
@@ -584,18 +657,15 @@ export function dispatchInboundMessage(args) {
|
|
|
584
657
|
* present. Returns true when a handler was scheduled.
|
|
585
658
|
*/
|
|
586
659
|
export function dispatchInboundFromEventBody(body, deps) {
|
|
587
|
-
|
|
588
|
-
var _e, _f, _g, _h, _j;
|
|
589
|
-
const log = (_e = deps.log) !== null && _e !== void 0 ? _e : defaultSlackLog;
|
|
660
|
+
const log = deps.log ?? defaultSlackLog;
|
|
590
661
|
let eventId;
|
|
591
662
|
const retractUnscheduledHandoff = () => {
|
|
592
|
-
|
|
593
|
-
const placeholder = (_a = deps.platformHandoff) === null || _a === void 0 ? void 0 : _a.slackPlaceholder;
|
|
663
|
+
const placeholder = deps.platformHandoff?.slackPlaceholder;
|
|
594
664
|
if (placeholder === undefined) {
|
|
595
665
|
return;
|
|
596
666
|
}
|
|
597
667
|
deps.waitUntil(retractPlaceholderMessage({
|
|
598
|
-
botToken:
|
|
668
|
+
botToken: deps.credentials?.botToken,
|
|
599
669
|
channelId: placeholder.channelId,
|
|
600
670
|
ts: placeholder.messageTs,
|
|
601
671
|
streamed: placeholder.streamed,
|
|
@@ -622,10 +692,10 @@ export function dispatchInboundFromEventBody(body, deps) {
|
|
|
622
692
|
retractUnscheduledHandoff();
|
|
623
693
|
return false;
|
|
624
694
|
}
|
|
625
|
-
if (
|
|
695
|
+
if (mention.author?.isBot === true) {
|
|
626
696
|
// Parse only admits bot-authored mentions when a gate exists, so the
|
|
627
697
|
// fallback is defensive.
|
|
628
|
-
const verdict =
|
|
698
|
+
const verdict = deps.botMentionGate?.evaluate(mention) ?? {
|
|
629
699
|
allow: false,
|
|
630
700
|
reason: "bot mentions not enabled",
|
|
631
701
|
};
|
|
@@ -634,7 +704,7 @@ export function dispatchInboundFromEventBody(body, deps) {
|
|
|
634
704
|
event_id: eventId,
|
|
635
705
|
channel: mention.channelId,
|
|
636
706
|
thread_ts: mention.threadTs,
|
|
637
|
-
from_bot:
|
|
707
|
+
from_bot: mention.author.botId ?? mention.author.userId,
|
|
638
708
|
reason: verdict.reason,
|
|
639
709
|
});
|
|
640
710
|
retractUnscheduledHandoff();
|
|
@@ -684,7 +754,7 @@ export function dispatchInboundFromEventBody(body, deps) {
|
|
|
684
754
|
}
|
|
685
755
|
const home = parseAppHomeOpened(body);
|
|
686
756
|
if (home !== null) {
|
|
687
|
-
const prompts =
|
|
757
|
+
const prompts = deps.suggestedPrompts ?? [];
|
|
688
758
|
log.info("app home opened", {
|
|
689
759
|
channel: home.channelId,
|
|
690
760
|
tab: home.tab,
|
|
@@ -693,7 +763,7 @@ export function dispatchInboundFromEventBody(body, deps) {
|
|
|
693
763
|
});
|
|
694
764
|
if (home.tab === "messages" && prompts.length > 0) {
|
|
695
765
|
deps.waitUntil(maybeSetSuggestedPrompts({
|
|
696
|
-
botToken:
|
|
766
|
+
botToken: deps.credentials?.botToken,
|
|
697
767
|
channelId: home.channelId,
|
|
698
768
|
prompts,
|
|
699
769
|
title: deps.suggestedPromptsTitle,
|
|
@@ -704,7 +774,7 @@ export function dispatchInboundFromEventBody(body, deps) {
|
|
|
704
774
|
}
|
|
705
775
|
const assistantThread = parseAssistantThreadStarted(body);
|
|
706
776
|
if (assistantThread !== null) {
|
|
707
|
-
const prompts =
|
|
777
|
+
const prompts = deps.suggestedPrompts ?? [];
|
|
708
778
|
log.info("assistant thread started", {
|
|
709
779
|
channel: assistantThread.channelId,
|
|
710
780
|
thread_ts: assistantThread.threadTs,
|
|
@@ -713,7 +783,7 @@ export function dispatchInboundFromEventBody(body, deps) {
|
|
|
713
783
|
});
|
|
714
784
|
if (prompts.length > 0) {
|
|
715
785
|
deps.waitUntil(maybeSetSuggestedPrompts({
|
|
716
|
-
botToken:
|
|
786
|
+
botToken: deps.credentials?.botToken,
|
|
717
787
|
channelId: assistantThread.channelId,
|
|
718
788
|
threadTs: assistantThread.threadTs,
|
|
719
789
|
prompts,
|
|
@@ -734,7 +804,10 @@ export function dispatchInboundFromEventBody(body, deps) {
|
|
|
734
804
|
return deps.channelWatch.handle(channelEvent, eventId);
|
|
735
805
|
}
|
|
736
806
|
}
|
|
737
|
-
log.debug("inbound ignored (unhandled event shape)",
|
|
807
|
+
log.debug("inbound ignored (unhandled event shape)", {
|
|
808
|
+
...describeSlackEventShape(body),
|
|
809
|
+
event_id: eventId,
|
|
810
|
+
});
|
|
738
811
|
retractUnscheduledHandoff();
|
|
739
812
|
return false;
|
|
740
813
|
}
|