@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,154 @@
1
+ /**
2
+ * Slack Socket Mode via `@slack/socket-mode`.
3
+ *
4
+ * Thin wrapper: ACK envelopes immediately, then forward Events API
5
+ * payloads to the channel pack. Reconnect is handled by the SDK.
6
+ */
7
+
8
+ import { type Logger, LogLevel, SocketModeClient } from "@slack/socket-mode";
9
+
10
+ export interface SlackSocketModeOptions {
11
+ appToken: string;
12
+ /** Events API payloads (`type: events_api` envelope body). */
13
+ onEvent: (payload: unknown) => void | Promise<void>;
14
+ /**
15
+ * Interactive payloads (`type: interactive` — Block Kit actions).
16
+ * When omitted, interactive envelopes are ACKed and ignored.
17
+ */
18
+ onInteractive?: (payload: unknown) => void | Promise<void>;
19
+ logger?: (line: string) => void;
20
+ }
21
+
22
+ export interface SlackSocketModeHandle {
23
+ stop(): void | Promise<void>;
24
+ }
25
+
26
+ function createBridgeLogger(write: (line: string) => void): Logger {
27
+ let level: LogLevel = LogLevel.INFO;
28
+ const rank: Record<LogLevel, number> = {
29
+ [LogLevel.ERROR]: 0,
30
+ [LogLevel.WARN]: 1,
31
+ [LogLevel.INFO]: 2,
32
+ [LogLevel.DEBUG]: 3,
33
+ };
34
+ const emit = (msgLevel: LogLevel, msgs: unknown[]): void => {
35
+ if (rank[msgLevel] > rank[level]) {
36
+ return;
37
+ }
38
+ const text = msgs
39
+ .map((m) => (typeof m === "string" ? m : JSON.stringify(m)))
40
+ .join(" ");
41
+ write(`[agent-serve/slack] Socket Mode ${text}`);
42
+ };
43
+ return {
44
+ debug: (...msgs) => emit(LogLevel.DEBUG, msgs),
45
+ info: (...msgs) => emit(LogLevel.INFO, msgs),
46
+ warn: (...msgs) => emit(LogLevel.WARN, msgs),
47
+ error: (...msgs) => emit(LogLevel.ERROR, msgs),
48
+ setLevel(next) {
49
+ level = next;
50
+ },
51
+ getLevel: () => level,
52
+ setName() {
53
+ // Name is unused; agent-serve prefixes lines itself.
54
+ },
55
+ };
56
+ }
57
+
58
+ function invokeHandler(
59
+ log: (line: string) => void,
60
+ label: string,
61
+ handler: (payload: unknown) => void | Promise<void>,
62
+ payload: unknown
63
+ ): void {
64
+ try {
65
+ const result = handler(payload);
66
+ if (
67
+ result !== undefined &&
68
+ typeof (result as Promise<void>).then === "function"
69
+ ) {
70
+ void Promise.resolve(result).catch((error) => {
71
+ log(
72
+ `[agent-serve/slack] Socket Mode ${label} failed: ${errorMessage(error)}`
73
+ );
74
+ });
75
+ }
76
+ } catch (error) {
77
+ log(
78
+ `[agent-serve/slack] Socket Mode ${label} failed: ${errorMessage(error)}`
79
+ );
80
+ }
81
+ }
82
+
83
+ function errorMessage(error: unknown): string {
84
+ return error instanceof Error ? error.message : String(error);
85
+ }
86
+
87
+ /**
88
+ * Start a Socket Mode connection. Call `stop()` to tear down.
89
+ * Resolves once the first WebSocket session is connected.
90
+ */
91
+ export async function startSlackSocketMode(
92
+ options: SlackSocketModeOptions
93
+ ): Promise<SlackSocketModeHandle> {
94
+ const write = options.logger ?? ((line: string) => console.log(line));
95
+ const client = new SocketModeClient({
96
+ appToken: options.appToken,
97
+ logger: createBridgeLogger(write),
98
+ logLevel: LogLevel.INFO,
99
+ autoReconnectEnabled: true,
100
+ });
101
+
102
+ client.on("connected", () => {
103
+ write("[agent-serve/slack] Socket Mode connected");
104
+ });
105
+ client.on("reconnecting", () => {
106
+ write("[agent-serve/slack] Socket Mode reconnecting");
107
+ });
108
+ client.on("disconnected", () => {
109
+ write("[agent-serve/slack] Socket Mode disconnected");
110
+ });
111
+
112
+ client.on(
113
+ "slack_event",
114
+ (evt: {
115
+ type?: string;
116
+ body?: unknown;
117
+ ack: (response?: Record<string, unknown>) => Promise<void>;
118
+ }) => {
119
+ // ACK immediately (3s envelope budget); then dispatch off-path.
120
+ void Promise.resolve(evt.ack()).catch((error: unknown) => {
121
+ write(
122
+ `[agent-serve/slack] Socket Mode ACK failed: ${errorMessage(error)}`
123
+ );
124
+ });
125
+
126
+ if (evt.type === "events_api") {
127
+ if (evt.body !== undefined) {
128
+ invokeHandler(write, "onEvent", options.onEvent, evt.body);
129
+ }
130
+ return;
131
+ }
132
+ if (evt.type === "interactive") {
133
+ if (evt.body !== undefined && options.onInteractive !== undefined) {
134
+ invokeHandler(
135
+ write,
136
+ "onInteractive",
137
+ options.onInteractive,
138
+ evt.body
139
+ );
140
+ }
141
+ return;
142
+ }
143
+ }
144
+ );
145
+
146
+ await client.start();
147
+
148
+ return {
149
+ async stop() {
150
+ await client.disconnect();
151
+ write("[agent-serve/slack] Socket Mode stopped");
152
+ },
153
+ };
154
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Chat streaming helpers for Slack AI / agent features.
3
+ */
4
+
5
+ export type StreamTaskStatus = "pending" | "in_progress" | "complete" | "error";
6
+
7
+ export interface StreamTaskChunk {
8
+ type: "task_update";
9
+ id: string;
10
+ title: string;
11
+ status: StreamTaskStatus;
12
+ }
13
+
14
+ /**
15
+ * Given previously sent cumulative text and the new cumulative text, return
16
+ * the suffix to append. Empty string when there is nothing new to send.
17
+ */
18
+ export function computeStreamAppend(
19
+ lastPostedText: string | null | undefined,
20
+ cumulative: string
21
+ ): string {
22
+ if (cumulative === "") {
23
+ return "";
24
+ }
25
+ if (
26
+ lastPostedText === null ||
27
+ lastPostedText === undefined ||
28
+ lastPostedText === ""
29
+ ) {
30
+ return cumulative;
31
+ }
32
+ if (cumulative.startsWith(lastPostedText)) {
33
+ return cumulative.slice(lastPostedText.length);
34
+ }
35
+ // Text rewound / rewritten — cannot unsend; skip append.
36
+ return "";
37
+ }
38
+
39
+ /** Build task_update chunks for tool calls. */
40
+ export function buildTaskChunksForCalls(
41
+ calls: Array<{ callId: string; toolName: string }>,
42
+ status: StreamTaskStatus
43
+ ): StreamTaskChunk[] {
44
+ return calls.map((call) => ({
45
+ type: "task_update" as const,
46
+ id: call.callId,
47
+ title: call.toolName,
48
+ status,
49
+ }));
50
+ }
51
+
52
+ export function buildTaskChunkForResult(args: {
53
+ callId: string;
54
+ toolName: string;
55
+ isError: boolean;
56
+ }): StreamTaskChunk {
57
+ return {
58
+ type: "task_update",
59
+ id: args.callId,
60
+ title: args.toolName,
61
+ status: args.isError ? "error" : "complete",
62
+ };
63
+ }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Slack surface for human-in-the-loop tool approvals.
3
+ *
4
+ * Or compose with {@link buildDefaultEvents} (or your own handlers). When
5
+ * composing by hand, also set `slackChannel({ interactivity: true })` (or
6
+ * `toolApprovals: true`) so Socket Mode routes Approve/Deny clicks —
7
+ * otherwise cards post but button presses are ACKed and ignored:
8
+ *
9
+ * ```ts
10
+ * events: {
11
+ * ...buildDefaultEvents({ credentials }),
12
+ * ...buildToolApprovalEvents({ credentials }),
13
+ * }
14
+ * ```
15
+ *
16
+ * Or opt in via `slackChannel({ toolApprovals: true })`.
17
+ * Park/resume itself is the framework HITL primitive (`needsApproval`);
18
+ * this pack only delivers Approve/Deny in Slack.
19
+ */
20
+
21
+ import type { ChannelEventHandlers } from "../../types.js";
22
+ import { postMessage, setThreadStatus, updateMessage } from "./api.js";
23
+ import {
24
+ buildApprovalBlocks,
25
+ buildResolvedApprovalBlocks,
26
+ } from "./approvals.js";
27
+ import { SLACK_DEFAULT_LOADING_MESSAGES } from "./constants.js";
28
+ import { defaultSlackLog, type SlackLog } from "./log.js";
29
+ import type { SlackChannelState, SlackCredentials } from "./types.js";
30
+
31
+ export interface BuildToolApprovalEventsOptions {
32
+ credentials?: SlackCredentials;
33
+ /** Resolved per-call so channel onStart can rebind the server logger. */
34
+ getLog?: () => SlackLog;
35
+ }
36
+
37
+ /**
38
+ * Stream-event handlers that post Block Kit Approve/Deny cards and
39
+ * update them when approval is resolved (HTTP, playground, or Slack).
40
+ */
41
+ export function buildToolApprovalEvents(
42
+ options: BuildToolApprovalEventsOptions = {}
43
+ ): ChannelEventHandlers<SlackChannelState> {
44
+ const botToken = options.credentials?.botToken;
45
+ const getLog = options.getLog ?? (() => defaultSlackLog);
46
+
47
+ return {
48
+ async "action.approval_requested"(event, channel, ctx) {
49
+ const log = getLog();
50
+ const state = channel.state;
51
+ if (state.channelId === null || state.threadTs === null) {
52
+ return;
53
+ }
54
+ const blocks = buildApprovalBlocks({
55
+ sessionId: ctx.session.id,
56
+ callId: event.data.callId,
57
+ toolName: event.data.toolName,
58
+ args: event.data.args,
59
+ });
60
+ try {
61
+ const posted = await postMessage({
62
+ botToken,
63
+ channel: state.channelId,
64
+ threadTs: state.threadTs,
65
+ text: `Approval required for \`${event.data.toolName}\``,
66
+ blocks,
67
+ });
68
+ channel.state.approvalMessageByCallId = {
69
+ ...(state.approvalMessageByCallId ?? {}),
70
+ [event.data.callId]: posted.ts,
71
+ };
72
+ await setThreadStatus({
73
+ botToken,
74
+ channelId: state.channelId,
75
+ threadTs: state.threadTs,
76
+ status: "Awaiting approval…",
77
+ loadingMessages: [
78
+ "Awaiting approval…",
79
+ ...SLACK_DEFAULT_LOADING_MESSAGES,
80
+ ],
81
+ });
82
+ log.info("approval card posted", {
83
+ call_id: event.data.callId,
84
+ tool: event.data.toolName,
85
+ message_ts: posted.ts,
86
+ });
87
+ } catch (error) {
88
+ log.warn("approval card post failed", {
89
+ call_id: event.data.callId,
90
+ error: error instanceof Error ? error.message : String(error),
91
+ });
92
+ }
93
+ },
94
+
95
+ async "action.approval_resolved"(event, channel) {
96
+ const log = getLog();
97
+ const state = channel.state;
98
+ const messageTs = state.approvalMessageByCallId?.[event.data.callId];
99
+ if (
100
+ state.channelId !== null &&
101
+ messageTs !== undefined &&
102
+ messageTs !== ""
103
+ ) {
104
+ const blocks = buildResolvedApprovalBlocks({
105
+ toolName: event.data.toolName,
106
+ decision: event.data.decision,
107
+ ...(event.data.by === undefined ? {} : { byUserId: event.data.by }),
108
+ });
109
+ const verb = event.data.decision === "approve" ? "Approved" : "Denied";
110
+ await updateMessage({
111
+ botToken,
112
+ channel: state.channelId,
113
+ ts: messageTs,
114
+ text: `${verb} — ${event.data.toolName}`,
115
+ blocks,
116
+ });
117
+ const next = { ...(state.approvalMessageByCallId ?? {}) };
118
+ delete next[event.data.callId];
119
+ channel.state.approvalMessageByCallId = next;
120
+ }
121
+ if (state.channelId !== null && state.threadTs !== null) {
122
+ await setThreadStatus({
123
+ botToken,
124
+ channelId: state.channelId,
125
+ threadTs: state.threadTs,
126
+ status: "Working…",
127
+ loadingMessages: [...SLACK_DEFAULT_LOADING_MESSAGES],
128
+ });
129
+ }
130
+ log.info("approval resolved in slack", {
131
+ call_id: event.data.callId,
132
+ decision: event.data.decision,
133
+ });
134
+ },
135
+ };
136
+ }
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Types for the Slack platform channel pack.
3
+ */
4
+
5
+ import type {
6
+ AgentCloudOptions,
7
+ AuthContext,
8
+ ChannelEventHandlers,
9
+ HostContext,
10
+ } from "../../types.js";
11
+
12
+ /**
13
+ * Pluggable Slack Web API caller. Instead of holding a raw `xoxb-…` token,
14
+ * calls are executed by `call` — e.g. proxied through the Cursor backend
15
+ * with the signed-in account's Slack connection (`cursorAccount: true`).
16
+ * Implementations return the Slack response body (including `ok: false`
17
+ * platform errors) and only throw on programmer error.
18
+ */
19
+ export interface SlackApiTransport {
20
+ kind: "api-transport";
21
+ /** Human-readable transport label for logs (e.g. `cursor-account`). */
22
+ label: string;
23
+ call(
24
+ method: string,
25
+ args: Record<string, unknown>
26
+ ): Promise<Record<string, unknown>>;
27
+ }
28
+
29
+ /** Bot token as a string, a (possibly async) resolver, or an API transport. */
30
+ export type SlackBotToken =
31
+ | string
32
+ | (() => string | Promise<string>)
33
+ | SlackApiTransport;
34
+
35
+ export interface SlackCredentials {
36
+ /**
37
+ * Bot user OAuth token (`xoxb-…`), or a {@link SlackApiTransport} that
38
+ * executes Web API calls without a local token. When omitted, falls back
39
+ * to `SLACK_BOT_TOKEN` (or `{envPrefix}_SLACK_BOT_TOKEN` via
40
+ * {@link SlackChannelOptions.envPrefix}).
41
+ */
42
+ botToken?: SlackBotToken;
43
+ /**
44
+ * App-level token (`xapp-…`) for Socket Mode. Requires scope
45
+ * `connections:write`. Same fallback rules as `botToken`.
46
+ */
47
+ appToken?: string | (() => string | Promise<string>);
48
+ }
49
+
50
+ /** Per-session Slack adapter state. */
51
+ export interface SlackChannelState {
52
+ channelId: string | null;
53
+ threadTs: string | null;
54
+ teamId: string | null;
55
+ triggeringUserId: string | null;
56
+ pendingToolCallMessage: string | null;
57
+ lastReasoningTypingAtMs: number | null;
58
+ lastReasoningTypingStatus: string | null;
59
+ /** Active chat stream message ts (`chat.startStream`). */
60
+ streamTs: string | null;
61
+ /** Channel id used when the stream was started. */
62
+ streamChannelId?: string | null;
63
+ /** Last cumulative text sent via appendStream (for incremental append). */
64
+ lastPostedText?: string | null;
65
+ /**
66
+ * When true, stream APIs failed for this session — use postMessage
67
+ * for the rest of the turn.
68
+ */
69
+ streamingUnavailable?: boolean;
70
+ /**
71
+ * Message ts of approval cards keyed by tool call id (for
72
+ * replacing Approve/Deny buttons after a decision).
73
+ */
74
+ approvalMessageByCallId?: Record<string, string>;
75
+ }
76
+
77
+ export interface SlackAuthor {
78
+ userId: string;
79
+ userName?: string;
80
+ isBot: boolean;
81
+ }
82
+
83
+ export interface SlackMessage {
84
+ text: string;
85
+ /** Text roughly suitable for the model (mention markers cleaned). */
86
+ markdown: string;
87
+ ts: string;
88
+ threadTs: string;
89
+ channelId: string;
90
+ teamId?: string;
91
+ author?: SlackAuthor;
92
+ }
93
+
94
+ export interface SlackDispatchDecision {
95
+ auth: AuthContext | null;
96
+ /** Extra context blocks injected alongside the default Slack context. */
97
+ context?: string[];
98
+ /**
99
+ * Override the user prompt sent to the model. When omitted, uses the Slack
100
+ * message markdown (plus context blocks). Host-prepared reviews can pass
101
+ * a short "read pr.txt" prompt here.
102
+ */
103
+ message?: string;
104
+ /**
105
+ * Absolute directory used as the local harness `cwd` for this session
106
+ * (new sessions only).
107
+ */
108
+ workspaceDir?: string;
109
+ /**
110
+ * Relative path → contents written into the session workspace before the
111
+ * first turn (new sessions only). Prefer this for host-prepared files like
112
+ * `pr.txt` so default skill materialization stays on the session cwd.
113
+ */
114
+ workspaceFiles?: Record<string, string>;
115
+ /** Session display title (new sessions only). */
116
+ title?: string;
117
+ /**
118
+ * Per-session cloud options (new sessions only). Use this to attach a PR to
119
+ * a cloud agent from an inbound Slack mention.
120
+ */
121
+ cloud?: AgentCloudOptions;
122
+ /**
123
+ * Seed the Cursor SDK agent id for a new session (ignored when the thread
124
+ * already has one). Lets a handler reattach a Slack thread to an existing
125
+ * cloud conversation (e.g. per-PR `bc-…` affinity).
126
+ */
127
+ sdkAgentId?: string;
128
+ }
129
+
130
+ export interface SlackSuggestedPrompt {
131
+ title: string;
132
+ message: string;
133
+ }
134
+
135
+ export interface SlackThreadHandle {
136
+ post(text: string, options?: { blocks?: unknown[] }): Promise<{ ts: string }>;
137
+ startTyping(status: string, loadingMessages?: string[]): Promise<void>;
138
+ setTitle(title: string): Promise<void>;
139
+ setSuggestedPrompts(
140
+ prompts: SlackSuggestedPrompt[],
141
+ title?: string
142
+ ): Promise<void>;
143
+ }
144
+
145
+ export interface SlackBinding {
146
+ thread: SlackThreadHandle;
147
+ slack: {
148
+ channelId: string;
149
+ threadTs: string;
150
+ teamId?: string;
151
+ };
152
+ /** Shared host services (MCP / GitHub / Slack). */
153
+ host: HostContext;
154
+ }
155
+
156
+ export type SlackMessageHandler = (
157
+ ctx: SlackBinding,
158
+ message: SlackMessage
159
+ ) =>
160
+ | SlackDispatchDecision
161
+ | null
162
+ | undefined
163
+ | Promise<SlackDispatchDecision | null | undefined>;
164
+
165
+ /**
166
+ * Opt-in channel watch: dispatch on posts in explicitly allowlisted
167
+ * channels without requiring an @mention. There is deliberately no
168
+ * "every channel the bot is in" wildcard — watching a channel is a
169
+ * per-channel decision.
170
+ */
171
+ export interface SlackChannelPostsOptions {
172
+ /**
173
+ * Channels to watch: ids (`C…` / `G…`) or `#names`. Must be non-empty
174
+ * (empty is a definition error). `#names` are resolved to ids via
175
+ * `conversations.list` when the channel starts; the bot must be a member
176
+ * of each watched channel to receive its messages. Socket Mode only —
177
+ * `cursorAccount: true` rejects `engagement.channelPosts`.
178
+ */
179
+ allow: string[];
180
+ /**
181
+ * Which posts dispatch. `"top-level"` (default) fires only on new
182
+ * channel posts — never on replies inside other people's threads, so the
183
+ * agent can take fresh intake but cannot barge into conversations.
184
+ * `"all"` also dispatches thread replies (Socket Mode only).
185
+ */
186
+ posts?: "top-level" | "all";
187
+ /**
188
+ * Delay dispatch by this many milliseconds so rapid edits settle first.
189
+ * Edits during the window update the dispatched text; deleting the post
190
+ * cancels the dispatch. Defaults to `0` (immediate). Socket Mode only —
191
+ * the Cursor relay does not deliver edits/deletes.
192
+ */
193
+ debounceMs?: number;
194
+ }
195
+
196
+ /**
197
+ * How the agent engages over Slack. Omitted entirely = mentions + DMs,
198
+ * which is also the default for each flag — summoned, never proactive.
199
+ */
200
+ export interface SlackEngagementOptions {
201
+ /** Dispatch on `app_mention`. Defaults to `true`. */
202
+ mentions?: boolean;
203
+ /** Dispatch on direct messages (`message.im`). Defaults to `true`. */
204
+ directMessages?: boolean;
205
+ /**
206
+ * Opt-in channel watch (see {@link SlackChannelPostsOptions}). Requires
207
+ * the Slack app to subscribe to `message.channels` / `message.groups`
208
+ * (`slack init --channel-posts`, or add the events to an existing app).
209
+ */
210
+ channelPosts?: SlackChannelPostsOptions;
211
+ }
212
+
213
+ export interface SlackChannelOptions {
214
+ credentials?: SlackCredentials;
215
+ /**
216
+ * Per-agent env prefix for tokens. `envPrefix: "MY_AGENT"` reads
217
+ * `MY_AGENT_SLACK_BOT_TOKEN` + `MY_AGENT_SLACK_APP_TOKEN`. Prefer this over
218
+ * shared `SLACK_*` vars when serving multiple agents in one process.
219
+ * Ignored when `credentials` is set explicitly.
220
+ */
221
+ envPrefix?: string;
222
+ /**
223
+ * Use the signed-in Cursor account's Slack connection instead of a
224
+ * dedicated Slack app: no bot/app tokens, no extra install. Inbound
225
+ * traffic (`@Cursor <agent name> …` mentions, replies in threads the
226
+ * agent owns, and DMs) is relayed from the Cursor backend
227
+ * (`/v0/slack-events`), and outbound Web API calls are proxied through it
228
+ * — the agent posts as the Cursor Slack app with this agent's name and
229
+ * icon.
230
+ *
231
+ * Both paths stay first-class: omit this (default) for the classic
232
+ * Socket-Mode channel with your own Slack app and tokens. Requires a
233
+ * signed-in host (`agent-serve login` / `CURSOR_API_KEY`) and a Slack
234
+ * account linked to the Cursor account. Mutually exclusive with
235
+ * `credentials` / `envPrefix`. `engagement.mentions: false` and
236
+ * `engagement.directMessages: false` are rejected (the relay always
237
+ * carries that traffic). Channel watching (`engagement.channelPosts`) and
238
+ * tool approvals / interactivity (`toolApprovals` / `interactivity`) are
239
+ * Socket Mode only — not supported on cursorAccount; agents must be
240
+ * explicitly addressed, and Approve/Deny buttons need a dedicated Slack
241
+ * app.
242
+ */
243
+ cursorAccount?: boolean;
244
+ /**
245
+ * Display name registered with the Cursor backend when
246
+ * {@link cursorAccount} is on: `@Cursor <agentName> …` routes here, and
247
+ * replies post under this username. Defaults to a name derived from the
248
+ * agent's mount slug (or project name).
249
+ */
250
+ agentName?: string;
251
+ /** Avatar for posts when {@link cursorAccount} is on. */
252
+ agentIcon?: { url?: string; emoji?: string };
253
+ /**
254
+ * Optional log sink. When omitted, uses `console.log` until the server
255
+ * mounts the channel and rebinds to {@link ServeOptions.logger}.
256
+ */
257
+ logger?: (line: string) => void;
258
+ /**
259
+ * Engagement surface. Defaults to mentions + DMs only; channel watch is
260
+ * opt-in via {@link SlackEngagementOptions.channelPosts}.
261
+ */
262
+ engagement?: SlackEngagementOptions;
263
+ onAppMention?: SlackMessageHandler;
264
+ onDirectMessage?: SlackMessageHandler;
265
+ /**
266
+ * Handler for watched channel posts (same contract as `onAppMention`:
267
+ * return `null` to skip, or a {@link SlackDispatchDecision} to dispatch).
268
+ * Only consulted when `engagement.channelPosts` is configured.
269
+ */
270
+ onChannelPost?: SlackMessageHandler;
271
+ /**
272
+ * Override / extend the default stream-event handlers (typing, replies).
273
+ * Handlers you provide replace the matching default handlers.
274
+ */
275
+ events?: ChannelEventHandlers<SlackChannelState>;
276
+ /**
277
+ * When true (default), reply on final `message.completed` and show typing
278
+ * via `assistant.threads.setStatus` (and streaming when enabled).
279
+ */
280
+ deliverDefaults?: boolean;
281
+ /**
282
+ * Stream assistant text while the turn runs via `chat.startStream` /
283
+ * `appendStream` / `stopStream` (defaults to `true` for Socket Mode).
284
+ * Ignored when {@link cursorAccount} is on — that path never edits posts
285
+ * (`setStatus` + one final `chat.postMessage` only).
286
+ */
287
+ streaming?: boolean;
288
+ /**
289
+ * Show task-style thinking steps for tool calls (stream chunks or status).
290
+ * Defaults to `true`.
291
+ */
292
+ thinkingSteps?: boolean;
293
+ /**
294
+ * Opt in to Slack delivery for human-in-the-loop tool approvals.
295
+ *
296
+ * Framework park/resume is enabled by `needsApproval` on server tools.
297
+ * Set this to `true` to also post Block Kit Approve/Deny cards and route
298
+ * the Socket Mode `interactive` clicks to `resolveApproval`. Socket Mode
299
+ * only — rejected on `cursorAccount: true` (the Cursor Slack connection
300
+ * does not relay Block Kit clicks).
301
+ *
302
+ * Defaults to `false`. For custom composition, spread
303
+ * `buildToolApprovalEvents({ credentials })` into `events`.
304
+ */
305
+ toolApprovals?: boolean;
306
+ /**
307
+ * Route interactive payloads to approval resolution without opting into
308
+ * the full {@link buildToolApprovalEvents} handler pack. Use when
309
+ * composing `buildToolApprovalEvents` into `events` manually. Socket Mode
310
+ * only — rejected on `cursorAccount: true`.
311
+ */
312
+ interactivity?: boolean;
313
+ /**
314
+ * Suggested prompts shown when an assistant thread starts (and optionally
315
+ * after a turn completes).
316
+ */
317
+ suggestedPrompts?: SlackSuggestedPrompt[];
318
+ suggestedPromptsTitle?: string;
319
+ }
320
+
321
+ export interface SlackManifestOptions {
322
+ /** Display name for the Slack app. */
323
+ name: string;
324
+ /** Bot display name (handle without @). Defaults from `name`. */
325
+ botDisplayName?: string;
326
+ /** Env profile. Affects display name suffix. */
327
+ env: "dev" | "prod";
328
+ /** Optional short description shown in the Slack app. */
329
+ description?: string;
330
+ /** Include `assistant_view` + `assistant:write` for typing status. */
331
+ assistant?: boolean;
332
+ /**
333
+ * Enable Slack interactivity (needed for Approve/Deny cards).
334
+ * Defaults to `false` — enable when using `toolApprovals: true`.
335
+ */
336
+ interactivity?: boolean;
337
+ /**
338
+ * Subscribe to `message.channels` + `message.groups` for the opt-in
339
+ * channel watch (`engagement.channelPosts`). Defaults to `false`.
340
+ */
341
+ channelPosts?: boolean;
342
+ /** Seed suggested prompts into the manifest `assistant_view`. */
343
+ suggestedPrompts?: Array<{ title: string; message: string }>;
344
+ }
345
+
346
+ /** Soft-fail result for optional Slack API features. */
347
+ export type SoftSlackResult<
348
+ T extends Record<string, unknown> = Record<string, unknown>,
349
+ > = ({ ok: true } & T) | { ok: false; error: string; unsupported?: boolean };