@cursor/july 0.1.96 → 0.1.97

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 (321) hide show
  1. package/README.md +3 -2
  2. package/dist/bin/agent-serve.js +14 -3
  3. package/dist/channels/origin/api.d.ts +15 -4
  4. package/dist/channels/origin/api.d.ts.map +1 -1
  5. package/dist/channels/origin/api.js +19 -3
  6. package/dist/channels/origin/binding.d.ts +11 -0
  7. package/dist/channels/origin/binding.d.ts.map +1 -1
  8. package/dist/channels/origin/binding.js +41 -25
  9. package/dist/channels/origin/index.d.ts +1 -0
  10. package/dist/channels/origin/index.d.ts.map +1 -1
  11. package/dist/channels/origin/index.js +1 -0
  12. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  13. package/dist/channels/origin/origin-channel.js +3 -0
  14. package/dist/channels/origin/reactions.d.ts +56 -0
  15. package/dist/channels/origin/reactions.d.ts.map +1 -0
  16. package/dist/channels/origin/reactions.js +67 -0
  17. package/dist/channels/origin/types.d.ts +11 -0
  18. package/dist/channels/origin/types.d.ts.map +1 -1
  19. package/dist/channels/slack/approvals.d.ts +16 -0
  20. package/dist/channels/slack/approvals.d.ts.map +1 -1
  21. package/dist/channels/slack/approvals.js +86 -0
  22. package/dist/channels/slack/cli-project.d.ts +19 -0
  23. package/dist/channels/slack/cli-project.d.ts.map +1 -0
  24. package/dist/channels/slack/cli-project.js +234 -0
  25. package/dist/channels/slack/defaults.d.ts.map +1 -1
  26. package/dist/channels/slack/defaults.js +97 -39
  27. package/dist/channels/slack/init.d.ts +3 -2
  28. package/dist/channels/slack/init.d.ts.map +1 -1
  29. package/dist/channels/slack/init.js +5 -5
  30. package/dist/channels/slack/interactive.d.ts +2 -1
  31. package/dist/channels/slack/interactive.d.ts.map +1 -1
  32. package/dist/channels/slack/interactive.js +15 -4
  33. package/dist/channels/slack/manifest.d.ts +1 -1
  34. package/dist/channels/slack/manifest.js +1 -1
  35. package/dist/channels/slack/setup.d.ts +1 -1
  36. package/dist/channels/slack/setup.d.ts.map +1 -1
  37. package/dist/channels/slack/setup.js +10 -6
  38. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  39. package/dist/channels/slack/slack-channel.js +1 -0
  40. package/dist/channels/slack/tool-approval-events.d.ts.map +1 -1
  41. package/dist/channels/slack/tool-approval-events.js +91 -1
  42. package/dist/docs/404.html +2 -2
  43. package/dist/docs/ab.html +4 -4
  44. package/dist/docs/assets/{app.jXleCmOc.js → app.B3rWNYE1.js} +1 -1
  45. package/dist/docs/assets/chunks/@localSearchIndexroot.BU9nHdnQ.js +1 -0
  46. package/dist/docs/assets/chunks/{VPLocalSearchBox.8LhyglIT.js → VPLocalSearchBox.C1lhqJJR.js} +1 -1
  47. package/dist/docs/assets/chunks/{theme.9ged-pr2.js → theme.B40_SXuv.js} +2 -2
  48. package/dist/docs/assets/{deployment.md.D9msOFOW.js → deployment.md.MFPKqsqI.js} +2 -2
  49. package/dist/docs/assets/{guides_mcp-oauth.md.DPYmBCbV.js → guides_mcp-oauth.md.CN-6YmTJ.js} +4 -4
  50. package/dist/docs/assets/{guides_mcp-oauth.md.DPYmBCbV.lean.js → guides_mcp-oauth.md.CN-6YmTJ.lean.js} +1 -1
  51. package/dist/docs/assets/guides_slack.md.VDXQV3ja.js +22 -0
  52. package/dist/docs/assets/guides_slack.md.VDXQV3ja.lean.js +1 -0
  53. package/dist/docs/assets/index.md.CVeRUOeZ.js +5 -0
  54. package/dist/docs/assets/{reference_agent-config.md.Cp_x38Nl.js → reference_agent-config.md.BHeYMgme.js} +1 -1
  55. package/dist/docs/assets/{reference_cli.md.CCnG-nJx.js → reference_cli.md.RyZf5OTE.js} +9 -6
  56. package/dist/docs/assets/{reference_cli.md.CCnG-nJx.lean.js → reference_cli.md.RyZf5OTE.lean.js} +1 -1
  57. package/dist/docs/assets/{reference_connections.md.BH8Oc0D0.js → reference_connections.md.DxldvyIB.js} +4 -3
  58. package/dist/docs/assets/{reference_http-api.md.D89k1mdm.js → reference_http-api.md.5zOAbV86.js} +1 -1
  59. package/dist/docs/assets/reference_sessions.md.NxFP_CAC.js +1 -0
  60. package/dist/docs/assets/{reference_tools.md.BHeXn2id.js → reference_tools.md.B84gw9Ii.js} +1 -1
  61. package/dist/docs/assets/templates_agents-md.md.CXSMZljE.js +2 -0
  62. package/dist/docs/assets/templates_agents-md.md.CXSMZljE.lean.js +1 -0
  63. package/dist/docs/assets/troubleshooting.md.DCiPBhYs.js +1 -0
  64. package/dist/docs/building-with-agents.html +4 -4
  65. package/dist/docs/concepts.html +4 -4
  66. package/dist/docs/deployment.html +7 -7
  67. package/dist/docs/deployment.md +5 -4
  68. package/dist/docs/evals.html +4 -4
  69. package/dist/docs/guides/agent-to-agent.html +4 -4
  70. package/dist/docs/guides/cloud-runtime.html +4 -4
  71. package/dist/docs/guides/convert-automation.html +4 -4
  72. package/dist/docs/guides/github.html +4 -4
  73. package/dist/docs/guides/human-in-the-loop.html +4 -4
  74. package/dist/docs/guides/mcp-oauth.html +8 -8
  75. package/dist/docs/guides/mcp-oauth.md +26 -8
  76. package/dist/docs/guides/opentelemetry.html +4 -4
  77. package/dist/docs/guides/slack.html +17 -33
  78. package/dist/docs/guides/slack.md +92 -201
  79. package/dist/docs/guides/webhooks.html +4 -4
  80. package/dist/docs/hashmap.json +1 -1
  81. package/dist/docs/hillclimbing.html +4 -4
  82. package/dist/docs/index.html +6 -6
  83. package/dist/docs/index.md +5 -3
  84. package/dist/docs/llms-full.txt +299 -653
  85. package/dist/docs/llms.txt +2 -2
  86. package/dist/docs/quickstart.html +4 -4
  87. package/dist/docs/reference/agent-config.html +6 -6
  88. package/dist/docs/reference/agent-config.md +2 -2
  89. package/dist/docs/reference/artifacts.html +4 -4
  90. package/dist/docs/reference/channels.html +4 -4
  91. package/dist/docs/reference/cli.html +13 -10
  92. package/dist/docs/reference/cli.md +38 -16
  93. package/dist/docs/reference/connections.html +9 -8
  94. package/dist/docs/reference/connections.md +6 -3
  95. package/dist/docs/reference/hooks.html +4 -4
  96. package/dist/docs/reference/http-api.html +6 -6
  97. package/dist/docs/reference/http-api.md +2 -1
  98. package/dist/docs/reference/instructions.html +4 -4
  99. package/dist/docs/reference/playground.html +4 -4
  100. package/dist/docs/reference/project-layout.html +4 -4
  101. package/dist/docs/reference/prompt.html +4 -4
  102. package/dist/docs/reference/schedules.html +4 -4
  103. package/dist/docs/reference/sessions.html +5 -5
  104. package/dist/docs/reference/sessions.md +4 -2
  105. package/dist/docs/reference/skills.html +4 -4
  106. package/dist/docs/reference/subagents.html +4 -4
  107. package/dist/docs/reference/tools.html +6 -6
  108. package/dist/docs/reference/tools.md +9 -2
  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 +4 -4
  112. package/dist/docs/templates/agents-md.html +28 -0
  113. package/dist/docs/templates/agents-md.md +105 -0
  114. package/dist/docs/templates/code-wiki.html +5 -5
  115. package/dist/docs/templates/demo.html +4 -4
  116. package/dist/docs/templates/pr-autofixer.html +4 -4
  117. package/dist/docs/templates/security-help.html +4 -4
  118. package/dist/docs/templates/security-reviewer.html +5 -5
  119. package/dist/docs/templates/triage.html +4 -4
  120. package/dist/docs/troubleshooting.html +5 -5
  121. package/dist/docs/troubleshooting.md +2 -2
  122. package/dist/evals/run-facts.d.ts.map +1 -1
  123. package/dist/evals/run-facts.js +27 -0
  124. package/dist/internal/advertise-tools.d.ts.map +1 -1
  125. package/dist/internal/advertise-tools.js +15 -9
  126. package/dist/internal/approval-gate.d.ts +12 -13
  127. package/dist/internal/approval-gate.d.ts.map +1 -1
  128. package/dist/internal/approval-gate.js +16 -21
  129. package/dist/internal/chat-client.js +10 -0
  130. package/dist/internal/cli-deploy.d.ts +5 -0
  131. package/dist/internal/cli-deploy.d.ts.map +1 -1
  132. package/dist/internal/cli-deploy.js +50 -17
  133. package/dist/internal/cli-mcp-oauth.js +8 -18
  134. package/dist/internal/cli-slack-manual.d.ts +24 -2
  135. package/dist/internal/cli-slack-manual.d.ts.map +1 -1
  136. package/dist/internal/cli-slack-manual.js +251 -20
  137. package/dist/internal/cli-slack.d.ts +9 -2
  138. package/dist/internal/cli-slack.d.ts.map +1 -1
  139. package/dist/internal/cli-slack.js +29 -82
  140. package/dist/internal/cursor/account-mcp.d.ts +1 -0
  141. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  142. package/dist/internal/cursor/account-mcp.js +17 -0
  143. package/dist/internal/cursor-agent-template.d.ts +1 -1
  144. package/dist/internal/cursor-agent-template.d.ts.map +1 -1
  145. package/dist/internal/cursor-agent-template.js +1 -0
  146. package/dist/internal/deploy-client.d.ts +17 -0
  147. package/dist/internal/deploy-client.d.ts.map +1 -1
  148. package/dist/internal/deploy-client.js +31 -10
  149. package/dist/internal/env-file.d.ts +19 -0
  150. package/dist/internal/env-file.d.ts.map +1 -0
  151. package/dist/internal/env-file.js +90 -0
  152. package/dist/internal/framework-file-storage.d.ts +1 -1
  153. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  154. package/dist/internal/framework-file-storage.js +6 -0
  155. package/dist/internal/hosted-delivery-protocol.d.ts +7 -0
  156. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  157. package/dist/internal/hosted-delivery-protocol.js +7 -0
  158. package/dist/internal/hosted-delivery.d.ts +6 -0
  159. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  160. package/dist/internal/hosted-delivery.js +63 -22
  161. package/dist/internal/hosted-execution-diag.d.ts +48 -0
  162. package/dist/internal/hosted-execution-diag.d.ts.map +1 -0
  163. package/dist/internal/hosted-execution-diag.js +150 -0
  164. package/dist/internal/http-channel.d.ts.map +1 -1
  165. package/dist/internal/http-channel.js +81 -1
  166. package/dist/internal/init-project.d.ts.map +1 -1
  167. package/dist/internal/init-project.js +2 -0
  168. package/dist/internal/logs-client.d.ts +5 -0
  169. package/dist/internal/logs-client.d.ts.map +1 -1
  170. package/dist/internal/logs-client.js +5 -0
  171. package/dist/internal/mcp-endpoint.js +2 -3
  172. package/dist/internal/mcp-host.d.ts +10 -0
  173. package/dist/internal/mcp-host.d.ts.map +1 -1
  174. package/dist/internal/mcp-host.js +57 -8
  175. package/dist/internal/mcp-oauth-on-demand.d.ts +68 -0
  176. package/dist/internal/mcp-oauth-on-demand.d.ts.map +1 -0
  177. package/dist/internal/mcp-oauth-on-demand.js +287 -0
  178. package/dist/internal/mcp-oauth-persist.d.ts +42 -0
  179. package/dist/internal/mcp-oauth-persist.d.ts.map +1 -0
  180. package/dist/internal/mcp-oauth-persist.js +92 -0
  181. package/dist/internal/mcp-oauth.d.ts +1 -0
  182. package/dist/internal/mcp-oauth.d.ts.map +1 -1
  183. package/dist/internal/mcp-oauth.js +10 -2
  184. package/dist/internal/otel/collector.d.ts.map +1 -1
  185. package/dist/internal/otel/collector.js +22 -9
  186. package/dist/internal/server.d.ts +3 -0
  187. package/dist/internal/server.d.ts.map +1 -1
  188. package/dist/internal/server.js +49 -22
  189. package/dist/internal/session-engine.d.ts +88 -3
  190. package/dist/internal/session-engine.d.ts.map +1 -1
  191. package/dist/internal/session-engine.js +515 -43
  192. package/dist/internal/sessions-client.d.ts +9 -7
  193. package/dist/internal/sessions-client.d.ts.map +1 -1
  194. package/dist/internal/sessions-client.js +3 -1
  195. package/dist/internal/storage-coordinator.d.ts +7 -0
  196. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  197. package/dist/internal/storage-coordinator.js +28 -5
  198. package/dist/internal/storage-roles.d.ts +5 -0
  199. package/dist/internal/storage-roles.d.ts.map +1 -1
  200. package/dist/internal/stream-progress.d.ts.map +1 -1
  201. package/dist/internal/stream-progress.js +10 -0
  202. package/dist/internal/tool-policy.d.ts +9 -1
  203. package/dist/internal/tool-policy.d.ts.map +1 -1
  204. package/dist/internal/tool-policy.js +13 -0
  205. package/dist/internal/trajectory.d.ts.map +1 -1
  206. package/dist/internal/trajectory.js +10 -0
  207. package/dist/internal/turn-outbox.d.ts +24 -0
  208. package/dist/internal/turn-outbox.d.ts.map +1 -0
  209. package/dist/internal/turn-outbox.js +80 -0
  210. package/dist/playground/assets/{index-Cx9CclK_.js → index-DrkI6y5O.js} +45 -45
  211. package/dist/playground/assets/index-DzNGwm7q.css +1 -0
  212. package/dist/playground/index.html +2 -2
  213. package/dist/storage-backends/cursor-hosted.d.ts +1 -1
  214. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  215. package/dist/storage-backends/cursor-hosted.js +12 -0
  216. package/dist/storage.d.ts +8 -0
  217. package/dist/storage.d.ts.map +1 -1
  218. package/dist/types.d.ts +63 -7
  219. package/dist/types.d.ts.map +1 -1
  220. package/docs/README.md +5 -3
  221. package/docs/deployment.md +5 -4
  222. package/docs/guides/mcp-oauth.md +26 -8
  223. package/docs/guides/slack.md +93 -202
  224. package/docs/reference/agent-config.md +2 -2
  225. package/docs/reference/cli.md +38 -16
  226. package/docs/reference/connections.md +6 -3
  227. package/docs/reference/http-api.md +2 -1
  228. package/docs/reference/sessions.md +4 -2
  229. package/docs/reference/tools.md +9 -2
  230. package/docs/templates/agents-md.md +110 -0
  231. package/docs/troubleshooting.md +2 -2
  232. package/package.json +1 -1
  233. package/skills/create-agent/SKILL.md +2 -1
  234. package/skills/mcp-auth/SKILL.md +6 -3
  235. package/skills/setup-slack/SKILL.md +23 -13
  236. package/src/bin/agent-serve.ts +13 -1
  237. package/src/channels/origin/api.ts +24 -5
  238. package/src/channels/origin/binding.ts +55 -26
  239. package/src/channels/origin/index.ts +1 -0
  240. package/src/channels/origin/origin-channel.ts +4 -0
  241. package/src/channels/origin/reactions.ts +82 -0
  242. package/src/channels/origin/types.ts +11 -0
  243. package/src/channels/slack/approvals.ts +105 -0
  244. package/src/channels/slack/cli-project.ts +267 -0
  245. package/src/channels/slack/defaults.ts +109 -46
  246. package/src/channels/slack/init.ts +10 -5
  247. package/src/channels/slack/interactive.ts +35 -9
  248. package/src/channels/slack/manifest.ts +1 -1
  249. package/src/channels/slack/setup.ts +10 -6
  250. package/src/channels/slack/slack-channel.ts +1 -0
  251. package/src/channels/slack/tool-approval-events.ts +93 -0
  252. package/src/evals/run-facts.ts +32 -0
  253. package/src/internal/advertise-tools.ts +31 -10
  254. package/src/internal/approval-gate.ts +20 -29
  255. package/src/internal/chat-client.ts +19 -0
  256. package/src/internal/cli-deploy.ts +79 -9
  257. package/src/internal/cli-mcp-oauth.ts +7 -21
  258. package/src/internal/cli-slack-manual.ts +350 -18
  259. package/src/internal/cli-slack.ts +40 -84
  260. package/src/internal/cursor/account-mcp.ts +21 -0
  261. package/src/internal/cursor-agent-template.ts +1 -0
  262. package/src/internal/deploy-client.ts +43 -0
  263. package/src/internal/env-file.ts +84 -0
  264. package/src/internal/framework-file-storage.ts +7 -1
  265. package/src/internal/hosted-delivery-protocol.ts +7 -0
  266. package/src/internal/hosted-delivery.ts +100 -27
  267. package/src/internal/hosted-execution-diag.ts +207 -0
  268. package/src/internal/http-channel.ts +99 -0
  269. package/src/internal/init-project.ts +2 -0
  270. package/src/internal/logs-client.ts +5 -0
  271. package/src/internal/mcp-endpoint.ts +13 -4
  272. package/src/internal/mcp-host.ts +77 -11
  273. package/src/internal/mcp-oauth-on-demand.ts +352 -0
  274. package/src/internal/mcp-oauth-persist.ts +127 -0
  275. package/src/internal/mcp-oauth.ts +17 -1
  276. package/src/internal/otel/collector.ts +30 -0
  277. package/src/internal/server.ts +59 -9
  278. package/src/internal/session-engine.ts +659 -56
  279. package/src/internal/sessions-client.ts +17 -8
  280. package/src/internal/storage-coordinator.ts +38 -8
  281. package/src/internal/storage-roles.ts +7 -0
  282. package/src/internal/stream-progress.ts +19 -0
  283. package/src/internal/tool-policy.ts +18 -0
  284. package/src/internal/trajectory.ts +10 -0
  285. package/src/internal/turn-outbox.ts +85 -0
  286. package/src/storage-backends/cursor-hosted.ts +13 -1
  287. package/src/storage.ts +12 -0
  288. package/src/types.ts +68 -8
  289. package/templates/agents-md/README.md +39 -0
  290. package/templates/agents-md/agent/agent.ts +8 -0
  291. package/templates/agents-md/agent/channels/github.ts +10 -0
  292. package/templates/agents-md/agent/channels/queue.ts +28 -0
  293. package/templates/agents-md/agent/channels/slack.ts +9 -0
  294. package/templates/agents-md/agent/instructions.md +39 -0
  295. package/templates/agents-md/agent/lib/collect.ts +439 -0
  296. package/templates/agents-md/agent/lib/config.ts +8 -0
  297. package/templates/agents-md/agent/lib/paths.ts +51 -0
  298. package/templates/agents-md/agent/schedules/weekly.ts +17 -0
  299. package/templates/agents-md/agent/tools/apply_agents.ts +226 -0
  300. package/templates/agents-md/evals/agents.eval.ts +135 -0
  301. package/templates/agents-md/evals/evals.config.ts +5 -0
  302. package/templates/agents-md/init.json +38 -0
  303. package/templates/agents-md/package.json +18 -0
  304. package/templates/agents-md/tsconfig.json +12 -0
  305. package/dist/docs/assets/chunks/@localSearchIndexroot.DFoGuETX.js +0 -1
  306. package/dist/docs/assets/guides_slack.md.C32HsdKk.js +0 -38
  307. package/dist/docs/assets/guides_slack.md.C32HsdKk.lean.js +0 -1
  308. package/dist/docs/assets/index.md.CI93Ltlb.js +0 -5
  309. package/dist/docs/assets/reference_sessions.md.D0mIh4KK.js +0 -1
  310. package/dist/docs/assets/troubleshooting.md.Ctv3T8C2.js +0 -1
  311. package/dist/docs/design/agsh.md +0 -406
  312. package/dist/playground/assets/index-B1DDvBeC.css +0 -1
  313. package/docs/design/agsh.md +0 -406
  314. /package/dist/docs/assets/{deployment.md.D9msOFOW.lean.js → deployment.md.MFPKqsqI.lean.js} +0 -0
  315. /package/dist/docs/assets/{index.md.CI93Ltlb.lean.js → index.md.CVeRUOeZ.lean.js} +0 -0
  316. /package/dist/docs/assets/{reference_agent-config.md.Cp_x38Nl.lean.js → reference_agent-config.md.BHeYMgme.lean.js} +0 -0
  317. /package/dist/docs/assets/{reference_connections.md.BH8Oc0D0.lean.js → reference_connections.md.DxldvyIB.lean.js} +0 -0
  318. /package/dist/docs/assets/{reference_http-api.md.D89k1mdm.lean.js → reference_http-api.md.5zOAbV86.lean.js} +0 -0
  319. /package/dist/docs/assets/{reference_sessions.md.D0mIh4KK.lean.js → reference_sessions.md.NxFP_CAC.lean.js} +0 -0
  320. /package/dist/docs/assets/{reference_tools.md.BHeXn2id.lean.js → reference_tools.md.B84gw9Ii.lean.js} +0 -0
  321. /package/dist/docs/assets/{troubleshooting.md.Ctv3T8C2.lean.js → troubleshooting.md.DCiPBhYs.lean.js} +0 -0
