@cursor/july 0.1.94 → 0.1.96

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 (332) hide show
  1. package/AGENTS.md +3 -4
  2. package/dist/channels/deployments/types.d.ts +1 -1
  3. package/dist/channels/deployments/types.d.ts.map +1 -1
  4. package/dist/channels/deployments/types.js +1 -0
  5. package/dist/channels/github/github-channel.d.ts.map +1 -1
  6. package/dist/channels/github/github-channel.js +14 -2
  7. package/dist/channels/github/types.d.ts +18 -3
  8. package/dist/channels/github/types.d.ts.map +1 -1
  9. package/dist/channels/origin/api.d.ts +59 -13
  10. package/dist/channels/origin/api.d.ts.map +1 -1
  11. package/dist/channels/origin/api.js +168 -27
  12. package/dist/channels/origin/binding.d.ts +2 -2
  13. package/dist/channels/origin/checks.d.ts +6 -6
  14. package/dist/channels/origin/checks.js +6 -6
  15. package/dist/channels/origin/cursor-account.d.ts +5 -3
  16. package/dist/channels/origin/cursor-account.d.ts.map +1 -1
  17. package/dist/channels/origin/cursor-account.js +5 -3
  18. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  19. package/dist/channels/origin/origin-channel.js +11 -3
  20. package/dist/channels/origin/origin-webhook.d.ts +11 -1
  21. package/dist/channels/origin/origin-webhook.d.ts.map +1 -1
  22. package/dist/channels/origin/origin-webhook.js +23 -3
  23. package/dist/channels/origin/types.d.ts +8 -0
  24. package/dist/channels/origin/types.d.ts.map +1 -1
  25. package/dist/channels/slack/api.d.ts +9 -0
  26. package/dist/channels/slack/api.d.ts.map +1 -1
  27. package/dist/channels/slack/api.js +36 -5
  28. package/dist/channels/slack/defaults.d.ts.map +1 -1
  29. package/dist/channels/slack/defaults.js +17 -46
  30. package/dist/channels/slack/dispatch.d.ts +7 -1
  31. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  32. package/dist/channels/slack/dispatch.js +47 -23
  33. package/dist/channels/slack/inbound.d.ts +8 -0
  34. package/dist/channels/slack/inbound.d.ts.map +1 -1
  35. package/dist/channels/slack/inbound.js +32 -0
  36. package/dist/channels/slack/live-delivery.d.ts +26 -29
  37. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  38. package/dist/channels/slack/live-delivery.js +172 -73
  39. package/dist/channels/slack/manifest.d.ts.map +1 -1
  40. package/dist/channels/slack/manifest.js +5 -1
  41. package/dist/channels/slack/nudge-carrier.d.ts +2 -0
  42. package/dist/channels/slack/nudge-carrier.d.ts.map +1 -1
  43. package/dist/channels/slack/nudge-carrier.js +48 -1
  44. package/dist/channels/slack/pr-ref.d.ts +7 -1
  45. package/dist/channels/slack/pr-ref.d.ts.map +1 -1
  46. package/dist/channels/slack/pr-ref.js +42 -23
  47. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  48. package/dist/channels/slack/slack-channel.js +2 -2
  49. package/dist/docs/404.html +2 -2
  50. package/dist/docs/ab.html +4 -4
  51. package/dist/docs/assets/{app.CFDEas4I.js → app.jXleCmOc.js} +1 -1
  52. package/dist/docs/assets/chunks/@localSearchIndexroot.DFoGuETX.js +1 -0
  53. package/dist/docs/assets/chunks/{VPLocalSearchBox.B1IIYpYS.js → VPLocalSearchBox.8LhyglIT.js} +1 -1
  54. package/dist/docs/assets/chunks/{theme.Ct4NSiLm.js → theme.9ged-pr2.js} +2 -2
  55. package/dist/docs/assets/index.md.CI93Ltlb.js +5 -0
  56. package/dist/docs/assets/{index.md.DRakGHFe.lean.js → index.md.CI93Ltlb.lean.js} +1 -1
  57. package/dist/docs/assets/{reference_cli.md.Cw6_ICYG.js → reference_cli.md.CCnG-nJx.js} +4 -2
  58. package/dist/docs/assets/{reference_cli.md.Cw6_ICYG.lean.js → reference_cli.md.CCnG-nJx.lean.js} +1 -1
  59. package/dist/docs/assets/{reference_skills.md.8son6Hjm.js → reference_skills.md.BFW9retM.js} +3 -3
  60. package/dist/docs/assets/{templates_agentic-owners.md.DqtPdm6f.js → templates_agentic-owners.md.BZSH4N9z.js} +1 -1
  61. package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.js +2 -0
  62. package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.lean.js +1 -0
  63. package/dist/docs/assets/{templates_demo.md.DhFcWN6j.js → templates_demo.md.BeQX9V3H.js} +1 -1
  64. package/dist/docs/assets/{templates_pr-autofixer.md.DU7dQpor.js → templates_pr-autofixer.md.x5zl6-GT.js} +2 -2
  65. package/dist/docs/assets/{templates_pr-autofixer.md.DU7dQpor.lean.js → templates_pr-autofixer.md.x5zl6-GT.lean.js} +1 -1
  66. package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.js +4 -0
  67. package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.lean.js +1 -0
  68. package/dist/docs/assets/{templates_security-reviewer.md.CTa7u_l1.js → templates_security-reviewer.md.lshxbCLK.js} +2 -2
  69. package/dist/docs/assets/{templates_security-reviewer.md.CTa7u_l1.lean.js → templates_security-reviewer.md.lshxbCLK.lean.js} +1 -1
  70. package/dist/docs/assets/{templates_triage.md.CVlpctKS.js → templates_triage.md.Co4UNzkZ.js} +3 -3
  71. package/dist/docs/assets/{templates_triage.md.CVlpctKS.lean.js → templates_triage.md.Co4UNzkZ.lean.js} +1 -1
  72. package/dist/docs/building-with-agents.html +4 -4
  73. package/dist/docs/concepts.html +4 -4
  74. package/dist/docs/deployment.html +4 -4
  75. package/dist/docs/evals.html +4 -4
  76. package/dist/docs/guides/agent-to-agent.html +4 -4
  77. package/dist/docs/guides/cloud-runtime.html +4 -4
  78. package/dist/docs/guides/convert-automation.html +4 -4
  79. package/dist/docs/guides/github.html +4 -4
  80. package/dist/docs/guides/human-in-the-loop.html +4 -4
  81. package/dist/docs/guides/mcp-oauth.html +4 -4
  82. package/dist/docs/guides/opentelemetry.html +4 -4
  83. package/dist/docs/guides/slack.html +4 -4
  84. package/dist/docs/guides/webhooks.html +4 -4
  85. package/dist/docs/hashmap.json +1 -1
  86. package/dist/docs/hillclimbing.html +4 -4
  87. package/dist/docs/index.html +6 -6
  88. package/dist/docs/index.md +5 -1
  89. package/dist/docs/llms-full.txt +189 -26
  90. package/dist/docs/llms.txt +2 -0
  91. package/dist/docs/quickstart.html +4 -4
  92. package/dist/docs/reference/agent-config.html +4 -4
  93. package/dist/docs/reference/artifacts.html +4 -4
  94. package/dist/docs/reference/channels.html +4 -4
  95. package/dist/docs/reference/cli.html +8 -6
  96. package/dist/docs/reference/cli.md +4 -1
  97. package/dist/docs/reference/connections.html +4 -4
  98. package/dist/docs/reference/hooks.html +4 -4
  99. package/dist/docs/reference/http-api.html +4 -4
  100. package/dist/docs/reference/instructions.html +4 -4
  101. package/dist/docs/reference/playground.html +4 -4
  102. package/dist/docs/reference/project-layout.html +4 -4
  103. package/dist/docs/reference/prompt.html +4 -4
  104. package/dist/docs/reference/schedules.html +4 -4
  105. package/dist/docs/reference/sessions.html +4 -4
  106. package/dist/docs/reference/skills.html +7 -7
  107. package/dist/docs/reference/subagents.html +4 -4
  108. package/dist/docs/reference/tools.html +4 -4
  109. package/dist/docs/scaffolding-agents.html +4 -4
  110. package/dist/docs/storage.html +4 -4
  111. package/dist/docs/templates/agentic-owners.html +7 -7
  112. package/dist/docs/templates/agentic-owners.md +1 -1
  113. package/dist/docs/templates/code-wiki.html +28 -0
  114. package/dist/docs/templates/code-wiki.md +91 -0
  115. package/dist/docs/templates/demo.html +6 -6
  116. package/dist/docs/templates/demo.md +3 -2
  117. package/dist/docs/templates/pr-autofixer.html +6 -6
  118. package/dist/docs/templates/pr-autofixer.md +7 -13
  119. package/dist/docs/templates/security-help.html +30 -0
  120. package/dist/docs/templates/security-help.md +65 -0
  121. package/dist/docs/templates/security-reviewer.html +6 -6
  122. package/dist/docs/templates/security-reviewer.md +1 -2
  123. package/dist/docs/templates/triage.html +7 -7
  124. package/dist/docs/templates/triage.md +2 -6
  125. package/dist/docs/troubleshooting.html +4 -4
  126. package/dist/files-backends/cursor-hosted.d.ts +26 -0
  127. package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
  128. package/dist/files-backends/cursor-hosted.js +32 -4
  129. package/dist/files.d.ts +2 -0
  130. package/dist/files.d.ts.map +1 -1
  131. package/dist/files.js +5 -0
  132. package/dist/internal/advertise-tools.d.ts +2 -0
  133. package/dist/internal/advertise-tools.d.ts.map +1 -1
  134. package/dist/internal/advertise-tools.js +15 -1
  135. package/dist/internal/bounded.d.ts +7 -0
  136. package/dist/internal/bounded.d.ts.map +1 -0
  137. package/dist/internal/bounded.js +32 -0
  138. package/dist/internal/cli-deploy.d.ts.map +1 -1
  139. package/dist/internal/cli-deploy.js +142 -7
  140. package/dist/internal/conversation-mirror.d.ts +85 -0
  141. package/dist/internal/conversation-mirror.d.ts.map +1 -0
  142. package/dist/internal/conversation-mirror.js +312 -0
  143. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  144. package/dist/internal/cursor/backend-client.js +22 -48
  145. package/dist/internal/cursor/session-token.d.ts +45 -0
  146. package/dist/internal/cursor/session-token.d.ts.map +1 -0
  147. package/dist/internal/cursor/session-token.js +99 -0
  148. package/dist/internal/cursor-agent-template.d.ts +1 -1
  149. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  150. package/dist/internal/cursor-agent-template.js +1 -0
  151. package/dist/internal/deferred-channel-session.d.ts +20 -0
  152. package/dist/internal/deferred-channel-session.d.ts.map +1 -0
  153. package/dist/internal/deferred-channel-session.js +62 -0
  154. package/dist/internal/deploy-client.d.ts +13 -1
  155. package/dist/internal/deploy-client.d.ts.map +1 -1
  156. package/dist/internal/deploy-client.js +11 -1
  157. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  158. package/dist/internal/deploy-manifest.js +11 -5
  159. package/dist/internal/discovery.d.ts.map +1 -1
  160. package/dist/internal/discovery.js +22 -2
  161. package/dist/internal/framework-file-storage.d.ts +61 -0
  162. package/dist/internal/framework-file-storage.d.ts.map +1 -0
  163. package/dist/internal/framework-file-storage.js +204 -0
  164. package/dist/internal/framework-storage-selection.d.ts +38 -16
  165. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  166. package/dist/internal/framework-storage-selection.js +78 -17
  167. package/dist/internal/hosted-admission-context.d.ts +20 -0
  168. package/dist/internal/hosted-admission-context.d.ts.map +1 -0
  169. package/dist/internal/hosted-admission-context.js +31 -0
  170. package/dist/internal/hosted-delivery-protocol.d.ts +5 -0
  171. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  172. package/dist/internal/hosted-delivery-protocol.js +33 -1
  173. package/dist/internal/hosted-delivery.d.ts +11 -2
  174. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  175. package/dist/internal/hosted-delivery.js +79 -35
  176. package/dist/internal/hosted-managed-automation.d.ts +30 -0
  177. package/dist/internal/hosted-managed-automation.d.ts.map +1 -0
  178. package/dist/internal/hosted-managed-automation.js +58 -0
  179. package/dist/internal/init-project.d.ts.map +1 -1
  180. package/dist/internal/init-project.js +2 -0
  181. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  182. package/dist/internal/install-cursor-skills.js +1 -3
  183. package/dist/internal/managed-delivery.d.ts +80 -0
  184. package/dist/internal/managed-delivery.d.ts.map +1 -0
  185. package/dist/internal/managed-delivery.js +86 -0
  186. package/dist/internal/review-comments.d.ts.map +1 -1
  187. package/dist/internal/review-comments.js +10 -98
  188. package/dist/internal/runtime-dispatch-runner.d.ts +5 -1
  189. package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
  190. package/dist/internal/runtime-dispatch-runner.js +7 -0
  191. package/dist/internal/scm/pr-url.d.ts +14 -0
  192. package/dist/internal/scm/pr-url.d.ts.map +1 -0
  193. package/dist/internal/scm/pr-url.js +65 -0
  194. package/dist/internal/sdk-runner.d.ts +25 -0
  195. package/dist/internal/sdk-runner.d.ts.map +1 -1
  196. package/dist/internal/sdk-runner.js +70 -0
  197. package/dist/internal/server.d.ts.map +1 -1
  198. package/dist/internal/server.js +11 -2
  199. package/dist/internal/session-engine.d.ts +13 -0
  200. package/dist/internal/session-engine.d.ts.map +1 -1
  201. package/dist/internal/session-engine.js +71 -3
  202. package/dist/internal/steering.d.ts +15 -0
  203. package/dist/internal/steering.d.ts.map +1 -0
  204. package/dist/internal/steering.js +18 -0
  205. package/dist/playground/assets/index-B1DDvBeC.css +1 -0
  206. package/dist/playground/assets/{index-B3JCyigB.js → index-Cx9CclK_.js} +47 -47
  207. package/dist/playground/index.html +2 -2
  208. package/dist/storage-backends/cursor-hosted.d.ts +8 -0
  209. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  210. package/dist/storage-backends/cursor-hosted.js +4 -3
  211. package/dist/types.d.ts +2 -1
  212. package/dist/types.d.ts.map +1 -1
  213. package/docs/README.md +5 -1
  214. package/docs/reference/cli.md +4 -1
  215. package/docs/templates/agentic-owners.md +1 -1
  216. package/docs/templates/code-wiki.md +96 -0
  217. package/docs/templates/demo.md +3 -2
  218. package/docs/templates/pr-autofixer.md +7 -13
  219. package/docs/templates/security-help.md +70 -0
  220. package/docs/templates/security-reviewer.md +1 -2
  221. package/docs/templates/triage.md +2 -6
  222. package/package.json +2 -2
  223. package/skills/ab/SKILL.md +13 -97
  224. package/skills/create-agent/SKILL.md +123 -223
  225. package/skills/debug/SKILL.md +34 -68
  226. package/skills/evals/SKILL.md +55 -180
  227. package/skills/framework-map/SKILL.md +83 -145
  228. package/skills/github/SKILL.md +53 -111
  229. package/skills/hillclimb/SKILL.md +40 -163
  230. package/skills/mcp-auth/SKILL.md +48 -107
  231. package/skills/otel/SKILL.md +22 -68
  232. package/skills/setup-slack/SKILL.md +77 -208
  233. package/src/channels/deployments/types.ts +1 -0
  234. package/src/channels/github/github-channel.ts +23 -8
  235. package/src/channels/github/types.ts +19 -2
  236. package/src/channels/origin/api.ts +242 -30
  237. package/src/channels/origin/binding.ts +2 -2
  238. package/src/channels/origin/checks.ts +6 -6
  239. package/src/channels/origin/cursor-account.ts +5 -3
  240. package/src/channels/origin/origin-channel.ts +13 -1
  241. package/src/channels/origin/origin-webhook.ts +27 -3
  242. package/src/channels/origin/types.ts +8 -0
  243. package/src/channels/slack/api.ts +41 -5
  244. package/src/channels/slack/defaults.ts +15 -49
  245. package/src/channels/slack/dispatch.ts +56 -22
  246. package/src/channels/slack/inbound.ts +43 -0
  247. package/src/channels/slack/live-delivery.ts +235 -114
  248. package/src/channels/slack/manifest.ts +5 -1
  249. package/src/channels/slack/nudge-carrier.ts +48 -1
  250. package/src/channels/slack/pr-ref.ts +56 -25
  251. package/src/channels/slack/slack-channel.ts +2 -0
  252. package/src/files-backends/cursor-hosted.ts +41 -2
  253. package/src/files.ts +11 -0
  254. package/src/internal/advertise-tools.ts +18 -2
  255. package/src/internal/bounded.ts +28 -0
  256. package/src/internal/cli-deploy.ts +183 -7
  257. package/src/internal/conversation-mirror.ts +406 -0
  258. package/src/internal/cursor/backend-client.ts +34 -58
  259. package/src/internal/cursor/session-token.ts +115 -0
  260. package/src/internal/cursor-agent-template.ts +1 -0
  261. package/src/internal/deferred-channel-session.ts +61 -0
  262. package/src/internal/deploy-client.ts +24 -1
  263. package/src/internal/deploy-manifest.ts +10 -5
  264. package/src/internal/discovery.ts +25 -2
  265. package/src/internal/framework-file-storage.ts +222 -0
  266. package/src/internal/framework-storage-selection.ts +101 -19
  267. package/src/internal/hosted-admission-context.ts +37 -0
  268. package/src/internal/hosted-delivery-protocol.ts +44 -1
  269. package/src/internal/hosted-delivery.ts +105 -40
  270. package/src/internal/hosted-managed-automation.ts +72 -0
  271. package/src/internal/init-project.ts +2 -0
  272. package/src/internal/install-cursor-skills.ts +1 -4
  273. package/src/internal/managed-delivery.ts +125 -0
  274. package/src/internal/review-comments.ts +10 -113
  275. package/src/internal/runtime-dispatch-runner.ts +10 -0
  276. package/src/internal/scm/pr-url.ts +95 -0
  277. package/src/internal/sdk-runner.ts +103 -0
  278. package/src/internal/server.ts +12 -0
  279. package/src/internal/session-engine.ts +76 -4
  280. package/src/internal/steering.ts +17 -0
  281. package/src/storage-backends/cursor-hosted.ts +10 -1
  282. package/src/types.ts +2 -1
  283. package/templates/agentic-owners/README.md +1 -1
  284. package/templates/agentic-owners/agent/agent.ts +0 -10
  285. package/templates/agentic-owners/agent/channels/github.ts +5 -14
  286. package/templates/agentic-owners/agent/lib/config.ts +0 -8
  287. package/templates/agentic-owners/agent/lib/review.ts +2 -15
  288. package/templates/agentic-owners/agent/tools/record_review.ts +2 -4
  289. package/templates/code-wiki/README.md +34 -0
  290. package/templates/code-wiki/agent/agent.ts +8 -0
  291. package/templates/code-wiki/agent/channels/github.ts +144 -0
  292. package/templates/code-wiki/agent/instructions.md +39 -0
  293. package/templates/code-wiki/agent/lib/repos.ts +5 -0
  294. package/templates/code-wiki/agent/lib/wiki.ts +22 -0
  295. package/templates/code-wiki/agent/tools/apply_wiki.ts +219 -0
  296. package/templates/code-wiki/evals/evals.config.ts +5 -0
  297. package/templates/code-wiki/evals/wiki.eval.ts +132 -0
  298. package/templates/code-wiki/init.json +25 -0
  299. package/templates/code-wiki/package.json +18 -0
  300. package/templates/code-wiki/tsconfig.json +12 -0
  301. package/templates/demo/agent/agent.ts +0 -10
  302. package/templates/pr-autofixer/README.md +0 -2
  303. package/templates/pr-autofixer/agent/agent.ts +0 -11
  304. package/templates/pr-autofixer/agent/channels/slack.ts +0 -7
  305. package/templates/pr-autofixer/agent/lib/pr-state.ts +5 -17
  306. package/templates/pr-autofixer/agent/lib/repos.ts +0 -1
  307. package/templates/security-help/README.md +2 -2
  308. package/templates/security-help/agent/agent.ts +1 -2
  309. package/templates/security-help/agent/channels/slack.ts +0 -3
  310. package/templates/security-help/agent/instructions.md +9 -10
  311. package/templates/security-help/agent/skills/access-request.md +1 -1
  312. package/templates/security-help/agent/skills/faq.md +31 -0
  313. package/templates/security-help/agent/skills/security-playbooks.md +1 -1
  314. package/templates/security-help/package.json +1 -2
  315. package/templates/security-reviewer/agent/agent.ts +0 -10
  316. package/templates/triage/agent/agent.ts +0 -10
  317. package/templates/triage/agent/channels/queue.ts +1 -1
  318. package/templates/triage/agent/channels/webhook.ts +1 -3
  319. package/dist/docs/assets/chunks/@localSearchIndexroot.DU3U2Ij2.js +0 -1
  320. package/dist/docs/assets/index.md.DRakGHFe.js +0 -5
  321. package/dist/internal/deployment-scm-event-stream.d.ts +0 -116
  322. package/dist/internal/deployment-scm-event-stream.d.ts.map +0 -1
  323. package/dist/internal/deployment-scm-event-stream.js +0 -474
  324. package/dist/playground/assets/index-D9N7-q97.css +0 -1
  325. package/src/internal/deployment-scm-event-stream.ts +0 -593
  326. package/templates/security-help/agent/knowledge/faq/approvals.md +0 -5
  327. package/templates/security-help/agent/knowledge/faq/channels.md +0 -6
  328. package/templates/security-help/agent/knowledge/faq/phishing.md +0 -10
  329. package/templates/security-help/agent/skills/security-first-pass.md +0 -15
  330. /package/dist/docs/assets/{reference_skills.md.8son6Hjm.lean.js → reference_skills.md.BFW9retM.lean.js} +0 -0
  331. /package/dist/docs/assets/{templates_agentic-owners.md.DqtPdm6f.lean.js → templates_agentic-owners.md.BZSH4N9z.lean.js} +0 -0
  332. /package/dist/docs/assets/{templates_demo.md.DhFcWN6j.lean.js → templates_demo.md.BeQX9V3H.lean.js} +0 -0
