@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,172 @@
1
+ ---
2
+ title: "GitHub"
3
+ description: "Wake your agent from pull requests, CI, and comments by pulling Cursor SCM events, with fixtures and replay for local tests."
4
+ ---
5
+
6
+ # GitHub agents
7
+
8
+ Wake your agent from repository events without exposing a public webhook
9
+ URL. Prefer `serve --cursor-events`: the host long-polls Cursor's SCM
10
+ event stream for repos you've connected to Cursor. You still declare a
11
+ `githubChannel` so hooks decide what each event does.
12
+
13
+ The companion skill for coding agents is
14
+ [`skills/github/SKILL.md`](../../skills/github/SKILL.md).
15
+
16
+ ## Pull events from Cursor
17
+
18
+ Connect GitHub in Cursor for the repositories you care about (Settings or
19
+ [cursor.com/dashboard](https://cursor.com/dashboard)). That gives your
20
+ account access and lets Cursor receive the repo's webhooks. Sign the host
21
+ in (`agentkit login` or `CURSOR_API_KEY`), define a GitHub
22
+ channel, then serve with `--cursor-events` and at least one `--repo`:
23
+
24
+ ```bash
25
+ agentkit serve --dir . --cursor-events --repo owner/repo
26
+ ```
27
+
28
+ Repeat `--repo` for each repository. The stream is read as the host's
29
+ Cursor user. `serve` refuses to start signed out rather than run a relay
30
+ that can never receive events.
31
+
32
+ Offset and consumer id live under `<state-root>/cursor-events/`.
33
+ `CURSOR_API_BASE_URL` overrides the backend. The stream carries event
34
+ metadata, not full webhook bodies, so your agent should re-read the PR
35
+ or checks from GitHub instead of trusting a snapshot in the wake.
36
+
37
+ This is the preferred production path: no public URL, no repo admin
38
+ webhook, and no inbound network for GitHub deliveries.
39
+
40
+ ## Define the channel
41
+
42
+ Author `agent/channels/github.ts` with `githubChannel()` from
43
+ `@cursor/july/channels/github`. It mounts
44
+ `POST /<slug>/v1/channels/github` and publishes the events it
45
+ dispatches on. That event set comes from the hooks you declare, or you
46
+ pin it with `webhookEvents`. Cursor event pull and local replay both use
47
+ it.
48
+
49
+ ```ts
50
+ import { defaultGitHubAuth, githubChannel } from "@cursor/july/channels/github";
51
+
52
+ export default githubChannel({
53
+ botName: "my-agent", // or GITHUB_APP_SLUG; used to ignore self-comments
54
+ credentials: { webhookSecret: () => process.env.GITHUB_WEBHOOK_SECRET },
55
+ onPullRequest: (ctx, pr) =>
56
+ pr.action === "opened" ? { auth: defaultGitHubAuth(ctx) } : null,
57
+ onCheckSuite: (ctx, suite) =>
58
+ suite.conclusion === "failure" ? { task: () => triage(ctx) } : null,
59
+ });
60
+ ```
61
+
62
+ The hooks are `onPullRequest`, `onComment`, `onIssue`, `onCheckSuite`,
63
+ `onCheckRun`, `onWorkflowRun`, `onStatus`, the catch-all `onEvent`, and
64
+ the lifecycle pair `onStart` / `onStop`. Each hook returns one of three
65
+ things:
66
+
67
+ | Return | Meaning |
68
+ | --- | --- |
69
+ | `{ auth }` | Start or continue a model turn as that actor. A chat session exists and shows up in the playground. |
70
+ | `{ task }` | Host-side work. The delivery is 202-ACKed immediately and the task runs past GitHub's ~10-second timeout. No chat session. |
71
+ | `null` | Skip this delivery. |
72
+
73
+ Return `{ task }` when the wake drives deterministic code. A security
74
+ reviewer can run its whole review loop this way and report
75
+ through commit statuses. Return `{ auth }` when the model needs to reason
76
+ about the event.
77
+
78
+ Outbound GitHub API calls prefer App installation tokens when
79
+ `GITHUB_APP_ID` and `GITHUB_APP_PRIVATE_KEY` are set (with an
80
+ installation id from the event or `GITHUB_APP_INSTALLATION_ID`). On
81
+ serve warmup, App-backed hosts also export a short-lived installation
82
+ token as `GH_TOKEN` so tools that shell out to `gh` (a host-side
83
+ `prepare_review` tool, say) authenticate without a PAT. For
84
+ local testing, skip the App credentials and use `GITHUB_TOKEN`,
85
+ `GH_TOKEN`, or `gh auth login`.
86
+
87
+ ## Test wakes locally
88
+
89
+ Use fixtures and `github replay` so you can develop without waiting on
90
+ live pushes. Both target the same channel route the Cursor relay uses.
91
+
92
+ ### Post a saved fixture
93
+
94
+ For offline tests, POST a saved payload with an `x-github-event` header.
95
+ A `--dev` server does not require a signature:
96
+
97
+ ```bash
98
+ curl -s -X POST http://127.0.0.1:3000/<slug>/v1/channels/github \
99
+ -H 'content-type: application/json' \
100
+ -H 'x-github-event: pull_request' \
101
+ -d @fixtures/github/pull_request.synchronize.json
102
+ ```
103
+
104
+ Don't hand-write payloads. Snapshot real ones with replay's
105
+ `--dry-run --out`, below.
106
+
107
+ ### Test with `github replay`
108
+
109
+ Use `replay` for deterministic tests and
110
+ [hillclimbing](../hillclimbing.md). It reads a real PR with `gh api`,
111
+ synthesizes GitHub-shaped payloads, signs them when a secret is
112
+ configured, and POSTs them at the channel. Pull access is enough: no
113
+ admin, and an env `GITHUB_TOKEN` is fine here. The same input produces
114
+ the same delivery.
115
+
116
+ ```bash
117
+ # Replay a pull_request delivery for a PR
118
+ agentkit github replay https://github.com/owner/repo/pull/123 --dir .
119
+
120
+ # Replay everything the channel listens for, with CI failing
121
+ agentkit github replay owner/repo#123 --dir . --events '*' --conclusion failure
122
+
123
+ # Inspect payloads without POSTing, and snapshot them as fixtures
124
+ agentkit github replay owner/repo#123 --dir . --events '*' --dry-run --out fixtures/github
125
+ ```
126
+
127
+ `--events` defaults to `pull_request`, and `'*'` means the channel's
128
+ declared set. `--action`, `--conclusion`, `--comment`, and `--context`
129
+ shape each synthesized event. `--secret` (or `GITHUB_WEBHOOK_SECRET`)
130
+ signs them.
131
+
132
+ ## Receive webhooks directly
133
+
134
+ Most hosts should pull events from Cursor instead. Use the HTTP channel
135
+ route when you already terminate GitHub webhooks yourself, or when you
136
+ are POSTing fixtures and replay locally.
137
+
138
+ With a webhook secret configured, the route admits everyone
139
+ (`allowAll()`) and the channel verifies `X-Hub-Signature-256` before
140
+ parsing. The HMAC becomes the request principal. Without a secret, the
141
+ route is loopback-only. The exception is `serve --dev`, which admits
142
+ unsigned loopback deliveries so fixtures and replay work with zero
143
+ config. Non-dev targets that accept real GitHub POSTs always need the
144
+ secret, and the same value must live on the server and on whatever signs
145
+ deliveries.
146
+
147
+ ## Handle high event volume
148
+
149
+ These patterns come from running a PR agent against real traffic:
150
+
151
+ - Debounce per PR (~3 seconds, latest event wins), and re-buffer while
152
+ CI settles. Skip a flush when a turn for that PR is already running.
153
+ - Persist the buffer before you acknowledge a wake, and restore it on
154
+ channel start. A restart must not drop buffered wakes.
155
+ - Key sessions with a stable continuation token (`pr:owner/repo#N`) so
156
+ every wake resumes the PR's conversation. Cross-channel resume needs
157
+ an affinity store mapping PR → SDK agent id; write one from an
158
+ `agent.bound` hook.
159
+ - Keep payload details out of wake prompts. Send a generic "re-check
160
+ the PR" and let the agent re-read source of truth instead of trusting a
161
+ stale snapshot.
162
+ - Cancel PR-scoped reminders on `pull_request.closed`.
163
+ - Decide explicitly which repos the agent may act on. Without an
164
+ allowlist the channel wakes for whatever deliveries reach it, and
165
+ every wake spends real model budget.
166
+
167
+ ## Related
168
+
169
+ - [Webhooks and custom channels](./webhooks.md): the HTTP mechanism under
170
+ this pack
171
+ - [Evals](../evals.md): turn replay snapshots into regression fixtures
172
+ - [Cloud runtime](./cloud-runtime.md): attach PRs to cloud VMs
@@ -0,0 +1,131 @@
1
+ ---
2
+ title: "Human-in-the-loop"
3
+ description: "Gate a tool call on human approval: park it, resolve it from the playground, HTTP, or Slack, and keep the turn alive throughout."
4
+ ---
5
+
6
+ # Human-in-the-loop approvals
7
+
8
+ Some tools must wait for human review: promoting a build, approving a PR,
9
+ spending money. Mark those tools `needsApproval` and the host parks the
10
+ in-flight call until a person approves or denies it, from the
11
+ playground, over HTTP, or with Slack buttons. The turn stays running;
12
+ nothing executes until someone decides.
13
+
14
+ ## Gate a tool
15
+
16
+ Mark the tool with `needsApproval` and export it like any other tool.
17
+
18
+ ```ts
19
+ import { defineTool } from "@cursor/july/tools";
20
+ import { z } from "zod";
21
+
22
+ export default defineTool({
23
+ description: "Promote a verified build to production.",
24
+ needsApproval: true,
25
+ inputSchema: z.object({
26
+ service: z.string(),
27
+ buildId: z.string(),
28
+ }),
29
+ async execute({ service, buildId }) {
30
+ return {
31
+ promoted: true,
32
+ service,
33
+ buildId,
34
+ environment: "production",
35
+ };
36
+ },
37
+ });
38
+ ```
39
+
40
+ `needsApproval` also takes a predicate over the validated input, so you
41
+ can gate only the dangerous shapes:
42
+
43
+ ```ts
44
+ needsApproval: (input) => input.amountUsd > 100,
45
+ ```
46
+
47
+ ## What happens to a gated call
48
+
49
+ When the model calls a `needsApproval` tool, the call parks and the
50
+ session's stream emits `action.approval_requested` with the `callId`,
51
+ tool name, and arguments. The turn stays running and waits. When a
52
+ person resolves it, the stream emits `action.approval_resolved` with the
53
+ decision and, where known, who decided. On approval, `execute` runs and
54
+ `action.result` follows exactly as if the tool had run immediately. On
55
+ denial, the model receives the denial as the tool result and continues
56
+ the turn. It can explain, adjust, or try something else.
57
+
58
+ Approvals exist for `execution: "server"` tools on the local runtime
59
+ only. Parked calls do not survive a host restart: pending approvals left
60
+ after a crash resolve as interrupted, and you re-run the turn.
61
+
62
+ ## Resolve from the playground
63
+
64
+ Parked calls render Approve / Deny buttons inline in the conversation.
65
+ Nothing to configure.
66
+
67
+ ## Resolve over HTTP
68
+
69
+ List and resolve programmatically. The routes run the same auth chain as
70
+ the rest of the session API, and the caller must be the session owner:
71
+
72
+ ```bash
73
+ curl http://127.0.0.1:3000/<slug>/v1/session/ses_.../approvals
74
+ # {"approvals":[{"callId":"...","toolName":"approve_pr","args":{...}}]}
75
+
76
+ curl -X POST http://127.0.0.1:3000/<slug>/v1/session/ses_.../approvals/<callId> \
77
+ -H 'content-type: application/json' \
78
+ -d '{"decision":"approve"}' # or "deny"
79
+ ```
80
+
81
+ ## Resolve from Slack
82
+
83
+ Set `toolApprovals: true` on the Slack channel and the pack posts Block
84
+ Kit Approve/Deny cards and routes the button clicks back to the parked
85
+ call:
86
+
87
+ ```ts
88
+ import { slackChannel } from "@cursor/july/channels/slack";
89
+
90
+ export default slackChannel({
91
+ toolApprovals: true,
92
+ });
93
+ ```
94
+
95
+ The Slack app manifest needs interactivity enabled. Cards show redacted,
96
+ truncated arguments because of Block Kit size limits. Execution still
97
+ uses the full validated input, so review sensitive tools in the
98
+ playground when the arguments may exceed the card. Details in the
99
+ [Slack guide](./slack.md#add-approval-buttons).
100
+
101
+ In `serve --dev`, the playground can also list Slack sessions and
102
+ resolve their parked tools (the audit trail records the HTTP caller).
103
+ That bridge does not open cross-owner approval for HTTP sessions, and
104
+ production and bearer-auth hosts stay strict: Slack approvals must come
105
+ from Slack interactivity or a matching principal.
106
+
107
+ ## Design principles for approvals
108
+
109
+ Park/resume is independent of delivery: `needsApproval` works with no
110
+ Slack channel at all, because the playground and HTTP surfaces are
111
+ always there.
112
+
113
+ Prefer approval gates over trust in instructions. "Only call this tool
114
+ when…" is a suggestion; `needsApproval` is a guarantee. And pair
115
+ approvals with dry-run defaults for destructive integrations: post real
116
+ PR reviews only behind an explicit env flag like `MY_AGENT_LIVE=1`, no
117
+ matter who approved.
118
+
119
+ Deterministic tool calls (`agentkit call`, `POST /v1/tools/:name`)
120
+ execute directly without parking. There the human is the caller.
121
+ Approval parking applies to model-initiated calls.
122
+
123
+ ## What's next
124
+
125
+ Continue with these pages:
126
+
127
+ - [Tools](../reference/tools.md): the full tool API `needsApproval`
128
+ lives on
129
+ - [Slack](./slack.md): the approval cards in context
130
+ - [Sessions and streaming](../reference/sessions.md): the
131
+ `action.approval_*` events on the wire
@@ -0,0 +1,245 @@
1
+ ---
2
+ title: "Slack"
3
+ description: "Put the agent in Slack over Socket Mode: manifests, tokens, doctor, engagement rules, and approval buttons."
4
+ ---
5
+
6
+ # Slack agents
7
+
8
+ The Slack channel puts your agent in Slack over Socket Mode: no public
9
+ Request URL, streaming replies in threads, tool "thinking" steps,
10
+ suggested prompts, and opt-in approval buttons. Setup is four short
11
+ phases. Two are yours, and two need a human with Slack admin access.
12
+
13
+ The companion skill is
14
+ [`skills/setup-slack/SKILL.md`](../../skills/setup-slack/SKILL.md).
15
+
16
+ ## Define the channel
17
+
18
+ Author `agent/channels/slack.ts` with `slackChannel()` from
19
+ `@cursor/july/channels/slack`:
20
+
21
+ ```ts
22
+ import { slackChannel } from "@cursor/july/channels/slack";
23
+
24
+ // Single agent: reads SLACK_BOT_TOKEN + SLACK_APP_TOKEN
25
+ export default slackChannel();
26
+
27
+ // Multi-agent serve: one Slack app (and token pair) per agent
28
+ export default slackChannel({ envPrefix: "WEATHER_AGENT" });
29
+ // → WEATHER_AGENT_SLACK_BOT_TOKEN + WEATHER_AGENT_SLACK_APP_TOKEN
30
+ ```
31
+
32
+ By default the channel connects over Socket Mode (the app connects
33
+ outward, so it works from behind any firewall) and responds only to
34
+ `app_mention` events and direct messages. Threads bind to sessions with
35
+ `continuationToken = channelId:threadTs`, so a thread is one durable
36
+ conversation. Replies stream (`chat.startStream` / `appendStream` /
37
+ `stopStream`) with a plain-message fallback, a rotating status shows
38
+ while the agent works, and the pack sets thread titles and suggested
39
+ prompts. When a Slack API is unavailable (`method_not_found`,
40
+ `missing_scope`), the pack degrades to `postMessage` instead of failing.
41
+
42
+ Missing tokens leave the channel idle (`channel idle … missing
43
+ credentials`) rather than failing `serve`. That's useful when you mount
44
+ many agents and only some have Slack apps.
45
+
46
+ ## Use the Cursor Slack connection
47
+
48
+ If the Cursor Slack app is already installed in your workspace and linked
49
+ to your Cursor account, skip the dedicated Slack app:
50
+
51
+ ```ts
52
+ import { slackChannel } from "@cursor/july/channels/slack";
53
+
54
+ export default slackChannel({
55
+ cursorAccount: true,
56
+ agentName: "Weatherbot", // defaults to a name derived from the mount slug
57
+ agentIcon: { emoji: ":robot_face:" },
58
+ });
59
+ ```
60
+
61
+ Sign the host in (`agentkit login` or `CURSOR_API_KEY`), then mention the
62
+ agent in Slack as `@Cursor Weatherbot …`. Thread replies and DMs keep going to
63
+ the same agent. Messages appear as the Cursor app under that agent's name
64
+ and icon, with live updates as the turn progresses.
65
+
66
+ Use a dedicated Socket Mode Slack app when you need your own bot user,
67
+ channel watching (`engagement.channelPosts`), or approval buttons. On
68
+ `cursorAccount`, agents must be explicitly addressed (@mention, DM, or
69
+ claimed-thread reply). Channel watching and `toolApprovals` /
70
+ `interactivity` are Socket Mode only; the Cursor connection does not relay
71
+ Block Kit clicks. Agent names must be unique on the host; an unmatched
72
+ `@Cursor <name>` stays on Cursor's normal Slack agent.
73
+
74
+ ## Set it up
75
+
76
+ ### Generate the app assets
77
+
78
+ One command generates the channel file, the app manifests, and the env template.
79
+
80
+ ```bash
81
+ agentkit slack init --dir . --name "My Agent"
82
+ ```
83
+
84
+ This writes `agent/channels/slack.ts` (with an `envPrefix` derived from
85
+ the directory name), importable app manifests at
86
+ `.agentkit/slack/manifest.{dev,prod}.json`, and
87
+ `.agentkit/slack/env.example`. Use `--no-prefix` for the shared
88
+ `SLACK_*` variables on single-agent hosts, `--prefix CUSTOM` to
89
+ override, and `--channel-posts` if you plan to watch channels.
90
+
91
+ ### Create the apps (human, Slack admin)
92
+
93
+ This phase needs a human with permission to create Slack apps.
94
+
95
+ 1. Open [api.slack.com/apps](https://api.slack.com/apps) → **Create New
96
+ App** → **From a manifest**.
97
+ 2. Paste `manifest.dev.json` and create the dev app.
98
+ 3. Repeat with `manifest.prod.json`. Dev and prod are separate Slack
99
+ apps with separate tokens.
100
+
101
+ ### Install and mint tokens (human)
102
+
103
+ For each app: **Install to Workspace** and copy the Bot User OAuth Token
104
+ (`xoxb-…`), then under **Basic Information → App-Level Tokens** create a
105
+ token with scope `connections:write` and copy it (`xapp-…`).
106
+
107
+ ### Wire the env and verify
108
+
109
+ Export the tokens in the shell that runs `serve`, using the names from
110
+ `env.example`. The CLI doesn't load `.env` files itself, so use your
111
+ usual env manager if you keep them in one:
112
+
113
+ ```bash
114
+ export MY_AGENT_SLACK_BOT_TOKEN=xoxb-…
115
+ export MY_AGENT_SLACK_APP_TOKEN=xapp-…
116
+ ```
117
+
118
+ ```bash
119
+ agentkit slack doctor --prefix MY_AGENT
120
+ ```
121
+
122
+ Proceed when `app_token`, `connections_open`, `bot_token`, and
123
+ `auth_test` are all green. Then serve and smoke it:
124
+
125
+ ```bash
126
+ agentkit serve --dir . --dev
127
+ # expect: [agentkit/slack] Socket Mode connected
128
+ ```
129
+
130
+ Invite the bot to a channel and @mention it (or DM it). Expect the
131
+ Thinking… status, then a threaded streaming reply, with correlated
132
+ server logs (`inbound kind=app_mention`, `session start`,
133
+ `reply delivered via stream|postMessage`).
134
+
135
+ ## Choose when the agent engages
136
+
137
+ Mentions and DMs are on by default. Watching channels means dispatching
138
+ on new posts without a mention. That's an explicit opt-in:
139
+
140
+ ```ts
141
+ export default slackChannel({
142
+ envPrefix: "TRIAGE",
143
+ engagement: {
144
+ // mentions / directMessages default to true
145
+ channelPosts: {
146
+ allow: ["#triage-alerts"], // explicit allowlist; no wildcard exists
147
+ posts: "top-level", // default: thread replies never dispatch
148
+ debounceMs: 15_000, // optional: let rapid edits settle
149
+ },
150
+ },
151
+ onChannelPost: async (ctx, message) => {
152
+ // same contract as onAppMention: return null to skip
153
+ return message.markdown.length > 20 ? {} : null;
154
+ },
155
+ });
156
+ ```
157
+
158
+ Channel watching needs the `message.channels` / `message.groups` events
159
+ on the Slack app (Socket Mode only — not available with
160
+ `cursorAccount: true`). Generate manifests with `slack init --channel-posts`,
161
+ or add the events and re-import. The bot must also be a member of each
162
+ watched channel. Posts that mention the bot stay on the `app_mention`
163
+ path, bot-authored posts never dispatch, and deleting a post inside the
164
+ debounce window cancels its dispatch. Watched posts reuse the
165
+ thread-scoped principal, so a later @mention continues the same session.
166
+ Set `engagement.mentions` or `engagement.directMessages` to `false` to
167
+ turn those surfaces off.
168
+
169
+ ## Prepare work on the host
170
+
171
+ Mention and DM handlers may return a prepared `message`,
172
+ `workspaceFiles`, or `cloud` block. It's the same host-prep pattern as
173
+ [custom channels](./webhooks.md#prepare-on-the-host-then-hand-off).
174
+ PR agents use it: extract a PR URL from the mention text and run the
175
+ same host path as the HTTP channel.
176
+
177
+ ## Add approval buttons
178
+
179
+ Tools with `needsApproval` park until a person decides. Route that
180
+ through Slack with one flag:
181
+
182
+ ```ts
183
+ export default slackChannel({
184
+ toolApprovals: true, // posts Block Kit Approve/Deny cards + routes clicks
185
+ });
186
+ ```
187
+
188
+ The Slack app manifest must have interactivity enabled. Regenerate with
189
+ `buildSlackManifest({ interactivity: true })` (or edit and re-import) if
190
+ your app predates it. Composing events by hand instead: spread
191
+ `buildToolApprovalEvents({ credentials })` into `events` and set
192
+ `interactivity: true` on the channel so Socket Mode routes the clicks.
193
+
194
+ Approval buttons need Socket Mode. `slackChannel({ cursorAccount: true })`
195
+ rejects `toolApprovals` and `interactivity` at construction, since the
196
+ Cursor Slack connection does not relay Block Kit clicks. Use a dedicated
197
+ Slack app to run approvals for a cursor-account agent.
198
+
199
+ Cards show redacted, truncated arguments (Block Kit size limits);
200
+ execution still uses the full validated input, so review sensitive tools
201
+ in the playground when the arguments may exceed the card. Approvals
202
+ exist for `execution: "server"` tools on the local runtime only, and
203
+ parked calls do not survive a host restart. The full lifecycle is in
204
+ [Human-in-the-loop](./human-in-the-loop.md).
205
+
206
+ ## Run several agents on one host
207
+
208
+ One Slack app and token pair per agent. Never share a pair across
209
+ agents in the same process. `envPrefix` keeps them apart
210
+ (`WEATHER_AGENT_SLACK_*`, `TRIAGE_SLACK_*`, …), and agents without tokens mount
211
+ with their Slack channel idle while everything else serves normally.
212
+
213
+ ## Keep the channel healthy
214
+
215
+ Two habits matter most.
216
+
217
+ - Don't `await` long work inside Slack dispatch handlers. The pack
218
+ dispatches through `waitUntil` and streams as the turn progresses.
219
+ - In `--dev` (loopback) or `--allow-anonymous` (trusted shared host), the
220
+ playground can list and stream Slack sessions and resolve their parked
221
+ approvals (the audit trail records the HTTP caller). Bearer-auth hosts
222
+ stay strict: Slack approvals must come from Slack interactivity or a
223
+ matching principal.
224
+
225
+ ## CLI reference
226
+
227
+ The `slack` subcommands cover setup end to end.
228
+
229
+ ```bash
230
+ agentkit slack setup # guided checklist
231
+ agentkit slack init --dir . --name "My Agent"
232
+ agentkit slack init --dir . --no-prefix # shared SLACK_* vars
233
+ agentkit slack init --dir . --channel-posts
234
+ agentkit slack manifest --env both # regenerate manifests
235
+ agentkit slack doctor --prefix MY_AGENT # token / connectivity checks
236
+ ```
237
+
238
+ ## What's next
239
+
240
+ Continue with these pages:
241
+
242
+ - [Human-in-the-loop](./human-in-the-loop.md): the approval lifecycle
243
+ behind `toolApprovals`
244
+ - [Webhooks and custom channels](./webhooks.md): the mechanism this
245
+ pack is built on