@@ -3,6 +3,8 @@
3
3
  */
4
4
  export const SLACK_APPROVE_ACTION_ID = "agent_serve_approve";
5
5
  export const SLACK_DENY_ACTION_ID = "agent_serve_deny";
6
+ export const SLACK_AUTH_CONNECTED_ACTION_ID = "agent_serve_auth_connected";
7
+ export const SLACK_AUTH_CANCEL_ACTION_ID = "agent_serve_auth_cancel";
6
8
  export function encodeApprovalActionValue(payload) {
7
9
  return JSON.stringify(payload);
8
10
  }
@@ -35,6 +37,24 @@ export function decisionFromActionId(actionId) {
35
37
  }
36
38
  return null;
37
39
  }
40
+ export function decisionFromAuthActionId(actionId) {
41
+ if (actionId === SLACK_AUTH_CONNECTED_ACTION_ID) {
42
+ return "approve";
43
+ }
44
+ if (actionId === SLACK_AUTH_CANCEL_ACTION_ID) {
45
+ return "deny";
46
+ }
47
+ return null;
48
+ }
49
+ export function authThreadStatus(connection) {
50
+ const prefix = "Waiting for ";
51
+ const suffix = " auth…";
52
+ const budget = 50 - prefix.length - suffix.length;
53
+ const name = connection.length <= budget
54
+ ? connection
55
+ : `${connection.slice(0, Math.max(0, budget - 1))}…`;
56
+ return `${prefix}${name}${suffix}`;
57
+ }
38
58
  const REDACTED = "[REDACTED]";
