@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
@@ -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 { resolveSlackSenderName } from "./sender-name.js";
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
- return __awaiter(this, void 0, void 0, function* () {
47
- var _a, _b, _c, _d;
48
- const messageFiles = (_a = args.message.files) !== null && _a !== void 0 ? _a : [];
49
- const prepared = messageFiles.length > 0 || args.threadFiles.length > 0
50
- ? yield prepareSlackAttachments({
51
- botToken: args.botToken,
52
- files: messageFiles,
53
- threadFiles: args.threadFiles,
54
- log: args.log,
55
- })
56
- : undefined;
57
- const workspaceFiles = Object.assign(Object.assign({}, args.decision.workspaceFiles), prepared === null || prepared === void 0 ? void 0 : prepared.workspaceFiles);
58
- const images = [...((_b = args.decision.images) !== null && _b !== void 0 ? _b : []), ...((_c = prepared === null || prepared === void 0 ? void 0 : prepared.images) !== null && _c !== void 0 ? _c : [])];
59
- return {
60
- userText: appendSlackAttachmentAnnotations(slackUserText(args.message, args.decision.message), (_d = prepared === null || prepared === void 0 ? void 0 : prepared.annotations) !== null && _d !== void 0 ? _d : [], messageFiles.length > 0 ? SLACK_ATTACHMENT_ONLY_PROMPT : ""),
61
- workspaceFiles: Object.keys(workspaceFiles).length > 0 ? workspaceFiles : undefined,
62
- images: images.length > 0 ? images : undefined,
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 Object.assign({ channelId: null, threadTs: null, teamId: null, triggeringUserId: null, pendingToolCallMessage: null, lastReasoningTypingAtMs: null, lastReasoningTypingStatus: null, streamTs: null, streamChannelId: null, lastPostedText: null, streamBlockText: null, lastBotMessageTs: null, streamingUnavailable: false, streamFull: false, streamAppendedChunks: 0, progressTs: null, approvalMessageByCallId: {}, reasoningCard: undefined, toolCardCounts: {}, agenticFiles: [], startPainted: false, turnStartedAtMs: null }, patch);
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: (_a = args.teamId) !== null && _a !== void 0 ? _a : null,
76
- triggeringUserId: (_b = args.triggeringUserId) !== null && _b !== void 0 ? _b : null,
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
- var _a, _b;
86
- return Object.assign(Object.assign(Object.assign({ ts: message.ts }, (((_a = message.author) === null || _a === void 0 ? void 0 : _a.userId) === undefined || message.author.userId === ""
87
- ? {}
88
- : { user: message.author.userId })), (((_b = message.author) === null || _b === void 0 ? void 0 : _b.botId) === undefined ? {} : { bot_id: message.author.botId })), {
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 Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, continuationArg(deps.continuation)), (deps.hasContinuationSession === undefined
98
- ? {}
99
- : { hasContinuationSession: deps.hasContinuationSession })), (deps.isContinuationBusy === undefined
100
- ? {}
101
- : { isContinuationBusy: deps.isContinuationBusy })), (deps.getContinuationLastBotMessageTs === undefined
102
- ? {}
103
- : {
104
- getContinuationLastBotMessageTs: deps.getContinuationLastBotMessageTs,
105
- })), (deps.interruptContinuation === undefined
106
- ? {}
107
- : { interruptContinuation: deps.interruptContinuation }));
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(Object.assign(Object.assign(Object.assign({ kind: args.kind, message: args.message, handler: args.handler, propagateHandlerErrors: deps.propagateHandlerErrors, send: deps.send, credentials: deps.credentials, host: deps.host, artifacts: deps.artifacts, log, evalCommandsEnabled: args.evalCommandsEnabled, followUpStatus: deps.followUpStatus, ack: deps.ack, placeholder: deps.placeholder, blockExternals: deps.blockExternals }, inboundContinuation(deps)), (args.eventId === undefined ? {} : { eventId: args.eventId })), (args.platformHandoff === undefined ? {} : { platformHandoff: args.platformHandoff }))));
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
- return __awaiter(this, void 0, void 0, function* () {
131
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5;
132
- var _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20;
133
- const { message, kind } = args;
134
- const log = (_6 = args.log) !== null && _6 !== void 0 ? _6 : defaultSlackLog;
135
- const binding = buildSlackBinding({
136
- botToken: (_a = args.credentials) === null || _a === void 0 ? void 0 : _a.botToken,
137
- channelId: message.channelId,
138
- threadTs: message.threadTs,
139
- host: args.host,
140
- artifacts: args.artifacts,
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
- const handoff = (_c = args.platformHandoff) === null || _c === void 0 ? void 0 : _c.slackPlaceholder;
154
- const handoffInThread = kind !== "channel_post" &&
155
- handoff !== undefined &&
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
- // Built-in eval directive: run playground batches without an agent turn.
280
- // Only when the bot is addressed — a watched channel post is dispatched
281
- // whatever it says, and may open with `eval` while talking to someone else.
282
- const evalCommandsEnabled = args.evalCommandsEnabled !== false && (kind === "app_mention" || kind === "direct_message");
283
- const evalDirective = evalCommandsEnabled && args.host.evals !== undefined
284
- ? ((_8 = parseSlackEvalDirective(message.text)) !== null && _8 !== void 0 ? _8 : parseSlackEvalDirective(message.markdown))
285
- : null;
286
- if (evalDirective !== null && args.host.evals !== undefined) {
287
- if (membership !== undefined && (yield membership)) {
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
- continuation,
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
- let decision;
309
- try {
310
- decision = yield args.handler(binding, message);
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
- catch (error) {
313
- log.error(`${kind} handler failed`, {
314
- error: error instanceof Error ? error.message : String(error),
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
- if (decision === null || decision === undefined) {
329
- log.info("inbound skipped (handler returned null)", {
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
- yield retractUnadoptedHandoff();
263
+ await retractUnadoptedHandoff();
336
264
  return;
337
265
  }
338
- // Reply-once / delayed parent: claim channel:ts after the handler accepts.
339
- const claimed = yield (_j = args.host.slackNudges) === null || _j === void 0 ? void 0 : _j.tryClaimAsk(message.channelId, message.ts);
340
- if (claimed === false) {
341
- log.info("inbound ask dedupe drop", {
342
- kind,
343
- channel: message.channelId,
344
- message_ts: message.ts,
345
- continuation,
346
- event_id: args.eventId,
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
- yield adoptMatchedHandoff();
351
- const painted = args.ack === undefined
352
- ? undefined
353
- : paintTurnStart({
354
- botToken: (_k = args.credentials) === null || _k === void 0 ? void 0 : _k.botToken,
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
- ack: args.ack,
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
- if (message.ts === message.threadTs && !isSlackImChannel(message.channelId)) {
361
- void maybeSetThreadTitle({
362
- botToken: (_l = args.credentials) === null || _l === void 0 ? void 0 : _l.botToken,
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
- title: firstLineTitle(message.markdown),
454
+ ack: args.ack ?? "",
366
455
  log,
367
456
  });
368
457
  }
369
- // A control-plane placeholder is turn scaffolding, not thread history: the
370
- // guest posts the reply over that exact ts, so hydrating it would feed the
371
- // model its own "still working" line as an already-sent reply.
372
- const excludeThreadTimestamps = [
373
- message.ts,
374
- ...(handoffInThread === undefined ? [] : [handoffInThread.messageTs]),
375
- ...((_9 = decision.excludeThreadTimestamps) !== null && _9 !== void 0 ? _9 : []),
376
- ];
377
- const mergeMessages = [triggeringMergeMessage(message)];
378
- const continuationExists = existsP === undefined ? false : yield existsP;
379
- const hasSession = loadThread && continuationExists;
380
- const afterTs = loadThread && hasSession && args.getContinuationLastBotMessageTs !== undefined
381
- ? yield args.getContinuationLastBotMessageTs(continuation)
382
- : undefined;
383
- const selfIdentity = resolveSlackSelfIdentity((_m = args.credentials) === null || _m === void 0 ? void 0 : _m.botToken);
384
- const senderName = resolveSlackSenderName({
385
- botToken: (_o = args.credentials) === null || _o === void 0 ? void 0 : _o.botToken,
386
- author: message.author,
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
- // Channel mentions: cold <slack_thread>, warm <slack_thread_delta>.
389
- const threadTask = !loadThread
390
- ? Promise.resolve(EMPTY_SLACK_THREAD_CONTEXT)
391
- : hasSession
392
- ? loadSlackThreadDelta(Object.assign(Object.assign({ botToken: (_p = args.credentials) === null || _p === void 0 ? void 0 : _p.botToken, channelId: message.channelId, threadTs: message.threadTs }, (afterTs === undefined ? {} : { afterTs })), { excludeTs: excludeThreadTimestamps, mergeMessages,
393
- log }))
394
- : loadSlackThreadContext({
395
- botToken: (_q = args.credentials) === null || _q === void 0 ? void 0 : _q.botToken,
396
- channelId: message.channelId,
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
- if ((message.files !== undefined && message.files.length > 0) || threadFileCount > 0) {
429
- log.info("slack attachments prepared", {
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
- if (threadContext !== undefined) {
440
- log.info(hasSession ? "thread delta loaded" : "thread context loaded", Object.assign({ kind, channel: message.channelId, thread_ts: message.threadTs, chars: threadContext.length, event_id: args.eventId }, (afterTs === undefined ? {} : { after_ts: afterTs })));
441
- }
442
- const [self, userName] = yield Promise.all([selfIdentity, senderName]);
443
- const prompt = [
444
- formatSlackContextBlock(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ userId: (_13 = (_v = message.author) === null || _v === void 0 ? void 0 : _v.userId) !== null && _13 !== void 0 ? _13 : "", channelId: message.channelId, threadTs: message.threadTs }, (userName === undefined ? {} : { userName })), (((_w = message.author) === null || _w === void 0 ? void 0 : _w.isBot) === true ? { userIsBot: true } : {})), (((_x = message.author) === null || _x === void 0 ? void 0 : _x.botId) === undefined ? {} : { userBotId: message.author.botId })), (message.teamId === undefined ? {} : { teamId: message.teamId })), (self === undefined ? {} : { selfUserId: self.userId })), ((self === null || self === void 0 ? void 0 : self.name) === undefined ? {} : { selfName: self.name }))),
445
- ...(threadContext === undefined ? [] : [threadContext]),
446
- ...((_14 = decision.context) !== null && _14 !== void 0 ? _14 : []),
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
- const sendOptions = Object.assign(Object.assign({ auth: decision.auth }, sendPatch), { admission: "coalesce", coalesceSourceTs: message.ts, state: state, refreshState: slackWakeChannelState({
479
- channelId: message.channelId,
480
- threadTs: message.threadTs,
481
- teamId: (_17 = message.teamId) !== null && _17 !== void 0 ? _17 : null,
482
- triggeringUserId: (_18 = (_1 = message.author) === null || _1 === void 0 ? void 0 : _1.userId) !== null && _18 !== void 0 ? _18 : null,
483
- startPainted: paintedStart,
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
- // Coalesce admits leave the active turn running: the follow-up is queued
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
- if (args.followUpStatus !== false) {
539
- yield binding.thread.startTyping(FOLLOWUP_TYPING);
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 (typingError) {
543
- log.error(`follow-up typing failed: ${typingError instanceof Error ? typingError.message : String(typingError)}`, {
544
- channel: message.channelId,
545
- thread_ts: message.threadTs,
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
- catch (error) {
552
- yield (_4 = args.host.slackNudges) === null || _4 === void 0 ? void 0 : _4.releaseAsk(message.channelId, message.ts);
553
- if (placeholder !== undefined) {
554
- yield placeholder.retract();
611
+ try {
612
+ if (args.followUpStatus !== false) {
613
+ await binding.thread.startTyping(FOLLOWUP_TYPING);
614
+ }
555
615
  }
556
- yield retractAdoptedPlaceholder();
557
- if (painted !== undefined) {
558
- yield painted;
559
- yield retractTurnStart({
560
- botToken: (_5 = args.credentials) === null || _5 === void 0 ? void 0 : _5.botToken,
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
- log.error(`${kind} delivery failed: ${error instanceof Error ? error.message : String(error)}`, {
568
- channel: message.channelId,
569
- thread_ts: message.threadTs,
570
- continuation,
571
- event_id: args.eventId,
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
- finally {
575
- if (placeholder !== undefined) {
576
- yield placeholder.done;
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
- var _a, _b, _c, _d;
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
- var _a, _b;
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: (_b = deps.credentials) === null || _b === void 0 ? void 0 : _b.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 (((_a = mention.author) === null || _a === void 0 ? void 0 : _a.isBot) === true) {
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 = (_f = (_b = deps.botMentionGate) === null || _b === void 0 ? void 0 : _b.evaluate(mention)) !== null && _f !== void 0 ? _f : {
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: (_g = mention.author.botId) !== null && _g !== void 0 ? _g : mention.author.userId,
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 = (_h = deps.suggestedPrompts) !== null && _h !== void 0 ? _h : [];
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: (_c = deps.credentials) === null || _c === void 0 ? void 0 : _c.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 = (_j = deps.suggestedPrompts) !== null && _j !== void 0 ? _j : [];
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: (_d = deps.credentials) === null || _d === void 0 ? void 0 : _d.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)", Object.assign(Object.assign({}, describeSlackEventShape(body)), { event_id: eventId }));
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
  }