@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.
Files changed (569) hide show
  1. package/dist/artifacts.js +3 -5
  2. package/dist/bin/agent-serve.js +803 -812
  3. package/dist/channels/bitbucket/api.js +305 -321
  4. package/dist/channels/bitbucket/binding.js +97 -61
  5. package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
  6. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
  7. package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
  8. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
  9. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  10. package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
  11. package/dist/channels/bitbucket/checks.js +9 -21
  12. package/dist/channels/bitbucket/cursor-account.js +1 -1
  13. package/dist/channels/bitbucket/defaults.js +14 -4
  14. package/dist/channels/bitbucket/events.js +1 -2
  15. package/dist/channels/bitbucket/index.d.ts +6 -2
  16. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  17. package/dist/channels/bitbucket/index.js +6 -2
  18. package/dist/channels/bitbucket/replay.js +80 -56
  19. package/dist/channels/bitbucket/state.js +16 -7
  20. package/dist/channels/bitbucket/types.d.ts +11 -2
  21. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  22. package/dist/channels/checks.js +18 -28
  23. package/dist/channels/deployments/deployments-channel.js +26 -34
  24. package/dist/channels/github/api.js +216 -210
  25. package/dist/channels/github/auth.d.ts +5 -1
  26. package/dist/channels/github/auth.d.ts.map +1 -1
  27. package/dist/channels/github/auth.js +157 -174
  28. package/dist/channels/github/binding.js +48 -39
  29. package/dist/channels/github/checks.js +9 -14
  30. package/dist/channels/github/cursor-account.js +6 -11
  31. package/dist/channels/github/defaults.js +105 -130
  32. package/dist/channels/github/forward.js +13 -17
  33. package/dist/channels/github/github-channel.d.ts +43 -2
  34. package/dist/channels/github/github-channel.d.ts.map +1 -1
  35. package/dist/channels/github/github-channel.js +1228 -958
  36. package/dist/channels/github/progress.js +145 -146
  37. package/dist/channels/github/replay.js +30 -39
  38. package/dist/channels/github/state.js +40 -16
  39. package/dist/channels/github/types.d.ts +30 -6
  40. package/dist/channels/github/types.d.ts.map +1 -1
  41. package/dist/channels/gitlab/api.js +100 -114
  42. package/dist/channels/gitlab/binding.js +52 -33
  43. package/dist/channels/gitlab/checks.js +28 -29
  44. package/dist/channels/gitlab/cursor-account.js +1 -1
  45. package/dist/channels/gitlab/defaults.js +9 -3
  46. package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
  47. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
  48. package/dist/channels/gitlab/gitlab-channel.js +95 -42
  49. package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
  50. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
  51. package/dist/channels/gitlab/gitlab-webhook.js +282 -249
  52. package/dist/channels/gitlab/index.d.ts +6 -2
  53. package/dist/channels/gitlab/index.d.ts.map +1 -1
  54. package/dist/channels/gitlab/index.js +6 -2
  55. package/dist/channels/gitlab/replay.js +50 -27
  56. package/dist/channels/gitlab/state.js +14 -6
  57. package/dist/channels/gitlab/types.d.ts +13 -2
  58. package/dist/channels/gitlab/types.d.ts.map +1 -1
  59. package/dist/channels/origin/api.js +100 -116
  60. package/dist/channels/origin/binding.js +15 -16
  61. package/dist/channels/origin/checks.js +30 -28
  62. package/dist/channels/origin/defaults.js +50 -65
  63. package/dist/channels/origin/origin-channel.js +266 -272
  64. package/dist/channels/origin/origin-webhook.js +70 -88
  65. package/dist/channels/origin/reactions.js +9 -21
  66. package/dist/channels/origin/state.js +13 -5
  67. package/dist/channels/slack/agentic-delivery.js +426 -478
  68. package/dist/channels/slack/agentic-posted.js +9 -10
  69. package/dist/channels/slack/agentic-signals.js +2 -3
  70. package/dist/channels/slack/api.js +417 -427
  71. package/dist/channels/slack/approvals.js +1 -1
  72. package/dist/channels/slack/assistant.js +37 -47
  73. package/dist/channels/slack/attachments.js +188 -206
  74. package/dist/channels/slack/auth.js +8 -6
  75. package/dist/channels/slack/bot-mentions.js +31 -45
  76. package/dist/channels/slack/channel-watch.js +42 -48
  77. package/dist/channels/slack/cli-project.js +112 -137
  78. package/dist/channels/slack/code-fences.js +3 -5
  79. package/dist/channels/slack/constants.js +2 -2
  80. package/dist/channels/slack/credentials.js +23 -38
  81. package/dist/channels/slack/defaults.js +292 -331
  82. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  83. package/dist/channels/slack/dispatch.js +533 -460
  84. package/dist/channels/slack/doctor.js +200 -214
  85. package/dist/channels/slack/eval-directive.js +79 -96
  86. package/dist/channels/slack/event-id-dedupe.js +1 -1
  87. package/dist/channels/slack/external-policy.js +26 -39
  88. package/dist/channels/slack/footer.js +28 -41
  89. package/dist/channels/slack/inbound.d.ts +1 -0
  90. package/dist/channels/slack/inbound.d.ts.map +1 -1
  91. package/dist/channels/slack/inbound.js +50 -31
  92. package/dist/channels/slack/init.d.ts +1 -5
  93. package/dist/channels/slack/init.d.ts.map +1 -1
  94. package/dist/channels/slack/init.js +42 -59
  95. package/dist/channels/slack/interactive.d.ts +9 -3
  96. package/dist/channels/slack/interactive.d.ts.map +1 -1
  97. package/dist/channels/slack/interactive.js +160 -162
  98. package/dist/channels/slack/links.js +1 -2
  99. package/dist/channels/slack/live-delivery.js +172 -190
  100. package/dist/channels/slack/manifest.d.ts.map +1 -1
  101. package/dist/channels/slack/manifest.js +44 -23
  102. package/dist/channels/slack/message-body.js +2 -2
  103. package/dist/channels/slack/nudge-carrier.js +30 -42
  104. package/dist/channels/slack/nudge-store.js +164 -191
  105. package/dist/channels/slack/paint-start.js +66 -81
  106. package/dist/channels/slack/placeholder.js +123 -152
  107. package/dist/channels/slack/pr-ref.js +1 -1
  108. package/dist/channels/slack/progress-delivery.js +65 -78
  109. package/dist/channels/slack/reasoning-card.js +36 -49
  110. package/dist/channels/slack/recording-sink.js +12 -24
  111. package/dist/channels/slack/reply-options.js +7 -12
  112. package/dist/channels/slack/self-identity.js +27 -35
  113. package/dist/channels/slack/sender-name.d.ts +12 -3
  114. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  115. package/dist/channels/slack/sender-name.js +57 -61
  116. package/dist/channels/slack/setup.js +2 -4
  117. package/dist/channels/slack/slack-channel.d.ts +6 -4
  118. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  119. package/dist/channels/slack/slack-channel.js +441 -308
  120. package/dist/channels/slack/socket-mode.js +38 -52
  121. package/dist/channels/slack/thread-context.js +143 -160
  122. package/dist/channels/slack/tool-approval-events.js +149 -166
  123. package/dist/channels/slack/tool-cards.js +6 -11
  124. package/dist/channels/slack/tool-chip.js +1 -2
  125. package/dist/channels/slack/types.d.ts +15 -17
  126. package/dist/channels/slack/types.d.ts.map +1 -1
  127. package/dist/channels/slack/upload.js +84 -97
  128. package/dist/channels/slack/user-info.js +27 -41
  129. package/dist/channels.js +9 -20
  130. package/dist/dashboard-session-url.js +3 -4
  131. package/dist/docs/404.html +2 -2
  132. package/dist/docs/assets/{app.BNhEdGa8.js → app.DXI7bwox.js} +4 -4
  133. package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
  134. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
  135. package/dist/docs/assets/chunks/{VPLocalSearchBox.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
  136. package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
  137. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
  138. package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
  139. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
  140. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
  141. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
  142. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
  143. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
  144. package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
  145. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
  146. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
  147. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
  148. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
  149. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
  150. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
  151. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
  152. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
  153. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
  154. package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
  155. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
  156. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
  157. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
  158. package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
  159. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
  160. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
  161. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
  162. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
  163. package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
  164. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
  165. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
  166. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
  167. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
  168. package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
  169. package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
  170. package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
  171. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
  172. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
  173. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
  174. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
  175. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
  176. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
  177. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
  178. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
  179. package/dist/docs/assets/chunks/{theme.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
  180. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
  181. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
  182. package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
  183. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
  184. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
  185. package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
  186. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
  187. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
  188. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
  189. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
  190. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
  191. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
  192. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
  193. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
  194. package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
  195. package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
  196. package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
  197. package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
  198. package/dist/docs/building-with-agents.html +37 -37
  199. package/dist/docs/building-with-agents.md +2 -0
  200. package/dist/docs/deployment.html +38 -38
  201. package/dist/docs/deployment.md +7 -0
  202. package/dist/docs/evals.html +36 -36
  203. package/dist/docs/guides/agent-to-agent.html +35 -35
  204. package/dist/docs/guides/bitbucket.html +38 -38
  205. package/dist/docs/guides/bitbucket.md +9 -1
  206. package/dist/docs/guides/cloud-agents.html +35 -35
  207. package/dist/docs/guides/convert-automation.html +35 -35
  208. package/dist/docs/guides/github.html +39 -39
  209. package/dist/docs/guides/github.md +20 -4
  210. package/dist/docs/guides/gitlab.html +38 -38
  211. package/dist/docs/guides/gitlab.md +9 -1
  212. package/dist/docs/guides/grokbot-agents.html +35 -35
  213. package/dist/docs/guides/hooks.html +35 -35
  214. package/dist/docs/guides/improve.html +35 -35
  215. package/dist/docs/guides/jev.html +35 -35
  216. package/dist/docs/guides/mcp-oauth.html +35 -35
  217. package/dist/docs/guides/migrate.html +66 -0
  218. package/dist/docs/guides/migrate.md +122 -0
  219. package/dist/docs/guides/opentelemetry.html +35 -35
  220. package/dist/docs/guides/slack.html +35 -35
  221. package/dist/docs/guides/webhooks.html +35 -35
  222. package/dist/docs/hashmap.json +1 -1
  223. package/dist/docs/hillclimbing.html +35 -35
  224. package/dist/docs/index.html +35 -35
  225. package/dist/docs/llms-full.txt +214 -6
  226. package/dist/docs/llms.txt +1 -0
  227. package/dist/docs/quickstart.html +35 -35
  228. package/dist/docs/reference/agent-config.html +35 -35
  229. package/dist/docs/reference/artifacts.html +35 -35
  230. package/dist/docs/reference/channels.html +35 -35
  231. package/dist/docs/reference/cli.html +39 -38
  232. package/dist/docs/reference/cli.md +39 -0
  233. package/dist/docs/reference/connections.html +35 -35
  234. package/dist/docs/reference/evals.html +35 -35
  235. package/dist/docs/reference/extensions.html +35 -35
  236. package/dist/docs/reference/hooks.html +35 -35
  237. package/dist/docs/reference/http-api.html +35 -35
  238. package/dist/docs/reference/instructions.html +35 -35
  239. package/dist/docs/reference/playground.html +35 -35
  240. package/dist/docs/reference/project-layout.html +35 -35
  241. package/dist/docs/reference/prompt.html +35 -35
  242. package/dist/docs/reference/schedules.html +35 -35
  243. package/dist/docs/reference/sessions.html +35 -35
  244. package/dist/docs/reference/skills.html +35 -35
  245. package/dist/docs/reference/subagents.html +35 -35
  246. package/dist/docs/reference/tools.html +35 -35
  247. package/dist/docs/templates/agentic-owners.html +35 -35
  248. package/dist/docs/templates/grokbot-agents.html +35 -35
  249. package/dist/docs/templates/security-reviewer.html +35 -35
  250. package/dist/docs/templates/thermo-quality-review.html +35 -35
  251. package/dist/docs/templates/thermo-review.html +35 -35
  252. package/dist/docs/templates/triage.html +35 -35
  253. package/dist/docs/troubleshooting.html +36 -36
  254. package/dist/docs/troubleshooting.md +1 -0
  255. package/dist/evals/assertions.js +20 -34
  256. package/dist/evals/expect.js +3 -6
  257. package/dist/evals/judge.js +5 -8
  258. package/dist/evals/loaders.js +45 -62
  259. package/dist/evals/matchers.js +2 -3
  260. package/dist/evals/reporters.js +43 -67
  261. package/dist/evals/results.js +1 -1
  262. package/dist/evals/run-facts.js +5 -6
  263. package/dist/evals.js +27 -15
  264. package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
  265. package/dist/extensions/cursor-cloud-agents/lib/backend.js +100 -126
  266. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
  267. package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
  268. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
  269. package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
  270. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
  271. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
  272. package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
  273. package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
  274. package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
  275. package/dist/extensions/cursor-cloud-agents/tools/list.js +8 -19
  276. package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
  277. package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
  278. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  279. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
  280. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
  281. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
  282. package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
  283. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
  284. package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
  285. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
  286. package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
  287. package/dist/extensions/jev/extension.js +3 -3
  288. package/dist/extensions/jev/lib/evaluate.js +43 -60
  289. package/dist/extensions/jev/tools/evaluate.js +6 -17
  290. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  291. package/dist/extensions.js +3 -5
  292. package/dist/files-backends/cursor-hosted.js +504 -523
  293. package/dist/files-backends/local-fs.js +72 -134
  294. package/dist/files.js +3 -3
  295. package/dist/filesystem.js +562 -861
  296. package/dist/index.js +16 -35
  297. package/dist/internal/advertise-tools.js +74 -86
  298. package/dist/internal/artifacts-store.js +298 -361
  299. package/dist/internal/as-of.js +2 -4
  300. package/dist/internal/authored-alias-hooks.js +6 -4
  301. package/dist/internal/authored-loaders.js +37 -52
  302. package/dist/internal/bounded-int.js +1 -2
  303. package/dist/internal/bounded.js +13 -24
  304. package/dist/internal/brand.js +1 -1
  305. package/dist/internal/browser-origin-guard.js +4 -4
  306. package/dist/internal/builtin-tools/artifacts.js +15 -27
  307. package/dist/internal/builtin-tools/index.js +2 -3
  308. package/dist/internal/builtin-tools/reminders.js +33 -52
  309. package/dist/internal/channel-architecture.d.ts +21 -0
  310. package/dist/internal/channel-architecture.d.ts.map +1 -0
  311. package/dist/internal/channel-architecture.js +41 -0
  312. package/dist/internal/channel-dispatch.js +3 -4
  313. package/dist/internal/channel-route-dispatch.js +40 -51
  314. package/dist/internal/channel-state.js +1 -1
  315. package/dist/internal/chat-client.js +319 -340
  316. package/dist/internal/cli-ax.js +1262 -1294
  317. package/dist/internal/cli-bitbucket.js +244 -272
  318. package/dist/internal/cli-convert-automation.js +137 -151
  319. package/dist/internal/cli-cursor.js +126 -147
  320. package/dist/internal/cli-deploy.d.ts.map +1 -1
  321. package/dist/internal/cli-deploy.js +1457 -1507
  322. package/dist/internal/cli-docs.js +130 -147
  323. package/dist/internal/cli-github.js +437 -476
  324. package/dist/internal/cli-gitlab.js +259 -288
  325. package/dist/internal/cli-images.js +266 -334
  326. package/dist/internal/cli-manifest.js +25 -37
  327. package/dist/internal/cli-mcp-oauth.js +228 -247
  328. package/dist/internal/cli-mcp.js +358 -383
  329. package/dist/internal/cli-migrate.js +73 -90
  330. package/dist/internal/cli-skills.js +35 -47
  331. package/dist/internal/cli-slack-manual.d.ts +0 -1
  332. package/dist/internal/cli-slack-manual.d.ts.map +1 -1
  333. package/dist/internal/cli-slack-manual.js +175 -204
  334. package/dist/internal/cli-slack.d.ts +1 -1
  335. package/dist/internal/cli-slack.d.ts.map +1 -1
  336. package/dist/internal/cli-slack.js +416 -456
  337. package/dist/internal/cloud-merge.js +7 -3
  338. package/dist/internal/cloud-turn-cost.js +8 -1
  339. package/dist/internal/connection-env.js +5 -6
  340. package/dist/internal/continuation-channel.js +10 -7
  341. package/dist/internal/continuation-identity.js +85 -67
  342. package/dist/internal/conversation-mirror.js +112 -131
  343. package/dist/internal/convert-automation/convert-workflow.js +21 -31
  344. package/dist/internal/cron.js +3 -3
  345. package/dist/internal/cursor/account-mcp.js +147 -146
  346. package/dist/internal/cursor/backend-client.js +290 -320
  347. package/dist/internal/cursor/bound-secret-file.js +3 -3
  348. package/dist/internal/cursor/credentials.js +127 -142
  349. package/dist/internal/cursor/cursor-api-transport.js +4 -8
  350. package/dist/internal/cursor/github-credentials.js +91 -108
  351. package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
  352. package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
  353. package/dist/internal/cursor/hosted-store-secrets.js +5 -9
  354. package/dist/internal/cursor/session-token.js +36 -48
  355. package/dist/internal/cursor/store-api-client.js +77 -92
  356. package/dist/internal/cursor-account-mcp-auth.js +132 -149
  357. package/dist/internal/cursor-agent-template.js +1 -1
  358. package/dist/internal/cursor-deployment-relay.js +33 -54
  359. package/dist/internal/cursor-event-relay.js +65 -59
  360. package/dist/internal/cursor-relay-core.js +258 -286
  361. package/dist/internal/deferred-channel-session.js +3 -12
  362. package/dist/internal/deploy-client.d.ts.map +1 -1
  363. package/dist/internal/deploy-client.js +413 -475
  364. package/dist/internal/deploy-manifest.d.ts +17 -0
  365. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  366. package/dist/internal/deploy-manifest.js +71 -21
  367. package/dist/internal/deploy-source.js +31 -43
  368. package/dist/internal/discovery/agent-config.js +45 -59
  369. package/dist/internal/discovery/agent.js +276 -280
  370. package/dist/internal/discovery/channels.js +67 -80
  371. package/dist/internal/discovery/connections.js +286 -296
  372. package/dist/internal/discovery/context.js +2 -13
  373. package/dist/internal/discovery/cursor-plugin.js +223 -259
  374. package/dist/internal/discovery/extension-overlay.js +104 -131
  375. package/dist/internal/discovery/extensions.js +276 -281
  376. package/dist/internal/discovery/fs.js +56 -79
  377. package/dist/internal/discovery/hooks.js +39 -50
  378. package/dist/internal/discovery/info.js +17 -19
  379. package/dist/internal/discovery/instructions.js +58 -71
  380. package/dist/internal/discovery/modules.js +45 -58
  381. package/dist/internal/discovery/project.d.ts.map +1 -1
  382. package/dist/internal/discovery/project.js +192 -215
  383. package/dist/internal/discovery/reminders.js +41 -52
  384. package/dist/internal/discovery/runtime.js +1 -1
  385. package/dist/internal/discovery/schedules.js +71 -82
  386. package/dist/internal/discovery/seed-files.js +21 -32
  387. package/dist/internal/discovery/services.js +74 -96
  388. package/dist/internal/discovery/skills.js +77 -94
  389. package/dist/internal/discovery/subagent.js +79 -95
  390. package/dist/internal/discovery/tools.js +12 -23
  391. package/dist/internal/distribution.js +2 -2
  392. package/dist/internal/docs-site.js +30 -45
  393. package/dist/internal/duration.js +1 -1
  394. package/dist/internal/env-file.js +48 -64
  395. package/dist/internal/eval-judge-model.js +17 -28
  396. package/dist/internal/eval-run-store.js +265 -254
  397. package/dist/internal/eval-runner.d.ts +8 -0
  398. package/dist/internal/eval-runner.d.ts.map +1 -1
  399. package/dist/internal/eval-runner.js +406 -408
  400. package/dist/internal/eval-transport.d.ts +24 -0
  401. package/dist/internal/eval-transport.d.ts.map +1 -0
  402. package/dist/internal/eval-transport.js +22 -0
  403. package/dist/internal/evals-client.js +242 -246
  404. package/dist/internal/event-log.js +72 -120
  405. package/dist/internal/event-mapper.js +30 -31
  406. package/dist/internal/factory-resource-channel.js +16 -30
  407. package/dist/internal/filesystem/errors.js +6 -6
  408. package/dist/internal/filesystem/format.js +10 -13
  409. package/dist/internal/filesystem/merge.js +52 -94
  410. package/dist/internal/filesystem/nearest.js +15 -27
  411. package/dist/internal/filesystem/scratch.js +65 -85
  412. package/dist/internal/filesystem/tools.js +221 -241
  413. package/dist/internal/filesystem/walk.js +76 -143
  414. package/dist/internal/framework-file-storage.js +118 -139
  415. package/dist/internal/framework-storage-selection.js +21 -13
  416. package/dist/internal/frontmatter.js +4 -6
  417. package/dist/internal/github-fanout.js +50 -64
  418. package/dist/internal/guest-network.js +96 -109
  419. package/dist/internal/handleAgentServeTrigger.js +121 -126
  420. package/dist/internal/host-files.js +73 -88
  421. package/dist/internal/host-kv.js +21 -36
  422. package/dist/internal/host-otel.js +22 -19
  423. package/dist/internal/host-platforms.js +49 -63
  424. package/dist/internal/hosted-catch-protocol.d.ts +1 -0
  425. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  426. package/dist/internal/hosted-catch-protocol.js +1 -0
  427. package/dist/internal/hosted-catch.d.ts +5 -3
  428. package/dist/internal/hosted-catch.d.ts.map +1 -1
  429. package/dist/internal/hosted-catch.js +84 -93
  430. package/dist/internal/hosted-delivery-protocol.js +32 -8
  431. package/dist/internal/hosted-delivery.d.ts +13 -1
  432. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  433. package/dist/internal/hosted-delivery.js +614 -584
  434. package/dist/internal/hosted-eval-cases.d.ts +21 -0
  435. package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
  436. package/dist/internal/hosted-eval-cases.js +162 -0
  437. package/dist/internal/hosted-execution-diag.js +38 -30
  438. package/dist/internal/hosted-execution-flush.js +75 -66
  439. package/dist/internal/hosted-execution-latency.js +16 -8
  440. package/dist/internal/hosted-managed-automation.js +2 -2
  441. package/dist/internal/hosting.js +2 -3
  442. package/dist/internal/http-channel-define.js +4 -1
  443. package/dist/internal/http-channel.js +101 -112
  444. package/dist/internal/http-control-plane-session.d.ts +18 -1
  445. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  446. package/dist/internal/http-control-plane-session.js +66 -32
  447. package/dist/internal/incoming-headers-to-fetch.js +1 -2
  448. package/dist/internal/init-interview.js +73 -93
  449. package/dist/internal/init-project.js +182 -214
  450. package/dist/internal/init-scaffold.js +10 -21
  451. package/dist/internal/inline-stdio-mcp.js +80 -86
  452. package/dist/internal/install-cursor-skills.js +231 -273
  453. package/dist/internal/legacy-command-guard.js +18 -31
  454. package/dist/internal/listen-port.js +34 -45
  455. package/dist/internal/local-control-plane.js +293 -307
  456. package/dist/internal/local-env.js +1 -1
  457. package/dist/internal/local-ingress.js +15 -9
  458. package/dist/internal/log-ring.js +1 -2
  459. package/dist/internal/logs-client.js +207 -227
  460. package/dist/internal/map-pool.js +24 -38
  461. package/dist/internal/mcp-endpoint.js +204 -180
  462. package/dist/internal/mcp-host.js +165 -168
  463. package/dist/internal/mcp-oauth-on-demand.js +170 -207
  464. package/dist/internal/mcp-oauth-persist.js +15 -29
  465. package/dist/internal/mcp-oauth.js +209 -266
  466. package/dist/internal/named-webhook-secret.d.ts +39 -0
  467. package/dist/internal/named-webhook-secret.d.ts.map +1 -0
  468. package/dist/internal/named-webhook-secret.js +47 -0
  469. package/dist/internal/open-browser.js +2 -3
  470. package/dist/internal/otel/collector.js +104 -68
  471. package/dist/internal/otel/config.js +24 -37
  472. package/dist/internal/otel/http.js +5 -7
  473. package/dist/internal/otel/mcp.js +3 -12
  474. package/dist/internal/otel/runtime.js +69 -83
  475. package/dist/internal/package-inline-stdio.js +57 -65
  476. package/dist/internal/peer-connections.js +9 -5
  477. package/dist/internal/platform-schedule-sync.js +39 -54
  478. package/dist/internal/platform-timers.js +176 -210
  479. package/dist/internal/playground/static.js +1 -2
  480. package/dist/internal/playground/toolchain.js +37 -53
  481. package/dist/internal/playground-proxy.js +230 -270
  482. package/dist/internal/process-memory-telemetry.js +33 -51
  483. package/dist/internal/prompt-context.js +3 -6
  484. package/dist/internal/reminder-control-plane-protocol.js +46 -13
  485. package/dist/internal/reminder-runner.js +770 -785
  486. package/dist/internal/reminder-schedule.js +1 -1
  487. package/dist/internal/reminder-store.js +57 -78
  488. package/dist/internal/request-error-status.js +1 -3
  489. package/dist/internal/request-headers.js +2 -2
  490. package/dist/internal/resolve-prod-target.js +119 -135
  491. package/dist/internal/resolved-connections.js +16 -6
  492. package/dist/internal/run-client.js +221 -229
  493. package/dist/internal/runtime-dispatch-runner.js +18 -43
  494. package/dist/internal/schedule-runner.js +49 -58
  495. package/dist/internal/scm/pr-url.js +7 -6
  496. package/dist/internal/sdk-runner.js +388 -363
  497. package/dist/internal/serve-restart.js +26 -39
  498. package/dist/internal/server.d.ts.map +1 -1
  499. package/dist/internal/server.js +1283 -1244
  500. package/dist/internal/session-cost.js +7 -9
  501. package/dist/internal/session-engine.d.ts +3 -1
  502. package/dist/internal/session-engine.d.ts.map +1 -1
  503. package/dist/internal/session-engine.js +2801 -2777
  504. package/dist/internal/session-links.js +12 -16
  505. package/dist/internal/session-run-log.js +134 -82
  506. package/dist/internal/session-store.js +133 -164
  507. package/dist/internal/sessions-client.js +97 -118
  508. package/dist/internal/skill-catalog.js +18 -23
  509. package/dist/internal/skills-sync.js +16 -30
  510. package/dist/internal/slack-provision-client.js +90 -116
  511. package/dist/internal/start-log-store.js +48 -67
  512. package/dist/internal/steering.js +1 -2
  513. package/dist/internal/storage-coordinator.js +160 -196
  514. package/dist/internal/store-mirror.js +16 -30
  515. package/dist/internal/stream-progress.js +6 -8
  516. package/dist/internal/terminal-style.js +3 -4
  517. package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
  518. package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
  519. package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
  520. package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
  521. package/dist/internal/tool-catalog.js +11 -5
  522. package/dist/internal/tool-result.js +1 -1
  523. package/dist/internal/trajectory.js +19 -22
  524. package/dist/internal/turn-cost.js +52 -62
  525. package/dist/internal/turn-governor.js +5 -8
  526. package/dist/internal/turn-lease-store.js +85 -105
  527. package/dist/internal/turn-outbox.js +28 -43
  528. package/dist/internal/update-check.js +231 -259
  529. package/dist/internal/v2-hosting.js +1 -2
  530. package/dist/internal/workspace-sync.js +25 -41
  531. package/dist/internal/workspace.js +111 -139
  532. package/dist/kv/memory-kv.js +27 -51
  533. package/dist/memory.js +106 -148
  534. package/dist/otel.js +5 -8
  535. package/dist/playground/assets/{index-Co4CUVTQ.js → index-Be0-1hw2.js} +45 -45
  536. package/dist/playground/assets/index-Clz6uHj9.css +1 -0
  537. package/dist/playground/index.html +2 -2
  538. package/dist/prompt.js +2 -4
  539. package/dist/storage-backends/cursor-hosted-v2.js +53 -83
  540. package/dist/storage-backends/cursor-hosted.js +105 -145
  541. package/dist/storage-backends/file-kv.js +100 -128
  542. package/dist/storage-protocol.js +3 -5
  543. package/dist/storage.js +17 -26
  544. package/dist/types.d.ts +68 -0
  545. package/dist/types.d.ts.map +1 -1
  546. package/dist/types.js +20 -18
  547. package/docs/building-with-agents.md +2 -0
  548. package/docs/deployment.md +7 -0
  549. package/docs/guides/bitbucket.md +9 -1
  550. package/docs/guides/github.md +20 -4
  551. package/docs/guides/gitlab.md +9 -1
  552. package/docs/guides/migrate.md +127 -0
  553. package/docs/reference/cli.md +39 -0
  554. package/docs/troubleshooting.md +1 -0
  555. package/package.json +1 -1
  556. package/skills/debug/SKILL.md +1 -0
  557. package/skills/github/SKILL.md +23 -0
  558. package/skills/migrate-v2/SKILL.md +51 -10
  559. package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
  560. package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
  561. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
  562. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
  563. package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
  564. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
  565. package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
  566. package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
  567. package/dist/playground/assets/index-C1g_PTTZ.css +0 -1
  568. /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
  569. /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.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`), and delivers the full
12
- * `event_callback` body through hosted admission — the attached adapter
13
- * routes it through the same inbound dispatch as Socket Mode. Hosted pods
14
- * skip Socket Mode entirely, so they never need an app token.
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 { dispatchBlockAction, dispatchInteractiveFromPayload } from "./interactive.js";
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: (_a = options.credentials) !== null && _a !== void 0 ? _a : credentialsFromEnv(options.envPrefix),
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) => __awaiter(this, void 0, void 0, function* () {
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
- var _a, _b, _c, _d, _e, _f, _g;
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 = (_a = options.credentials) !== null && _a !== void 0 ? _a : credentialsFromEnv(options.envPrefix);
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 = (_b = options.onAppMention) !== null && _b !== void 0 ? _b : defaultInbound;
102
- const onDirectMessage = (_c = options.onDirectMessage) !== null && _c !== void 0 ? _c : defaultInbound;
93
+ const onAppMention = options.onAppMention ?? defaultInbound;
94
+ const onDirectMessage = options.onDirectMessage ?? defaultInbound;
103
95
  const onReactionAdded = options.onReactionAdded;
104
- const onChannelPost = (_d = options.onChannelPost) !== null && _d !== void 0 ? _d : (silent
105
- ? authOnlyInbound(policy, "channel_post")
106
- : createDefaultOnChannelPost(loadingMessages, policy));
107
- const engagement = (_e = options.engagement) !== null && _e !== void 0 ? _e : {};
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 = (_f = options.followUpStatus) !== null && _f !== void 0 ? _f : !silent;
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
- // Hosted v2 event capability, matching what the engagement flags can
128
- // dispatch: mentions ride `app_mention`; DMs and watched channel posts
129
- // both arrive as `message`. Membership of `slack.thread/v2` admits
130
- // exactly these two, so `reaction_added` (hosted follow-up only inside
131
- // an existing thread) is deliberately not declared.
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
- const toolApprovals = options.toolApprovals === true;
140
- const interactivity = options.interactivity === true;
141
- const onBlockAction = options.onBlockAction;
142
- const routeInteractive = toolApprovals || interactivity || onBlockAction !== undefined;
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
- return __awaiter(this, void 0, void 0, function* () {
176
- const names = allowlist.unresolvedNames();
177
- if (names.length === 0) {
178
- return;
179
- }
180
- try {
181
- const botToken = yield tryResolveBotToken(credentials);
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: error instanceof Error ? error.message : String(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
- return __awaiter(this, void 0, void 0, function* () {
204
- if (channelPosts === undefined) {
205
- return undefined;
206
- }
207
- const channelEvent = parseChannelMessageEvent(payload, {
208
- includeBotAuthored: true,
209
- });
210
- if (channelEvent === null || channelEvent.kind === "deleted") {
211
- return undefined;
212
- }
213
- hostedAllowlist !== null && hostedAllowlist !== void 0 ? hostedAllowlist : (hostedAllowlist = new SlackChannelAllowlist(channelPosts.allow));
214
- if (!hostedAllowlist.matches(channelEvent.message.channelId) &&
215
- hostedAllowlist.unresolvedNames().length > 0) {
216
- hostedAllowlistReady !== null && hostedAllowlistReady !== void 0 ? hostedAllowlistReady : (hostedAllowlistReady = resolveHostedAllowlistNames(hostedAllowlist));
217
- yield hostedAllowlistReady;
218
- }
219
- const botUserId = parseEventBodyBotUserId(payload);
220
- return createChannelPostWatcher({
221
- // Admission answers before a debounce timer could fire; edits arrive
222
- // as their own deliveries and the edge drops them.
223
- options: Object.assign(Object.assign({}, channelPosts), { debounceMs: 0 }),
224
- allowlist: hostedAllowlist,
225
- getBotUserId: () => botUserId,
226
- log: getLog(),
227
- dispatch: (message, eventId) => {
228
- args.waitUntil(dispatchInboundMessage(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ kind: "channel_post", message, handler: onChannelPost, propagateHandlerErrors: true, send: args.send, credentials, host: args.host, artifacts: args.artifacts, log: getLog(), evalCommandsEnabled,
229
- followUpStatus, ack: reply.ack, blockExternals, continuation: options.continuation }, (args.hasContinuationSession === undefined
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 })), (args.isContinuationBusy === undefined
241
+ : { hasContinuationSession: args.hasContinuationSession }),
242
+ ...(args.isContinuationBusy === undefined
232
243
  ? {}
233
- : { isContinuationBusy: args.isContinuationBusy })), (args.getContinuationLastBotMessageTs === undefined
244
+ : { isContinuationBusy: args.isContinuationBusy }),
245
+ ...(args.getContinuationLastBotMessageTs === undefined
234
246
  ? {}
235
247
  : {
236
248
  getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
237
- })), (args.interruptContinuation === undefined
249
+ }),
250
+ ...(args.interruptContinuation === undefined
238
251
  ? {}
239
- : { interruptContinuation: args.interruptContinuation })), (eventId === undefined ? {} : { eventId })), (platformHandoff === undefined ? {} : { platformHandoff }))));
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
- var _a, _b;
246
- const watch = (_a = args.channelWatch) !== null && _a !== void 0 ? _a : channelWatch;
247
- return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ send: args.send, continuation: options.continuation, waitUntil: args.waitUntil, onAppMention,
248
- onDirectMessage }, (onReactionAdded === undefined ? {} : { onReactionAdded })), { credentials, eventIds: (_b = args.eventIds) !== null && _b !== void 0 ? _b : eventIds, propagateHandlerErrors: args.propagateHandlerErrors, host: args.host, artifacts: args.artifacts, log: getLog(), mentionsEnabled,
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, ack: reply.ack, placeholder: reply.placeholder, blockExternals }), (args.platformHandoff === undefined ? {} : { platformHandoff: args.platformHandoff })), (args.hasContinuationSession === undefined
252
- ? {}
253
- : { hasContinuationSession: args.hasContinuationSession })), (args.isContinuationBusy === undefined
254
- ? {}
255
- : { isContinuationBusy: args.isContinuationBusy })), (args.getContinuationLastBotMessageTs === undefined
256
- ? {}
257
- : {
258
- getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
259
- })), (args.interruptContinuation === undefined
260
- ? {}
261
- : { interruptContinuation: args.interruptContinuation })), (watch === undefined ? {} : { channelWatch: watch })), (botMentionGate === undefined ? {} : { botMentionGate })), { suggestedPrompts: options.suggestedPrompts, suggestedPromptsTitle: options.suggestedPromptsTitle });
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: Object.assign(Object.assign(Object.assign({ kind: "slack",
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 }, (reply.mode === "agentic"
271
- ? {
272
- slackReply: Object.assign({ mode: "agentic", ack: (_g = reply.ack) !== null && _g !== void 0 ? _g : DEFAULT_ACK }, (reply.placeholder === undefined
273
- ? {}
274
- : {
275
- placeholder: reply.placeholder,
276
- })),
277
- }
278
- : {})), (channelPosts === undefined || channelPostsWatchEverywhere(channelPosts.allow)
279
- ? {}
280
- : { slackChannelPosts: [...channelPosts.allow] })), { deprecations: reply.deprecations }),
281
- receive(input_1, _a) {
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
- const teamId = typeof target.teamId === "string" ? target.teamId : undefined;
294
- getLog().info("receive handoff", {
295
- channel: channelId,
296
- thread_ts: threadTs,
297
- team: teamId,
298
- });
299
- const state = emptySlackChannelState({
300
- channelId,
301
- threadTs,
302
- teamId: teamId !== null && teamId !== void 0 ? teamId : null,
303
- });
304
- return send(input.message, Object.assign(Object.assign({ auth: input.auth, admission: "coalesce" }, (continuationSource(options.continuation, "slack") === "control-plane"
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
- })), { state, refreshState: slackWakeChannelState({
314
- channelId,
315
- threadTs,
316
- teamId: teamId !== null && teamId !== void 0 ? teamId : null,
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
- return __awaiter(this, void 0, void 0, function* () {
323
- var _a, _b, _c, _d, _e, _f;
324
- runtime.log = createSlackLogger((_a = args.logger) !== null && _a !== void 0 ? _a : options.logger);
325
- // Cursor-managed v2 receives inbound events through the control-plane
326
- // adapter attached below. Do not also start (or warn about) the local
327
- // Socket Mode transport: hosted outbound replies need only the bot token.
328
- if (args.architecture === "v2" && process.env[AGENT_SERVE_GENERATION_ENV_VAR] !== undefined) {
329
- getLog().info("channel start", { transport: "events-api" });
330
- return;
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
- getLog().info("channel start", { transport: "socket" });
333
- const appToken = yield tryResolveAppToken(credentials);
334
- const botToken = yield tryResolveBotToken(credentials);
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
- let botUserId;
343
- let botId;
344
- let installTeamId;
345
- let webClient = null;
346
- if (channelPosts !== undefined || botMentions !== undefined || routeInteractive) {
347
- try {
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
- if (botMentions !== undefined) {
362
- if (botUserId === undefined && botId === undefined) {
363
- getLog().error("bot mentions disabled", {
364
- reason: "engagement.botMentions requires bot identity from auth.test (loop safety)",
365
- });
366
- }
367
- else {
368
- botMentionGate = new SlackBotMentionGate(botMentions, { botUserId, botId }, { log: getLog() });
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
- if (channelPosts !== undefined) {
378
- const allowlist = new SlackChannelAllowlist(channelPosts.allow);
379
- try {
380
- const names = allowlist.unresolvedNames();
381
- if (names.length > 0 && webClient !== null) {
382
- allowlist.applyResolvedNames(yield resolveChannelNames(webClient, names, getLog()));
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
- else {
398
- channelWatch = createChannelPostWatcher({
399
- options: channelPosts,
400
- allowlist,
401
- getBotUserId: () => botUserId,
402
- getBotId: () => botId,
403
- log: getLog(),
404
- dispatch: (message, eventId) => {
405
- args.waitUntil(dispatchInboundMessage(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ kind: "channel_post", message, handler: onChannelPost, send: args.send, credentials, host: args.host, artifacts: args.artifacts, log: getLog(), evalCommandsEnabled,
406
- followUpStatus, ack: reply.ack, blockExternals, continuation: options.continuation }, (args.hasContinuationSession === undefined
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
- })), (args.isContinuationBusy === undefined
513
+ }),
514
+ ...(args.isContinuationBusy === undefined
411
515
  ? {}
412
- : { isContinuationBusy: args.isContinuationBusy })), (args.getContinuationLastBotMessageTs === undefined
516
+ : { isContinuationBusy: args.isContinuationBusy }),
517
+ ...(args.getContinuationLastBotMessageTs === undefined
413
518
  ? {}
414
519
  : {
415
520
  getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
416
- })), (args.interruptContinuation === undefined
521
+ }),
522
+ ...(args.interruptContinuation === undefined
417
523
  ? {}
418
524
  : {
419
525
  interruptContinuation: args.interruptContinuation,
420
- })), (eventId === undefined ? {} : { eventId }))));
421
- },
422
- });
423
- getLog().info("channel watch enabled", {
424
- channels: channelPosts.allow.join(","),
425
- posts: (_e = channelPosts.posts) !== null && _e !== void 0 ? _e : "top-level",
426
- debounce_ms: (_f = channelPosts.debounceMs) !== null && _f !== void 0 ? _f : 0,
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
- const socketOptions = {
431
- appToken,
432
- logger: line => getLog().write(line),
433
- onEvent: payload => {
434
- dispatchInboundFromEventBody(payload, inboundDeps(Object.assign(Object.assign(Object.assign(Object.assign({ send: args.send, waitUntil: args.waitUntil, host: args.host, artifacts: args.artifacts }, (args.hasContinuationSession === undefined
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 })), (args.isContinuationBusy === undefined
549
+ : { hasContinuationSession: args.hasContinuationSession }),
550
+ ...(args.isContinuationBusy === undefined
437
551
  ? {}
438
- : { isContinuationBusy: args.isContinuationBusy })), (args.getContinuationLastBotMessageTs === undefined
552
+ : { isContinuationBusy: args.isContinuationBusy }),
553
+ ...(args.getContinuationLastBotMessageTs === undefined
439
554
  ? {}
440
555
  : {
441
556
  getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs,
442
- })), (args.interruptContinuation === undefined
557
+ }),
558
+ ...(args.interruptContinuation === undefined
443
559
  ? {}
444
- : { interruptContinuation: args.interruptContinuation }))));
445
- },
446
- };
447
- if (routeInteractive) {
448
- socketOptions.onInteractive = (payload) => __awaiter(this, void 0, void 0, function* () {
449
- // Framework tool-approval Approve/Deny clicks resolve first;
450
- // anything else (including approval-shaped clicks whose value
451
- // fails to parse) falls through to the author's block-action hook.
452
- const handledAsApproval = yield dispatchInteractiveFromPayload(payload, {
453
- credentials,
454
- getSession: args.getSession,
455
- resolveApproval: args.resolveApproval,
456
- resolveAuth: args.resolveAuth,
457
- waitUntil: args.waitUntil,
458
- log: getLog(),
459
- blockExternals,
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
- throw error;
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: () => __awaiter(this, void 0, void 0, function* () {
501
- var _a;
616
+ onStop: async () => {
502
617
  getLog().info("channel stop");
503
- channelWatch === null || channelWatch === void 0 ? void 0 : channelWatch.stop();
618
+ channelWatch?.stop();
504
619
  channelWatch = undefined;
505
620
  botMentionGate = undefined;
506
- yield socketHandle === null || socketHandle === void 0 ? void 0 : socketHandle.stop();
621
+ await socketHandle?.stop();
507
622
  socketHandle = null;
508
- yield (_a = options.onStop) === null || _a === void 0 ? void 0 : _a.call(options);
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
- dispatch: (_a) => __awaiter(this, [_a], void 0, function* ({ payload, args, platformHandoff }) {
528
- const hostedWatch = yield hostedChannelWatch(payload, args, platformHandoff);
529
- const dispatched = dispatchInboundFromEventBody(payload, inboundDeps(Object.assign(Object.assign({ send: args.send, waitUntil: args.waitUntil, host: args.host, artifacts: args.artifacts, eventIds: createEventIdDedupe(), propagateHandlerErrors: true, hasContinuationSession: args.hasContinuationSession, isContinuationBusy: args.isContinuationBusy, getContinuationLastBotMessageTs: args.getContinuationLastBotMessageTs, interruptContinuation: args.interruptContinuation }, (platformHandoff === undefined ? {} : { platformHandoff })), (hostedWatch === undefined ? {} : { channelWatch: hostedWatch }))));
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
  }