39
59
  const SENSITIVE_KEY = /(?:pass(?:word|wd)?|secret|token|api[_-]?key|authorization|credential|private[_-]?key|access[_-]?key)/i;
40
60
  /** Strip likely secrets before args are shown in Slack cards. */
@@ -140,6 +160,72 @@ export function buildApprovalBlocks(args) {
140
160
  },
141
161
  ];
142
162
  }
163
+ export function buildAuthBlocks(args) {
164
+ const value = encodeApprovalActionValue({
165
+ sessionId: args.sessionId,
166
+ callId: args.callId,
167
+ });
168
+ const label = args.connection.length > 20
169
+ ? `Authorize ${args.connection.slice(0, 17)}…`
170
+ : `Authorize ${args.connection}`;
171
+ return [
172
+ {
173
+ type: "header",
174
+ text: {
175
+ type: "plain_text",
176
+ text: "MCP authorization needed",
177
+ emoji: true,
178
+ },
179
+ },
180
+ {
181
+ type: "section",
182
+ text: {
183
+ type: "mrkdwn",
184
+ text: `Connect \`${args.connection}\` so \`${args.toolName}\` can continue.`,
185
+ },
186
+ },
187
+ {
188
+ type: "actions",
189
+ block_id: `auth_${args.callId}`.slice(0, 255),
190
+ elements: [
191
+ {
192
+ type: "button",
193
+ text: { type: "plain_text", text: label, emoji: true },
194
+ url: args.authUrl,
195
+ },
196
+ {
197
+ type: "button",
198
+ action_id: SLACK_AUTH_CONNECTED_ACTION_ID,
199
+ text: { type: "plain_text", text: "Connected", emoji: true },
200
+ style: "primary",
201
+ value,
202
+ },
203
+ {
204
+ type: "button",
205
+ action_id: SLACK_AUTH_CANCEL_ACTION_ID,
206
+ text: { type: "plain_text", text: "Cancel", emoji: true },
207
+ style: "danger",
208
+ value,
209
+ },
210
+ ],
211
+ },
212
+ ];
213
+ }
214
+ export function buildResolvedAuthBlocks(args) {
215
+ const verb = args.decision === "approve" ? "Connected" : "Cancelled";
216
+ const by = args.byUserId === undefined || args.byUserId === ""
217
+ ? ""
218
+ : ` by <@${args.byUserId}>`;
219
+ return [
220
+ {
221
+ type: "section",
222
+ text: {
223
+ type: "mrkdwn",
224
+ text: `*${verb}*${by} — \`${args.connection}\``,
225
+ },
226
+ },
227
+ ];
228
+ }
143
229
  export function buildResolvedApprovalBlocks(args) {
144
230
  const verb = args.decision === "approve" ? "Approved" : "Denied";
145
231
  const by = args.byUserId === undefined || args.byUserId === ""
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Official Slack CLI project files for `slack init --manual`.
3
+ *
4
+ * `.slack/` is the committed Slack CLI project: hook, manifests, hooks.json.
5
+ * Agent SDK serve owns the socket; do not `slack deploy` / `slack run`.
6
+ */
7
+ export declare const SLACK_CLI_HOME_BIN = ".slack/bin/slack";
8
+ export declare const SLACK_CLI_GET_MANIFEST = "node .slack/get-manifest.mjs";
9
+ export type SlackCliEnvironment = "local" | "deployed";
10
+ /** Official Slack CLI, if present. `SLACK_CLI` overrides. */
11
+ export declare function detectSlackCli(env?: NodeJS.ProcessEnv): string | undefined;
12
+ /** Hook + manifests under `.slack/`. Merge hooks.json; keep existing config. */
13
+ export declare function writeSlackCliProject(rootDir: string, manifests: ReadonlyArray<{
14
+ name: string;
15
+ contents: string;
16
+ }>): Promise<string[]>;
17
+ export declare function parseSlackAuthTeams(text: string): string[];
18
+ export declare function readSlackCliAppId(dir: string, environment: SlackCliEnvironment, team?: string): Promise<string | undefined>;
19
+ //# sourceMappingURL=cli-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-project.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/cli-project.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AAErD,eAAO,MAAM,sBAAsB,iCAAiC,CAAC;AAErE,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,UAAU,CAAC;AAkCvD,6DAA6D;AAC7D,wBAAgB,cAAc,CAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAQpB;AAED,gFAAgF;AAChF,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAC3D,OAAO,CAAC,MAAM,EAAE,CAAC,CAmCnB;AAkFD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAS1D;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,mBAAmB,EAChC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAS7B"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Official Slack CLI project files for `slack init --manual`.
3
+ *
4
+ * `.slack/` is the committed Slack CLI project: hook, manifests, hooks.json.
5
+ * Agent SDK serve owns the socket; do not `slack deploy` / `slack run`.
6
+ */
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ import { randomUUID } from "node:crypto";
17
+ import { existsSync } from "node:fs";
18
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
19
+ import { homedir } from "node:os";
20
+ import { join } from "node:path";
21
+ export const SLACK_CLI_HOME_BIN = ".slack/bin/slack";
22
+ export const SLACK_CLI_GET_MANIFEST = "node .slack/get-manifest.mjs";
23
+ const TEAM_ID_RE = /\(Team ID: ([TE][A-Z0-9]+)\)/g;
24
+ const GET_MANIFEST_JS = `import { readFileSync } from "node:fs";
25
+ import { dirname, join } from "node:path";
26
+ import { fileURLToPath } from "node:url";
27
+
28
+ const here = dirname(fileURLToPath(import.meta.url));
29
+
30
+ function target() {
31
+ const env = process.env.SLACK_ENV ?? process.env.SLACK_APP_ENVIRONMENT;
32
+ if (env === "deployed" || env === "prod") return "manifest.prod.json";
33
+ if (env === "local" || env === "dev") return "manifest.dev.json";
34
+ try {
35
+ const raw = readFileSync(join(here, "cli-environment"), "utf8").trim();
36
+ if (raw === "deployed" || raw === "prod") return "manifest.prod.json";
37
+ } catch {
38
+ // default local
39
+ }
40
+ return "manifest.dev.json";
41
+ }
42
+
43
+ process.stdout.write(readFileSync(join(here, target()), "utf8"));
44
+ `;
45
+ function isEnoent(error) {
46
+ return (error instanceof Error &&
47
+ "code" in error &&
48
+ error.code === "ENOENT");
49
+ }
50
+ /** Official Slack CLI, if present. `SLACK_CLI` overrides. */
51
+ export function detectSlackCli(env = process.env) {
52
+ var _a, _b;
53
+ const override = env.SLACK_CLI;
54
+ if (override !== undefined && override !== "") {
55
+ return override;
56
+ }
57
+ const home = (_b = (_a = env.HOME) !== null && _a !== void 0 ? _a : env.USERPROFILE) !== null && _b !== void 0 ? _b : homedir();
58
+ const homeBin = join(home, SLACK_CLI_HOME_BIN);
59
+ return existsSync(homeBin) ? homeBin : undefined;
60
+ }
61
+ /** Hook + manifests under `.slack/`. Merge hooks.json; keep existing config. */
62
+ export function writeSlackCliProject(rootDir, manifests) {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ const slackDir = join(rootDir, ".slack");
65
+ yield mkdir(slackDir, { recursive: true });
66
+ const created = [];
67
+ yield writeFile(join(slackDir, "get-manifest.mjs"), GET_MANIFEST_JS);
68
+ created.push(".slack/get-manifest.mjs");
69
+ for (const file of manifests) {
70
+ yield writeFile(join(slackDir, file.name), file.contents);
71
+ created.push(`.slack/${file.name}`);
72
+ }
73
+ if (yield upsertGetManifestHook(slackDir)) {
74
+ created.push(".slack/hooks.json");
75
+ }
76
+ if (yield writeIfMissing(join(slackDir, "config.json"), `${JSON.stringify({
77
+ manifest: { source: "local" },
78
+ project_id: randomUUID(),
79
+ }, null, 2)}\n`)) {
80
+ created.push(".slack/config.json");
81
+ }
82
+ if (yield mergeGitignore(join(slackDir, ".gitignore"))) {
83
+ created.push(".slack/.gitignore");
84
+ }
85
+ return created;
86
+ });
87
+ }
88
+ function upsertGetManifestHook(slackDir) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ var _a;
91
+ const path = join(slackDir, "hooks.json");
92
+ let existing;
93
+ try {
94
+ const parsed = JSON.parse(yield readFile(path, "utf8"));
95
+ if (parsed === null ||
96
+ typeof parsed !== "object" ||
97
+ Array.isArray(parsed)) {
98
+ throw new Error(".slack/hooks.json is not a JSON object");
99
+ }
100
+ existing = parsed;
101
+ }
102
+ catch (error) {
103
+ if (!isEnoent(error)) {
104
+ throw error;
105
+ }
106
+ yield writeFile(path, `${JSON.stringify({ hooks: { "get-manifest": SLACK_CLI_GET_MANIFEST } }, null, 2)}\n`);
107
+ return true;
108
+ }
109
+ const hooks = (_a = existing.hooks) !== null && _a !== void 0 ? _a : {};
110
+ if (hooks["get-manifest"] === SLACK_CLI_GET_MANIFEST) {
111
+ return false;
112
+ }
113
+ hooks["get-manifest"] = SLACK_CLI_GET_MANIFEST;
114
+ existing.hooks = hooks;
115
+ yield writeFile(path, `${JSON.stringify(existing, null, 2)}\n`);
116
+ return true;
117
+ });
118
+ }
119
+ function writeIfMissing(path, contents) {
120
+ return __awaiter(this, void 0, void 0, function* () {
121
+ try {
122
+ yield writeFile(path, contents, { flag: "wx" });
123
+ return true;
124
+ }
125
+ catch (error) {
126
+ if (error instanceof Error &&
127
+ "code" in error &&
128
+ error.code === "EEXIST") {
129
+ return false;
130
+ }
131
+ throw error;
132
+ }
133
+ });
134
+ }
135
+ function mergeGitignore(path) {
136
+ return __awaiter(this, void 0, void 0, function* () {
137
+ const lines = ["apps.dev.json", "cache/", "cli-environment"];
138
+ let existing = "";
139
+ try {
140
+ existing = yield readFile(path, "utf8");
141
+ }
142
+ catch (error) {
143
+ if (!isEnoent(error)) {
144
+ throw error;
145
+ }
146
+ yield writeFile(path, `${lines.join("\n")}\n`);
147
+ return true;
148
+ }
149
+ const have = new Set(existing
150
+ .split(/\r?\n/)
151
+ .map((line) => line.trim())
152
+ .filter((line) => line !== ""));
153
+ const missing = lines.filter((line) => !have.has(line));
154
+ if (missing.length === 0) {
155
+ return false;
156
+ }
157
+ const prefix = existing === "" || existing.endsWith("\n") ? existing : `${existing}\n`;
158
+ yield writeFile(path, `${prefix}${missing.join("\n")}\n`);
159
+ return true;
160
+ });
161
+ }
162
+ export function parseSlackAuthTeams(text) {
163
+ const ids = [];
164
+ for (const match of text.matchAll(TEAM_ID_RE)) {
165
+ const id = match[1];
166
+ if (id !== undefined && !ids.includes(id)) {
167
+ ids.push(id);
168
+ }
169
+ }
170
+ return ids;
171
+ }
172
+ export function readSlackCliAppId(dir, environment, team) {
173
+ return __awaiter(this, void 0, void 0, function* () {
174
+ const apps = yield loadAppMap(dir, environment);
175
+ if (apps === undefined) {
176
+ return undefined;
177
+ }
178
+ if (team !== undefined) {
179
+ return appIdOf(apps[team]);
180
+ }
181
+ return firstAppId(apps);
182
+ });
183
+ }
184
+ function loadAppMap(dir, environment) {
185
+ return __awaiter(this, void 0, void 0, function* () {
186
+ if (environment === "local") {
187
+ return readJson(join(dir, ".slack/apps.dev.json"));
188
+ }
189
+ const deployed = yield readJson(join(dir, ".slack/apps.json"));
190
+ if (deployed === undefined) {
191
+ return undefined;
192
+ }
193
+ const apps = deployed.apps;
194
+ if (apps !== undefined && typeof apps === "object" && apps !== null) {
195
+ return apps;
196
+ }
197
+ return deployed;
198
+ });
199
+ }
200
+ function firstAppId(value) {
201
+ for (const entry of Object.values(value)) {
202
+ const id = appIdOf(entry);
203
+ if (id !== undefined) {
204
+ return id;
205
+ }
206
+ }
207
+ return undefined;
208
+ }
209
+ function appIdOf(entry) {
210
+ if (entry === undefined || entry === null || typeof entry !== "object") {
211
+ return undefined;
212
+ }
213
+ const appId = entry.app_id;
214
+ if (typeof appId === "string" && appId.startsWith("A")) {
215
+ return appId;
216
+ }
217
+ return undefined;
218
+ }
219
+ function readJson(path) {
220
+ return __awaiter(this, void 0, void 0, function* () {
221
+ try {
222
+ const parsed = JSON.parse(yield readFile(path, "utf8"));
223
+ if (parsed === null ||
224
+ typeof parsed !== "object" ||
225
+ Array.isArray(parsed)) {
226
+ return undefined;
227
+ }
228
+ return parsed;
229
+ }
230
+ catch (_a) {
231
+ return undefined;
232
+ }
233
+ });
234
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAe3D,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAMpB,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACpC,cAAc,CAEhB;AAED,qCAAqC;AACrC,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACpC,OAAO,CAET;AAED,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAS7E;AA0BD,6EAA6E;AAC7E,wBAAgB,sBAAsB,CACpC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,EACnC,MAAM,CAAC,EAAE,iBAAiB,GACzB,mBAAmB,CAQrB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,EACnC,MAAM,CAAC,EAAE,iBAAiB,GACzB,mBAAmB,CAWrB;AAED,eAAO,MAAM,mBAAmB,EAAE,mBACR,CAAC;AAC3B,eAAO,MAAM,sBAAsB,EAAE,mBACX,CAAC;AAC3B,eAAO,MAAM,oBAAoB,EAAE,mBACL,CAAC;AAE/B,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mEAAmE;IACnE,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,QAAQ,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,oBAAoB,CAAC,iBAAiB,CAAC,CA4WzC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAuB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAehF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAMpB,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACpC,cAAc,CAEhB;AAED,qCAAqC;AACrC,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACpC,OAAO,CAET;AAED,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAS7E;AA0BD,6EAA6E;AAC7E,wBAAgB,sBAAsB,CACpC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,EACnC,MAAM,CAAC,EAAE,iBAAiB,GACzB,mBAAmB,CAQrB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,EACnC,MAAM,CAAC,EAAE,iBAAiB,GACzB,mBAAmB,CAWrB;AAED,eAAO,MAAM,mBAAmB,EAAE,mBACR,CAAC;AAC3B,eAAO,MAAM,sBAAsB,EAAE,mBACX,CAAC;AAC3B,eAAO,MAAM,oBAAoB,EAAE,mBACL,CAAC;AAE/B,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mEAAmE;IACnE,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,QAAQ,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,oBAAoB,CAAC,iBAAiB,CAAC,CA2azC"}
@@ -121,6 +121,80 @@ export function buildDefaultEvents(options = {}) {
121
121
  });
