@cursor/july 0.1.1

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 (623) hide show
  1. package/AGENTS.md +290 -0
  2. package/LICENSE.md +3 -0
  3. package/README.md +1233 -0
  4. package/dist/ab.d.ts +290 -0
  5. package/dist/ab.d.ts.map +1 -0
  6. package/dist/ab.js +386 -0
  7. package/dist/bin/agent-serve.d.ts +15 -0
  8. package/dist/bin/agent-serve.d.ts.map +1 -0
  9. package/dist/bin/agent-serve.js +754 -0
  10. package/dist/channels/github/api.d.ts +101 -0
  11. package/dist/channels/github/api.d.ts.map +1 -0
  12. package/dist/channels/github/api.js +229 -0
  13. package/dist/channels/github/auth.d.ts +67 -0
  14. package/dist/channels/github/auth.d.ts.map +1 -0
  15. package/dist/channels/github/auth.js +239 -0
  16. package/dist/channels/github/binding.d.ts +73 -0
  17. package/dist/channels/github/binding.d.ts.map +1 -0
  18. package/dist/channels/github/binding.js +114 -0
  19. package/dist/channels/github/defaults.d.ts +24 -0
  20. package/dist/channels/github/defaults.d.ts.map +1 -0
  21. package/dist/channels/github/defaults.js +100 -0
  22. package/dist/channels/github/events.d.ts +18 -0
  23. package/dist/channels/github/events.d.ts.map +1 -0
  24. package/dist/channels/github/events.js +59 -0
  25. package/dist/channels/github/forward.d.ts +137 -0
  26. package/dist/channels/github/forward.d.ts.map +1 -0
  27. package/dist/channels/github/forward.js +271 -0
  28. package/dist/channels/github/github-channel.d.ts +127 -0
  29. package/dist/channels/github/github-channel.d.ts.map +1 -0
  30. package/dist/channels/github/github-channel.js +1688 -0
  31. package/dist/channels/github/index.d.ts +52 -0
  32. package/dist/channels/github/index.d.ts.map +1 -0
  33. package/dist/channels/github/index.js +51 -0
  34. package/dist/channels/github/replay.d.ts +115 -0
  35. package/dist/channels/github/replay.d.ts.map +1 -0
  36. package/dist/channels/github/replay.js +282 -0
  37. package/dist/channels/github/state.d.ts +26 -0
  38. package/dist/channels/github/state.d.ts.map +1 -0
  39. package/dist/channels/github/state.js +50 -0
  40. package/dist/channels/github/types.d.ts +385 -0
  41. package/dist/channels/github/types.d.ts.map +1 -0
  42. package/dist/channels/github/types.js +1 -0
  43. package/dist/channels/slack/api.d.ts +117 -0
  44. package/dist/channels/slack/api.d.ts.map +1 -0
  45. package/dist/channels/slack/api.js +437 -0
  46. package/dist/channels/slack/approvals.d.ts +32 -0
  47. package/dist/channels/slack/approvals.d.ts.map +1 -0
  48. package/dist/channels/slack/approvals.js +157 -0
  49. package/dist/channels/slack/assistant.d.ts +23 -0
  50. package/dist/channels/slack/assistant.d.ts.map +1 -0
  51. package/dist/channels/slack/assistant.js +67 -0
  52. package/dist/channels/slack/auth.d.ts +40 -0
  53. package/dist/channels/slack/auth.d.ts.map +1 -0
  54. package/dist/channels/slack/auth.js +71 -0
  55. package/dist/channels/slack/channel-watch.d.ts +46 -0
  56. package/dist/channels/slack/channel-watch.d.ts.map +1 -0
  57. package/dist/channels/slack/channel-watch.js +180 -0
  58. package/dist/channels/slack/constants.d.ts +17 -0
  59. package/dist/channels/slack/constants.d.ts.map +1 -0
  60. package/dist/channels/slack/constants.js +27 -0
  61. package/dist/channels/slack/credentials.d.ts +35 -0
  62. package/dist/channels/slack/credentials.d.ts.map +1 -0
  63. package/dist/channels/slack/credentials.js +88 -0
  64. package/dist/channels/slack/cursor-account.d.ts +76 -0
  65. package/dist/channels/slack/cursor-account.d.ts.map +1 -0
  66. package/dist/channels/slack/cursor-account.js +88 -0
  67. package/dist/channels/slack/defaults.d.ts +32 -0
  68. package/dist/channels/slack/defaults.d.ts.map +1 -0
  69. package/dist/channels/slack/defaults.js +380 -0
  70. package/dist/channels/slack/dispatch.d.ts +43 -0
  71. package/dist/channels/slack/dispatch.d.ts.map +1 -0
  72. package/dist/channels/slack/dispatch.js +185 -0
  73. package/dist/channels/slack/doctor.d.ts +24 -0
  74. package/dist/channels/slack/doctor.d.ts.map +1 -0
  75. package/dist/channels/slack/doctor.js +115 -0
  76. package/dist/channels/slack/event-id-dedupe.d.ts +10 -0
  77. package/dist/channels/slack/event-id-dedupe.d.ts.map +1 -0
  78. package/dist/channels/slack/event-id-dedupe.js +23 -0
  79. package/dist/channels/slack/inbound.d.ts +41 -0
  80. package/dist/channels/slack/inbound.d.ts.map +1 -0
  81. package/dist/channels/slack/inbound.js +166 -0
  82. package/dist/channels/slack/index.d.ts +45 -0
  83. package/dist/channels/slack/index.d.ts.map +1 -0
  84. package/dist/channels/slack/index.js +44 -0
  85. package/dist/channels/slack/init.d.ts +32 -0
  86. package/dist/channels/slack/init.d.ts.map +1 -0
  87. package/dist/channels/slack/init.js +82 -0
  88. package/dist/channels/slack/interactive.d.ts +19 -0
  89. package/dist/channels/slack/interactive.d.ts.map +1 -0
  90. package/dist/channels/slack/interactive.js +142 -0
  91. package/dist/channels/slack/links.d.ts +10 -0
  92. package/dist/channels/slack/links.d.ts.map +1 -0
  93. package/dist/channels/slack/links.js +19 -0
  94. package/dist/channels/slack/live-delivery.d.ts +75 -0
  95. package/dist/channels/slack/live-delivery.d.ts.map +1 -0
  96. package/dist/channels/slack/live-delivery.js +143 -0
  97. package/dist/channels/slack/log.d.ts +25 -0
  98. package/dist/channels/slack/log.d.ts.map +1 -0
  99. package/dist/channels/slack/log.js +47 -0
  100. package/dist/channels/slack/manifest.d.ts +57 -0
  101. package/dist/channels/slack/manifest.d.ts.map +1 -0
  102. package/dist/channels/slack/manifest.js +110 -0
  103. package/dist/channels/slack/pr-ref.d.ts +18 -0
  104. package/dist/channels/slack/pr-ref.d.ts.map +1 -0
  105. package/dist/channels/slack/pr-ref.js +36 -0
  106. package/dist/channels/slack/setup.d.ts +14 -0
  107. package/dist/channels/slack/setup.d.ts.map +1 -0
  108. package/dist/channels/slack/setup.js +86 -0
  109. package/dist/channels/slack/slack-channel.d.ts +15 -0
  110. package/dist/channels/slack/slack-channel.d.ts.map +1 -0
  111. package/dist/channels/slack/slack-channel.js +281 -0
  112. package/dist/channels/slack/socket-mode.d.ts +26 -0
  113. package/dist/channels/slack/socket-mode.d.ts.map +1 -0
  114. package/dist/channels/slack/socket-mode.js +116 -0
  115. package/dist/channels/slack/stream.d.ts +26 -0
  116. package/dist/channels/slack/stream.d.ts.map +1 -0
  117. package/dist/channels/slack/stream.js +39 -0
  118. package/dist/channels/slack/tool-approval-events.d.ts +33 -0
  119. package/dist/channels/slack/tool-approval-events.d.ts.map +1 -0
  120. package/dist/channels/slack/tool-approval-events.js +129 -0
  121. package/dist/channels/slack/types.d.ts +326 -0
  122. package/dist/channels/slack/types.d.ts.map +1 -0
  123. package/dist/channels/slack/types.js +4 -0
  124. package/dist/channels.d.ts +116 -0
  125. package/dist/channels.d.ts.map +1 -0
  126. package/dist/channels.js +294 -0
  127. package/dist/connections.d.ts +75 -0
  128. package/dist/connections.d.ts.map +1 -0
  129. package/dist/connections.js +75 -0
  130. package/dist/docs/404.html +22 -0
  131. package/dist/docs/ab.html +87 -0
  132. package/dist/docs/assets/ab.md.COdXkces.js +63 -0
  133. package/dist/docs/assets/ab.md.COdXkces.lean.js +1 -0
  134. package/dist/docs/assets/app.DqfFEmJd.js +1 -0
  135. package/dist/docs/assets/building-with-agents.md.CJCtZCyi.js +13 -0
  136. package/dist/docs/assets/building-with-agents.md.CJCtZCyi.lean.js +1 -0
  137. package/dist/docs/assets/chunks/@localSearchIndexroot.CcVk1uKq.js +1 -0
  138. package/dist/docs/assets/chunks/VPLocalSearchBox.BaLEdS15.js +9 -0
  139. package/dist/docs/assets/chunks/framework.CAZyNGu9.js +19 -0
  140. package/dist/docs/assets/chunks/theme.CZRvu_0q.js +2 -0
  141. package/dist/docs/assets/concepts.md.Cfb9b-k1.js +4 -0
  142. package/dist/docs/assets/concepts.md.Cfb9b-k1.lean.js +1 -0
  143. package/dist/docs/assets/deployment.md.Dx1TYNk5.js +14 -0
  144. package/dist/docs/assets/deployment.md.Dx1TYNk5.lean.js +1 -0
  145. package/dist/docs/assets/evals.md.DPZ_MAnI.js +85 -0
  146. package/dist/docs/assets/evals.md.DPZ_MAnI.lean.js +1 -0
  147. package/dist/docs/assets/guides_agent-to-agent.md.CrtrsySy.js +10 -0
  148. package/dist/docs/assets/guides_agent-to-agent.md.CrtrsySy.lean.js +1 -0
  149. package/dist/docs/assets/guides_cloud-runtime.md.CYlNMTNp.js +9 -0
  150. package/dist/docs/assets/guides_cloud-runtime.md.CYlNMTNp.lean.js +1 -0
  151. package/dist/docs/assets/guides_github.md.DwbKhCeS.js +20 -0
  152. package/dist/docs/assets/guides_github.md.DwbKhCeS.lean.js +1 -0
  153. package/dist/docs/assets/guides_human-in-the-loop.md.Dvuctx7s.js +28 -0
  154. package/dist/docs/assets/guides_human-in-the-loop.md.Dvuctx7s.lean.js +1 -0
  155. package/dist/docs/assets/guides_slack.md.bv41fHfW.js +37 -0
  156. package/dist/docs/assets/guides_slack.md.bv41fHfW.lean.js +1 -0
  157. package/dist/docs/assets/guides_webhooks.md.hFTik3lf.js +50 -0
  158. package/dist/docs/assets/guides_webhooks.md.hFTik3lf.lean.js +1 -0
  159. package/dist/docs/assets/hillclimbing.md.DHNast08.js +4 -0
  160. package/dist/docs/assets/hillclimbing.md.DHNast08.lean.js +1 -0
  161. package/dist/docs/assets/index.md.BPKcj5AI.js +20 -0
  162. package/dist/docs/assets/index.md.BPKcj5AI.lean.js +1 -0
  163. package/dist/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  164. package/dist/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  165. package/dist/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  166. package/dist/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  167. package/dist/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  168. package/dist/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  169. package/dist/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  170. package/dist/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  171. package/dist/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  172. package/dist/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  173. package/dist/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  174. package/dist/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  175. package/dist/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  176. package/dist/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  177. package/dist/docs/assets/quickstart.md.tVPiGK_L.js +35 -0
  178. package/dist/docs/assets/quickstart.md.tVPiGK_L.lean.js +1 -0
  179. package/dist/docs/assets/reference_agent-config.md.Bpd7HQwf.js +34 -0
  180. package/dist/docs/assets/reference_agent-config.md.Bpd7HQwf.lean.js +1 -0
  181. package/dist/docs/assets/reference_channels.md.D7JTR03W.js +53 -0
  182. package/dist/docs/assets/reference_channels.md.D7JTR03W.lean.js +1 -0
  183. package/dist/docs/assets/reference_cli.md.DA730zCu.js +33 -0
  184. package/dist/docs/assets/reference_cli.md.DA730zCu.lean.js +1 -0
  185. package/dist/docs/assets/reference_connections.md.C3vNH_DE.js +26 -0
  186. package/dist/docs/assets/reference_connections.md.C3vNH_DE.lean.js +1 -0
  187. package/dist/docs/assets/reference_hooks.md.BCEc3MyM.js +12 -0
  188. package/dist/docs/assets/reference_hooks.md.BCEc3MyM.lean.js +1 -0
  189. package/dist/docs/assets/reference_http-api.md.DBAahtdz.js +11 -0
  190. package/dist/docs/assets/reference_http-api.md.DBAahtdz.lean.js +1 -0
  191. package/dist/docs/assets/reference_instructions.md.BC05LEQ8.js +12 -0
  192. package/dist/docs/assets/reference_instructions.md.BC05LEQ8.lean.js +1 -0
  193. package/dist/docs/assets/reference_playground.md.CPZhfYaO.js +1 -0
  194. package/dist/docs/assets/reference_playground.md.CPZhfYaO.lean.js +1 -0
  195. package/dist/docs/assets/reference_project-layout.md.Bd_CKtNS.js +31 -0
  196. package/dist/docs/assets/reference_project-layout.md.Bd_CKtNS.lean.js +1 -0
  197. package/dist/docs/assets/reference_schedules.md.D7qijxLk.js +82 -0
  198. package/dist/docs/assets/reference_schedules.md.D7qijxLk.lean.js +1 -0
  199. package/dist/docs/assets/reference_sessions.md.DdjWabnN.js +8 -0
  200. package/dist/docs/assets/reference_sessions.md.DdjWabnN.lean.js +1 -0
  201. package/dist/docs/assets/reference_skills.md.VQnlBT3Q.js +15 -0
  202. package/dist/docs/assets/reference_skills.md.VQnlBT3Q.lean.js +1 -0
  203. package/dist/docs/assets/reference_subagents.md.CIRAVcPK.js +10 -0
  204. package/dist/docs/assets/reference_subagents.md.CIRAVcPK.lean.js +1 -0
  205. package/dist/docs/assets/reference_tools.md.DF5kwlt0.js +46 -0
  206. package/dist/docs/assets/reference_tools.md.DF5kwlt0.lean.js +1 -0
  207. package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.js +1 -0
  208. package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.lean.js +1 -0
  209. package/dist/docs/assets/style.Bj-IXa5W.css +1 -0
  210. package/dist/docs/assets/troubleshooting.md.DkovjS7h.js +1 -0
  211. package/dist/docs/assets/troubleshooting.md.DkovjS7h.lean.js +1 -0
  212. package/dist/docs/building-with-agents.html +37 -0
  213. package/dist/docs/concepts.html +28 -0
  214. package/dist/docs/deployment.html +38 -0
  215. package/dist/docs/evals.html +109 -0
  216. package/dist/docs/guides/agent-to-agent.html +34 -0
  217. package/dist/docs/guides/cloud-runtime.html +33 -0
  218. package/dist/docs/guides/github.html +44 -0
  219. package/dist/docs/guides/human-in-the-loop.html +52 -0
  220. package/dist/docs/guides/slack.html +61 -0
  221. package/dist/docs/guides/webhooks.html +74 -0
  222. package/dist/docs/hashmap.json +1 -0
  223. package/dist/docs/hillclimbing.html +28 -0
  224. package/dist/docs/index.html +44 -0
  225. package/dist/docs/quickstart.html +59 -0
  226. package/dist/docs/reference/agent-config.html +58 -0
  227. package/dist/docs/reference/channels.html +77 -0
  228. package/dist/docs/reference/cli.html +57 -0
  229. package/dist/docs/reference/connections.html +50 -0
  230. package/dist/docs/reference/hooks.html +36 -0
  231. package/dist/docs/reference/http-api.html +35 -0
  232. package/dist/docs/reference/instructions.html +36 -0
  233. package/dist/docs/reference/playground.html +25 -0
  234. package/dist/docs/reference/project-layout.html +55 -0
  235. package/dist/docs/reference/schedules.html +106 -0
  236. package/dist/docs/reference/sessions.html +32 -0
  237. package/dist/docs/reference/skills.html +39 -0
  238. package/dist/docs/reference/subagents.html +34 -0
  239. package/dist/docs/reference/tools.html +70 -0
  240. package/dist/docs/scaffolding-agents.html +25 -0
  241. package/dist/docs/troubleshooting.html +25 -0
  242. package/dist/docs/vp-icons.css +0 -0
  243. package/dist/evals.d.ts +312 -0
  244. package/dist/evals.d.ts.map +1 -0
  245. package/dist/evals.js +254 -0
  246. package/dist/hooks.d.ts +23 -0
  247. package/dist/hooks.d.ts.map +1 -0
  248. package/dist/hooks.js +23 -0
  249. package/dist/index.d.ts +71 -0
  250. package/dist/index.d.ts.map +1 -0
  251. package/dist/index.js +101 -0
  252. package/dist/internal/ab-collector.d.ts +42 -0
  253. package/dist/internal/ab-collector.d.ts.map +1 -0
  254. package/dist/internal/ab-collector.js +153 -0
  255. package/dist/internal/ab-fold.d.ts +36 -0
  256. package/dist/internal/ab-fold.d.ts.map +1 -0
  257. package/dist/internal/ab-fold.js +171 -0
  258. package/dist/internal/ab-snapshot.d.ts +70 -0
  259. package/dist/internal/ab-snapshot.d.ts.map +1 -0
  260. package/dist/internal/ab-snapshot.js +208 -0
  261. package/dist/internal/approval-gate.d.ts +34 -0
  262. package/dist/internal/approval-gate.d.ts.map +1 -0
  263. package/dist/internal/approval-gate.js +85 -0
  264. package/dist/internal/auth.d.ts +8 -0
  265. package/dist/internal/auth.d.ts.map +1 -0
  266. package/dist/internal/auth.js +27 -0
  267. package/dist/internal/authored-alias-hooks.d.ts +31 -0
  268. package/dist/internal/authored-alias-hooks.d.ts.map +1 -0
  269. package/dist/internal/authored-alias-hooks.js +43 -0
  270. package/dist/internal/authored-loaders.d.ts +25 -0
  271. package/dist/internal/authored-loaders.d.ts.map +1 -0
  272. package/dist/internal/authored-loaders.js +129 -0
  273. package/dist/internal/bounded-int.d.ts +11 -0
  274. package/dist/internal/bounded-int.d.ts.map +1 -0
  275. package/dist/internal/bounded-int.js +13 -0
  276. package/dist/internal/brand.d.ts +6 -0
  277. package/dist/internal/brand.d.ts.map +1 -0
  278. package/dist/internal/brand.js +17 -0
  279. package/dist/internal/chat-client.d.ts +19 -0
  280. package/dist/internal/chat-client.d.ts.map +1 -0
  281. package/dist/internal/chat-client.js +327 -0
  282. package/dist/internal/cli-ax.d.ts +58 -0
  283. package/dist/internal/cli-ax.d.ts.map +1 -0
  284. package/dist/internal/cli-ax.js +345 -0
  285. package/dist/internal/cli-cursor.d.ts +20 -0
  286. package/dist/internal/cli-cursor.d.ts.map +1 -0
  287. package/dist/internal/cli-cursor.js +227 -0
  288. package/dist/internal/cli-github.d.ts +47 -0
  289. package/dist/internal/cli-github.d.ts.map +1 -0
  290. package/dist/internal/cli-github.js +644 -0
  291. package/dist/internal/cli-slack.d.ts +18 -0
  292. package/dist/internal/cli-slack.d.ts.map +1 -0
  293. package/dist/internal/cli-slack.js +144 -0
  294. package/dist/internal/cloud-merge.d.ts +23 -0
  295. package/dist/internal/cloud-merge.d.ts.map +1 -0
  296. package/dist/internal/cloud-merge.js +28 -0
  297. package/dist/internal/cron.d.ts +17 -0
  298. package/dist/internal/cron.d.ts.map +1 -0
  299. package/dist/internal/cron.js +60 -0
  300. package/dist/internal/cursor/account-mcp.d.ts +95 -0
  301. package/dist/internal/cursor/account-mcp.d.ts.map +1 -0
  302. package/dist/internal/cursor/account-mcp.js +342 -0
  303. package/dist/internal/cursor/backend-client.d.ts +118 -0
  304. package/dist/internal/cursor/backend-client.d.ts.map +1 -0
  305. package/dist/internal/cursor/backend-client.js +477 -0
  306. package/dist/internal/cursor/credentials.d.ts +112 -0
  307. package/dist/internal/cursor/credentials.d.ts.map +1 -0
  308. package/dist/internal/cursor/credentials.js +329 -0
  309. package/dist/internal/cursor-event-relay.d.ts +111 -0
  310. package/dist/internal/cursor-event-relay.d.ts.map +1 -0
  311. package/dist/internal/cursor-event-relay.js +181 -0
  312. package/dist/internal/cursor-relay-core.d.ts +113 -0
  313. package/dist/internal/cursor-relay-core.d.ts.map +1 -0
  314. package/dist/internal/cursor-relay-core.js +364 -0
  315. package/dist/internal/cursor-slack-relay.d.ts +94 -0
  316. package/dist/internal/cursor-slack-relay.d.ts.map +1 -0
  317. package/dist/internal/cursor-slack-relay.js +171 -0
  318. package/dist/internal/describe-error.d.ts +3 -0
  319. package/dist/internal/describe-error.d.ts.map +1 -0
  320. package/dist/internal/describe-error.js +4 -0
  321. package/dist/internal/dev-mode.d.ts +13 -0
  322. package/dist/internal/dev-mode.d.ts.map +1 -0
  323. package/dist/internal/dev-mode.js +17 -0
  324. package/dist/internal/discovery.d.ts +55 -0
  325. package/dist/internal/discovery.d.ts.map +1 -0
  326. package/dist/internal/discovery.js +1427 -0
  327. package/dist/internal/distribution.d.ts +47 -0
  328. package/dist/internal/distribution.d.ts.map +1 -0
  329. package/dist/internal/distribution.js +82 -0
  330. package/dist/internal/docs-site.d.ts +28 -0
  331. package/dist/internal/docs-site.d.ts.map +1 -0
  332. package/dist/internal/docs-site.js +169 -0
  333. package/dist/internal/duration.d.ts +8 -0
  334. package/dist/internal/duration.d.ts.map +1 -0
  335. package/dist/internal/duration.js +35 -0
  336. package/dist/internal/eval-run-store.d.ts +81 -0
  337. package/dist/internal/eval-run-store.d.ts.map +1 -0
  338. package/dist/internal/eval-run-store.js +396 -0
  339. package/dist/internal/eval-runner.d.ts +76 -0
  340. package/dist/internal/eval-runner.d.ts.map +1 -0
  341. package/dist/internal/eval-runner.js +336 -0
  342. package/dist/internal/event-log.d.ts +51 -0
  343. package/dist/internal/event-log.d.ts.map +1 -0
  344. package/dist/internal/event-log.js +167 -0
  345. package/dist/internal/event-mapper.d.ts +46 -0
  346. package/dist/internal/event-mapper.d.ts.map +1 -0
  347. package/dist/internal/event-mapper.js +226 -0
  348. package/dist/internal/frontmatter.d.ts +12 -0
  349. package/dist/internal/frontmatter.d.ts.map +1 -0
  350. package/dist/internal/frontmatter.js +61 -0
  351. package/dist/internal/github-fanout.d.ts +32 -0
  352. package/dist/internal/github-fanout.d.ts.map +1 -0
  353. package/dist/internal/github-fanout.js +122 -0
  354. package/dist/internal/handleAgentServeTrigger.d.ts +59 -0
  355. package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -0
  356. package/dist/internal/handleAgentServeTrigger.js +115 -0
  357. package/dist/internal/host-platforms.d.ts +40 -0
  358. package/dist/internal/host-platforms.d.ts.map +1 -0
  359. package/dist/internal/host-platforms.js +113 -0
  360. package/dist/internal/http-channel.d.ts +54 -0
  361. package/dist/internal/http-channel.d.ts.map +1 -0
  362. package/dist/internal/http-channel.js +382 -0
  363. package/dist/internal/ids.d.ts +19 -0
  364. package/dist/internal/ids.d.ts.map +1 -0
  365. package/dist/internal/ids.js +34 -0
  366. package/dist/internal/init-project.d.ts +22 -0
  367. package/dist/internal/init-project.d.ts.map +1 -0
  368. package/dist/internal/init-project.js +125 -0
  369. package/dist/internal/json-dir-store.d.ts +32 -0
  370. package/dist/internal/json-dir-store.d.ts.map +1 -0
  371. package/dist/internal/json-dir-store.js +100 -0
  372. package/dist/internal/json-schema.d.ts +18 -0
  373. package/dist/internal/json-schema.d.ts.map +1 -0
  374. package/dist/internal/json-schema.js +53 -0
  375. package/dist/internal/log-ring.d.ts +23 -0
  376. package/dist/internal/log-ring.d.ts.map +1 -0
  377. package/dist/internal/log-ring.js +42 -0
  378. package/dist/internal/map-pool.d.ts +6 -0
  379. package/dist/internal/map-pool.d.ts.map +1 -0
  380. package/dist/internal/map-pool.js +41 -0
  381. package/dist/internal/mcp-endpoint.d.ts +59 -0
  382. package/dist/internal/mcp-endpoint.d.ts.map +1 -0
  383. package/dist/internal/mcp-endpoint.js +355 -0
  384. package/dist/internal/mcp-host.d.ts +28 -0
  385. package/dist/internal/mcp-host.d.ts.map +1 -0
  386. package/dist/internal/mcp-host.js +162 -0
  387. package/dist/internal/net.d.ts +5 -0
  388. package/dist/internal/net.d.ts.map +1 -0
  389. package/dist/internal/net.js +30 -0
  390. package/dist/internal/peer-connections.d.ts +44 -0
  391. package/dist/internal/peer-connections.d.ts.map +1 -0
  392. package/dist/internal/peer-connections.js +67 -0
  393. package/dist/internal/playground/static.d.ts +35 -0
  394. package/dist/internal/playground/static.d.ts.map +1 -0
  395. package/dist/internal/playground/static.js +162 -0
  396. package/dist/internal/playground/toolchain.d.ts +57 -0
  397. package/dist/internal/playground/toolchain.d.ts.map +1 -0
  398. package/dist/internal/playground/toolchain.js +226 -0
  399. package/dist/internal/reminder-runner.d.ts +62 -0
  400. package/dist/internal/reminder-runner.d.ts.map +1 -0
  401. package/dist/internal/reminder-runner.js +582 -0
  402. package/dist/internal/reminder-schedule.d.ts +22 -0
  403. package/dist/internal/reminder-schedule.d.ts.map +1 -0
  404. package/dist/internal/reminder-schedule.js +82 -0
  405. package/dist/internal/reminder-store.d.ts +58 -0
  406. package/dist/internal/reminder-store.d.ts.map +1 -0
  407. package/dist/internal/reminder-store.js +106 -0
  408. package/dist/internal/resolved-connections.d.ts +41 -0
  409. package/dist/internal/resolved-connections.d.ts.map +1 -0
  410. package/dist/internal/resolved-connections.js +73 -0
  411. package/dist/internal/review-comments.d.ts +50 -0
  412. package/dist/internal/review-comments.d.ts.map +1 -0
  413. package/dist/internal/review-comments.js +194 -0
  414. package/dist/internal/router.d.ts +33 -0
  415. package/dist/internal/router.d.ts.map +1 -0
  416. package/dist/internal/router.js +93 -0
  417. package/dist/internal/run-client.d.ts +49 -0
  418. package/dist/internal/run-client.d.ts.map +1 -0
  419. package/dist/internal/run-client.js +208 -0
  420. package/dist/internal/schedule-runner.d.ts +31 -0
  421. package/dist/internal/schedule-runner.d.ts.map +1 -0
  422. package/dist/internal/schedule-runner.js +126 -0
  423. package/dist/internal/sdk-runner.d.ts +41 -0
  424. package/dist/internal/sdk-runner.d.ts.map +1 -0
  425. package/dist/internal/sdk-runner.js +221 -0
  426. package/dist/internal/server.d.ts +25 -0
  427. package/dist/internal/server.d.ts.map +1 -0
  428. package/dist/internal/server.js +1374 -0
  429. package/dist/internal/session-engine.d.ts +287 -0
  430. package/dist/internal/session-engine.d.ts.map +1 -0
  431. package/dist/internal/session-engine.js +1377 -0
  432. package/dist/internal/session-store.d.ts +29 -0
  433. package/dist/internal/session-store.d.ts.map +1 -0
  434. package/dist/internal/session-store.js +140 -0
  435. package/dist/internal/session-urls.d.ts +10 -0
  436. package/dist/internal/session-urls.d.ts.map +1 -0
  437. package/dist/internal/session-urls.js +25 -0
  438. package/dist/internal/stream-progress.d.ts +14 -0
  439. package/dist/internal/stream-progress.d.ts.map +1 -0
  440. package/dist/internal/stream-progress.js +195 -0
  441. package/dist/internal/tool-result.d.ts +20 -0
  442. package/dist/internal/tool-result.d.ts.map +1 -0
  443. package/dist/internal/tool-result.js +45 -0
  444. package/dist/internal/trajectory.d.ts +56 -0
  445. package/dist/internal/trajectory.d.ts.map +1 -0
  446. package/dist/internal/trajectory.js +248 -0
  447. package/dist/internal/workspace.d.ts +42 -0
  448. package/dist/internal/workspace.d.ts.map +1 -0
  449. package/dist/internal/workspace.js +199 -0
  450. package/dist/playground/assets/cursor-icons-outline-oY2V_mvK.woff2 +0 -0
  451. package/dist/playground/assets/index-1K-hG-7p.css +1 -0
  452. package/dist/playground/assets/index-FlWjhg3x.js +79 -0
  453. package/dist/playground/index.html +17 -0
  454. package/dist/reminders.d.ts +23 -0
  455. package/dist/reminders.d.ts.map +1 -0
  456. package/dist/reminders.js +22 -0
  457. package/dist/schedules.d.ts +23 -0
  458. package/dist/schedules.d.ts.map +1 -0
  459. package/dist/schedules.js +26 -0
  460. package/dist/skills.d.ts +22 -0
  461. package/dist/skills.d.ts.map +1 -0
  462. package/dist/skills.js +22 -0
  463. package/dist/tools.d.ts +92 -0
  464. package/dist/tools.d.ts.map +1 -0
  465. package/dist/tools.js +68 -0
  466. package/dist/types.d.ts +1609 -0
  467. package/dist/types.d.ts.map +1 -0
  468. package/dist/types.js +80 -0
  469. package/docs/README.md +174 -0
  470. package/docs/ab.md +355 -0
  471. package/docs/building-with-agents.md +129 -0
  472. package/docs/concepts.md +177 -0
  473. package/docs/deployment.md +218 -0
  474. package/docs/evals.md +383 -0
  475. package/docs/guides/agent-to-agent.md +118 -0
  476. package/docs/guides/cloud-runtime.md +122 -0
  477. package/docs/guides/github.md +172 -0
  478. package/docs/guides/human-in-the-loop.md +131 -0
  479. package/docs/guides/slack.md +245 -0
  480. package/docs/guides/webhooks.md +201 -0
  481. package/docs/hillclimbing.md +93 -0
  482. package/docs/quickstart.md +183 -0
  483. package/docs/reference/agent-config.md +154 -0
  484. package/docs/reference/channels.md +206 -0
  485. package/docs/reference/cli.md +257 -0
  486. package/docs/reference/connections.md +137 -0
  487. package/docs/reference/hooks.md +74 -0
  488. package/docs/reference/http-api.md +219 -0
  489. package/docs/reference/instructions.md +77 -0
  490. package/docs/reference/playground.md +67 -0
  491. package/docs/reference/project-layout.md +119 -0
  492. package/docs/reference/schedules.md +220 -0
  493. package/docs/reference/sessions.md +165 -0
  494. package/docs/reference/skills.md +79 -0
  495. package/docs/reference/subagents.md +74 -0
  496. package/docs/reference/tools.md +203 -0
  497. package/docs/scaffolding-agents.md +113 -0
  498. package/docs/troubleshooting.md +95 -0
  499. package/package.json +185 -0
  500. package/skills/ab/SKILL.md +139 -0
  501. package/skills/create-agent/SKILL.md +219 -0
  502. package/skills/debug/SKILL.md +71 -0
  503. package/skills/evals/SKILL.md +217 -0
  504. package/skills/framework-map/SKILL.md +142 -0
  505. package/skills/github/SKILL.md +144 -0
  506. package/skills/hillclimb/SKILL.md +162 -0
  507. package/skills/setup-slack/SKILL.md +180 -0
  508. package/src/ab.ts +675 -0
  509. package/src/bin/agent-serve.ts +949 -0
  510. package/src/channels/github/api.ts +374 -0
  511. package/src/channels/github/auth.ts +275 -0
  512. package/src/channels/github/binding.ts +223 -0
  513. package/src/channels/github/defaults.ts +111 -0
  514. package/src/channels/github/events.ts +72 -0
  515. package/src/channels/github/forward.ts +381 -0
  516. package/src/channels/github/github-channel.ts +2270 -0
  517. package/src/channels/github/index.ts +52 -0
  518. package/src/channels/github/replay.ts +387 -0
  519. package/src/channels/github/state.ts +95 -0
  520. package/src/channels/github/types.ts +490 -0
  521. package/src/channels/slack/api.ts +580 -0
  522. package/src/channels/slack/approvals.ts +198 -0
  523. package/src/channels/slack/assistant.ts +76 -0
  524. package/src/channels/slack/auth.ts +112 -0
  525. package/src/channels/slack/channel-watch.ts +219 -0
  526. package/src/channels/slack/constants.ts +30 -0
  527. package/src/channels/slack/credentials.ts +90 -0
  528. package/src/channels/slack/cursor-account.ts +166 -0
  529. package/src/channels/slack/defaults.ts +450 -0
  530. package/src/channels/slack/dispatch.ts +293 -0
  531. package/src/channels/slack/doctor.ts +135 -0
  532. package/src/channels/slack/event-id-dedupe.ts +30 -0
  533. package/src/channels/slack/inbound.ts +219 -0
  534. package/src/channels/slack/index.ts +45 -0
  535. package/src/channels/slack/init.ts +133 -0
  536. package/src/channels/slack/interactive.ts +194 -0
  537. package/src/channels/slack/links.ts +23 -0
  538. package/src/channels/slack/live-delivery.ts +201 -0
  539. package/src/channels/slack/log.ts +83 -0
  540. package/src/channels/slack/manifest.ts +179 -0
  541. package/src/channels/slack/pr-ref.ts +50 -0
  542. package/src/channels/slack/setup.ts +97 -0
  543. package/src/channels/slack/slack-channel.ts +374 -0
  544. package/src/channels/slack/socket-mode.ts +154 -0
  545. package/src/channels/slack/stream.ts +63 -0
  546. package/src/channels/slack/tool-approval-events.ts +136 -0
  547. package/src/channels/slack/types.ts +349 -0
  548. package/src/channels.ts +385 -0
  549. package/src/connections.ts +89 -0
  550. package/src/evals.ts +501 -0
  551. package/src/hooks.ts +33 -0
  552. package/src/index.ts +184 -0
  553. package/src/internal/ab-collector.ts +210 -0
  554. package/src/internal/ab-fold.ts +228 -0
  555. package/src/internal/ab-snapshot.ts +335 -0
  556. package/src/internal/approval-gate.ts +115 -0
  557. package/src/internal/auth.ts +39 -0
  558. package/src/internal/authored-alias-hooks.ts +69 -0
  559. package/src/internal/authored-loaders.ts +138 -0
  560. package/src/internal/bounded-int.ts +27 -0
  561. package/src/internal/brand.ts +29 -0
  562. package/src/internal/chat-client.ts +407 -0
  563. package/src/internal/cli-ax.ts +474 -0
  564. package/src/internal/cli-cursor.ts +275 -0
  565. package/src/internal/cli-github.ts +849 -0
  566. package/src/internal/cli-slack.ts +175 -0
  567. package/src/internal/cloud-merge.ts +41 -0
  568. package/src/internal/cron.ts +78 -0
  569. package/src/internal/cursor/account-mcp.ts +472 -0
  570. package/src/internal/cursor/backend-client.ts +614 -0
  571. package/src/internal/cursor/credentials.ts +401 -0
  572. package/src/internal/cursor-event-relay.ts +281 -0
  573. package/src/internal/cursor-relay-core.ts +444 -0
  574. package/src/internal/cursor-slack-relay.ts +242 -0
  575. package/src/internal/describe-error.ts +4 -0
  576. package/src/internal/dev-mode.ts +20 -0
  577. package/src/internal/discovery.ts +1709 -0
  578. package/src/internal/distribution.ts +97 -0
  579. package/src/internal/docs-site.ts +191 -0
  580. package/src/internal/duration.ts +39 -0
  581. package/src/internal/eval-run-store.ts +519 -0
  582. package/src/internal/eval-runner.ts +522 -0
  583. package/src/internal/event-log.ts +175 -0
  584. package/src/internal/event-mapper.ts +272 -0
  585. package/src/internal/frontmatter.ts +77 -0
  586. package/src/internal/github-fanout.ts +159 -0
  587. package/src/internal/handleAgentServeTrigger.ts +156 -0
  588. package/src/internal/host-platforms.ts +144 -0
  589. package/src/internal/http-channel.ts +546 -0
  590. package/src/internal/ids.ts +44 -0
  591. package/src/internal/init-project.ts +165 -0
  592. package/src/internal/json-dir-store.ts +109 -0
  593. package/src/internal/json-schema.ts +69 -0
  594. package/src/internal/log-ring.ts +59 -0
  595. package/src/internal/map-pool.ts +32 -0
  596. package/src/internal/mcp-endpoint.ts +518 -0
  597. package/src/internal/mcp-host.ts +211 -0
  598. package/src/internal/net.ts +31 -0
  599. package/src/internal/peer-connections.ts +100 -0
  600. package/src/internal/playground/static.ts +189 -0
  601. package/src/internal/playground/toolchain.ts +277 -0
  602. package/src/internal/reminder-runner.ts +756 -0
  603. package/src/internal/reminder-schedule.ts +106 -0
  604. package/src/internal/reminder-store.ts +145 -0
  605. package/src/internal/resolved-connections.ts +145 -0
  606. package/src/internal/review-comments.ts +268 -0
  607. package/src/internal/router.ts +145 -0
  608. package/src/internal/run-client.ts +320 -0
  609. package/src/internal/schedule-runner.ts +161 -0
  610. package/src/internal/sdk-runner.ts +315 -0
  611. package/src/internal/server.ts +1737 -0
  612. package/src/internal/session-engine.ts +1810 -0
  613. package/src/internal/session-store.ts +147 -0
  614. package/src/internal/session-urls.ts +40 -0
  615. package/src/internal/stream-progress.ts +254 -0
  616. package/src/internal/tool-result.ts +54 -0
  617. package/src/internal/trajectory.ts +306 -0
  618. package/src/internal/workspace.ts +223 -0
  619. package/src/reminders.ts +35 -0
  620. package/src/schedules.ts +37 -0
  621. package/src/skills.ts +27 -0
  622. package/src/tools.ts +127 -0
  623. package/src/types.ts +1848 -0
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Slack platform channel pack for agent-serve.
3
+ *
4
+ * ```ts
5
+ * import { slackChannel } from "@anysphere/agent-serve/channels/slack";
6
+ *
7
+ * // Single agent: SLACK_BOT_TOKEN + SLACK_APP_TOKEN
8
+ * export default slackChannel();
9
+ *
10
+ * // Multi-agent serve: one Slack app per agent
11
+ * export default slackChannel({ envPrefix: "MY_AGENT" });
12
+ * // → MY_AGENT_SLACK_BOT_TOKEN + MY_AGENT_SLACK_APP_TOKEN
13
+ *
14
+ * // No Slack app at all: ride the signed-in Cursor account's Slack
15
+ * // connection (`@Cursor <agent name> …` routes here; replies post as
16
+ * // this agent through the Cursor Slack app)
17
+ * export default slackChannel({ cursorAccount: true });
18
+ * ```
19
+ */
20
+
21
+ export * from "./api.js";
22
+ export * from "./approvals.js";
23
+ export * from "./assistant.js";
24
+ export * from "./auth.js";
25
+ export * from "./channel-watch.js";
26
+ export * from "./constants.js";
27
+ export * from "./credentials.js";
28
+ export * from "./cursor-account.js";
29
+ export * from "./defaults.js";
30
+ export * from "./dispatch.js";
31
+ export * from "./doctor.js";
32
+ export * from "./event-id-dedupe.js";
33
+ export * from "./inbound.js";
34
+ export * from "./init.js";
35
+ export * from "./interactive.js";
36
+ export * from "./links.js";
37
+ export * from "./log.js";
38
+ export * from "./manifest.js";
39
+ export * from "./pr-ref.js";
40
+ export * from "./setup.js";
41
+ export * from "./slack-channel.js";
42
+ export * from "./socket-mode.js";
43
+ export * from "./stream.js";
44
+ export * from "./tool-approval-events.js";
45
+ export * from "./types.js";
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Scaffold a Slack channel into an agent-serve project.
3
+ */
4
+
5
+ import { mkdir, writeFile } from "node:fs/promises";
6
+ import { basename, join, resolve } from "node:path";
7
+ import { envPrefixFromName, slackEnvKeys } from "./credentials.js";
8
+ import { buildSlackManifestPair } from "./manifest.js";
9
+
10
+ export interface InitSlackOptions {
11
+ dir: string;
12
+ /** Display name for the Slack app. Defaults to directory basename. */
13
+ name?: string;
14
+ description?: string;
15
+ /**
16
+ * Env prefix for tokens (`MY_AGENT` → `MY_AGENT_SLACK_BOT_TOKEN`). Defaults to
17
+ * the directory basename so multi-agent serve can mount several Slack bots.
18
+ * Pass `""` to use the shared `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` globals.
19
+ */
20
+ envPrefix?: string;
21
+ /**
22
+ * Subscribe the generated manifests to `message.channels` +
23
+ * `message.groups` for the opt-in channel watch
24
+ * (`engagement.channelPosts` on `slackChannel`).
25
+ */
26
+ channelPosts?: boolean;
27
+ }
28
+
29
+ export interface InitSlackResult {
30
+ rootDir: string;
31
+ files: string[];
32
+ envPrefix: string | undefined;
33
+ envKeys: { bot: string; app: string };
34
+ }
35
+
36
+ export async function initSlackChannel(
37
+ options: InitSlackOptions
38
+ ): Promise<InitSlackResult> {
39
+ const rootDir = resolve(options.dir);
40
+ const name = options.name ?? basename(rootDir);
41
+ const envPrefix =
42
+ options.envPrefix === ""
43
+ ? undefined
44
+ : (options.envPrefix ?? envPrefixFromName(basename(rootDir)));
45
+ const envKeys = slackEnvKeys(envPrefix);
46
+ const written: string[] = [];
47
+
48
+ const write = async (rel: string, contents: string): Promise<void> => {
49
+ const abs = join(rootDir, rel);
50
+ await mkdir(join(abs, ".."), { recursive: true });
51
+ await writeFile(abs, contents, { flag: "wx" });
52
+ written.push(rel);
53
+ };
54
+
55
+ const envPrefixLine =
56
+ envPrefix === undefined
57
+ ? ""
58
+ : ` envPrefix: ${JSON.stringify(envPrefix)},\n`;
59
+
60
+ await write(
61
+ "agent/channels/slack.ts",
62
+ `import { slackChannel } from "@anysphere/agent-serve/channels/slack";
63
+
64
+ /**
65
+ * Slack channel (Socket Mode).
66
+ *
67
+ * Tokens: ${envKeys.bot} + ${envKeys.app}
68
+ * (see .agent-serve/slack/env.example).
69
+ *
70
+ * Full setup: agent-serve slack setup
71
+ */
72
+ export default slackChannel({
73
+ ${envPrefixLine} // Streaming and thinking steps default to true.
74
+ suggestedPrompts: [
75
+ { title: "Help", message: "How can you help me?" },
76
+ { title: "Status", message: "What are you working on?" },
77
+ ],
78
+ });
79
+ `
80
+ );
81
+
82
+ const pair = buildSlackManifestPair({
83
+ name,
84
+ ...(options.description === undefined
85
+ ? {}
86
+ : { description: options.description }),
87
+ ...(options.channelPosts === true ? { channelPosts: true } : {}),
88
+ });
89
+
90
+ await write(
91
+ ".agent-serve/slack/manifest.dev.json",
92
+ `${JSON.stringify(pair.dev, null, 2)}\n`
93
+ );
94
+ await write(
95
+ ".agent-serve/slack/manifest.prod.json",
96
+ `${JSON.stringify(pair.prod, null, 2)}\n`
97
+ );
98
+
99
+ await write(
100
+ ".agent-serve/slack/env.example",
101
+ `# Copy to .env.local (or export in your shell). Use the *dev* Slack app
102
+ # for local development; use the Prod app tokens in deployment secrets.
103
+ #
104
+ # Multi-agent serve needs a distinct Slack app (and token pair) per agent.
105
+
106
+ ${envKeys.bot}=xoxb-...
107
+ ${envKeys.app}=xapp-...
108
+ `
109
+ );
110
+
111
+ await write(
112
+ ".agent-serve/slack/setup-status.json",
113
+ `${JSON.stringify(
114
+ {
115
+ updatedAt: new Date().toISOString(),
116
+ envPrefix: envPrefix ?? null,
117
+ envKeys,
118
+ phases: {
119
+ generate: true,
120
+ createApps: false,
121
+ install: false,
122
+ env: false,
123
+ serve: false,
124
+ smoke: false,
125
+ },
126
+ },
127
+ null,
128
+ 2
129
+ )}\n`
130
+ );
131
+
132
+ return { rootDir, files: written, envPrefix, envKeys };
133
+ }
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Socket Mode interactive payloads (Block Kit Approve/Deny).
3
+ */
4
+
5
+ import type {
6
+ ApprovalDecision,
7
+ AuthContext,
8
+ ChannelSession,
9
+ PendingApproval,
10
+ } from "../../types.js";
11
+ import { decisionFromActionId, parseApprovalActionValue } from "./approvals.js";
12
+ import { buildSlackInteractiveApprovalAuth } from "./auth.js";
13
+ import { defaultSlackLog, type SlackLog } from "./log.js";
14
+ import type { SlackCredentials } from "./types.js";
15
+
16
+ export interface SlackInteractiveDispatchDeps {
17
+ credentials: SlackCredentials | undefined;
18
+ getSession: (sessionId: string) => Promise<ChannelSession | null>;
19
+ resolveApproval: (
20
+ sessionId: string,
21
+ callId: string,
22
+ decision: ApprovalDecision,
23
+ auth: AuthContext | null
24
+ ) => Promise<PendingApproval>;
25
+ waitUntil: (promise: Promise<unknown>) => void;
26
+ log?: SlackLog;
27
+ }
28
+
29
+ /**
30
+ * Handle a Socket Mode `interactive` body. Returns true when this was
31
+ * an agent-serve approval action (handled or rejected with a reason).
32
+ */
33
+ export async function dispatchInteractiveFromPayload(
34
+ payload: unknown,
35
+ deps: SlackInteractiveDispatchDeps
36
+ ): Promise<boolean> {
37
+ const log = deps.log ?? defaultSlackLog;
38
+ const parsed = parseBlockActionsPayload(payload);
39
+ if (parsed === null) {
40
+ return false;
41
+ }
42
+
43
+ const decision = decisionFromActionId(parsed.actionId);
44
+ const value = parseApprovalActionValue(parsed.value);
45
+ if (decision === null || value === null) {
46
+ return false;
47
+ }
48
+
49
+ log.info("interactive approval", {
50
+ decision,
51
+ session: value.sessionId,
52
+ call_id: value.callId,
53
+ user: parsed.userId,
54
+ channel: parsed.channelId,
55
+ });
56
+
57
+ const session = await deps.getSession(value.sessionId);
58
+ if (session === null) {
59
+ log.warn("interactive approval: unknown session", {
60
+ session: value.sessionId,
61
+ });
62
+ return true;
63
+ }
64
+
65
+ const attrs = session.info.auth?.attributes ?? {};
66
+ const sessionChannel = attrs.channel_id ?? "";
67
+ const sessionThread = attrs.thread_ts ?? "";
68
+ if (
69
+ sessionChannel !== "" &&
70
+ parsed.channelId !== "" &&
71
+ sessionChannel !== parsed.channelId
72
+ ) {
73
+ log.warn("interactive approval: channel mismatch", {
74
+ session: value.sessionId,
75
+ expected: sessionChannel,
76
+ got: parsed.channelId,
77
+ });
78
+ return true;
79
+ }
80
+ if (
81
+ sessionThread !== "" &&
82
+ parsed.threadTs !== "" &&
83
+ sessionThread !== parsed.threadTs
84
+ ) {
85
+ log.warn("interactive approval: thread mismatch", {
86
+ session: value.sessionId,
87
+ expected: sessionThread,
88
+ got: parsed.threadTs,
89
+ });
90
+ return true;
91
+ }
92
+
93
+ const sessionAuth = session.info.auth;
94
+ if (sessionAuth === undefined || sessionAuth === null) {
95
+ log.warn("interactive approval: session has no auth", {
96
+ session: value.sessionId,
97
+ });
98
+ return true;
99
+ }
100
+
101
+ const teamId = attrs.team_id;
102
+ const clickingAuth = buildSlackInteractiveApprovalAuth({
103
+ sessionAuth,
104
+ channelId: parsed.channelId || sessionChannel,
105
+ threadTs: parsed.threadTs || sessionThread,
106
+ ...(teamId === undefined || teamId === "" ? {} : { teamId }),
107
+ clickingUserId: parsed.userId,
108
+ });
109
+
110
+ try {
111
+ await deps.resolveApproval(
112
+ value.sessionId,
113
+ value.callId,
114
+ decision,
115
+ clickingAuth
116
+ );
117
+ } catch (error) {
118
+ log.warn("interactive approval resolve failed", {
119
+ session: value.sessionId,
120
+ call_id: value.callId,
121
+ error: error instanceof Error ? error.message : String(error),
122
+ });
123
+ }
124
+ return true;
125
+ }
126
+
127
+ interface ParsedBlockAction {
128
+ actionId: string;
129
+ value: string;
130
+ channelId: string;
131
+ threadTs: string;
132
+ userId: string;
133
+ messageTs: string;
134
+ }
135
+
136
+ function parseBlockActionsPayload(payload: unknown): ParsedBlockAction | null {
137
+ if (typeof payload !== "object" || payload === null) {
138
+ return null;
139
+ }
140
+ const record = payload as Record<string, unknown>;
141
+ if (record.type !== "block_actions") {
142
+ return null;
143
+ }
144
+ const actions = record.actions;
145
+ if (!Array.isArray(actions) || actions.length === 0) {
146
+ return null;
147
+ }
148
+ const first = actions[0];
149
+ if (typeof first !== "object" || first === null) {
150
+ return null;
151
+ }
152
+ const action = first as Record<string, unknown>;
153
+ if (
154
+ typeof action.action_id !== "string" ||
155
+ typeof action.value !== "string"
156
+ ) {
157
+ return null;
158
+ }
159
+
160
+ const channel =
161
+ typeof record.channel === "object" && record.channel !== null
162
+ ? (record.channel as Record<string, unknown>)
163
+ : {};
164
+ const message =
165
+ typeof record.message === "object" && record.message !== null
166
+ ? (record.message as Record<string, unknown>)
167
+ : {};
168
+ const user =
169
+ typeof record.user === "object" && record.user !== null
170
+ ? (record.user as Record<string, unknown>)
171
+ : {};
172
+
173
+ const channelId = typeof channel.id === "string" ? channel.id : "";
174
+ const messageTs = typeof message.ts === "string" ? message.ts : "";
175
+ const threadTs =
176
+ typeof message.thread_ts === "string"
177
+ ? message.thread_ts
178
+ : typeof record.container === "object" &&
179
+ record.container !== null &&
180
+ typeof (record.container as { thread_ts?: unknown }).thread_ts ===
181
+ "string"
182
+ ? (record.container as { thread_ts: string }).thread_ts
183
+ : messageTs;
184
+ const userId = typeof user.id === "string" ? user.id : "";
185
+
186
+ return {
187
+ actionId: action.action_id,
188
+ value: action.value,
189
+ channelId,
190
+ threadTs,
191
+ userId,
192
+ messageTs,
193
+ };
194
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Slack deep links for threads / messages.
3
+ */
4
+
5
+ /** Build a web permalink that opens a Slack thread in the browser. */
6
+ export function slackThreadPermalink(args: {
7
+ channelId: string;
8
+ threadTs: string;
9
+ teamId?: string;
10
+ }): string | null {
11
+ const channelId = args.channelId.trim();
12
+ const threadTs = args.threadTs.trim();
13
+ if (channelId === "" || threadTs === "") {
14
+ return null;
15
+ }
16
+ const teamId = args.teamId?.trim();
17
+ if (teamId !== undefined && teamId !== "" && teamId !== "unknown") {
18
+ // Client deep link opens the thread pane in the right workspace.
19
+ return `https://app.slack.com/client/${encodeURIComponent(teamId)}/${encodeURIComponent(channelId)}/thread/${encodeURIComponent(channelId)}-${encodeURIComponent(threadTs)}`;
20
+ }
21
+ const pTs = `p${threadTs.replace(".", "")}`;
22
+ return `https://app.slack.com/archives/${encodeURIComponent(channelId)}/${pTs}?thread_ts=${encodeURIComponent(threadTs)}`;
23
+ }
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Live-reply delivery for Slack `chat.startStream` / append / stop.
3
+ *
4
+ * Cursor-account channels do not use this path — they reply with a single
5
+ * final `chat.postMessage` and put thinking on `assistant.threads.setStatus`
6
+ * (no message edits).
7
+ */
8
+
9
+ import type { ChannelEventContext } from "../../types.js";
10
+ import { appendChatStream, startChatStream, stopChatStream } from "./api.js";
11
+ import type { SlackLog } from "./log.js";
12
+ import { computeStreamAppend } from "./stream.js";
13
+ import type { SlackBotToken, SlackChannelState } from "./types.js";
14
+
15
+ type SlackChannel = ChannelEventContext<SlackChannelState>;
16
+
17
+ export interface LiveDeliveryDeps {
18
+ botToken: SlackBotToken | undefined;
19
+ getLog: () => SlackLog;
20
+ }
21
+
22
+ /**
23
+ * How the default handlers deliver an in-progress reply. Methods write live
24
+ * delivery state (`streamTs`, `streamChannelId`, `lastPostedText`,
25
+ * `streamingUnavailable`) on `channel.state` directly.
26
+ */
27
+ export interface LiveDeliveryStrategy {
28
+ /** True when tool-call thinking steps can be appended to the live message. */
29
+ readonly inlineToolSteps: boolean;
30
+ /** Open the live message (stream start). */
31
+ start(args: {
32
+ channel: SlackChannel;
33
+ channelId: string;
34
+ threadTs: string;
35
+ sessionId: string;
36
+ }): Promise<void>;
37
+ /** Push the latest cumulative text to the live message (throttled). */
38
+ append(args: {
39
+ channel: SlackChannel;
40
+ channelId: string;
41
+ streamTs: string;
42
+ text: string;
43
+ sessionId: string;
44
+ }): Promise<void>;
45
+ /**
46
+ * Flush the final reply text. `delivered` is false only when the caller must
47
+ * post the full reply as a fresh message (finalize failed on partial text).
48
+ */
49
+ finalize(args: {
50
+ channel: SlackChannel;
51
+ channelId: string;
52
+ streamTs: string;
53
+ text: string;
54
+ sessionId: string;
55
+ }): Promise<{ delivered: boolean }>;
56
+ /** Close the live message when the turn produced no final text. */
57
+ finalizeEmpty(args: {
58
+ channel: SlackChannel;
59
+ channelId: string;
60
+ streamTs: string;
61
+ }): Promise<void>;
62
+ /** Best-effort remove a live message left open after the turn ended. */
63
+ cleanupOrphan(args: { channel: SlackChannel }): Promise<void>;
64
+ /** Deliver the error text into the live message; `delivered` gates a fallback post. */
65
+ fail(args: {
66
+ channel: SlackChannel;
67
+ channelId: string;
68
+ streamTs: string;
69
+ errorText: string;
70
+ sessionId: string;
71
+ }): Promise<{ delivered: boolean }>;
72
+ }
73
+
74
+ export function createStreamDeliveryStrategy(
75
+ deps: LiveDeliveryDeps
76
+ ): LiveDeliveryStrategy {
77
+ const { botToken, getLog } = deps;
78
+ return {
79
+ inlineToolSteps: true,
80
+
81
+ async start({ channel, channelId, threadTs, sessionId }) {
82
+ const log = getLog();
83
+ const started = await startChatStream({
84
+ botToken,
85
+ channel: channelId,
86
+ thread_ts: threadTs,
87
+ markdown_text: "",
88
+ });
89
+ if (!started.ok) {
90
+ log.warn("chat.startStream unavailable", {
91
+ error: started.error,
92
+ channel: channelId,
93
+ thread_ts: threadTs,
94
+ session: sessionId,
95
+ });
96
+ if (started.unsupported === true) {
97
+ channel.state.streamingUnavailable = true;
98
+ }
99
+ return;
100
+ }
101
+ channel.state.streamTs = started.ts;
102
+ channel.state.streamChannelId = started.channel;
103
+ channel.state.lastPostedText = "";
104
+ log.info("chat.startStream ok", {
105
+ channel: started.channel,
106
+ stream_ts: started.ts,
107
+ session: sessionId,
108
+ });
109
+ },
110
+
111
+ async append({ channel, channelId, streamTs, text, sessionId }) {
112
+ const appendText = computeStreamAppend(
113
+ channel.state.lastPostedText,
114
+ text
115
+ );
116
+ if (appendText === "") {
117
+ return;
118
+ }
119
+ const result = await appendChatStream({
120
+ botToken,
121
+ channel: channelId,
122
+ ts: streamTs,
123
+ markdown_text: appendText,
124
+ });
125
+ if (!result.ok) {
126
+ getLog().warn("appendStream failed", {
127
+ error: result.error,
128
+ channel: channelId,
129
+ stream_ts: streamTs,
130
+ session: sessionId,
131
+ });
132
+ if (result.unsupported === true) {
133
+ channel.state.streamingUnavailable = true;
134
+ }
135
+ return;
136
+ }
137
+ channel.state.lastPostedText = text;
138
+ },
139
+
140
+ async finalize({ channel, channelId, streamTs, text, sessionId }) {
141
+ const log = getLog();
142
+ // Only send the unsent suffix — full text was already appended.
143
+ const appendText = computeStreamAppend(
144
+ channel.state.lastPostedText,
145
+ text
146
+ );
147
+ const stopped = await stopChatStream({
148
+ botToken,
149
+ channel: channelId,
150
+ ts: streamTs,
151
+ markdown_text: appendText === "" ? undefined : appendText,
152
+ });
153
+ if (stopped.ok) {
154
+ channel.state.streamTs = null;
155
+ channel.state.lastPostedText = text;
156
+ log.info("reply delivered via stream", {
157
+ channel: channelId,
158
+ stream_ts: streamTs,
159
+ session: sessionId,
160
+ chars: text.length,
161
+ });
162
+ return { delivered: true };
163
+ }
164
+ log.warn("chat.stopStream failed; falling back to postMessage", {
165
+ error: stopped.error,
166
+ channel: channelId,
167
+ stream_ts: streamTs,
168
+ session: sessionId,
169
+ });
170
+ if (stopped.unsupported === true) {
171
+ channel.state.streamingUnavailable = true;
172
+ }
173
+ channel.state.streamTs = null;
174
+ // If we already streamed content, do not post the full reply again.
175
+ const alreadyStreamed =
176
+ typeof channel.state.lastPostedText === "string" &&
177
+ channel.state.lastPostedText.length > 0;
178
+ return { delivered: alreadyStreamed };
179
+ },
180
+
181
+ async finalizeEmpty({ channelId, streamTs }) {
182
+ await stopChatStream({ botToken, channel: channelId, ts: streamTs });
183
+ },
184
+
185
+ async cleanupOrphan() {
186
+ // The stream path closes its message in message.completed / turn.failed;
187
+ // there is nothing to clean up after turn.completed.
188
+ },
189
+
190
+ async fail({ channel, channelId, streamTs, errorText }) {
191
+ const stopped = await stopChatStream({
192
+ botToken,
193
+ channel: channelId,
194
+ ts: streamTs,
195
+ markdown_text: errorText,
196
+ });
197
+ channel.state.streamTs = null;
198
+ return { delivered: stopped.ok };
199
+ },
200
+ };
201
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Shared logging for the Slack channel pack.
3
+ *
4
+ * Uses the same `(line: string) => void` contract as ServeOptions.logger.
5
+ * Lines always start with `[agent-serve/slack]` so Socket Mode docs and greps
6
+ * keep working. Optional key=value fields carry correlation ids.
7
+ */
8
+
9
+ export type SlackLogWrite = (line: string) => void;
10
+
11
+ export type SlackLogLevel = "debug" | "info" | "warn" | "error";
12
+
13
+ export type SlackLogFields = Record<
14
+ string,
15
+ string | number | boolean | null | undefined
16
+ >;
17
+
18
+ export interface SlackLog {
19
+ /** Raw sink used by Socket Mode (already-prefixed lines ok). */
20
+ write: SlackLogWrite;
21
+ debug: (message: string, fields?: SlackLogFields) => void;
22
+ info: (message: string, fields?: SlackLogFields) => void;
23
+ warn: (message: string, fields?: SlackLogFields) => void;
24
+ error: (message: string, fields?: SlackLogFields) => void;
25
+ }
26
+
27
+ /** Format `key=value` pairs; omit null/undefined. */
28
+ export function formatSlackLogFields(fields?: SlackLogFields): string {
29
+ if (fields === undefined) {
30
+ return "";
31
+ }
32
+ const parts: string[] = [];
33
+ for (const [key, value] of Object.entries(fields)) {
34
+ if (value === undefined || value === null) {
35
+ continue;
36
+ }
37
+ const rendered =
38
+ typeof value === "string" && /[\s=]/.test(value)
39
+ ? JSON.stringify(value)
40
+ : String(value);
41
+ parts.push(`${key}=${rendered}`);
42
+ }
43
+ return parts.length === 0 ? "" : ` ${parts.join(" ")}`;
44
+ }
45
+
46
+ export function formatSlackLogLine(
47
+ level: SlackLogLevel,
48
+ message: string,
49
+ fields?: SlackLogFields
50
+ ): string {
51
+ const levelTag = level === "info" ? "" : `${level} `;
52
+ return `[agent-serve/slack] ${levelTag}${message}${formatSlackLogFields(fields)}`;
53
+ }
54
+
55
+ export function createSlackLogger(
56
+ write: SlackLogWrite = (line) => console.log(line)
57
+ ): SlackLog {
58
+ const emit = (
59
+ level: SlackLogLevel,
60
+ message: string,
61
+ fields?: SlackLogFields
62
+ ): void => {
63
+ write(formatSlackLogLine(level, message, fields));
64
+ };
65
+
66
+ return {
67
+ write(line: string): void {
68
+ // Preserve Socket Mode messages that already include the prefix.
69
+ write(
70
+ line.startsWith("[agent-serve/slack]")
71
+ ? line
72
+ : `[agent-serve/slack] ${line}`
73
+ );
74
+ },
75
+ debug: (message, fields) => emit("debug", message, fields),
76
+ info: (message, fields) => emit("info", message, fields),
77
+ warn: (message, fields) => emit("warn", message, fields),
78
+ error: (message, fields) => emit("error", message, fields),
79
+ };
80
+ }
81
+
82
+ /** Default logger when none is injected (console). */
83
+ export const defaultSlackLog: SlackLog = createSlackLogger();