@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,90 @@
1
+ /**
2
+ * Per-agent Slack credential resolution.
3
+ *
4
+ * Multi-agent serve needs one Slack app (and token pair) per agent. Use
5
+ * `envPrefix: "MY_AGENT"` so the pack reads `MY_AGENT_SLACK_BOT_TOKEN` /
6
+ * `MY_AGENT_SLACK_APP_TOKEN` instead of the shared globals.
7
+ */
8
+
9
+ import type { SlackBotToken, SlackCredentials } from "./types.js";
10
+
11
+ /** Normalize an agent directory / display name into an env prefix. */
12
+ export function envPrefixFromName(name: string): string {
13
+ return name
14
+ .trim()
15
+ .replace(/[^A-Za-z0-9]+/g, "_")
16
+ .replace(/^_+|_+$/g, "")
17
+ .toUpperCase();
18
+ }
19
+
20
+ /** Env var names for a Slack token pair. */
21
+ export function slackEnvKeys(prefix?: string): {
22
+ bot: string;
23
+ app: string;
24
+ } {
25
+ if (prefix === undefined || prefix.trim() === "") {
26
+ return { bot: "SLACK_BOT_TOKEN", app: "SLACK_APP_TOKEN" };
27
+ }
28
+ const normalized = envPrefixFromName(prefix);
29
+ return {
30
+ bot: `${normalized}_SLACK_BOT_TOKEN`,
31
+ app: `${normalized}_SLACK_APP_TOKEN`,
32
+ };
33
+ }
34
+
35
+ /**
36
+ * Credentials that read `{PREFIX}_SLACK_BOT_TOKEN` / `{PREFIX}_SLACK_APP_TOKEN`
37
+ * (or the unprefixed globals when `prefix` is omitted). Resolvers return `""`
38
+ * when unset so multi-agent serve does not fall through to a shared token.
39
+ */
40
+ export function credentialsFromEnv(prefix?: string): SlackCredentials {
41
+ const keys = slackEnvKeys(prefix);
42
+ return {
43
+ botToken: () => process.env[keys.bot]?.trim() ?? "",
44
+ appToken: () => process.env[keys.app]?.trim() ?? "",
45
+ };
46
+ }
47
+
48
+ async function readExplicitToken(
49
+ explicit: SlackBotToken | undefined
50
+ ): Promise<string | undefined> {
51
+ if (explicit === undefined) {
52
+ return undefined;
53
+ }
54
+ const value = typeof explicit === "function" ? await explicit() : explicit;
55
+ // API transports (objects) carry no raw token to resolve.
56
+ if (typeof value !== "string") {
57
+ return undefined;
58
+ }
59
+ const trimmed = value.trim();
60
+ return trimmed === "" ? undefined : trimmed;
61
+ }
62
+
63
+ /**
64
+ * Resolve a bot token string without throwing. When `credentials.botToken`
65
+ * is set (string or resolver), only that value is used — no global fallback
66
+ * — so a per-agent prefix cannot accidentally bind every mounted agent to
67
+ * one app. When omitted, falls back to `SLACK_BOT_TOKEN`. API transports
68
+ * resolve to `undefined` (they execute calls without a local token).
69
+ */
70
+ export async function tryResolveBotToken(
71
+ credentials: SlackCredentials | undefined
72
+ ): Promise<string | undefined> {
73
+ if (credentials?.botToken !== undefined) {
74
+ return readExplicitToken(credentials.botToken);
75
+ }
76
+ return readExplicitToken(process.env.SLACK_BOT_TOKEN);
77
+ }
78
+
79
+ /**
80
+ * Resolve an app-level token without throwing. Same per-agent rules as
81
+ * {@link tryResolveBotToken}.
82
+ */
83
+ export async function tryResolveAppToken(
84
+ credentials: SlackCredentials | undefined
85
+ ): Promise<string | undefined> {
86
+ if (credentials?.appToken !== undefined) {
87
+ return readExplicitToken(credentials.appToken);
88
+ }
89
+ return readExplicitToken(process.env.SLACK_APP_TOKEN);
90
+ }
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Cursor-account mode for the Slack channel pack: instead of a dedicated
3
+ * Slack app (Socket Mode + `xoxb`/`xapp` tokens), the channel rides the
4
+ * signed-in Cursor account's Slack connection. Inbound events are relayed
5
+ * by the serve host from `/v0/slack-events` (see
6
+ * `internal/cursor-slack-relay.ts`); outbound Web API calls run through a
7
+ * {@link SlackApiTransport} bound to the backend proxy.
8
+ *
9
+ * This file is the seam between the channel definition (authored at
10
+ * `defineChannel` time) and the serve-time relay: `slackChannel()` registers
11
+ * a runtime ref here, and the server discovers it, binds the transport, and
12
+ * dispatches relayed envelopes through the pack's normal inbound path.
13
+ */
14
+
15
+ import type { HostContext, SendMessageFn } from "../../types.js";
16
+ import { dispatchInboundMessage } from "./dispatch.js";
17
+ import type { EventIdDedupe } from "./event-id-dedupe.js";
18
+ import { slackTextToMarkdown } from "./inbound.js";
19
+ import type { SlackLog } from "./log.js";
20
+ import type {
21
+ SlackApiTransport,
22
+ SlackChannelOptions,
23
+ SlackCredentials,
24
+ SlackMessage,
25
+ SlackMessageHandler,
26
+ } from "./types.js";
27
+
28
+ /**
29
+ * Transport placeholder created at `slackChannel()` definition time and
30
+ * bound to the real backend proxy caller when the serve host starts its
31
+ * relay. Calls before binding soft-fail Slack-style.
32
+ */
33
+ export interface PendingSlackApiTransport extends SlackApiTransport {
34
+ bind(impl: SlackApiTransport["call"]): void;
35
+ }
36
+
37
+ export function createPendingSlackApiTransport(): PendingSlackApiTransport {
38
+ let bound: SlackApiTransport["call"] | undefined;
39
+ return {
40
+ kind: "api-transport",
41
+ label: "cursor-account",
42
+ bind(impl) {
43
+ bound = impl;
44
+ },
45
+ async call(method, args) {
46
+ if (bound === undefined) {
47
+ return { ok: false, error: "cursor_slack_relay_not_started" };
48
+ }
49
+ return bound(method, args);
50
+ },
51
+ };
52
+ }
53
+
54
+ /**
55
+ * One routed Slack event from `/v0/slack-events` (mirror of the backend's
56
+ * SlackAgentEventEnvelope, minus server-only fields).
57
+ */
58
+ export interface CursorSlackEnvelope {
59
+ eventName: string;
60
+ slackTeamId: string;
61
+ channelId: string;
62
+ channelType?: string;
63
+ threadTs: string;
64
+ messageTs: string;
65
+ slackUserId?: string;
66
+ text: string;
67
+ agentName: string;
68
+ consumerId: string;
69
+ /**
70
+ * How the backend routed the event: leading agent name or owned thread.
71
+ */
72
+ matchedBy: "name" | "thread";
73
+ eventId?: string;
74
+ receivedAtMs: number;
75
+ }
76
+
77
+ /** Serve-time runtime handle for one cursor-account Slack channel. */
78
+ export interface SlackCursorAccountRuntime {
79
+ options: SlackChannelOptions;
80
+ /** The channel's live credentials (botToken slot holds the transport). */
81
+ credentials: SlackCredentials;
82
+ transport: PendingSlackApiTransport;
83
+ eventIds: EventIdDedupe;
84
+ onAppMention: SlackMessageHandler;
85
+ onDirectMessage: SlackMessageHandler;
86
+ getLog: () => SlackLog;
87
+ }
88
+
89
+ const runtimeByDefinition = new WeakMap<object, SlackCursorAccountRuntime>();
90
+
91
+ export function registerSlackCursorAccountRuntime(
92
+ definition: object,
93
+ runtime: SlackCursorAccountRuntime
94
+ ): void {
95
+ runtimeByDefinition.set(definition, runtime);
96
+ }
97
+
98
+ /**
99
+ * Recover the cursor-account runtime for a channel definition, if it was
100
+ * created via `slackChannel({ cursorAccount: true })`.
101
+ */
102
+ export function getSlackCursorAccountRuntime(
103
+ definition: object
104
+ ): SlackCursorAccountRuntime | undefined {
105
+ return runtimeByDefinition.get(definition);
106
+ }
107
+
108
+ /**
109
+ * Dispatch one relayed envelope through the pack's normal inbound path
110
+ * (same handlers, session continuation, and reply delivery as Socket Mode).
111
+ */
112
+ export async function dispatchCursorSlackEnvelope(args: {
113
+ runtime: SlackCursorAccountRuntime;
114
+ envelope: CursorSlackEnvelope;
115
+ send: SendMessageFn;
116
+ host: HostContext;
117
+ }): Promise<void> {
118
+ const { runtime, envelope } = args;
119
+ const log = runtime.getLog();
120
+
121
+ if (
122
+ envelope.eventId !== undefined &&
123
+ envelope.eventId.length > 0 &&
124
+ !runtime.eventIds.tryHandle(envelope.eventId)
125
+ ) {
126
+ log.debug("cursor-account inbound dedupe drop", {
127
+ event_id: envelope.eventId,
128
+ });
129
+ return;
130
+ }
131
+
132
+ const message: SlackMessage = {
133
+ text: envelope.text,
134
+ markdown: slackTextToMarkdown(envelope.text),
135
+ ts: envelope.messageTs,
136
+ threadTs: envelope.threadTs,
137
+ channelId: envelope.channelId,
138
+ teamId: envelope.slackTeamId,
139
+ ...(envelope.slackUserId === undefined
140
+ ? {}
141
+ : {
142
+ author: { userId: envelope.slackUserId, isBot: false },
143
+ }),
144
+ };
145
+
146
+ // DMs to @Cursor route as direct messages; everything else (explicit
147
+ // `@Cursor <agent> …` mentions and claimed-thread replies) dispatches on
148
+ // the mention handler — a claimed-thread reply is addressed to the agent
149
+ // by construction. Mentions/DM disable toggles are rejected at
150
+ // `slackChannel({ cursorAccount: true })` construction so the backend
151
+ // never consumes events the host would drop.
152
+ const isDm =
153
+ envelope.channelType === "im" || envelope.channelId.startsWith("D");
154
+ const kind = isDm ? "direct_message" : "app_mention";
155
+ const handler = isDm ? runtime.onDirectMessage : runtime.onAppMention;
156
+ await dispatchInboundMessage({
157
+ kind,
158
+ message,
159
+ handler,
160
+ send: args.send,
161
+ credentials: runtime.credentials,
162
+ host: args.host,
163
+ log,
164
+ ...(envelope.eventId === undefined ? {} : { eventId: envelope.eventId }),
165
+ });
166
+ }
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Default inbound handlers and stream-event sinks for the Slack channel.
3
+ */
4
+
5
+ import type { ChannelEventHandlers } from "../../types.js";
6
+ import {
7
+ appendChatStream,
8
+ postMessage,
9
+ setThreadStatus,
10
+ truncateTypingStatus,
11
+ } from "./api.js";
12
+ import { firstNonEmptyLine, maybeSetSuggestedPrompts } from "./assistant.js";
13
+ import { defaultSlackAuth } from "./auth.js";
14
+ import {
15
+ SLACK_DEFAULT_LOADING_MESSAGES,
16
+ SLACK_TYPING_MIN_GROWTH,
17
+ SLACK_TYPING_MIN_INTERVAL_MS,
18
+ } from "./constants.js";
19
+ import { createStreamDeliveryStrategy } from "./live-delivery.js";
20
+ import { defaultSlackLog, type SlackLog } from "./log.js";
21
+ import { buildTaskChunkForResult, buildTaskChunksForCalls } from "./stream.js";
22
+ import type {
23
+ SlackChannelState,
24
+ SlackCredentials,
25
+ SlackMessageHandler,
26
+ SlackSuggestedPrompt,
27
+ } from "./types.js";
28
+
29
+ const defaultOnInbound: SlackMessageHandler = async (ctx, message) => {
30
+ await ctx.thread.startTyping("Thinking…");
31
+ const auth = defaultSlackAuth(message, ctx);
32
+ return auth === null ? null : { auth };
33
+ };
34
+
35
+ export const defaultOnAppMention: SlackMessageHandler = defaultOnInbound;
36
+ export const defaultOnDirectMessage: SlackMessageHandler = defaultOnInbound;
37
+
38
+ /**
39
+ * Default watched-channel-post handler: same thread-scoped principal as
40
+ * mentions (so a later @mention continues the session), tagged with an
41
+ * `engagement: "channel_post"` attribute for auth policies.
42
+ */
43
+ export const defaultOnChannelPost: SlackMessageHandler = async (
44
+ ctx,
45
+ message
46
+ ) => {
47
+ await ctx.thread.startTyping("Thinking…");
48
+ const auth = defaultSlackAuth(message, ctx, { engagement: "channel_post" });
49
+ return auth === null ? null : { auth };
50
+ };
51
+
52
+ export interface BuildDefaultEventsOptions {
53
+ credentials?: SlackCredentials;
54
+ streaming?: boolean;
55
+ thinkingSteps?: boolean;
56
+ suggestedPrompts?: SlackSuggestedPrompt[];
57
+ suggestedPromptsTitle?: string;
58
+ /** Resolved per-call so channel onStart can rebind the server logger. */
59
+ getLog?: () => SlackLog;
60
+ }
61
+
62
+ /**
63
+ * Build default stream-event handlers (typing, streaming, replies).
64
+ * Streaming / thinking default to ON.
65
+ *
66
+ * Tool-approval cards are a separate primitive — compose with
67
+ * `buildToolApprovalEvents` or set `toolApprovals: true` on `slackChannel`.
68
+ */
69
+ export function buildDefaultEvents(
70
+ options: BuildDefaultEventsOptions = {}
71
+ ): ChannelEventHandlers<SlackChannelState> {
72
+ const credentials = options.credentials;
73
+ const streaming = options.streaming !== false;
74
+ const thinkingSteps = options.thinkingSteps !== false;
75
+ const suggestedPrompts = options.suggestedPrompts ?? [];
76
+ const suggestedPromptsTitle = options.suggestedPromptsTitle;
77
+ const botToken = credentials?.botToken;
78
+ const getLog = options.getLog ?? (() => defaultSlackLog);
79
+ const strategy = createStreamDeliveryStrategy({ botToken, getLog });
80
+
81
+ return {
82
+ async "turn.started"(event, channel) {
83
+ const log = getLog();
84
+ channel.state.pendingToolCallMessage = null;
85
+ channel.state.lastReasoningTypingAtMs = null;
86
+ channel.state.lastReasoningTypingStatus = null;
87
+ channel.state.streamTs = null;
88
+ channel.state.streamChannelId = null;
89
+ channel.state.lastPostedText = null;
90
+ channel.state.approvalMessageByCallId = {};
91
+
92
+ const state = channel.state;
93
+ if (state.channelId === null || state.threadTs === null) {
94
+ return;
95
+ }
96
+
97
+ log.info("turn.started", {
98
+ session: event.sessionId,
99
+ turn: event.turnId,
100
+ channel: state.channelId,
101
+ thread_ts: state.threadTs,
102
+ });
103
+
104
+ await setThreadStatus({
105
+ botToken,
106
+ channelId: state.channelId,
107
+ threadTs: state.threadTs,
108
+ status: "Working…",
109
+ loadingMessages: [...SLACK_DEFAULT_LOADING_MESSAGES],
110
+ });
111
+
112
+ // Retry streaming each turn unless a prior call proved the feature
113
+ // unsupported for this workspace/app. Thinking stays on setStatus
114
+ // (Cursor-account proxy pins agent username/icon on that method).
115
+ if (!streaming || state.streamingUnavailable === true) {
116
+ return;
117
+ }
118
+
119
+ await strategy.start({
120
+ channel,
121
+ channelId: state.channelId,
122
+ threadTs: state.threadTs,
123
+ sessionId: event.sessionId,
124
+ });
125
+ },
126
+
127
+ async "message.appended"(event, channel) {
128
+ if (!streaming || channel.state.streamingUnavailable === true) {
129
+ return;
130
+ }
131
+ const streamTs = channel.state.streamTs;
132
+ const channelId =
133
+ channel.state.streamChannelId ?? channel.state.channelId;
134
+ if (
135
+ streamTs === null ||
136
+ streamTs === "" ||
137
+ channelId === null ||
138
+ channelId === ""
139
+ ) {
140
+ return;
141
+ }
142
+
143
+ await strategy.append({
144
+ channel,
145
+ channelId,
146
+ streamTs,
147
+ text: event.data.text,
148
+ sessionId: event.sessionId,
149
+ });
150
+ },
151
+
152
+ async "reasoning.appended"(event, channel) {
153
+ const line = firstNonEmptyLine(event.data.text);
154
+ if (line === undefined) {
155
+ return;
156
+ }
157
+ const status = truncateTypingStatus(line);
158
+ const previous = channel.state.lastReasoningTypingStatus;
159
+ const grew =
160
+ previous !== null &&
161
+ status.startsWith(previous) &&
162
+ status.length >= previous.length + SLACK_TYPING_MIN_GROWTH;
163
+ const now = Date.now();
164
+ const lastAt = channel.state.lastReasoningTypingAtMs;
165
+ if (
166
+ !grew &&
167
+ lastAt !== null &&
168
+ now - lastAt >= 0 &&
169
+ now - lastAt < SLACK_TYPING_MIN_INTERVAL_MS
170
+ ) {
171
+ return;
172
+ }
173
+ if (channel.state.channelId === null || channel.state.threadTs === null) {
174
+ return;
175
+ }
176
+ await setThreadStatus({
177
+ botToken,
178
+ channelId: channel.state.channelId,
179
+ threadTs: channel.state.threadTs,
180
+ status,
181
+ loadingMessages: [status, ...SLACK_DEFAULT_LOADING_MESSAGES],
182
+ });
183
+ channel.state.lastReasoningTypingAtMs = now;
184
+ channel.state.lastReasoningTypingStatus = status;
185
+ },
186
+
187
+ async "actions.requested"(event, channel) {
188
+ const pending = channel.state.pendingToolCallMessage;
189
+ channel.state.pendingToolCallMessage = null;
190
+ const names = event.data.calls.map((call) => call.toolName);
191
+
192
+ const statusText =
193
+ pending !== null
194
+ ? truncateTypingStatus(pending)
195
+ : truncateTypingStatus(`Running ${names.join(", ")}…`);
196
+
197
+ if (
198
+ strategy.inlineToolSteps &&
199
+ thinkingSteps &&
200
+ streaming &&
201
+ channel.state.streamingUnavailable !== true &&
202
+ channel.state.streamTs !== null &&
203
+ channel.state.streamTs !== ""
204
+ ) {
205
+ const channelId =
206
+ channel.state.streamChannelId ?? channel.state.channelId;
207
+ if (channelId !== null && channelId !== "") {
208
+ const chunks = buildTaskChunksForCalls(
209
+ event.data.calls,
210
+ "in_progress"
211
+ );
212
+ const result = await appendChatStream({
213
+ botToken,
214
+ channel: channelId,
215
+ ts: channel.state.streamTs,
216
+ chunks,
217
+ });
218
+ if (result.ok) {
219
+ if (
220
+ channel.state.channelId !== null &&
221
+ channel.state.threadTs !== null
222
+ ) {
223
+ await setThreadStatus({
224
+ botToken,
225
+ channelId: channel.state.channelId,
226
+ threadTs: channel.state.threadTs,
227
+ status: statusText,
228
+ });
229
+ }
230
+ return;
231
+ }
232
+ }
233
+ }
234
+
235
+ if (channel.state.channelId !== null && channel.state.threadTs !== null) {
236
+ await setThreadStatus({
237
+ botToken,
238
+ channelId: channel.state.channelId,
239
+ threadTs: channel.state.threadTs,
240
+ status: statusText,
241
+ });
242
+ }
243
+ },
244
+
245
+ async "action.result"(event, channel) {
246
+ if (
247
+ !strategy.inlineToolSteps ||
248
+ !thinkingSteps ||
249
+ !streaming ||
250
+ channel.state.streamingUnavailable === true ||
251
+ channel.state.streamTs === null ||
252
+ channel.state.streamTs === ""
253
+ ) {
254
+ return;
255
+ }
256
+ const channelId =
257
+ channel.state.streamChannelId ?? channel.state.channelId;
258
+ if (channelId === null || channelId === "") {
259
+ return;
260
+ }
261
+ const chunk = buildTaskChunkForResult({
262
+ callId: event.data.callId,
263
+ toolName: event.data.toolName,
264
+ isError: event.data.isError,
265
+ });
266
+ await appendChatStream({
267
+ botToken,
268
+ channel: channelId,
269
+ ts: channel.state.streamTs,
270
+ chunks: [chunk],
271
+ });
272
+ },
273
+
274
+ async "message.completed"(event, channel) {
275
+ const log = getLog();
276
+ if (event.data.finishReason === "tool_call") {
277
+ channel.state.pendingToolCallMessage =
278
+ firstNonEmptyLine(event.data.text) ?? null;
279
+ return;
280
+ }
281
+ channel.state.pendingToolCallMessage = null;
282
+
283
+ const state = channel.state;
284
+ if (state.channelId === null || state.threadTs === null) {
285
+ return;
286
+ }
287
+
288
+ const clearStatus = async (): Promise<void> => {
289
+ await setThreadStatus({
290
+ botToken,
291
+ channelId: state.channelId!,
292
+ threadTs: state.threadTs!,
293
+ status: "",
294
+ });
295
+ };
296
+
297
+ // Empty final text: still close any open stream / clear the skeleton
298
+ // and clear typing.
299
+ if (event.data.text === "") {
300
+ if (state.streamTs !== null && state.streamTs !== "") {
301
+ await strategy.finalizeEmpty({
302
+ channel,
303
+ channelId: state.streamChannelId ?? state.channelId,
304
+ streamTs: state.streamTs,
305
+ });
306
+ channel.state.streamTs = null;
307
+ }
308
+ await clearStatus();
309
+ return;
310
+ }
311
+
312
+ const canStream =
313
+ streaming &&
314
+ state.streamingUnavailable !== true &&
315
+ state.streamTs !== null &&
316
+ state.streamTs !== "";
317
+
318
+ if (canStream && state.streamTs !== null) {
319
+ const { delivered } = await strategy.finalize({
320
+ channel,
321
+ channelId: state.streamChannelId ?? state.channelId,
322
+ streamTs: state.streamTs,
323
+ text: event.data.text,
324
+ sessionId: event.sessionId,
325
+ });
326
+ if (delivered) {
327
+ await clearStatus();
328
+ return;
329
+ }
330
+ }
331
+
332
+ try {
333
+ const posted = await postMessage({
334
+ botToken,
335
+ channel: state.channelId,
336
+ text: event.data.text,
337
+ threadTs: state.threadTs,
338
+ });
339
+ channel.state.lastPostedText = event.data.text;
340
+ log.info("reply delivered via postMessage", {
341
+ channel: state.channelId,
342
+ thread_ts: state.threadTs,
343
+ message_ts: posted.ts,
344
+ session: event.sessionId,
345
+ chars: event.data.text.length,
346
+ });
347
+ } catch (error) {
348
+ log.error(
349
+ `postMessage failed: ${
350
+ error instanceof Error ? error.message : String(error)
351
+ }`,
352
+ {
353
+ channel: state.channelId,
354
+ thread_ts: state.threadTs,
355
+ session: event.sessionId,
356
+ }
357
+ );
358
+ }
359
+
360
+ await clearStatus();
361
+ },
362
+
363
+ async "turn.completed"(event, channel) {
364
+ const log = getLog();
365
+ log.info("turn.completed", {
366
+ session: event.sessionId,
367
+ turn: event.turnId,
368
+ channel: channel.state.channelId,
369
+ thread_ts: channel.state.threadTs,
370
+ });
371
+
372
+ await strategy.cleanupOrphan({ channel });
373
+
374
+ if (
375
+ suggestedPrompts.length === 0 ||
376
+ channel.state.channelId === null ||
377
+ channel.state.threadTs === null
378
+ ) {
379
+ return;
380
+ }
381
+ await maybeSetSuggestedPrompts({
382
+ botToken,
383
+ channelId: channel.state.channelId,
384
+ threadTs: channel.state.threadTs,
385
+ prompts: suggestedPrompts,
386
+ ...(suggestedPromptsTitle === undefined
387
+ ? {}
388
+ : { title: suggestedPromptsTitle }),
389
+ log,
390
+ });
391
+ },
392
+
393
+ async "turn.failed"(event, channel) {
394
+ const log = getLog();
395
+ const state = channel.state;
396
+ log.error("turn.failed", {
397
+ session: event.sessionId,
398
+ turn: event.turnId,
399
+ error: event.data.message,
400
+ channel: state.channelId,
401
+ thread_ts: state.threadTs,
402
+ });
403
+ if (state.channelId === null || state.threadTs === null) {
404
+ return;
405
+ }
406
+ // Do not echo engine/tool error text into Slack — it can leak
407
+ // paths, tokens, or other sensitive detail to workspace members.
408
+ const errorText =
409
+ "I hit an error while handling your request. Please try again or rephrase.";
410
+
411
+ let delivered = false;
412
+ if (state.streamTs !== null && state.streamTs !== "") {
413
+ ({ delivered } = await strategy.fail({
414
+ channel,
415
+ channelId: state.streamChannelId ?? state.channelId,
416
+ streamTs: state.streamTs,
417
+ errorText,
418
+ sessionId: event.sessionId,
419
+ }));
420
+ }
421
+ if (!delivered) {
422
+ try {
423
+ await postMessage({
424
+ botToken,
425
+ channel: state.channelId,
426
+ text: errorText,
427
+ threadTs: state.threadTs,
428
+ });
429
+ } catch (error) {
430
+ log.error(
431
+ `turn.failed postMessage failed: ${
432
+ error instanceof Error ? error.message : String(error)
433
+ }`,
434
+ {
435
+ channel: state.channelId,
436
+ thread_ts: state.threadTs,
437
+ session: event.sessionId,
438
+ }
439
+ );
440
+ }
441
+ }
442
+ await setThreadStatus({
443
+ botToken,
444
+ channelId: state.channelId,
445
+ threadTs: state.threadTs,
446
+ status: "",
447
+ });
448
+ },
449
+ };
450
+ }