@cursor/bdk 0.2.8 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/dist/artifacts.js +3 -5
  2. package/dist/bin/agent-serve.d.ts +1 -0
  3. package/dist/bin/agent-serve.d.ts.map +1 -1
  4. package/dist/bin/agent-serve.js +820 -807
  5. package/dist/channels/bitbucket/api.js +305 -321
  6. package/dist/channels/bitbucket/binding.js +97 -61
  7. package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
  8. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
  9. package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
  10. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
  11. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  12. package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
  13. package/dist/channels/bitbucket/checks.js +9 -21
  14. package/dist/channels/bitbucket/cursor-account.js +1 -1
  15. package/dist/channels/bitbucket/defaults.js +14 -4
  16. package/dist/channels/bitbucket/events.js +1 -2
  17. package/dist/channels/bitbucket/index.d.ts +6 -2
  18. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  19. package/dist/channels/bitbucket/index.js +6 -2
  20. package/dist/channels/bitbucket/replay.js +80 -56
  21. package/dist/channels/bitbucket/state.js +16 -7
  22. package/dist/channels/bitbucket/types.d.ts +11 -2
  23. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  24. package/dist/channels/checks.js +18 -28
  25. package/dist/channels/deployments/deployments-channel.js +26 -34
  26. package/dist/channels/github/api.js +216 -210
  27. package/dist/channels/github/auth.d.ts +5 -1
  28. package/dist/channels/github/auth.d.ts.map +1 -1
  29. package/dist/channels/github/auth.js +157 -174
  30. package/dist/channels/github/binding.js +48 -39
  31. package/dist/channels/github/checks.js +9 -14
  32. package/dist/channels/github/cursor-account.js +6 -11
  33. package/dist/channels/github/defaults.js +105 -130
  34. package/dist/channels/github/forward.js +13 -17
  35. package/dist/channels/github/github-channel.d.ts +43 -2
  36. package/dist/channels/github/github-channel.d.ts.map +1 -1
  37. package/dist/channels/github/github-channel.js +1228 -958
  38. package/dist/channels/github/progress.js +145 -146
  39. package/dist/channels/github/replay.js +30 -39
  40. package/dist/channels/github/state.js +40 -16
  41. package/dist/channels/github/types.d.ts +30 -6
  42. package/dist/channels/github/types.d.ts.map +1 -1
  43. package/dist/channels/gitlab/api.js +100 -114
  44. package/dist/channels/gitlab/binding.js +52 -33
  45. package/dist/channels/gitlab/checks.js +28 -29
  46. package/dist/channels/gitlab/cursor-account.js +1 -1
  47. package/dist/channels/gitlab/defaults.js +9 -3
  48. package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
  49. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
  50. package/dist/channels/gitlab/gitlab-channel.js +95 -42
  51. package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
  52. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
  53. package/dist/channels/gitlab/gitlab-webhook.js +282 -249
  54. package/dist/channels/gitlab/index.d.ts +6 -2
  55. package/dist/channels/gitlab/index.d.ts.map +1 -1
  56. package/dist/channels/gitlab/index.js +6 -2
  57. package/dist/channels/gitlab/replay.js +50 -27
  58. package/dist/channels/gitlab/state.js +14 -6
  59. package/dist/channels/gitlab/types.d.ts +13 -2
  60. package/dist/channels/gitlab/types.d.ts.map +1 -1
  61. package/dist/channels/origin/api.js +100 -116
  62. package/dist/channels/origin/binding.js +15 -16
  63. package/dist/channels/origin/checks.js +30 -28
  64. package/dist/channels/origin/defaults.js +50 -65
  65. package/dist/channels/origin/origin-channel.js +266 -272
  66. package/dist/channels/origin/origin-webhook.js +70 -88
  67. package/dist/channels/origin/reactions.js +9 -21
  68. package/dist/channels/origin/state.js +13 -5
  69. package/dist/channels/slack/agentic-delivery.js +426 -478
  70. package/dist/channels/slack/agentic-posted.js +9 -10
  71. package/dist/channels/slack/agentic-signals.js +2 -3
  72. package/dist/channels/slack/api.js +417 -427
  73. package/dist/channels/slack/approvals.js +1 -1
  74. package/dist/channels/slack/assistant.js +37 -47
  75. package/dist/channels/slack/attachments.js +188 -206
  76. package/dist/channels/slack/auth.js +8 -6
  77. package/dist/channels/slack/bot-mentions.js +31 -45
  78. package/dist/channels/slack/channel-watch.js +42 -48
  79. package/dist/channels/slack/cli-project.js +112 -137
  80. package/dist/channels/slack/code-fences.js +3 -5
  81. package/dist/channels/slack/constants.js +2 -2
  82. package/dist/channels/slack/credentials.js +23 -38
  83. package/dist/channels/slack/defaults.js +292 -331
  84. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  85. package/dist/channels/slack/dispatch.js +533 -460
  86. package/dist/channels/slack/doctor.js +200 -214
  87. package/dist/channels/slack/eval-directive.js +79 -96
  88. package/dist/channels/slack/event-id-dedupe.js +1 -1
  89. package/dist/channels/slack/external-policy.js +26 -39
  90. package/dist/channels/slack/footer.js +28 -41
  91. package/dist/channels/slack/inbound.d.ts +1 -0
  92. package/dist/channels/slack/inbound.d.ts.map +1 -1
  93. package/dist/channels/slack/inbound.js +50 -31
  94. package/dist/channels/slack/init.d.ts +1 -5
  95. package/dist/channels/slack/init.d.ts.map +1 -1
  96. package/dist/channels/slack/init.js +42 -59
  97. package/dist/channels/slack/interactive.d.ts +9 -3
  98. package/dist/channels/slack/interactive.d.ts.map +1 -1
  99. package/dist/channels/slack/interactive.js +160 -162
  100. package/dist/channels/slack/links.js +1 -2
  101. package/dist/channels/slack/live-delivery.js +172 -190
  102. package/dist/channels/slack/manifest.d.ts.map +1 -1
  103. package/dist/channels/slack/manifest.js +44 -23
  104. package/dist/channels/slack/message-body.js +2 -2
  105. package/dist/channels/slack/nudge-carrier.js +30 -42
  106. package/dist/channels/slack/nudge-store.js +164 -191
  107. package/dist/channels/slack/paint-start.js +66 -81
  108. package/dist/channels/slack/placeholder.js +123 -152
  109. package/dist/channels/slack/pr-ref.js +1 -1
  110. package/dist/channels/slack/progress-delivery.js +65 -78
  111. package/dist/channels/slack/reasoning-card.js +36 -49
  112. package/dist/channels/slack/recording-sink.js +12 -24
  113. package/dist/channels/slack/reply-options.js +7 -12
  114. package/dist/channels/slack/self-identity.js +27 -35
  115. package/dist/channels/slack/sender-name.d.ts +12 -3
  116. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  117. package/dist/channels/slack/sender-name.js +57 -61
  118. package/dist/channels/slack/setup.js +2 -4
  119. package/dist/channels/slack/slack-channel.d.ts +6 -4
  120. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  121. package/dist/channels/slack/slack-channel.js +441 -308
  122. package/dist/channels/slack/socket-mode.js +38 -52
  123. package/dist/channels/slack/thread-context.js +143 -160
  124. package/dist/channels/slack/tool-approval-events.js +149 -166
  125. package/dist/channels/slack/tool-cards.js +6 -11
  126. package/dist/channels/slack/tool-chip.js +1 -2
  127. package/dist/channels/slack/types.d.ts +15 -17
  128. package/dist/channels/slack/types.d.ts.map +1 -1
  129. package/dist/channels/slack/upload.js +84 -97
  130. package/dist/channels/slack/user-info.js +27 -41
  131. package/dist/channels.js +9 -20
  132. package/dist/dashboard-session-url.js +3 -4
  133. package/dist/docs/404.html +2 -2
  134. package/dist/docs/assets/{app.oyjtOr3W.js → app.DXI7bwox.js} +4 -4
  135. package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
  136. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
  137. package/dist/docs/assets/chunks/{VPLocalSearchBox.D0P6J_UJ.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
  138. package/dist/docs/assets/chunks/{arc.B0LY1J1h.js → arc.BOG1yms8.js} +1 -1
  139. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.dPduLUxY.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
  140. package/dist/docs/assets/chunks/{baseUniq.B_Ohm21h.js → baseUniq.H044KjKs.js} +1 -1
  141. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.B4zcanaJ.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
  142. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D9Iw21nx.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
  143. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
  144. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DDVwRShI.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
  145. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DsYcdn1i.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
  146. package/dist/docs/assets/chunks/{chunk-55IACEB6.BzzQvcYp.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
  147. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BMiXZ7FX.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
  148. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.D_mBcLoc.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
  149. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMVjWVMx.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
  150. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BG-FrPv9.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
  151. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CkFE1ap3.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
  152. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
  153. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
  154. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
  155. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BVNnCTvY.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
  156. package/dist/docs/assets/chunks/{dagre-KV5264BT.CDN5PR9l.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
  157. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DQRUlT-i.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
  158. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.CoeblYQT.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
  159. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DW3ymjl0.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
  160. package/dist/docs/assets/chunks/{diagram-TYMM5635.BP0uN4Jw.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
  161. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DVFUWEn4.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
  162. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.HU-eHspv.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
  163. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DHNhXijY.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
  164. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DkISXcO3.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
  165. package/dist/docs/assets/chunks/{graph.CCV0fuRR.js → graph.BVqKRmRo.js} +1 -1
  166. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.bgILzOoc.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
  167. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CuryXC0F.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
  168. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BL1Pr-wu.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
  169. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BbGjvk4l.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
  170. package/dist/docs/assets/chunks/{layout.C4PfdldS.js → layout.CGU3gfSf.js} +1 -1
  171. package/dist/docs/assets/chunks/{linear.C3xD1T6X.js → linear.DaihpW_n.js} +1 -1
  172. package/dist/docs/assets/chunks/{min.CzgRAQ9c.js → min.BS-j8kHQ.js} +1 -1
  173. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CA9rSWum.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
  174. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B8MprgJu.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
  175. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DndDwbKT.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
  176. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.Zhfgwlnn.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
  177. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.B6RRm6N5.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
  178. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Bfmz-1PN.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
  179. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.gbrdNqgj.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
  180. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
  181. package/dist/docs/assets/chunks/{theme.gpWjytMh.js → theme.DaplWQhQ.js} +2 -2
  182. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bl1l7M1f.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
  183. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.Dfle4U0d.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
  184. package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +162 -0
  185. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CM_4lmvZ.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
  186. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CHT5X28R.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
  187. package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
  188. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
  189. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
  190. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
  191. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
  192. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
  193. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
  194. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
  195. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
  196. package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
  197. package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
  198. package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
  199. package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
  200. package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
  201. package/dist/docs/building-with-agents.html +37 -37
  202. package/dist/docs/building-with-agents.md +2 -0
  203. package/dist/docs/deployment.html +38 -38
  204. package/dist/docs/deployment.md +7 -0
  205. package/dist/docs/evals.html +36 -36
  206. package/dist/docs/guides/agent-to-agent.html +35 -35
  207. package/dist/docs/guides/bitbucket.html +38 -38
  208. package/dist/docs/guides/bitbucket.md +9 -1
  209. package/dist/docs/guides/cloud-agents.html +35 -35
  210. package/dist/docs/guides/convert-automation.html +35 -35
  211. package/dist/docs/guides/github.html +39 -39
  212. package/dist/docs/guides/github.md +20 -4
  213. package/dist/docs/guides/gitlab.html +38 -38
  214. package/dist/docs/guides/gitlab.md +9 -1
  215. package/dist/docs/guides/grokbot-agents.html +35 -35
  216. package/dist/docs/guides/hooks.html +35 -35
  217. package/dist/docs/guides/improve.html +35 -35
  218. package/dist/docs/guides/jev.html +35 -35
  219. package/dist/docs/guides/mcp-oauth.html +35 -35
  220. package/dist/docs/guides/migrate.html +66 -0
  221. package/dist/docs/guides/migrate.md +122 -0
  222. package/dist/docs/guides/opentelemetry.html +35 -35
  223. package/dist/docs/guides/slack.html +35 -35
  224. package/dist/docs/guides/webhooks.html +35 -35
  225. package/dist/docs/hashmap.json +1 -1
  226. package/dist/docs/hillclimbing.html +35 -35
  227. package/dist/docs/index.html +35 -35
  228. package/dist/docs/llms-full.txt +214 -6
  229. package/dist/docs/llms.txt +1 -0
  230. package/dist/docs/quickstart.html +35 -35
  231. package/dist/docs/reference/agent-config.html +35 -35
  232. package/dist/docs/reference/artifacts.html +35 -35
  233. package/dist/docs/reference/channels.html +35 -35
  234. package/dist/docs/reference/cli.html +39 -38
  235. package/dist/docs/reference/cli.md +39 -0
  236. package/dist/docs/reference/connections.html +35 -35
  237. package/dist/docs/reference/evals.html +35 -35
  238. package/dist/docs/reference/extensions.html +35 -35
  239. package/dist/docs/reference/hooks.html +35 -35
  240. package/dist/docs/reference/http-api.html +35 -35
  241. package/dist/docs/reference/instructions.html +35 -35
  242. package/dist/docs/reference/playground.html +35 -35
  243. package/dist/docs/reference/project-layout.html +35 -35
  244. package/dist/docs/reference/prompt.html +35 -35
  245. package/dist/docs/reference/schedules.html +35 -35
  246. package/dist/docs/reference/sessions.html +35 -35
  247. package/dist/docs/reference/skills.html +38 -38
  248. package/dist/docs/reference/subagents.html +35 -35
  249. package/dist/docs/reference/tools.html +35 -35
  250. package/dist/docs/templates/agentic-owners.html +35 -35
  251. package/dist/docs/templates/grokbot-agents.html +35 -35
  252. package/dist/docs/templates/security-reviewer.html +35 -35
  253. package/dist/docs/templates/thermo-quality-review.html +35 -35
  254. package/dist/docs/templates/thermo-review.html +35 -35
  255. package/dist/docs/templates/triage.html +35 -35
  256. package/dist/docs/troubleshooting.html +36 -36
  257. package/dist/docs/troubleshooting.md +1 -0
  258. package/dist/evals/assertions.js +20 -34
  259. package/dist/evals/expect.js +3 -6
  260. package/dist/evals/judge.js +5 -8
  261. package/dist/evals/loaders.js +45 -62
  262. package/dist/evals/matchers.js +2 -3
  263. package/dist/evals/reporters.js +43 -67
  264. package/dist/evals/results.js +1 -1
  265. package/dist/evals/run-facts.js +5 -6
  266. package/dist/evals.js +27 -15
  267. package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
  268. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +0 -1
  269. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
  270. package/dist/extensions/cursor-cloud-agents/lib/backend.js +101 -130
  271. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
  272. package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
  273. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
  274. package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
  275. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
  276. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
  277. package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
  278. package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
  279. package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
  280. package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -1
  281. package/dist/extensions/cursor-cloud-agents/tools/list.js +9 -20
  282. package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
  283. package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
  284. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  285. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
  286. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
  287. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
  288. package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
  289. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
  290. package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
  291. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
  292. package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
  293. package/dist/extensions/jev/extension.js +3 -3
  294. package/dist/extensions/jev/lib/evaluate.js +43 -60
  295. package/dist/extensions/jev/tools/evaluate.js +6 -17
  296. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  297. package/dist/extensions.js +3 -5
  298. package/dist/files-backends/cursor-hosted.js +504 -523
  299. package/dist/files-backends/local-fs.js +72 -134
  300. package/dist/files.js +3 -3
  301. package/dist/filesystem.js +562 -861
  302. package/dist/index.js +16 -35
  303. package/dist/internal/advertise-tools.js +74 -86
  304. package/dist/internal/artifacts-store.js +298 -361
  305. package/dist/internal/as-of.js +2 -4
  306. package/dist/internal/authored-alias-hooks.js +6 -4
  307. package/dist/internal/authored-loaders.js +37 -52
  308. package/dist/internal/bounded-int.js +1 -2
  309. package/dist/internal/bounded.js +13 -24
  310. package/dist/internal/brand.js +1 -1
  311. package/dist/internal/browser-origin-guard.js +4 -4
  312. package/dist/internal/builtin-tools/artifacts.js +15 -27
  313. package/dist/internal/builtin-tools/index.js +2 -3
  314. package/dist/internal/builtin-tools/reminders.js +33 -52
  315. package/dist/internal/channel-architecture.d.ts +21 -0
  316. package/dist/internal/channel-architecture.d.ts.map +1 -0
  317. package/dist/internal/channel-architecture.js +41 -0
  318. package/dist/internal/channel-dispatch.js +3 -4
  319. package/dist/internal/channel-route-dispatch.js +40 -51
  320. package/dist/internal/channel-state.js +1 -1
  321. package/dist/internal/chat-client.js +319 -340
  322. package/dist/internal/cli-ax.js +1262 -1294
  323. package/dist/internal/cli-bitbucket.js +244 -272
  324. package/dist/internal/cli-convert-automation.js +137 -151
  325. package/dist/internal/cli-cursor.js +126 -147
  326. package/dist/internal/cli-deploy.d.ts.map +1 -1
  327. package/dist/internal/cli-deploy.js +1457 -1507
  328. package/dist/internal/cli-docs.js +130 -147
  329. package/dist/internal/cli-github.js +437 -476
  330. package/dist/internal/cli-gitlab.js +259 -288
  331. package/dist/internal/cli-images.js +266 -334
  332. package/dist/internal/cli-manifest.js +25 -37
  333. package/dist/internal/cli-mcp-oauth.js +228 -247
  334. package/dist/internal/cli-mcp.js +358 -383
  335. package/dist/internal/cli-migrate.d.ts +18 -0
  336. package/dist/internal/cli-migrate.d.ts.map +1 -0
  337. package/dist/internal/cli-migrate.js +136 -0
  338. package/dist/internal/cli-skills.js +35 -47
  339. package/dist/internal/cli-slack-manual.d.ts +0 -1
  340. package/dist/internal/cli-slack-manual.d.ts.map +1 -1
  341. package/dist/internal/cli-slack-manual.js +175 -204
  342. package/dist/internal/cli-slack.d.ts +1 -1
  343. package/dist/internal/cli-slack.d.ts.map +1 -1
  344. package/dist/internal/cli-slack.js +416 -456
  345. package/dist/internal/cloud-merge.js +7 -3
  346. package/dist/internal/cloud-turn-cost.js +8 -1
  347. package/dist/internal/connection-env.js +5 -6
  348. package/dist/internal/continuation-channel.js +10 -7
  349. package/dist/internal/continuation-identity.js +85 -67
  350. package/dist/internal/conversation-mirror.js +112 -131
  351. package/dist/internal/convert-automation/convert-workflow.js +21 -31
  352. package/dist/internal/cron.js +3 -3
  353. package/dist/internal/cursor/account-mcp.js +147 -146
  354. package/dist/internal/cursor/backend-client.js +290 -320
  355. package/dist/internal/cursor/bound-secret-file.js +3 -3
  356. package/dist/internal/cursor/credentials.d.ts +1 -0
  357. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  358. package/dist/internal/cursor/credentials.js +130 -142
  359. package/dist/internal/cursor/cursor-api-transport.js +4 -8
  360. package/dist/internal/cursor/github-credentials.js +91 -108
  361. package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
  362. package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
  363. package/dist/internal/cursor/hosted-store-secrets.js +5 -9
  364. package/dist/internal/cursor/session-token.js +36 -48
  365. package/dist/internal/cursor/store-api-client.js +77 -92
  366. package/dist/internal/cursor-account-mcp-auth.js +132 -149
  367. package/dist/internal/cursor-agent-template.js +1 -1
  368. package/dist/internal/cursor-deployment-relay.js +33 -54
  369. package/dist/internal/cursor-event-relay.js +65 -59
  370. package/dist/internal/cursor-relay-core.js +258 -286
  371. package/dist/internal/deferred-channel-session.js +3 -12
  372. package/dist/internal/deploy-client.js +410 -475
  373. package/dist/internal/deploy-manifest.d.ts +17 -0
  374. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  375. package/dist/internal/deploy-manifest.js +71 -21
  376. package/dist/internal/deploy-source.js +31 -43
  377. package/dist/internal/discovery/agent-config.js +45 -59
  378. package/dist/internal/discovery/agent.js +276 -280
  379. package/dist/internal/discovery/channels.js +67 -80
  380. package/dist/internal/discovery/connections.js +286 -296
  381. package/dist/internal/discovery/context.js +2 -13
  382. package/dist/internal/discovery/cursor-plugin.js +223 -259
  383. package/dist/internal/discovery/extension-overlay.js +104 -131
  384. package/dist/internal/discovery/extensions.js +276 -281
  385. package/dist/internal/discovery/fs.js +56 -79
  386. package/dist/internal/discovery/hooks.js +39 -50
  387. package/dist/internal/discovery/info.js +17 -19
  388. package/dist/internal/discovery/instructions.js +58 -71
  389. package/dist/internal/discovery/modules.js +45 -58
  390. package/dist/internal/discovery/project.d.ts.map +1 -1
  391. package/dist/internal/discovery/project.js +192 -215
  392. package/dist/internal/discovery/reminders.js +41 -52
  393. package/dist/internal/discovery/runtime.js +1 -1
  394. package/dist/internal/discovery/schedules.js +71 -82
  395. package/dist/internal/discovery/seed-files.js +21 -32
  396. package/dist/internal/discovery/services.js +74 -96
  397. package/dist/internal/discovery/skills.js +77 -94
  398. package/dist/internal/discovery/subagent.js +79 -95
  399. package/dist/internal/discovery/tools.js +12 -23
  400. package/dist/internal/distribution.js +2 -2
  401. package/dist/internal/docs-site.js +30 -45
  402. package/dist/internal/duration.js +1 -1
  403. package/dist/internal/env-file.js +48 -64
  404. package/dist/internal/eval-judge-model.js +17 -28
  405. package/dist/internal/eval-run-store.js +265 -254
  406. package/dist/internal/eval-runner.d.ts +8 -0
  407. package/dist/internal/eval-runner.d.ts.map +1 -1
  408. package/dist/internal/eval-runner.js +406 -408
  409. package/dist/internal/eval-transport.d.ts +24 -0
  410. package/dist/internal/eval-transport.d.ts.map +1 -0
  411. package/dist/internal/eval-transport.js +22 -0
  412. package/dist/internal/evals-client.js +242 -246
  413. package/dist/internal/event-log.js +72 -120
  414. package/dist/internal/event-mapper.js +30 -31
  415. package/dist/internal/factory-resource-channel.js +16 -30
  416. package/dist/internal/filesystem/errors.js +6 -6
  417. package/dist/internal/filesystem/format.js +10 -13
  418. package/dist/internal/filesystem/merge.js +52 -94
  419. package/dist/internal/filesystem/nearest.js +15 -27
  420. package/dist/internal/filesystem/scratch.js +65 -85
  421. package/dist/internal/filesystem/tools.js +221 -241
  422. package/dist/internal/filesystem/walk.js +76 -143
  423. package/dist/internal/framework-file-storage.js +118 -139
  424. package/dist/internal/framework-storage-selection.js +21 -13
  425. package/dist/internal/frontmatter.js +4 -6
  426. package/dist/internal/github-fanout.js +50 -64
  427. package/dist/internal/guest-network.js +96 -109
  428. package/dist/internal/handleAgentServeTrigger.js +121 -126
  429. package/dist/internal/host-files.js +73 -88
  430. package/dist/internal/host-kv.js +21 -36
  431. package/dist/internal/host-otel.js +22 -19
  432. package/dist/internal/host-platforms.js +49 -63
  433. package/dist/internal/hosted-catch-protocol.d.ts +1 -0
  434. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  435. package/dist/internal/hosted-catch-protocol.js +1 -0
  436. package/dist/internal/hosted-catch.d.ts +5 -3
  437. package/dist/internal/hosted-catch.d.ts.map +1 -1
  438. package/dist/internal/hosted-catch.js +84 -93
  439. package/dist/internal/hosted-delivery-protocol.js +32 -8
  440. package/dist/internal/hosted-delivery.d.ts +13 -1
  441. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  442. package/dist/internal/hosted-delivery.js +614 -584
  443. package/dist/internal/hosted-eval-cases.d.ts +21 -0
  444. package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
  445. package/dist/internal/hosted-eval-cases.js +162 -0
  446. package/dist/internal/hosted-execution-diag.js +38 -30
  447. package/dist/internal/hosted-execution-flush.js +75 -66
  448. package/dist/internal/hosted-execution-latency.js +16 -8
  449. package/dist/internal/hosted-managed-automation.js +2 -2
  450. package/dist/internal/hosting.js +2 -3
  451. package/dist/internal/http-channel-define.js +4 -1
  452. package/dist/internal/http-channel.js +101 -112
  453. package/dist/internal/http-control-plane-session.d.ts +18 -1
  454. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  455. package/dist/internal/http-control-plane-session.js +66 -32
  456. package/dist/internal/incoming-headers-to-fetch.js +1 -2
  457. package/dist/internal/init-interview.js +73 -93
  458. package/dist/internal/init-project.js +182 -214
  459. package/dist/internal/init-scaffold.js +10 -21
  460. package/dist/internal/inline-stdio-mcp.js +80 -86
  461. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  462. package/dist/internal/install-cursor-skills.js +238 -274
  463. package/dist/internal/legacy-command-guard.js +18 -31
  464. package/dist/internal/listen-port.js +34 -45
  465. package/dist/internal/local-control-plane.js +293 -307
  466. package/dist/internal/local-env.js +1 -1
  467. package/dist/internal/local-ingress.js +15 -9
  468. package/dist/internal/log-ring.js +1 -2
  469. package/dist/internal/logs-client.js +207 -227
  470. package/dist/internal/map-pool.js +24 -38
  471. package/dist/internal/mcp-endpoint.js +204 -180
  472. package/dist/internal/mcp-host.js +165 -168
  473. package/dist/internal/mcp-oauth-on-demand.js +170 -207
  474. package/dist/internal/mcp-oauth-persist.js +15 -29
  475. package/dist/internal/mcp-oauth.js +209 -266
  476. package/dist/internal/named-webhook-secret.d.ts +39 -0
  477. package/dist/internal/named-webhook-secret.d.ts.map +1 -0
  478. package/dist/internal/named-webhook-secret.js +47 -0
  479. package/dist/internal/open-browser.js +2 -3
  480. package/dist/internal/otel/collector.js +104 -68
  481. package/dist/internal/otel/config.js +24 -37
  482. package/dist/internal/otel/http.js +5 -7
  483. package/dist/internal/otel/mcp.js +3 -12
  484. package/dist/internal/otel/runtime.js +69 -83
  485. package/dist/internal/package-inline-stdio.js +57 -65
  486. package/dist/internal/peer-connections.js +9 -5
  487. package/dist/internal/platform-schedule-sync.js +39 -54
  488. package/dist/internal/platform-timers.js +176 -210
  489. package/dist/internal/playground/static.js +1 -2
  490. package/dist/internal/playground/toolchain.js +37 -53
  491. package/dist/internal/playground-proxy.js +230 -270
  492. package/dist/internal/process-memory-telemetry.js +33 -51
  493. package/dist/internal/prompt-context.js +3 -6
  494. package/dist/internal/reminder-control-plane-protocol.js +46 -13
  495. package/dist/internal/reminder-runner.js +770 -785
  496. package/dist/internal/reminder-schedule.js +1 -1
  497. package/dist/internal/reminder-store.js +57 -78
  498. package/dist/internal/request-error-status.js +1 -3
  499. package/dist/internal/request-headers.js +2 -2
  500. package/dist/internal/resolve-prod-target.js +119 -135
  501. package/dist/internal/resolved-connections.js +16 -6
  502. package/dist/internal/run-client.js +221 -229
  503. package/dist/internal/runtime-dispatch-runner.js +18 -43
  504. package/dist/internal/schedule-runner.js +49 -58
  505. package/dist/internal/scm/pr-url.js +7 -6
  506. package/dist/internal/sdk-runner.js +388 -363
  507. package/dist/internal/serve-restart.js +26 -39
  508. package/dist/internal/server.d.ts.map +1 -1
  509. package/dist/internal/server.js +1283 -1244
  510. package/dist/internal/session-cost.js +7 -9
  511. package/dist/internal/session-engine.d.ts +3 -1
  512. package/dist/internal/session-engine.d.ts.map +1 -1
  513. package/dist/internal/session-engine.js +2801 -2777
  514. package/dist/internal/session-links.js +12 -16
  515. package/dist/internal/session-run-log.js +134 -82
  516. package/dist/internal/session-store.js +133 -164
  517. package/dist/internal/sessions-client.js +97 -118
  518. package/dist/internal/skill-catalog.js +18 -23
  519. package/dist/internal/skills-sync.js +16 -30
  520. package/dist/internal/slack-provision-client.js +90 -116
  521. package/dist/internal/start-log-store.js +48 -67
  522. package/dist/internal/steering.js +1 -2
  523. package/dist/internal/storage-coordinator.js +160 -196
  524. package/dist/internal/store-mirror.js +16 -30
  525. package/dist/internal/stream-progress.js +6 -8
  526. package/dist/internal/terminal-style.js +3 -4
  527. package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
  528. package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
  529. package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
  530. package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
  531. package/dist/internal/tool-catalog.js +11 -5
  532. package/dist/internal/tool-result.js +1 -1
  533. package/dist/internal/trajectory.js +19 -22
  534. package/dist/internal/turn-cost.js +52 -62
  535. package/dist/internal/turn-governor.js +5 -8
  536. package/dist/internal/turn-lease-store.js +85 -105
  537. package/dist/internal/turn-outbox.js +28 -43
  538. package/dist/internal/update-check.js +231 -259
  539. package/dist/internal/v2-hosting.js +1 -2
  540. package/dist/internal/workspace-sync.js +25 -41
  541. package/dist/internal/workspace.js +111 -139
  542. package/dist/kv/memory-kv.js +27 -51
  543. package/dist/memory.js +106 -148
  544. package/dist/otel.js +5 -8
  545. package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
  546. package/dist/playground/assets/{index-MijLHTbB.js → index-JekUQERK.js} +45 -45
  547. package/dist/playground/index.html +2 -2
  548. package/dist/prompt.js +2 -4
  549. package/dist/storage-backends/cursor-hosted-v2.js +53 -83
  550. package/dist/storage-backends/cursor-hosted.js +105 -145
  551. package/dist/storage-backends/file-kv.js +100 -128
  552. package/dist/storage-protocol.js +3 -5
  553. package/dist/storage.js +17 -26
  554. package/dist/types.d.ts +68 -0
  555. package/dist/types.d.ts.map +1 -1
  556. package/dist/types.js +20 -18
  557. package/docs/building-with-agents.md +2 -0
  558. package/docs/deployment.md +7 -0
  559. package/docs/guides/bitbucket.md +9 -1
  560. package/docs/guides/github.md +20 -4
  561. package/docs/guides/gitlab.md +9 -1
  562. package/docs/guides/migrate.md +127 -0
  563. package/docs/reference/cli.md +39 -0
  564. package/docs/troubleshooting.md +1 -0
  565. package/package.json +1 -1
  566. package/skills/debug/SKILL.md +1 -0
  567. package/skills/github/SKILL.md +23 -0
  568. package/skills/migrate-v2/SKILL.md +264 -0
  569. package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +0 -1
  570. package/dist/docs/assets/chunks/channel.CRUyWDV-.js +0 -1
  571. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CG_UObcQ.js +0 -1
  572. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CG_UObcQ.js +0 -1
  573. package/dist/docs/assets/chunks/clone.NYSZ9qZN.js +0 -1
  574. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DOOmulfQ.js +0 -1
  575. package/dist/docs/assets/chunks/wardley-RL74JXVD.BJrCW6xc.js +0 -162
  576. package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
  577. package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
  578. package/dist/playground/assets/index-DPKLl4C_.css +0 -1
  579. /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
  580. /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
  581. /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.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
  }