@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,201 @@
1
+ ---
2
+ title: "Webhooks & custom channels"
3
+ description: "Give the agent its own HTTP surface: validated routes, sessions keyed to your domain, and replies delivered back out."
4
+ ---
5
+
6
+ # Webhooks and custom channels
7
+
8
+ A custom channel gives the agent its own HTTP surface. You get routes
9
+ with validated payloads, sessions keyed to something in your domain (a
10
+ thread, a ticket, a PR), and replies delivered back to the caller. The
11
+ [Slack](./slack.md) and [GitHub](./github.md) packs build on this
12
+ mechanism. This page is the mechanism itself.
13
+
14
+ ## What you already have
15
+
16
+ The built-in HTTP channel is always mounted (under `/<slug>` in the
17
+ default multi-agent layout). `POST /v1/session` starts a conversation,
18
+ `POST /v1/session/:id` follows up, and `GET /v1/session/:id/stream`
19
+ streams NDJSON events, plus sessions, approvals, and tool routes. The
20
+ full list is in the [HTTP API reference](../reference/http-api.md).
21
+
22
+ Write a custom channel when that shape doesn't fit: a webhook with its
23
+ own payload contract, a surface that keys sessions by a domain id, or a
24
+ flow that does host-side work before (or instead of) a model turn.
25
+
26
+ ## Define a channel
27
+
28
+ Author `agent/channels/<id>.ts` with `defineChannel`. The filename is
29
+ the channel id, and routes mount under `/v1/channels/<id>`:
30
+
31
+ ```ts
32
+ import { defineChannel, POST } from "@cursor/july/channels";
33
+ import { z } from "zod";
34
+
35
+ export default defineChannel({
36
+ routes: [
37
+ POST("/message", {
38
+ description: "Enqueue a chat turn on this channel",
39
+ bodySchema: z.object({
40
+ message: z.string(),
41
+ thread: z.string().optional(),
42
+ }),
43
+ handler: async (_req, { send, body }) => {
44
+ const session = await send(body.message, {
45
+ // stable key: same thread → same durable session
46
+ continuationToken: body.thread,
47
+ });
48
+ return Response.json({ sessionId: session.id });
49
+ },
50
+ }),
51
+ ],
52
+ events: {
53
+ "message.completed"(event, channel, ctx) {
54
+ // deliver the reply back to the surface that owns this channel:
55
+ // post to a webhook, reply in a thread, update a ticket, …
56
+ },
57
+ },
58
+ });
59
+ ```
60
+
61
+ ```bash
62
+ curl -X POST http://127.0.0.1:3000/<slug>/v1/channels/<id>/message \
63
+ -H 'content-type: application/json' \
64
+ -d '{"message":"hello","thread":"ticket-42"}'
65
+ ```
66
+
67
+ ## Schemas are Zod, and required
68
+
69
+ `GET` routes require a Zod `querySchema`. `POST`, `PUT`, and `PATCH`
70
+ require a Zod `bodySchema`. Compile-time checks enforce this, so plain
71
+ JSON Schema objects won't type-check. Use `z.object({})` or
72
+ `z.unknown()` when a surface is intentionally open. The host validates
73
+ before your handler runs, handlers receive typed `args.body` and
74
+ `args.query`, and empty POST bodies are coerced to `{}` first.
75
+
76
+ Declared schemas also feed `GET /v1/info`, which adds two things to the
77
+ playground: a **Try** button on every route, and matching **slash
78
+ commands** in the composer (a channel `drive` route becomes `/drive …`).
79
+
80
+ ## What a handler receives
81
+
82
+ Handlers get the Fetch `Request` plus an args object:
83
+
84
+ | Helper | What it does |
85
+ | --- | --- |
86
+ | `send(message, options?)` | Run a model turn on this channel. `continuationToken` keys the durable session; options can seed `workspaceFiles`, attach `cloud` repos, or override `auth`. |
87
+ | `getSession(sessionId)` | Look up an existing session |
88
+ | `receive(channel, input)` | Hand off to another channel (schedules use this) |
89
+ | `callTool(name, input, opts?)` | Run an authored server tool with no model turn ([Tools](../reference/tools.md#call-a-tool-without-a-model-turn)) |
90
+ | `body`, `query`, `params` | Validated payloads and path params |
91
+ | `auth` | The `AuthContext` the route's auth chain resolved |
92
+ | `requestIp` | The TCP peer address |
93
+ | `host` | Shared host services: `host.mcp`, `host.github`, `host.slack`, `host.reminders` |
94
+ | `waitUntil(promise)` | Background work that outlives the response |
95
+
96
+ Channel `state` declares the starting per-session adapter state. It
97
+ persists across events, and event handlers receive it on
98
+ `channel.state`.
99
+
100
+ ## Respond fast, work in the background
101
+
102
+ Webhook senders time out quickly. GitHub gives you about ten seconds.
103
+ For slow work, ACK immediately and continue in the background:
104
+
105
+ ```ts
106
+ handler: async (_req, { send, waitUntil, body }) => {
107
+ waitUntil(
108
+ send(`Process incoming report: ${body.url}`, {
109
+ continuationToken: `report:${body.id}`,
110
+ })
111
+ );
112
+ return Response.json({ accepted: true }, { status: 202 });
113
+ },
114
+ ```
115
+
116
+ ## Prepare on the host, then hand off
117
+
118
+ The strongest channel pattern: do the deterministic setup in the
119
+ handler, then hand the model prepared evidence. Fetch the PR with
120
+ `callTool`, seed the files it needs, and make the prompt about judgment
121
+ rather than about finding things:
122
+
123
+ ```ts
124
+ handler: async (_req, { callTool, send, body }) => {
125
+ const prep = await callTool("prepare_pr", { pr: body.pr });
126
+ if (prep.isError) {
127
+ return Response.json({ ok: false, error: prep.result }, { status: 502 });
128
+ }
129
+ const session = await send("Review the prepared PR under pr/.", {
130
+ continuationToken: `pr:${body.pr}`,
131
+ });
132
+ return Response.json({ sessionId: session.id });
133
+ },
134
+ ```
135
+
136
+ This host-prep shape is the change with the largest effect on latency
137
+ and quality. [Hillclimbing](../hillclimbing.md) lists it first.
138
+
139
+ ## Deliver replies back out
140
+
141
+ The `events` map subscribes the channel to stream events for the
142
+ sessions it owns. Typical wiring: `message.completed` posts the
143
+ assistant text back to the caller's surface, and `turn.failed` posts an
144
+ error notice. The full vocabulary is in
145
+ [Sessions and streaming](../reference/sessions.md#the-event-vocabulary).
146
+
147
+ ## Auth: loopback by default, on purpose
148
+
149
+ Every route runs an auth-policy chain (the channel's `auth` array). The
150
+ default is `[localDevStrict()]`: direct loopback callers only. Requests
151
+ carrying proxy-forwarding headers (`X-Forwarded-For`, `X-Real-IP`,
152
+ `Forwarded`, `X-Forwarded-Host`) are rejected, and a loopback `Host`
153
+ header is required. So a tunnel, a same-host reverse proxy, or a
154
+ DNS-rebinding page can't silently re-expose the route.
155
+
156
+ Before real traffic, author auth explicitly:
157
+
158
+ ```ts
159
+ import { bearerAuth, defineChannel, localDevStrict } from "@cursor/july/channels";
160
+
161
+ export default defineChannel({
162
+ auth: [localDevStrict(), bearerAuth(process.env.WEBHOOK_TOKEN ?? "")],
163
+ routes: [/* … */],
164
+ });
165
+ ```
166
+
167
+ The built-in policies are `localDevStrict()` (the default),
168
+ `localDev()`, `loopbackOnly()`, `bearerAuth(tokenOrVerify)`, and
169
+ `allowAll()`, and any `(request, info) => AuthContext | null` function
170
+ composes with them. Signature-verified surfaces usually use `allowAll()`
171
+ at the route and verify the HMAC in the channel; the GitHub channel with
172
+ a webhook secret works this way. The details live in
173
+ [Channels](../reference/channels.md#auth-policies).
174
+
175
+ Server-level flags interact with channel auth. `--bearer-token <secret>`
176
+ swaps the default for `bearerAuth` on every channel that doesn't author
177
+ its own chain, and `--allow-anonymous` swaps it for `allowAll()`
178
+ (trusted networks only). Authored `auth` arrays always win over both.
179
+
180
+ ## Test a channel
181
+
182
+ Start with curl and saved payloads under `fixtures/`. The playground's
183
+ **Try** modal covers manual probes. It remembers your last body per
184
+ endpoint, has Copy curl, and opens the created session on a successful
185
+ Try. For regression coverage, drive the same behavior through an eval,
186
+ or keep channel logic deterministic in `agent/lib/` and unit-test it
187
+ there. When something looks wrong, read the session's `events.ndjson`.
188
+ The stream is the record of what happened.
189
+
190
+ For GitHub specifically, don't hand-roll fixtures.
191
+ `agentkit github replay` synthesizes real-shaped, signed payloads
192
+ from any PR you can read. See the [GitHub guide](./github.md).
193
+
194
+ ## What's next
195
+
196
+ Continue with these pages:
197
+
198
+ - [Channels reference](../reference/channels.md): the full authoring API
199
+ - [GitHub](./github.md) and [Slack](./slack.md): the packaged channels
200
+ - [Sessions and streaming](../reference/sessions.md): events your
201
+ channel can subscribe to
@@ -0,0 +1,93 @@
1
+ ---
2
+ title: "Hillclimbing"
3
+ description: "Improve an agent one measured round at a time, with the hillclimb skill running the loop with you."
4
+ ---
5
+
6
+ # Hillclimbing
7
+
8
+ Make an agent better on fixed inputs: measure, change one lever, remeasure, and lock every kept win with an eval.
9
+
10
+ ## What is hillclimbing?
11
+
12
+ Hillclimbing is a measured improvement loop. You pin a few fixtures, name the one dominant problem in the run, change one lever, and check the same fixtures again. Keep only what helps. Every kept change lands an [eval](./evals.md) so the win stays put.
13
+
14
+ You don't have to run the loop alone. The package ships a coding-agent skill that drives it with you.
15
+
16
+ ```mermaid
17
+ flowchart LR
18
+ measure[Measure] --> change[Change one lever]
19
+ change --> remeasure[Remeasure]
20
+ remeasure --> measure
21
+ ```
22
+
23
+ ## How do I hillclimb an agent with a coding agent?
24
+
25
+ Have Cursor read [`skills/hillclimb/SKILL.md`](../skills/hillclimb/SKILL.md).
26
+
27
+ Tell it:
28
+
29
+ 1. **Which agent** you're improving (path or slug)
30
+ 2. **One to three fixtures** you'll reuse every round: a PR URL, a saved webhook body, or a canonical chat prompt
31
+ 3. **What "better" means** this round: correct tool choice, fewer tools, lower latency, or output quality. Name the freeze line too: API shape, public output, and existing evals that must stay green
32
+
33
+ The skill serves the agent, hits your fixtures, reads the session trajectory, proposes one change, remeasures, and checks with you before the next round.
34
+
35
+ Other skills cover the edges:
36
+
37
+ | When you need… | Skill |
38
+ | --- | --- |
39
+ | The measured improvement loop | [`skills/hillclimb/SKILL.md`](../skills/hillclimb/SKILL.md) |
40
+ | An eval that locks a kept win | [`skills/evals/SKILL.md`](../skills/evals/SKILL.md) |
41
+ | Repeatable GitHub webhook inputs | [`skills/github/SKILL.md`](../skills/github/SKILL.md) |
42
+ | A run that misbehaves | [`skills/debug/SKILL.md`](../skills/debug/SKILL.md) |
43
+
44
+ See [Building agents with agents](./building-with-agents.md) for every framework skill and a good first prompt.
45
+
46
+ ## What do I need before a hillclimb round?
47
+
48
+ Agree on four things before you edit:
49
+
50
+ 1. **The target agent**: the project you're improving
51
+ 2. **Fixtures**: one to three fixed inputs you can compare across runs
52
+ 3. **Success criteria**: what better means this round
53
+ 4. **The freeze line**: what must not change
54
+
55
+ Pin the input first. A moving fixture is noise. For GitHub agents, use `agentkit github replay` (see the [GitHub guide](./guides/github.md)). For a single tool without a model turn, use `agentkit call`. For a chat turn, use `agentkit run --dir . --message "…"`.
56
+
57
+ ## How do I run one hillclimb round?
58
+
59
+ **Measure.** Hit the agent the way a user would: playground, channel HTTP, or Slack in `--dev`. Or ask the hillclimb skill to do it. `agentkit run` returns a JSON trajectory and writes a trace under `.agentkit/traces/`.
60
+
61
+ **Reflect.** Score the trajectory, not impressions. Was the answer right? Did the model thrash (too many tools, fat evidence, grep loops)? Did it invent work the host should have prepared? Name the single dominant problem for this round in one sentence. Example: "Full-file dumps trigger grep loops."
62
+
63
+ **Change one lever.** Prefer the smallest change that addresses that problem:
64
+
65
+ 1. Host prep: seed what the model needs so it doesn't hunt
66
+ 2. Evidence shape: trim or reorder artifacts
67
+ 3. Instructions and skills: tighten the procedure
68
+ 4. Tool surface: remove or gate tools that invite wandering
69
+ 5. Framework changes: only when the agent can't express the fix
70
+
71
+ **Remeasure.** Same fixtures. Diff tools, wall time, and quality side by side. Keep the change only if the target metric improves and the freeze line holds.
72
+
73
+ ## How do I lock a hillclimb improvement with an eval?
74
+
75
+ Every kept change needs an eval that would have failed before the change: a tool-choice gate, an `action.result` count bound, or an output-shape check. Run `agentkit eval --dir . --json` between rounds. Never weaken an existing gate to pass the round.
76
+
77
+ Details live in [Evals](./evals.md). The evals skill will author the case with you.
78
+
79
+ ## What habits help hillclimbing stay reliable?
80
+
81
+ - One problem per round. Don't bundle "trim evidence and rewrite instructions" unless you chose that on purpose.
82
+ - Keep fixtures fixed until you deliberately need a harder case.
83
+ - Separate host work from model tools when you blame latency. Moving deterministic prep onto the host is often the biggest win. In one PR reviewer, host-prepared evidence cut turns from about 8 minutes to about 1 minute.
84
+ - Spot-check quality on at least one fixture against a known-good answer. Efficiency-only climbs quietly drop findings.
85
+ - Treat `turn.failed` with `"turn interrupted"` as expected when a follow-up or stop preempted the turn.
86
+ - Don't deploy, post to real surfaces, or weaken evals as part of a climb.
87
+
88
+ ## Related
89
+
90
+ - [Evals](./evals.md)
91
+ - [Building agents with agents](./building-with-agents.md)
92
+ - [GitHub guide](./guides/github.md)
93
+ - [Fix common agent problems](./troubleshooting.md)
@@ -0,0 +1,183 @@
1
+ ---
2
+ title: "Build your first weather agent"
3
+ description: "Create a weather agent, add a typed tool, run it from the terminal, and open it in the playground."
4
+ ---
5
+
6
+ # Build your first weather agent
7
+
8
+ Create an agent, give it a weather tool, run a complete turn, and chat
9
+ with it in the browser.
10
+
11
+ ## Prerequisites
12
+
13
+ You need:
14
+
15
+ - Node 22.13 or newer. Bun isn't supported.
16
+ - The `agentkit` CLI. See [Run the CLI](./README.md#run-the-cli)
17
+ for the current package and command names.
18
+ - A Cursor credential for model turns. Sign in once:
19
+
20
+ ```bash
21
+ agentkit login
22
+ ```
23
+
24
+ You can also set `CURSOR_API_KEY` instead of signing in.
25
+
26
+ ## Scaffolding Agents
27
+
28
+ Have Cursor read [`skills/create-agent/SKILL.md`](../skills/create-agent/SKILL.md)
29
+ and describe what you want:
30
+
31
+ > Build me a weather agent for the playground. Start with one weather
32
+ > tool and guide me through the remaining decisions.
33
+
34
+ Cursor asks for missing choices, shows you the plan, then builds and
35
+ verifies the agent. Continue below to do the same by hand.
36
+
37
+ See [Scaffold an agent with Cursor](./scaffolding-agents.md) for the
38
+ full guided workflow.
39
+
40
+ ## Create your project
41
+
42
+ Start with the built-in scaffold:
43
+
44
+ ```bash
45
+ agentkit init ./weather-agent
46
+ cd weather-agent
47
+ ```
48
+
49
+ The scaffold creates the files agentkit discovers:
50
+
51
+ ```text
52
+ weather-agent/
53
+ ├── agent/
54
+ │ ├── agent.ts
55
+ │ ├── instructions.md
56
+ │ └── tools/
57
+ │ └── echo.ts
58
+ └── package.json
59
+ ```
60
+
61
+ `agent.ts` holds the model and runtime settings. `instructions.md` is
62
+ the always-on system prompt. Each file under `agent/tools/` becomes a
63
+ tool.
64
+
65
+ Check the project before you run it:
66
+
67
+ ```bash
68
+ agentkit validate --dir .
69
+ agentkit info --dir .
70
+ ```
71
+
72
+ These commands inspect the project without starting a model turn.
73
+
74
+ ## Run your agent
75
+
76
+ The scaffold already works. Run one turn from the terminal:
77
+
78
+ ```bash
79
+ agentkit run --dir . \
80
+ --message "Introduce yourself in one sentence."
81
+ ```
82
+
83
+ `run` starts the agent, sends the message, and waits for the final
84
+ reply. It prints a JSON trajectory with the response, tool calls, and
85
+ token usage. It also writes an NDJSON trace under
86
+ `.agentkit/traces/`.
87
+
88
+ ## Add weather instructions
89
+
90
+ Replace `agent/instructions.md`:
91
+
92
+ ```md
93
+ # Weather agent
94
+
95
+ You are a concise weather assistant.
96
+
97
+ - Use `get_weather` before answering questions about current weather.
98
+ - Tell the user the weather data is simulated.
99
+ - Keep replies to two sentences or fewer.
100
+ ```
101
+
102
+ Remove the demo echo tool:
103
+
104
+ ```bash
105
+ rm agent/tools/echo.ts
106
+ ```
107
+
108
+ ## Add a weather tool
109
+
110
+ Create `agent/tools/get_weather.ts`:
111
+
112
+ ```ts
113
+ import { defineTool } from "@cursor/july/tools";
114
+ import { z } from "zod";
115
+
116
+ export default defineTool({
117
+ description: "Get simulated current weather for a city.",
118
+ inputSchema: z.object({
119
+ city: z.string().describe("City name, such as San Francisco"),
120
+ }),
121
+ async execute({ city }) {
122
+ const temperatureF = Math.round(Math.random() * (90 - 32) + 32);
123
+
124
+ return {
125
+ city,
126
+ temperatureF,
127
+ conditions: "sunny",
128
+ };
129
+ },
130
+ });
131
+ ```
132
+
133
+ The file adds one tool named `get_weather`:
134
+
135
+ - `description` tells the model when to call it.
136
+ - `inputSchema` defines and validates the arguments.
137
+ - `execute` runs on the server and returns data to the model.
138
+
139
+ This version uses simulated data so you can run it without another API
140
+ key. Replace `execute` with a weather API when you're ready.
141
+
142
+ ## Try the weather tool
143
+
144
+ Call the tool directly first:
145
+
146
+ ```bash
147
+ agentkit call get_weather --dir . \
148
+ --input '{"city":"San Francisco"}'
149
+ ```
150
+
151
+ `call` validates the input and runs `execute` without a model turn. If
152
+ the result looks right, ask the agent:
153
+
154
+ ```bash
155
+ agentkit run --dir . \
156
+ --message "What's the weather in San Francisco?"
157
+ ```
158
+
159
+ The agent calls `get_weather`, receives the result, and uses it in the
160
+ final reply. agentkit runs the tool loop for you.
161
+
162
+ ## Open the playground
163
+
164
+ Start the development server:
165
+
166
+ ```bash
167
+ agentkit serve --dir . --dev
168
+ ```
169
+
170
+ Open the playground URL printed in the terminal. Ask the same weather
171
+ question. The playground streams the reply and shows the tool arguments
172
+ and result inline.
173
+
174
+ ## Where to go next
175
+
176
+ - [Tools](./reference/tools.md): add more typed capabilities, like
177
+ replacing the simulated weather tool with live Open-Meteo data
178
+ - [Evals](./evals.md): turn this weather question into a regression
179
+ check
180
+ - [Channels](./reference/channels.md): expose the agent through HTTP,
181
+ Slack, or another webhook
182
+ - [Building agents with agents](./building-with-agents.md): have a
183
+ coding agent extend the project for you
@@ -0,0 +1,154 @@
1
+ ---
2
+ title: "Agent config"
3
+ description: "defineAgent at agent/agent.ts: the model, the local and cloud runtimes, and serving programmatically."
4
+ ---
5
+
6
+ # Agent config (`agent/agent.ts`)
7
+
8
+ `agent/agent.ts` default-exports `defineAgent(config)`: which model runs
9
+ the agent, where turns execute, and runtime-specific defaults.
10
+ Everything is optional on the root agent.
11
+
12
+ ```ts
13
+ import { defineAgent } from "@cursor/july";
14
+
15
+ export default defineAgent({
16
+ model: {
17
+ id: "grok-4.5",
18
+ params: [
19
+ { id: "effort", value: "high" },
20
+ { id: "fast", value: "true" },
21
+ ],
22
+ }, // optional; this is the default
23
+ runtime: "local", // default, or "cloud"
24
+ // cloud: {
25
+ // repos: [{ url: "https://github.com/org/repo", startingRef: "main" }],
26
+ // },
27
+ // local: { cwd: "../harness" },
28
+ });
29
+ ```
30
+
31
+ ## Fields on `defineAgent`
32
+
33
+ `defineAgent` accepts these fields.
34
+
35
+ | Field | Type | Meaning |
36
+ | --- | --- | --- |
37
+ | `model` | string or `{ id, params }` | Cursor model for turns. Defaults to `grok-4.5` with `effort=high`, `fast=true` on the root agent. Subagents omit it to inherit. |
38
+ | `name` | string | Display name override. Defaults to the package name or directory name. |
39
+ | `description` | string | What the agent is for. Required on subagents; the parent model reads it to decide when to delegate. Documentation-only on the root. |
40
+ | `instructions` | string | Inline instructions. Prefer `instructions.md`; this exists for subagents and generated configs. |
41
+ | `runtime` | `"local"` or `"cloud"` | Where turns execute. Default `"local"`. |
42
+ | `cloud` | object | Cloud agent defaults: repos, env, envVars, forwarded to the Cursor SDK. Used when `runtime` is `"cloud"`, and as the base merged under per-session `cloud` send options. |
43
+ | `local` | `{ cwd? }` | Local harness defaults; ignored for cloud turns. |
44
+
45
+ ## Choose a model
46
+
47
+ `model` is a Cursor model id string, or `{ id, params }`. Effort and
48
+ speed are params, not id suffixes. The SDK rejects suffix-style ids
49
+ like `grok-4.5-fast`:
50
+
51
+ ```ts
52
+ model: {
53
+ id: "grok-4.5",
54
+ params: [
55
+ { id: "effort", value: "high" },
56
+ { id: "fast", value: "true" },
57
+ ],
58
+ }
59
+ ```
60
+
61
+ A plain string works when you don't need params:
62
+
63
+ ```ts
64
+ model: "composer-2.5",
65
+ ```
66
+
67
+ ## Choose a runtime
68
+
69
+ `runtime: "local"` (the default) runs turns on the Cursor SDK harness on
70
+ this machine. The session id doubles as the SDK agent id, and server
71
+ tools, skills, sandbox seeds, and tool approvals all apply.
72
+
73
+ `runtime: "cloud"` runs turns on Cursor cloud agents (`bc-…` ids). Pass
74
+ a `cloud` block with the repos the VM carries. In-process server
75
+ tools are not available, and instructions and agent-tool catalogs are
76
+ prepended to the first prompt, because the local session workspace is
77
+ not the cloud VM.
78
+
79
+ `validate` warns when `runtime: "cloud"` is combined with server tools,
80
+ skills, or sandbox seeds that only apply locally. The full capability
81
+ matrix and the patterns that hold up are in the
82
+ [Cloud runtime guide](../guides/cloud-runtime.md).
83
+
84
+ ## Local cwd
85
+
86
+ `local.cwd` sets the default parent directory for local harness
87
+ workspaces. Each session uses `<cwd>/<sessionId>` (absolute, or relative
88
+ to the project root) unless a per-send `workspaceDir` overrides it.
89
+
90
+ This is your control over ambient context. Session workspaces are real
91
+ Cursor project directories, so the harness loads `AGENTS.md` and
92
+ `.cursor` config from ancestor directories. An agent inside a big
93
+ monorepo that must not inherit the monorepo's rules points `cwd`
94
+ outside it (or runs with `--state-root` under `/tmp`). An agent that
95
+ *needs* a specific checkout's skills and rules points `cwd` inside that
96
+ checkout.
97
+
98
+ ## The `cloud` block
99
+
100
+ Cloud agent defaults forwarded to the Cursor SDK: `repos` (each
101
+ `{ url, startingRef? }`), environment selection, `envVars`, and the
102
+ rest. A local agent uses the same block as the base config when a
103
+ channel opens a cloud-attached session per send. That hybrid pattern is
104
+ covered in
105
+ [Cloud runtime](../guides/cloud-runtime.md#hybrid-local-agent-cloud-sessions).
106
+
107
+ ## Generate instructions
108
+
109
+ When the system prompt must be computed, author `agent/instructions.ts`
110
+ instead of markdown:
111
+
112
+ ```ts
113
+ import { defineInstructions } from "@cursor/july";
114
+
115
+ export default defineInstructions({
116
+ markdown: `You are the on-call assistant for ${process.env.TEAM_NAME}.`,
117
+ });
118
+ ```
119
+
120
+ The directory form and the runtime mapping are in
121
+ [Instructions](./instructions.md).
122
+
123
+ ## Serve programmatically
124
+
125
+ `serve(dirOrProject, options)` embeds the server in your own process:
126
+
127
+ ```ts
128
+ import { serve } from "@cursor/july";
129
+
130
+ const handle = await serve("./my-agent", {
131
+ port: 3000,
132
+ apiKey: process.env.CURSOR_API_KEY, // optional; see credential order
133
+ });
134
+ console.log(`listening on ${handle.url}`);
135
+ // handle.callTool(...), handle.dispatchSchedule("heartbeat"),
136
+ // handle.createReminder(...), handle.project, await handle.close()
137
+ ```
138
+
139
+ `ServeOptions` mirrors the CLI flags: `port`, `host`, `dev`,
140
+ `stateRoot`, `apiKey`, `schedules`, `reminders`, `playground`,
141
+ `authToken` (the `--bearer-token` equivalent), `allowAnonymous`,
142
+ `publicUrl`, `cursorEvents`, and `mode: "single" | "multi"`. The Cursor
143
+ credential resolves in one order everywhere: explicit `apiKey`, then
144
+ `CURSOR_API_KEY`, then the key stored by `agentkit login`.
145
+
146
+ ## What's next
147
+
148
+ Continue with these pages:
149
+
150
+ - [Instructions](./instructions.md): the required half of a minimal
151
+ agent
152
+ - [Cloud runtime](../guides/cloud-runtime.md): when and how to leave
153
+ the host
154
+ - [CLI](./cli.md): the flags `ServeOptions` mirrors