122
122
  }
123
123
  });
124
+ /**
125
+ * Deliver assistant text to the bound Slack thread. Used by a stop-reason
126
+ * `message.completed` and by `turn.completed` when the last assistant
127
+ * block was `finishReason: "tool_call"` (answer then `tag_artifact`,
128
+ * etc.) so the playground result still reaches Slack.
129
+ */
130
+ const deliverReplyText = (args) => __awaiter(this, void 0, void 0, function* () {
131
+ var _a, _b;
132
+ const log = getLog();
133
+ const state = args.channel.state;
134
+ if (state.channelId === null ||
135
+ state.threadTs === null ||
136
+ args.text === "") {
137
+ return false;
138
+ }
139
+ if (state.lastPostedText === args.text) {
140
+ // Stream append sets this watermark while chat.stopStream is still
141
+ // pending. Treat a match as "already on Slack", not "already finalized".
142
+ const streamTs = state.streamTs;
143
+ if (streamTs !== null && streamTs !== "") {
144
+ const canStream = streaming && state.streamingUnavailable !== true;
145
+ if (canStream) {
146
+ yield strategy.finalize({
147
+ channel: args.channel,
148
+ channelId: (_a = state.streamChannelId) !== null && _a !== void 0 ? _a : state.channelId,
149
+ text: args.text,
150
+ sessionId: args.sessionId,
151
+ });
152
+ }
153
+ else {
154
+ yield strategy.cleanupOrphan({ channel: args.channel });
155
+ }
156
+ }
157
+ return true;
158
+ }
159
+ const canStream = streaming && state.streamingUnavailable !== true;
160
+ if (canStream) {
161
+ const { delivered } = yield strategy.finalize({
162
+ channel: args.channel,
163
+ channelId: (_b = state.streamChannelId) !== null && _b !== void 0 ? _b : state.channelId,
164
+ text: args.text,
165
+ sessionId: args.sessionId,
166
+ });
167
+ if (delivered) {
168
+ return true;
169
+ }
170
+ }
171
+ try {
172
+ const posted = yield postMessage({
173
+ botToken,
174
+ channel: state.channelId,
175
+ text: args.text,
176
+ threadTs: state.threadTs,
177
+ });
178
+ state.lastPostedText = args.text;
179
+ state.lastBotMessageTs = posted.ts;
180
+ log.info("reply delivered via postMessage", {
181
+ channel: state.channelId,
182
+ thread_ts: state.threadTs,
183
+ message_ts: posted.ts,
184
+ session: args.sessionId,
185
+ chars: args.text.length,
186
+ });
187
+ return true;
188
+ }
189
+ catch (error) {
190
+ log.error(`postMessage failed: ${error instanceof Error ? error.message : String(error)}`, {
191
+ channel: state.channelId,
192
+ thread_ts: state.threadTs,
193
+ session: args.sessionId,
194
+ });
195
+ return false;
196
+ }
197
+ });
124
198
  return {
125
199
  "turn.started"(event, channel) {
126
200
  return __awaiter(this, void 0, void 0, function* () {
@@ -284,8 +358,7 @@ export function buildDefaultEvents(options = {}) {
284
358
  },
285
359
  "message.completed"(event, channel) {
286
360
  return __awaiter(this, void 0, void 0, function* () {
287
- var _a, _b;
288
- const log = getLog();
361
+ var _a;
289
362
  if (event.data.finishReason === "tool_call") {
290
363
  channel.state.pendingToolCallMessage = (_a = firstNonEmptyLine(event.data.text)) !== null && _a !== void 0 ? _a : null;
291
364
  return;
@@ -302,43 +375,11 @@ export function buildDefaultEvents(options = {}) {
302
375
  yield clearWorkingStatus(state.channelId, state.threadTs);
303
376
  return;
304
377
  }
305
- const canStream = streaming && state.streamingUnavailable !== true;
306
- if (canStream) {
307
- const { delivered } = yield strategy.finalize({
308
- channel,
309
- channelId: (_b = state.streamChannelId) !== null && _b !== void 0 ? _b : state.channelId,
310
- text: event.data.text,
311
- sessionId: event.sessionId,
312
- });
313
- if (delivered) {
314
- yield clearWorkingStatus(state.channelId, state.threadTs);
315
- return;
316
- }
317
- }
318
- try {
319
- const posted = yield postMessage({
320
- botToken,
321
- channel: state.channelId,
322
- text: event.data.text,
323
- threadTs: state.threadTs,
324
- });
325
- channel.state.lastPostedText = event.data.text;
326
- channel.state.lastBotMessageTs = posted.ts;
327
- log.info("reply delivered via postMessage", {
328
- channel: state.channelId,
329
- thread_ts: state.threadTs,
330
- message_ts: posted.ts,
331
- session: event.sessionId,
332
- chars: event.data.text.length,
333
- });
334
- }
335
- catch (error) {
336
- log.error(`postMessage failed: ${error instanceof Error ? error.message : String(error)}`, {
337
- channel: state.channelId,
338
- thread_ts: state.threadTs,
339
- session: event.sessionId,
340
- });
341
- }
378
+ yield deliverReplyText({
379
+ channel,
380
+ text: event.data.text,
381
+ sessionId: event.sessionId,
382
+ });
342
383
  yield clearWorkingStatus(state.channelId, state.threadTs);
343
384
  });
344
385
  },
@@ -351,6 +392,23 @@ export function buildDefaultEvents(options = {}) {
351
392
  channel: channel.state.channelId,
352
393
  thread_ts: channel.state.threadTs,
353
394
  });
395
+ // Mid-turn `tool_call` text is held as status, not posted. If the
396
+ // turn ends without a later `finishReason: "stop"` block, the
397
+ // playground still has `result` (last assistant text) and Slack
398
+ // would otherwise stay silent.
399
+ const result = event.data.result;
400
+ const unpublished = typeof result === "string" &&
401
+ result !== "" &&
402
+ result !== channel.state.lastPostedText;
403
+ if (unpublished) {
404
+ yield deliverReplyText({
405
+ channel,
406
+ text: result,
407
+ sessionId: event.sessionId,
408
+ });
409
+ }
410
+ // Always close leftovers. deliverReplyText may fall through to
411
+ // postMessage when streaming is unavailable and leave streamTs open.
354
412
  yield strategy.cleanupOrphan({ channel });
355
413
  // Always drop the assistant chip. message.completed already clears
356
414
  // after a normal reply, but a tool-call-only finish (or a missed
@@ -2,7 +2,7 @@
2
2
  * Scaffold a Slack channel into an agent-serve project.
3
3
  *
4
4
  * `initSlackChannel` is the create-safe writer: `agent/channels/slack.ts`
5
- * only. DIY manifests for paste at api.slack.com live in
5
+ * only. DIY manifests + Slack CLI `.slack/` live in
6
6
  * {@link initSlackManual} so `slack create` cannot reach them.
7
7
  */
8
8
  export interface InitSlackOptions {
@@ -38,7 +38,8 @@ export interface InitSlackResult {
38
38
  export declare function initSlackChannel(options: InitSlackOptions): Promise<InitSlackResult>;
39
39
  /**
40
40
  * `slack init --manual`: channel file plus DIY manifests
41
- * (`managedByCursor: false`), env.example, and setup-status.json.
41
+ * (`managedByCursor: false`), Slack CLI `.slack/` project, env.example,
42
+ * and setup-status.json.
42
43
  */
43
44
  export declare function initSlackManual(options: InitSlackManualOptions): Promise<InitSlackResult>;
44
45
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/init.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACvC;AAoED,yDAAyD;AACzD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAa1B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAgD1B"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/init.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACvC;AAoED,yDAAyD;AACzD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAa1B;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAmD1B"}
@@ -2,7 +2,7 @@
2
2
  * Scaffold a Slack channel into an agent-serve project.
3
3
  *
4
4
  * `initSlackChannel` is the create-safe writer: `agent/channels/slack.ts`
5
- * only. DIY manifests for paste at api.slack.com live in
5
+ * only. DIY manifests + Slack CLI `.slack/` live in
6
6
  * {@link initSlackManual} so `slack create` cannot reach them.
7
7
  */
8
8
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
@@ -17,6 +17,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
17
17
  import { mkdir, writeFile } from "node:fs/promises";
18
18
  import { basename, join, resolve } from "node:path";
19
19
  import { PACKAGE_NAME } from "../../internal/distribution.js";
20
+ import { writeSlackCliProject } from "./cli-project.js";
20
21
  import { envPrefixFromName, slackEnvKeys } from "./credentials.js";
21
22
  import { buildSlackManifestPair, slackManifestFileEntries, } from "./manifest.js";
22
23
  import { initialSlackSetupStatus } from "./setup.js";
@@ -83,7 +84,8 @@ export function initSlackChannel(options) {
83
84
  }
84
85
  /**
85
86
  * `slack init --manual`: channel file plus DIY manifests
86
- * (`managedByCursor: false`), env.example, and setup-status.json.
87
+ * (`managedByCursor: false`), Slack CLI `.slack/` project, env.example,
88
+ * and setup-status.json.
87
89
  */
88
90
  export function initSlackManual(options) {
89
91
  return __awaiter(this, void 0, void 0, function* () {
@@ -100,9 +102,6 @@ export function initSlackManual(options) {
100
102
  description: options.description,
101
103
  channelPosts: options.channelPosts,
102
104
  });
103
- for (const file of slackManifestFileEntries(pair)) {
104
- yield write(`.agent-serve/slack/${file.name}`, file.contents);
105
- }
106
105
  yield write(".agent-serve/slack/env.example", `# Copy to .env.local (or export in your shell). Use the *dev* Slack app
107
106
  # for local development; use the Prod app tokens in deployment secrets.
108
107
  #
@@ -115,6 +114,7 @@ ${target.envKeys.app}=xapp-...
115
114
  envPrefix: target.envPrefix,
116
115
  envKeys: target.envKeys,
117
116
  }), null, 2)}\n`);
117
+ files.push(...(yield writeSlackCliProject(target.rootDir, slackManifestFileEntries(pair))));
118
118
  return {
119
119
  rootDir: target.rootDir,
120
120
  files,
@@ -7,13 +7,14 @@
7
7
  * `slackChannel({ onBlockAction })`).
8
8
  */
9
9
  import type { ContinuationIdentity } from "../../internal/continuation-identity.js";
10
- import type { ApprovalDecision, ArtifactsApi, AuthContext, ChannelSession, HostContext, PendingApproval, SendMessageFn } from "../../types.js";
10
+ import type { ApprovalDecision, ArtifactsApi, AuthContext, ChannelSession, HostContext, PendingApproval, PendingAuth, SendMessageFn } from "../../types.js";
11
11
  import { type SlackLog } from "./log.js";
12
12
  import type { SlackBlockAction, SlackBlockActionHandler, SlackBotToken, SlackContinuationProbes, SlackCredentials } from "./types.js";
13
13
  export interface SlackInteractiveDispatchDeps {
14
14
  credentials: SlackCredentials | undefined;
15
15
  getSession: (sessionId: string) => Promise<ChannelSession | null>;
16
16
  resolveApproval: (sessionId: string, callId: string, decision: ApprovalDecision, auth: AuthContext | null) => Promise<PendingApproval>;
17
+ resolveAuth: (sessionId: string, callId: string, decision: ApprovalDecision, auth: AuthContext | null) => Promise<PendingAuth>;
17
18
  waitUntil: (promise: Promise<unknown>) => void;
18
19
  log?: SlackLog;
19
20
  /** Defaults to true. */
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/interactive.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,eAAe,EACf,aAAa,EACd,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC1C,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAClE,eAAe,EAAE,CACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,WAAW,GAAG,IAAI,KACrB,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9B,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC/C,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,wBAAwB;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,OAAO,CAAC,CAiHlB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,GACf,gBAAgB,GAAG,IAAI,CAoFzB;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,gBAAgB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBnB;AAED,MAAM,WAAW,4BAA6B,SAAQ,uBAAuB;IAC3E,OAAO,EAAE,uBAAuB,CAAC;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC1C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,YAAY,CAAC;IACxB,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,wBAAwB;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA4BD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,OAAO,CAAC,CAoDlB"}
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/interactive.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,eAAe,EACf,WAAW,EACX,aAAa,EACd,MAAM,gBAAgB,CAAC;AAUxB,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC1C,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAClE,eAAe,EAAE,CACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,WAAW,GAAG,IAAI,KACrB,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9B,WAAW,EAAE,CACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,WAAW,GAAG,IAAI,KACrB,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1B,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAC/C,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,wBAAwB;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,OAAO,CAAC,CAgIlB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,GACf,gBAAgB,GAAG,IAAI,CAoFzB;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,gBAAgB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBnB;AAED,MAAM,WAAW,4BAA6B,SAAQ,uBAAuB;IAC3E,OAAO,EAAE,uBAAuB,CAAC;IACjC,IAAI,EAAE,aAAa,CAAC;IACpB,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC1C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,YAAY,CAAC;IACxB,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,wBAAwB;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA4BD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,OAAO,CAAC,CAoDlB"}