@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
package/docs/evals.md ADDED
@@ -0,0 +1,383 @@
1
+ ---
2
+ title: "Evals"
3
+ description: "Define repeatable checks with defineEval, run them with agentkit eval, and use them as regression checks."
4
+ ---
5
+
6
+ # Evals
7
+
8
+ An eval is a repeatable check that runs your agent against a fixed input
9
+ and gates the recorded trajectory: the run completed, the right tool
10
+ ran, the reply has the right shape. Evals are how you know a prompt
11
+ tweak helped, a refactor didn't regress the agent, and last month's fix
12
+ is still holding.
13
+
14
+ Evals exercise the same surface your users hit. The runner starts (or
15
+ targets) a real agent server, drives sessions over the public API, and
16
+ grades what comes back. A passing eval means the agent started,
17
+ accepted a message, and did what you asserted.
18
+
19
+ > [!NOTE]
20
+ > Import paths here use `@cursor/july/evals`. On projects still
21
+ > using `@cursor/july`, swap the import and run
22
+ > `agent-serve eval`. See
23
+ > [Run the CLI](./README.md#run-the-cli) for the full rename table.
24
+
25
+ ## Define evals with `defineEval`
26
+
27
+ agentkit discovers evals under the project-root `evals/` directory,
28
+ in `.eval.ts` or `.eval.js` files. That's a sibling of `agent/`, never
29
+ inside it (`agent/evals/` is silently ignored). TypeScript is the normal
30
+ authoring format.
31
+
32
+ The file path is the eval's identity, so you don't author an id.
33
+ Directories group related evals: `evals/builds/api.eval.ts` becomes id
34
+ `builds/api`. An `index` filename collapses to its directory, so
35
+ `evals/builds/index.eval.ts` becomes `builds`.
36
+
37
+ An eval is a single `async test(t)`. You drive the agent with `t` and
38
+ assert on the run with the same `t`:
39
+
40
+ ```ts
41
+ // evals/readiness.eval.ts
42
+ import { defineEval, includes } from "@cursor/july/evals";
43
+
44
+ export default defineEval({
45
+ description: "Inspects a PR without approving it.",
46
+ tags: ["smoke"],
47
+ timeoutMs: 120_000,
48
+ async test(t) {
49
+ await t.send(
50
+ "Is https://github.com/acme/checkout/pull/42 ready to approve?"
51
+ );
52
+ t.succeeded();
53
+ t.calledTool("inspect_pr");
54
+ t.notCalledTool("approve_pr");
55
+ t.check(t.reply, includes(/ready|approve/i));
56
+ },
57
+ });
58
+ ```
59
+
60
+ One file can also hold several datapoints through `cases` (provide
61
+ either `test` or `cases`, not both). Each case id becomes
62
+ `<fileId>/<case.id>`:
63
+
64
+ ```ts
65
+ // evals/prs.eval.ts → prs/checkout, prs/search
66
+ export default defineEval({
67
+ tags: ["smoke", "prs"],
68
+ cases: [
69
+ {
70
+ id: "checkout",
71
+ description: "Checkout PR readiness.",
72
+ async test(t) {
73
+ await t.send(
74
+ "Is https://github.com/acme/checkout/pull/42 ready to approve?"
75
+ );
76
+ t.succeeded();
77
+ t.calledTool("inspect_pr");
78
+ },
79
+ },
80
+ {
81
+ id: "search",
82
+ async test(t) {
83
+ await t.send(
84
+ "Check https://github.com/acme/search/pull/7 before approval."
85
+ );
86
+ t.succeeded();
87
+ t.calledTool("inspect_pr");
88
+ },
89
+ },
90
+ ],
91
+ });
92
+ ```
93
+
94
+ Case ids must be single path segments, unique within the file.
95
+ Each case can set its own `description`, `tags`, and `timeoutMs`. A
96
+ case-level value replaces the file-level value for that datapoint.
97
+
98
+ ## Configure eval runs
99
+
100
+ Each project with evals needs `evals/evals.config.ts` or
101
+ `evals/evals.config.js`, and it must set `maxConcurrency`. Each case
102
+ issues real model-provider requests, so concurrency is capped hard at
103
+ 200. Existing projects use 20. Discovery with `eval --list` works
104
+ without this file, but running a case does not.
105
+
106
+ ```ts
107
+ import {
108
+ defineEvalConfig,
109
+ persistEvalRunsToDir,
110
+ } from "@cursor/july/evals";
111
+
112
+ export default defineEvalConfig({
113
+ maxConcurrency: 20, // required
114
+ // timeoutMs: 180_000, // optional project-wide default
115
+ // maxPlaygroundRuns: 50, // playground /v1/dev/evals history only (default 20)
116
+ //
117
+ // Playground batches default to **process memory only** — they disappear
118
+ // when `serve` exits. Opt into durable storage:
119
+ // persistRuns: persistEvalRunsToDir(".agent-serve/eval-runs"),
120
+ // Or implement { load, save, delete } yourself (S3, DB, …).
121
+ });
122
+ ```
123
+
124
+ The timeout order is case or file `timeoutMs`, CLI `--timeout-ms`,
125
+ project config `timeoutMs`, then the 180-second runner default.
126
+
127
+ Playground batch retention is separate from case concurrency:
128
+
129
+ | Option | Default | Meaning |
130
+ | --- | --- | --- |
131
+ | `maxPlaygroundRuns` | `20` | Max batches in the playground / `/v1/dev/evals*` history (not CLI `eval`) |
132
+ | `persistRuns` | unset | Optional `{ load, save, delete }` so batches survive process restart (`delete` required for durable prune) |
133
+
134
+ Without `persistRuns`, navigating away and back still works while the same
135
+ `serve` process is up; a restart clears history.
136
+
137
+ ## Drive and assert with `t`
138
+
139
+ `t` is both the driver and the assertion surface. You write ordinary
140
+ control flow, sending turns and asserting inline.
141
+
142
+ Drive the agent with `t.send(message, options?)`. It runs one turn and
143
+ waits for the session to park or fail. Multiple sends in one case share
144
+ the session, which is how you write multi-turn evals. The return value
145
+ contains the turn's `message`, `sessionId`, `events`, `toolCalls`, and
146
+ `ok` state.
147
+
148
+ Read the full case state with `t.reply` (the last assistant text),
149
+ `t.events` (every captured session event across turns), and
150
+ `t.sessionId`.
151
+
152
+ Assert with the gates:
153
+
154
+ | Gate | Checks |
155
+ | --- | --- |
156
+ | `t.succeeded()` | the captured trajectory has at least one turn and did not fail |
157
+ | `t.calledTool(name)` | `name` appears in the captured tool calls |
158
+ | `t.notCalledTool(name)` | `name` does not appear in the captured tool calls |
159
+ | `t.messageIncludes(token)` | the last assistant reply matches a string or `RegExp` |
160
+ | `t.check(value, expectation)` | any value, against a builder |
161
+
162
+ `calledTool` reads the recorded trajectory. A requested call counts even
163
+ when its result has not arrived. To require a completed result, inspect
164
+ `t.events` for an `action.result` event.
165
+
166
+ The expectation builders are `includes(string | RegExp)`,
167
+ `equals(value)`, and `satisfies(predicate, label)`. `includes`
168
+ stringifies its input, `equals` compares values deeply, and `satisfies`
169
+ runs your predicate. `t.log(message)` records a debug line for the CLI
170
+ and playground result.
171
+
172
+ Two `t.send` options make cases self-contained: `workspaceFiles`
173
+ (`{ path: contents }`, seeded into the session workspace before the
174
+ first turn) and `workspaceDir` (an absolute harness cwd). Prefer
175
+ `workspaceFiles` over machine-local paths, so the case carries its own
176
+ fixtures. Both options only apply to the first `t.send`, when the runner
177
+ creates the session.
178
+
179
+ ```ts
180
+ const toolResults = t.events.filter((e) => e.type === "action.result");
181
+ t.check(
182
+ toolResults.length,
183
+ satisfies((n) => (n as number) <= 4, "at most 4 tool calls")
184
+ );
185
+ ```
186
+
187
+ A case with no explicit gates falls back to whether at least one turn
188
+ completed successfully. Add `t.succeeded()` and behavior-specific gates
189
+ anyway. They make the contract visible during review.
190
+
191
+ ## Run evals from the CLI
192
+
193
+ The `eval` command discovers, filters, and runs cases.
194
+
195
+ Run the CLI under Node 22.13 or newer. Do not use Bun. Its HTTP/2 client
196
+ breaks tool-result streams and causes eval turns to fail.
197
+
198
+ ```bash
199
+ agentkit eval --dir . --list # discover only
200
+ agentkit eval --dir . # run all
201
+ agentkit eval --dir . builds/checkout # one datapoint
202
+ agentkit eval --dir . builds search # several ids or prefixes
203
+ agentkit eval --dir . --tag smoke --tag pull-request # any matching tag
204
+ agentkit eval --dir . --json --no-stream # machine-readable results
205
+ agentkit eval --dir . --verbose # logs + reply snippets
206
+ ```
207
+
208
+ Id filters use OR semantics. Each filter selects an exact id and its
209
+ descendants. For example, `builds` selects `builds`,
210
+ `builds/checkout`, and every other case below that path. Repeated tags
211
+ also use OR semantics. When you provide both ids and tags, a case must
212
+ match both groups.
213
+
214
+ `eval` boots an ephemeral server on port 0 with a temp state root
215
+ outside the project, so cases don't inherit ambient monorepo rules and
216
+ don't pollute `.agentkit/`. Point `--url` at a running server to eval
217
+ a live agent instead:
218
+
219
+ ```bash
220
+ agentkit eval --dir . \
221
+ --url http://127.0.0.1:3000/weather-agent \
222
+ --bearer-token "$AGENT_TOKEN"
223
+ ```
224
+
225
+ The eval definitions still come from `--dir`; `--url` only changes the
226
+ agent that receives the turns. For a locally mounted multi-agent
227
+ directory, `--slug weather-agent` chooses the target. Use
228
+ `--state-root` to keep ephemeral session state at a chosen path,
229
+ `--timeout-ms` to override the project timeout, and `--no-stream` to
230
+ keep live progress off stderr. A TTY streams turn progress by default.
231
+ `--verbose` still writes `t.log` lines to stderr and adds reply snippets
232
+ to text results.
233
+
234
+ Model turns need a Cursor credential from `agentkit login` or
235
+ `CURSOR_API_KEY`.
236
+
237
+ The exit code is `0` when every selected case passes, `1` when any case
238
+ fails, and `2` when no case matches. `--list` exits `0`, including when
239
+ it finds no cases.
240
+
241
+ For a compact command index, see [CLI: eval](./reference/cli.md#eval).
242
+
243
+ ### JSON results
244
+
245
+ Use `--json --no-stream` in scripts and CI. The top-level result carries
246
+ the totals and one result per case:
247
+
248
+ ```json
249
+ {
250
+ "ok": true,
251
+ "passed": 1,
252
+ "failed": 0,
253
+ "results": [
254
+ {
255
+ "id": "readiness",
256
+ "ok": true,
257
+ "assertions": [{ "name": "succeeded", "passed": true }],
258
+ "sessionId": "ses_123",
259
+ "inputs": ["Is checkout pull request 42 ready to approve?"],
260
+ "toolCalls": [{ "toolName": "inspect_pr", "isError": false }],
261
+ "logs": [],
262
+ "durationMs": 12340
263
+ }
264
+ ]
265
+ }
266
+ ```
267
+
268
+ Each case result can also include `description`, `finalText`, `tools`,
269
+ `error`, and tool arguments or output. This shape lets CI report the
270
+ failed assertion without parsing terminal text.
271
+
272
+ ## Run evals in the playground
273
+
274
+ Start the server with `--dev`, open the playground, and choose
275
+ **Evals**. You can run every case or one case, watch progress, and open
276
+ the resulting session trace.
277
+
278
+ ```bash
279
+ agentkit serve --dir . --dev
280
+ ```
281
+
282
+ Playground runs target the live server instead of an ephemeral one.
283
+ Their sessions appear in the session list. One eval batch can run at a
284
+ time. By default those batches are **in-memory only** (capped by
285
+ `maxPlaygroundRuns`); set `persistRuns` in `evals.config.ts` if you need them
286
+ after a serve restart — see [Configure eval runs](#configure-eval-runs).
287
+
288
+ The UI uses the playground eval routes (available without `--dev`):
289
+ `GET /v1/dev/evals` lists datapoints and config (includes `maxPlaygroundRuns` /
290
+ `durableRuns`),
291
+ `GET /v1/dev/evals/runs` rehydrates recent batches after navigation,
292
+ `POST /v1/dev/evals/runs` starts a batch, and
293
+ `GET /v1/dev/evals/runs/:runId` polls it. See
294
+ [Playground eval routes](./reference/http-api.md#playground-eval-routes).
295
+ The start request returns `202` while cases run in the background.
296
+ Poll until the snapshot status becomes `completed` or `failed`.
297
+ Configuration errors appear on a failed snapshot.
298
+
299
+ ## What good cases assert
300
+
301
+ Gate decisions and shape, not prose. Model wording varies run to run.
302
+ Tool choice, tool avoidance, and output structure are the stable
303
+ contract.
304
+
305
+ 1. `t.succeeded()`: always, first.
306
+ 2. The tool decision: `calledTool` for the intended path,
307
+ `notCalledTool` for the likely wrong alternative. The pair is
308
+ stronger than either alone.
309
+ 3. Output shape: a regex for the contract (`/ready|blocked/i`, a JSON
310
+ marker, a findings-block fence), never exact sentences.
311
+ 4. For structured output, parse `t.reply` and check fields with
312
+ `satisfies` instead of substring-matching JSON.
313
+
314
+ The common failure modes: asserting exact phrasing, packing more than
315
+ about five gates into one case (split it), and cases that depend on live
316
+ external state that drifts (pin the input; see fixtures).
317
+
318
+ ## Pick fixtures by agent type
319
+
320
+ The right fixture depends on the surface under test.
321
+
322
+ | Agent surface | Fixture |
323
+ | --- | --- |
324
+ | Chat / domain assistant | A canonical prompt string, chosen once and frozen |
325
+ | Tool-heavy | Run `agentkit call <tool>` first to pin what the tool returns, then freeze the prompt that triggers it |
326
+ | GitHub webhook | `agentkit github replay <pr> --events '*' --dry-run --out fixtures/github` snapshots real payloads for offline replay ([GitHub guide](./guides/github.md)) |
327
+ | PR reviewer with host preparation | Diff, metadata, and gold labels pinned to commit SHAs; keep any live PR matrix small |
328
+ | Workspace-dependent | `workspaceFiles` in `t.send` options, never developer-machine paths |
329
+
330
+ Tag the fast, reliably passing core `smoke` and run `--tag smoke` in the
331
+ inner loop. Leave slow or flaky-prone cases untagged for explicit runs.
332
+
333
+ ### Materialize API-backed fixtures
334
+
335
+ An input that only points at external data, such as a pull request URL,
336
+ snapshot id, or pair of commit SHAs, is not self-contained. Fetch it
337
+ once and commit the rendered fixture before you expand the suite.
338
+
339
+ 1. Save the diff, metadata, and labels under `fixtures/` at pinned
340
+ revisions.
341
+ 2. Seed those files with `workspaceFiles`, or read them from the fixture
342
+ directory.
343
+ 3. Assert decisions and output shape against the saved evidence.
344
+ 4. Keep a small `smoke` subset for any remaining live pipeline checks.
345
+
346
+ `maxConcurrency` limits parallel datapoints. It does not limit model or
347
+ API fan-out inside one datapoint. Materialized fixtures prevent a large
348
+ suite from exhausting provider and GitHub rate limits. The
349
+ [evals skill](../skills/evals/SKILL.md) has the full fixture workflow.
350
+
351
+ ## Keep improvements with regression evals
352
+
353
+ Every [hillclimb](./hillclimbing.md) round that keeps a change must land
354
+ an eval that would have failed before the change. If you can't express
355
+ the improvement as a gate (a `calledTool` shift, a bounded
356
+ `action.result` count, an output-shape regex), the improvement is
357
+ unverified, and it'll regress silently.
358
+
359
+ The rule cuts the other way too: never weaken an existing gate to make a
360
+ round pass. That's the freeze line moving, and it turns your regression
361
+ suite into a list of checks that no longer protect anything.
362
+
363
+ ## Compare variants on live traffic
364
+
365
+ Use `defineAB` to compare variant metrics on live sessions. It is not a
366
+ test runner and has no `agentkit ab` command. Keep `defineEval` as the
367
+ regression ratchet. Eval sessions do not enroll or change live metrics.
368
+ See [Live A/B metrics](./ab.md) for assignment, behavior, collection,
369
+ and inspection.
370
+
371
+ ## What's next
372
+
373
+ Continue with these pages:
374
+
375
+ - [Live A/B metrics](./ab.md): sticky variants and cumulative metrics
376
+ on live sessions
377
+ - [Hillclimbing](./hillclimbing.md): the loop evals make trustworthy
378
+ - [Building agents with agents](./building-with-agents.md): have a
379
+ coding agent write the first suite
380
+ - [GitHub guide](./guides/github.md): deterministic webhook fixtures
381
+ with `github replay`
382
+ - [Sessions and streaming](./reference/sessions.md): the events
383
+ `t.events` contains
@@ -0,0 +1,118 @@
1
+ ---
2
+ title: "Agent-to-agent"
3
+ description: "Every agent is an MCP server. Peer MCP connections let one agent delegate to another that keeps its own tools, sessions, and context."
4
+ ---
5
+
6
+ # Agent-to-agent
7
+
8
+ Every mounted agent is also an MCP server. So agents can delegate to each
9
+ other without extra infrastructure. One agent hands a question to
10
+ another, and the peer answers in its own session with its own
11
+ instructions, tools, and context. Any external MCP client can do the
12
+ same. A peer MCP connection makes the wiring one line.
13
+
14
+ This guide wires a `concierge` agent that delegates weather questions
15
+ to a `weather-agent` peer mounted on the same host.
16
+
17
+ ## The MCP endpoint
18
+
19
+ Each agent serves the Model Context Protocol over streamable HTTP at
20
+ `/<slug>/v1/mcp` (or `/v1/mcp` in single mode). The surface is stateless
21
+ (session identity travels in tool arguments) and runs the same route
22
+ auth chain as the session API. It exposes three tools:
23
+
24
+ | Tool | Behavior |
25
+ | --- | --- |
26
+ | `ask` | Send a message. Runs a model turn in this agent's own session and returns `{ status, sessionId, reply }`. Omit `sessionId` for a fresh session; pass it back to follow up. |
27
+ | `check` | Wait for or poll a running session (`waitSeconds: 0` polls without blocking). |
28
+ | `call_tool` | Call one of the agent's server tools directly, no model turn. Registered only when the agent has server tools. |
29
+
30
+ Waits are bounded at roughly 50 seconds, below typical MCP client
31
+ request timeouts: a long turn returns `status: "running"` and the caller
32
+ keeps waiting with `check`. Sessions created this way live on the `mcp`
33
+ channel, bind to the calling principal, and show up in the playground
34
+ and `GET /v1/sessions` like any other session.
35
+
36
+ Any MCP client can attach to this endpoint. It isn't only for other
37
+ agentkit agents.
38
+
39
+ ## Wire a peer MCP connection
40
+
41
+ A peer MCP connection points one agent at another mounted on the same
42
+ serve host. Author an MCP connection whose transport is the peer's slug:
43
+
44
+ ```ts
45
+ // agents/concierge/agent/mcp-connections/weather.ts
46
+ import { defineConnection } from "@cursor/july/connections";
47
+
48
+ export default defineConnection({
49
+ agent: "weather-agent",
50
+ description: "Delegate weather questions to the weather agent.",
51
+ });
52
+ ```
53
+
54
+ The parent model now sees the peer's `ask` and `check` (and `call_tool`)
55
+ tools under the `weather` server name. It reads like subagent
56
+ delegation, except the peer is a full agent that keeps its own
57
+ instructions, tools, MCP connections, and sessions.
58
+
59
+ ```bash
60
+ agentkit serve --dir ./agents --dev
61
+ agentkit chat --url http://127.0.0.1:3000/concierge \
62
+ --message "What's the weather in Paris right now?"
63
+ # concierge → weather.ask → weather-agent's own session/tools → reply
64
+ ```
65
+
66
+ ## Peer or subagent?
67
+
68
+ The two delegation mechanisms solve different problems.
69
+
70
+ | | Subagent (`agent/subagents/<id>/`) | Peer (`defineConnection({ agent })`) |
71
+ | --- | --- | --- |
72
+ | Runs as | an SDK custom subagent inside the parent's harness | an independent agent on the same host |
73
+ | Own tools, MCP connections, sessions | no, inherits the parent's surface | yes, everything is its own |
74
+ | Visible to others | only its parent | any MCP client, other agents, its own playground |
75
+ | Reach for it when | splitting one job into specialist roles | composing independently useful agents |
76
+
77
+ ## How peer URLs resolve
78
+
79
+ Peer URLs resolve when the server starts, so the ephemeral ports `run`
80
+ and `eval` use work too. Local-runtime turns (and host-side
81
+ `ctx.host.mcp` or channel-handler calls) reach the peer over loopback,
82
+ which works under the default auth. Cloud-runtime turns execute on a VM
83
+ that cannot reach this host's loopback address: pass
84
+ `--public-url https://agentkit.example.com` (or
85
+ `serve(dir, { publicUrl })`) so peers resolve to a reachable URL.
86
+ Without one, peers are omitted from cloud turns and the server warns at
87
+ startup. With `--bearer-token`, the token is attached to peer calls
88
+ automatically so they pass the target agent's auth chain.
89
+
90
+ ## Guardrails
91
+
92
+ Unknown peer slugs and self-references fail `serve` at startup, so you
93
+ find out immediately rather than at delegation time. Peers require the
94
+ multi-agent layout (each agent mounted under its slug, the default).
95
+
96
+ The framework does not provide cross-host loop protection. If agent A's
97
+ instructions delegate to B and B's delegate back to A, they can recurse.
98
+ Scope each agent's delegation instructions narrowly. The concierge
99
+ delegates *weather questions* to `weather-agent`, not everything.
100
+
101
+ ## Call a peer from host code
102
+
103
+ Peer MCP connections are ordinary MCP connections, so deterministic host code
104
+ can use them too. A channel handler or server tool can call
105
+ `host.mcp.callTool("weather", "ask", { message: "…" })` without any
106
+ model turn deciding to. See
107
+ [MCP connections](../reference/connections.md#every-mcp-connection-is-available-in-three-places)
108
+ for the three places every MCP connection is available.
109
+
110
+ ## What's next
111
+
112
+ Continue with these pages:
113
+
114
+ - [MCP connections](../reference/connections.md): all four MCP connection
115
+ transports
116
+ - [Subagents](../reference/subagents.md): the in-harness alternative
117
+ - [HTTP API](../reference/http-api.md#mcp-endpoint): the endpoint
118
+ contract
@@ -0,0 +1,122 @@
1
+ ---
2
+ title: "Cloud runtime"
3
+ description: "Run turns on Cursor cloud agents instead of the local harness: when to switch, what changes, and the patterns that hold up."
4
+ ---
5
+
6
+ # Cloud runtime
7
+
8
+ By default, turns execute on the Cursor SDK's local harness, on the same
9
+ machine as the server. Set `runtime: "cloud"` and turns execute on
10
+ Cursor cloud agents instead. They're ephemeral VMs that carry a repo
11
+ checkout, run `gh`, `git`, and tests for real, and scale past what one
12
+ host's disk and CPU can do. The serve host keeps handling routing, host
13
+ preparation, sessions, and bookkeeping.
14
+
15
+ A canonical use is a PR driver whose triage runs on cloud VMs. The
16
+ patterns in this guide come from running one against real PR traffic.
17
+
18
+ ## When to switch
19
+
20
+ A guideline from running PR agents at scale: per-PR worktrees on the serve host
21
+ don't scale to hundreds of engineers opening PRs. When the job needs a
22
+ repo checkout at scale, use cloud. The signals:
23
+
24
+ - The agent must run repo commands (tests, builds, `git`) against many
25
+ different refs concurrently.
26
+ - Turns are long and heavy, and you don't want them competing with the
27
+ server for resources.
28
+ - The work product is a PR or branch the VM can push, not a local file.
29
+
30
+ Stay local when the agent is conversational, tool-driven against APIs,
31
+ or works over host-prepared evidence. Local turns are cheaper, start
32
+ faster, and support the full authored surface.
33
+
34
+ ## Configure it
35
+
36
+ Cloud runtime is two fields on the agent config.
37
+
38
+ ```ts
39
+ import { defineAgent } from "@cursor/july";
40
+
41
+ export default defineAgent({
42
+ runtime: "cloud",
43
+ cloud: {
44
+ repos: [{ url: "https://github.com/org/repo", startingRef: "main" }],
45
+ // env / envVars / … forwarded to the Cursor SDK
46
+ },
47
+ });
48
+ ```
49
+
50
+ The host must be signed in (`agentkit login` or `CURSOR_API_KEY`).
51
+
52
+ > [!IMPORTANT]
53
+ > Cloud agents run against the Cursor backend under the signed-in
54
+ > account, and every wake spends real cloud-agent budget. Decide
55
+ > explicitly what may trigger one.
56
+
57
+ ## What changes on cloud
58
+
59
+ Cloud turns run on a VM without your authored files, so the runtime
60
+ mapping shifts:
61
+
62
+ | Folder or file | Local runtime | Cloud runtime |
63
+ | --- | --- | --- |
64
+ | `instructions.*` | `AGENTS.md` in the session workspace | prepended to the first prompt |
65
+ | Server tools (`execution: "server"`) | in-process SDK custom tools | not available |
66
+ | Agent tools (`execution: "agent"`) | scripts in the session workspace | catalog + script bodies on the first prompt |
67
+ | `skills/*` | `.cursor/skills/` in the workspace | only if present in the cloud repo |
68
+ | `mcp-connections/*.ts` | SDK `mcpServers` | SDK `mcpServers` (peers need `--public-url`) |
69
+ | `sandbox/workspace/**` | seeded into the session workspace | ignored |
70
+ | Tool approvals (`needsApproval`) | supported | not supported |
71
+
72
+ `agentkit validate` warns when `runtime: "cloud"` is combined with
73
+ local-only capabilities. Those warnings match this table.
74
+
75
+ Two more behaviors are cloud-specific. Sessions persist a separate SDK
76
+ agent id (`bc-…`), emitted on the stream as `agent.bound` with a URL to
77
+ the cloud conversation. Cloud ids are minted during the first send. And
78
+ peer MCP connections resolve to `--public-url` for cloud turns, because a VM
79
+ cannot reach the host's loopback; without one, peers are omitted from
80
+ cloud turns and the server warns at startup.
81
+
82
+ ## Hybrid: local agent, cloud sessions
83
+
84
+ A local-runtime agent can still open cloud-attached sessions per send.
85
+ Channel handlers may pass a `cloud` block (repos pinned to a PR ref, say)
86
+ in `send` options, and Slack handlers may return `cloud` from a mention
87
+ hook. A PR driver works this way: chat stays local, and the `drive`
88
+ flow attaches the PR to a cloud VM. The agent-level `cloud` config is the
89
+ base that per-session options merge over.
90
+
91
+ ## Patterns that hold up
92
+
93
+ These come from running a PR driver against real PR traffic:
94
+
95
+ - One cloud agent per unit of work (per PR, say). Store the `bc-…` id
96
+ keyed by the work unit (an affinity store written from an
97
+ `agent.bound` hook) so webhook wakes resume the same conversation
98
+ instead of booting a fresh VM per event.
99
+ - Stable continuation keys (`pr:owner/repo#N`) so every wake lands on
100
+ the same session within a channel.
101
+ - Keep the host deterministic: fetch briefs and metadata on the host,
102
+ send the VM a compact prompt, and let the VM re-read source of truth
103
+ with its own `gh` and `git` instead of trusting payload snapshots.
104
+ - Limit exposure: add repository allowlists on webhook channels,
105
+ because every wake spends the account's budget.
106
+
107
+ ## Verify cloud agents
108
+
109
+ `agentkit run` and `eval` work unchanged. The trajectory records the
110
+ same event vocabulary plus `agent.bound` with the cloud URL, so you can
111
+ open the cloud conversation for any session. Cloud turns take minutes.
112
+ Pass generous `--timeout-ms` values, and keep curl timeouts long when
113
+ driving channels directly.
114
+
115
+ ## What's next
116
+
117
+ Continue with these pages:
118
+
119
+ - [Agent config](../reference/agent-config.md): the `runtime` and
120
+ `cloud` fields precisely
121
+ - [GitHub guide](./github.md): the webhook patterns that pair with
122
+ cloud triage