@@ -166,7 +166,7 @@ export function buildDefaultEvents(
166
166
  status: "",
167
167
  });
168
168
  if (!result.ok) {
169
- getLog().warn("assistant.threads.setStatus not-ok", {
169
+ getLog().warn("slack setStatus not-ok", {
170
170
  error: result.error,
171
171
  channel: channelId,
172
172
  thread_ts: threadTs,
@@ -205,42 +205,22 @@ export function buildDefaultEvents(
205
205
  status: "Working…",
206
206
  loadingMessages,
207
207
  });
208
-
209
- // Retry streaming each turn unless a prior call proved the feature
210
- // unsupported for this workspace/app. Thinking stays on setStatus
211
- // (Cursor-account proxy pins agent username/icon on that method).
212
- if (!streaming || state.streamingUnavailable === true) {
213
- return;
214
- }
215
-
216
- await strategy.start({
217
- channel,
218
- channelId: state.channelId,
219
- threadTs: state.threadTs,
220
- sessionId: event.sessionId,
221
- });
222
208
  },
223
209
 
224
210
  async "message.appended"(event, channel) {
225
211
  if (!streaming || channel.state.streamingUnavailable === true) {
226
212
  return;
227
213
  }
228
- const streamTs = channel.state.streamTs;
229
214
  const channelId =
230
215
  channel.state.streamChannelId ?? channel.state.channelId;
231
- if (
232
- streamTs === null ||
233
- streamTs === "" ||
234
- channelId === null ||
235
- channelId === ""
236
- ) {
216
+ const threadTs = channel.state.threadTs;
217
+ if (channelId === null || channelId === "" || threadTs === null) {
237
218
  return;
238
219
  }
239
220
 
240
221
  await strategy.append({
241
222
  channel,
242
223
  channelId,
243
- streamTs,
244
224
  text: event.data.text,
245
225
  sessionId: event.sessionId,
246
226
  });
@@ -298,24 +278,23 @@ export function buildDefaultEvents(
298
278
  strategy.inlineToolSteps &&
299
279
  thinkingSteps &&
300
280
  streaming &&
301
- channel.state.streamingUnavailable !== true &&
302
- channel.state.streamTs !== null &&
303
- channel.state.streamTs !== ""
281
+ channel.state.streamingUnavailable !== true
304
282
  ) {
305
283
  const channelId =
306
284
  channel.state.streamChannelId ?? channel.state.channelId;
307
- if (channelId !== null && channelId !== "") {
285
+ const threadTs = channel.state.threadTs;
286
+ if (channelId !== null && channelId !== "" && threadTs !== null) {
308
287
  const chunks = buildTaskChunksForCalls(
309
288
  event.data.calls,
310
289
  "in_progress"
311
290
  );
312
- const result = await appendChatStream({
313
- botToken,
314
- channel: channelId,
315
- ts: channel.state.streamTs,
291
+ const streamed = await strategy.appendChunks({
292
+ channel,
293
+ channelId,
316
294
  chunks,
295
+ sessionId: event.sessionId,
317
296
  });
318
- if (result.ok) {
297
+ if (streamed) {
319
298
  if (
320
299
  channel.state.channelId !== null &&
321
300
  channel.state.threadTs !== null
@@ -388,29 +367,17 @@ export function buildDefaultEvents(
388
367
  // Empty final text: still close any open stream / clear the skeleton
389
368
  // and clear typing.
390
369
  if (event.data.text === "") {
391
- if (state.streamTs !== null && state.streamTs !== "") {
392
- await strategy.finalizeEmpty({
393
- channel,
394
- channelId: state.streamChannelId ?? state.channelId,
395
- streamTs: state.streamTs,
396
- });
397
- channel.state.streamTs = null;
398
- }
370
+ await strategy.finalizeEmpty({ channel });
399
371
  await clearWorkingStatus(state.channelId, state.threadTs);
400
372
  return;
401
373
  }
402
374
 
403
- const canStream =
404
- streaming &&
405
- state.streamingUnavailable !== true &&
406
- state.streamTs !== null &&
407
- state.streamTs !== "";
375
+ const canStream = streaming && state.streamingUnavailable !== true;
408
376
 
409
- if (canStream && state.streamTs !== null) {
377
+ if (canStream) {
410
378
  const { delivered } = await strategy.finalize({
411
379
  channel,
412
380
  channelId: state.streamChannelId ?? state.channelId,
413
- streamTs: state.streamTs,
414
381
  text: event.data.text,
415
382
  sessionId: event.sessionId,
416
383
  });
@@ -509,11 +476,10 @@ export function buildDefaultEvents(
509
476
  const errorText = formatSlackTurnFailureMessage(event.data.message);
510
477
 
511
478
  let delivered = false;
512
- if (state.streamTs !== null && state.streamTs !== "") {
479
+ if (streaming && state.streamingUnavailable !== true) {
513
480
  ({ delivered } = await strategy.fail({
514
481
  channel,
515
482
  channelId: state.streamChannelId ?? state.channelId,
516
- streamTs: state.streamTs,
517
483
  errorText,
518
484
  sessionId: event.sessionId,
519
485
  }));
@@ -9,6 +9,7 @@ import {
9
9
  normalizeIdentity,
10
10
  } from "../../internal/continuation-identity.js";
11
11
  import { routeLocalIngressContinuation } from "../../internal/local-ingress.js";
12
+ import { steeringEnabled } from "../../internal/steering.js";
12
13
  import type {
13
14
  ArtifactsApi,
14
15
  HostContext,
@@ -16,7 +17,11 @@ import type {
16
17
  SendMessageFn,
17
18
  } from "../../types.js";
18
19
  import { buildSlackBinding, slackContinuationKey } from "./api.js";
19
- import { firstLineTitle, maybeSetThreadTitle } from "./assistant.js";
20
+ import {
21
+ firstLineTitle,
22
+ maybeSetSuggestedPrompts,
23
+ maybeSetThreadTitle,
24
+ } from "./assistant.js";
20
25
  import {
21
26
  appendSlackAttachmentAnnotations,
22
27
  prepareSlackAttachments,
@@ -33,6 +38,7 @@ import { isExternalSlackSender } from "./external-policy.js";
33
38
  import {
34
39
  formatSlackContextBlock,
35
40
  parseAppMentionEvent,
41
+ parseAssistantThreadStarted,
36
42
  parseChannelMessageEvent,
37
43
  parseDirectMessageEvent,
38
44
  parseReactionAddedEvent,
@@ -51,6 +57,7 @@ import type {
51
57
  SlackDispatchDecision,
52
58
  SlackMessage,
53
59
  SlackMessageHandler,
60
+ SlackSuggestedPrompt,
54
61
  } from "./types.js";
55
62
 
56
63
  const FOLLOWUP_TYPING = "Saw your follow-up…";
@@ -167,6 +174,12 @@ export interface SlackInboundDispatchDeps extends SlackContinuationProbes {
167
174
  * `false` to admit them (or when an upstream gate already refused them).
168
175
  */
169
176
  blockExternals?: boolean;
177
+ /**
178
+ * Suggested prompts written on `assistant_thread_started` so the
179
+ * assistant pane is not blank before the first user message.
180
+ */
181
+ suggestedPrompts?: SlackSuggestedPrompt[];
182
+ suggestedPromptsTitle?: string;
170
183
  }
171
184
 
172
185
  function triggeringMergeMessage(
@@ -529,27 +542,24 @@ export async function dispatchInboundMessage(args: {
529
542
  continuation,
530
543
  event_id: args.eventId,
531
544
  });
532
- // Queue it for mid-turn injection too. The carrier drains this at the
533
- // running turn's next tool boundary; whatever it does not reach in time
534
- // still drains into the boundary turn, deduped by sourceTs.
535
- try {
536
- await args.host.slackNudges?.append({
537
- continuationKey: continuation,
538
- sourceTs: message.ts,
539
- text: media.userText,
540
- ...(message.author?.userName === undefined
541
- ? {}
542
- : { author: message.author.userName }),
543
- });
544
- } catch (nudgeError) {
545
- log.warn("nudge append failed", {
546
- error:
547
- nudgeError instanceof Error
548
- ? nudgeError.message
549
- : String(nudgeError),
550
- continuation,
551
- event_id: args.eventId,
552
- });
545
+ if (!steeringEnabled()) {
546
+ try {
547
+ await args.host.slackNudges?.append({
548
+ continuationKey: continuation,
549
+ sourceTs: message.ts,
550
+ text: media.userText,
551
+ author: message.author?.userName,
552
+ });
553
+ } catch (nudgeError) {
554
+ log.warn("nudge append failed", {
555
+ error:
556
+ nudgeError instanceof Error
557
+ ? nudgeError.message
558
+ : String(nudgeError),
559
+ continuation,
560
+ event_id: args.eventId,
561
+ });
562
+ }
553
563
  }
554
564
  try {
555
565
  if (args.followUpStatus !== false) {
@@ -750,6 +760,30 @@ export function dispatchInboundFromEventBody(
750
760
  return true;
751
761
  }
752
762
 
763
+ const assistantThread = parseAssistantThreadStarted(body);
764
+ if (assistantThread !== null) {
765
+ const prompts = deps.suggestedPrompts ?? [];
766
+ log.info("assistant thread started", {
767
+ channel: assistantThread.channelId,
768
+ thread_ts: assistantThread.threadTs,
769
+ user: assistantThread.userId,
770
+ event_id: eventId,
771
+ });
772
+ if (prompts.length > 0) {
773
+ deps.waitUntil(
774
+ maybeSetSuggestedPrompts({
775
+ botToken: deps.credentials?.botToken,
776
+ channelId: assistantThread.channelId,
777
+ threadTs: assistantThread.threadTs,
778
+ prompts,
779
+ title: deps.suggestedPromptsTitle,
780
+ log,
781
+ })
782
+ );
783
+ }
784
+ return true;
785
+ }
786
+
753
787
  if (deps.channelWatch !== undefined) {
754
788
  // Parse keeps bot-authored posts; the watcher enforces the per-channel
755
789
  // policy (includeBotPosts, own-post loop safety) with skip logging.
@@ -121,6 +121,49 @@ export function parseAppMentionEvent(
121
121
  return delegation === undefined ? message : { ...message, delegation };
122
122
  }
123
123
 
124
+ export interface SlackAssistantThreadStarted {
125
+ channelId: string;
126
+ threadTs: string;
127
+ userId?: string;
128
+ teamId?: string;
129
+ }
130
+
131
+ /** Slack fires this when a user opens the assistant pane. No model turn. */
132
+ export function parseAssistantThreadStarted(
133
+ body: unknown
134
+ ): SlackAssistantThreadStarted | null {
135
+ const root = asRecord(body);
136
+ if (root === null || root.type !== "event_callback") {
137
+ return null;
138
+ }
139
+ const event = asRecord(root.event);
140
+ if (event === null || event.type !== "assistant_thread_started") {
141
+ return null;
142
+ }
143
+ const thread = asRecord(event.assistant_thread);
144
+ if (thread === null) {
145
+ return null;
146
+ }
147
+ const channelId = asString(thread.channel_id);
148
+ const threadTs = asString(thread.thread_ts);
149
+ if (
150
+ channelId === undefined ||
151
+ channelId === "" ||
152
+ threadTs === undefined ||
153
+ threadTs === ""
154
+ ) {
155
+ return null;
156
+ }
157
+ const userId = asString(thread.user_id);
158
+ const teamId = asString(root.team_id) ?? asString(event.team_id);
159
+ return {
160
+ channelId,
161
+ threadTs,
162
+ userId: userId === undefined || userId === "" ? undefined : userId,
163
+ teamId: teamId === undefined || teamId === "" ? undefined : teamId,
164
+ };
165
+ }
166
+
124
167
  /**
125
168
  * Parse DM / IM messages. More generous than a strict channel_type check:
126
169
  * accepts `channel_type === "im"` or channel ids starting with `D`, and