@cursor/july 0.1.92 → 0.1.94

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 (448) hide show
  1. package/AGENTS.md +8 -20
  2. package/README.md +115 -182
  3. package/dist/channels/deployments/deployments-channel.d.ts +7 -0
  4. package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
  5. package/dist/channels/deployments/deployments-channel.js +26 -2
  6. package/dist/channels/deployments/types.d.ts +8 -0
  7. package/dist/channels/deployments/types.d.ts.map +1 -1
  8. package/dist/channels/github/github-channel.d.ts +3 -0
  9. package/dist/channels/github/github-channel.d.ts.map +1 -1
  10. package/dist/channels/github/github-channel.js +28 -56
  11. package/dist/channels/slack/attachments.js +2 -2
  12. package/dist/channels/slack/dispatch.d.ts +0 -7
  13. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  14. package/dist/channels/slack/dispatch.js +4 -7
  15. package/dist/channels/slack/eval-directive.d.ts +5 -12
  16. package/dist/channels/slack/eval-directive.d.ts.map +1 -1
  17. package/dist/channels/slack/eval-directive.js +8 -19
  18. package/dist/channels/slack/index.d.ts +0 -6
  19. package/dist/channels/slack/index.d.ts.map +1 -1
  20. package/dist/channels/slack/index.js +0 -6
  21. package/dist/channels/slack/setup.d.ts +4 -4
  22. package/dist/channels/slack/setup.d.ts.map +1 -1
  23. package/dist/channels/slack/setup.js +8 -15
  24. package/dist/channels/slack/slack-channel.d.ts +6 -13
  25. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  26. package/dist/channels/slack/slack-channel.js +15 -101
  27. package/dist/channels/slack/types.d.ts +12 -79
  28. package/dist/channels/slack/types.d.ts.map +1 -1
  29. package/dist/channels/slack/types.js +1 -15
  30. package/dist/client.d.ts +14 -0
  31. package/dist/client.d.ts.map +1 -0
  32. package/dist/client.js +12 -0
  33. package/dist/connections.d.ts +18 -9
  34. package/dist/connections.d.ts.map +1 -1
  35. package/dist/connections.js +17 -8
  36. package/dist/continuation.d.ts +1 -1
  37. package/dist/continuation.js +1 -1
  38. package/dist/docs/404.html +2 -2
  39. package/dist/docs/ab.html +8 -8
  40. package/dist/docs/ab.md +7 -13
  41. package/dist/docs/assets/{ab.md.CVzWxLoB.js → ab.md.DJo5r4R-.js} +4 -4
  42. package/dist/docs/assets/{ab.md.CVzWxLoB.lean.js → ab.md.DJo5r4R-.lean.js} +1 -1
  43. package/dist/docs/assets/{app.Bci6CM9E.js → app.CFDEas4I.js} +1 -1
  44. package/dist/docs/assets/building-with-agents.md.DI4mEzlt.js +13 -0
  45. package/dist/docs/assets/{building-with-agents.md.DH8A_cHA.lean.js → building-with-agents.md.DI4mEzlt.lean.js} +1 -1
  46. package/dist/docs/assets/chunks/@localSearchIndexroot.DU3U2Ij2.js +1 -0
  47. package/dist/docs/assets/chunks/{VPLocalSearchBox.BCPT6xA-.js → VPLocalSearchBox.B1IIYpYS.js} +1 -1
  48. package/dist/docs/assets/chunks/{theme.BEA8BF3c.js → theme.Ct4NSiLm.js} +2 -2
  49. package/dist/docs/assets/concepts.md.lwAgBIMI.js +1 -0
  50. package/dist/docs/assets/{concepts.md.CRfU3bVg.lean.js → concepts.md.lwAgBIMI.lean.js} +1 -1
  51. package/dist/docs/assets/{deployment.md.DX_hc3ze.js → deployment.md.D9msOFOW.js} +9 -14
  52. package/dist/docs/assets/{deployment.md.DX_hc3ze.lean.js → deployment.md.D9msOFOW.lean.js} +1 -1
  53. package/dist/docs/assets/{evals.md.a0SMN6r9.js → evals.md.lfJoEVc8.js} +6 -6
  54. package/dist/docs/assets/{evals.md.a0SMN6r9.lean.js → evals.md.lfJoEVc8.lean.js} +1 -1
  55. package/dist/docs/assets/{guides_agent-to-agent.md.BCeVdJRJ.js → guides_agent-to-agent.md.BDb0t1QV.js} +2 -2
  56. package/dist/docs/assets/guides_cloud-runtime.md.CkYbjnAX.js +9 -0
  57. package/dist/docs/assets/guides_cloud-runtime.md.CkYbjnAX.lean.js +1 -0
  58. package/dist/docs/assets/{guides_convert-automation.md.D06eIzea.js → guides_convert-automation.md.B4sjlodG.js} +2 -2
  59. package/dist/docs/assets/{guides_github.md.Cdt1s2QC.js → guides_github.md.Cnh2mL4a.js} +5 -5
  60. package/dist/docs/assets/{guides_github.md.Cdt1s2QC.lean.js → guides_github.md.Cnh2mL4a.lean.js} +1 -1
  61. package/dist/docs/assets/{guides_mcp-oauth.md.Du0f7pGU.js → guides_mcp-oauth.md.DPYmBCbV.js} +7 -9
  62. package/dist/docs/assets/{guides_mcp-oauth.md.Du0f7pGU.lean.js → guides_mcp-oauth.md.DPYmBCbV.lean.js} +1 -1
  63. package/dist/docs/assets/{guides_slack.md.DiUmk_Oi.js → guides_slack.md.C32HsdKk.js} +7 -13
  64. package/dist/docs/assets/guides_slack.md.C32HsdKk.lean.js +1 -0
  65. package/dist/docs/assets/{guides_webhooks.md.BpnIdO0i.js → guides_webhooks.md.DKdA43Qm.js} +2 -2
  66. package/dist/docs/assets/{hillclimbing.md.ywF3yDAd.js → hillclimbing.md.DhESf3OO.js} +1 -1
  67. package/dist/docs/assets/index.md.DRakGHFe.js +5 -0
  68. package/dist/docs/assets/{index.md.BAaMXLFd.lean.js → index.md.DRakGHFe.lean.js} +1 -1
  69. package/dist/docs/assets/{quickstart.md.DsrarzEg.js → quickstart.md.Nj_LjW_a.js} +2 -2
  70. package/dist/docs/assets/{reference_agent-config.md.Bqylgw50.js → reference_agent-config.md.Cp_x38Nl.js} +3 -3
  71. package/dist/docs/assets/{reference_channels.md.DQZjCnyh.js → reference_channels.md.Cd2f2iyV.js} +2 -2
  72. package/dist/docs/assets/{reference_channels.md.DQZjCnyh.lean.js → reference_channels.md.Cd2f2iyV.lean.js} +1 -1
  73. package/dist/docs/assets/{reference_cli.md.B7GkAJRC.js → reference_cli.md.Cw6_ICYG.js} +10 -11
  74. package/dist/docs/assets/{reference_cli.md.B7GkAJRC.lean.js → reference_cli.md.Cw6_ICYG.lean.js} +1 -1
  75. package/dist/docs/assets/{reference_connections.md.DYidrb-j.js → reference_connections.md.BH8Oc0D0.js} +7 -7
  76. package/dist/docs/assets/{reference_connections.md.DYidrb-j.lean.js → reference_connections.md.BH8Oc0D0.lean.js} +1 -1
  77. package/dist/docs/assets/reference_hooks.md.a8BJxMR5.js +14 -0
  78. package/dist/docs/assets/{reference_hooks.md.B9FSgdDe.lean.js → reference_hooks.md.a8BJxMR5.lean.js} +1 -1
  79. package/dist/docs/assets/reference_http-api.md.D89k1mdm.js +11 -0
  80. package/dist/docs/assets/reference_http-api.md.D89k1mdm.lean.js +1 -0
  81. package/dist/docs/assets/{reference_instructions.md.DhNCOl7r.js → reference_instructions.md.CR7XSsGk.js} +3 -3
  82. package/dist/docs/assets/{reference_instructions.md.DhNCOl7r.lean.js → reference_instructions.md.CR7XSsGk.lean.js} +1 -1
  83. package/dist/docs/assets/reference_playground.md.DnX5nL-B.js +1 -0
  84. package/dist/docs/assets/reference_playground.md.DnX5nL-B.lean.js +1 -0
  85. package/dist/docs/assets/reference_project-layout.md.Bv4KOtlB.js +19 -0
  86. package/dist/docs/assets/{reference_prompt.md.DZUMtLPD.js → reference_prompt.md.DnaD5dNK.js} +1 -1
  87. package/dist/docs/assets/{reference_schedules.md.DNipebiG.js → reference_schedules.md.DI_JrHgq.js} +1 -1
  88. package/dist/docs/assets/reference_sessions.md.D0mIh4KK.js +1 -0
  89. package/dist/docs/assets/{reference_sessions.md.tUFzz98S.lean.js → reference_sessions.md.D0mIh4KK.lean.js} +1 -1
  90. package/dist/docs/assets/{reference_skills.md.B5ZEuHfG.js → reference_skills.md.8son6Hjm.js} +4 -4
  91. package/dist/docs/assets/{reference_subagents.md.Xoav0AII.js → reference_subagents.md.CfsIloPm.js} +1 -1
  92. package/dist/docs/assets/{reference_tools.md.wpaJtHn6.js → reference_tools.md.BHeXn2id.js} +3 -3
  93. package/dist/docs/assets/{reference_tools.md.wpaJtHn6.lean.js → reference_tools.md.BHeXn2id.lean.js} +1 -1
  94. package/dist/docs/assets/scaffolding-agents.md.D7UUkWw0.js +1 -0
  95. package/dist/docs/assets/{scaffolding-agents.md.CRDDUtYJ.lean.js → scaffolding-agents.md.D7UUkWw0.lean.js} +1 -1
  96. package/dist/docs/assets/{storage.md.JbjlHWZ6.js → storage.md.BOHeqk2M.js} +5 -5
  97. package/dist/docs/assets/{storage.md.JbjlHWZ6.lean.js → storage.md.BOHeqk2M.lean.js} +1 -1
  98. package/dist/docs/assets/{templates_agentic-owners.md.DSJSIpWU.js → templates_agentic-owners.md.DqtPdm6f.js} +2 -2
  99. package/dist/docs/assets/{templates_pr-autofixer.md.1HAR3RXE.js → templates_pr-autofixer.md.DU7dQpor.js} +2 -2
  100. package/dist/docs/assets/{templates_pr-autofixer.md.1HAR3RXE.lean.js → templates_pr-autofixer.md.DU7dQpor.lean.js} +1 -1
  101. package/dist/docs/assets/{templates_security-reviewer.md.ByFyRta2.js → templates_security-reviewer.md.CTa7u_l1.js} +2 -2
  102. package/dist/docs/assets/{templates_security-reviewer.md.ByFyRta2.lean.js → templates_security-reviewer.md.CTa7u_l1.lean.js} +1 -1
  103. package/dist/docs/assets/troubleshooting.md.Ctv3T8C2.js +1 -0
  104. package/dist/docs/assets/{troubleshooting.md.DYECCZiJ.lean.js → troubleshooting.md.Ctv3T8C2.lean.js} +1 -1
  105. package/dist/docs/building-with-agents.html +7 -7
  106. package/dist/docs/building-with-agents.md +5 -11
  107. package/dist/docs/concepts.html +5 -8
  108. package/dist/docs/concepts.md +13 -17
  109. package/dist/docs/deployment.html +13 -18
  110. package/dist/docs/deployment.md +9 -30
  111. package/dist/docs/design/agsh.md +406 -0
  112. package/dist/docs/evals.html +10 -10
  113. package/dist/docs/evals.md +16 -37
  114. package/dist/docs/guides/agent-to-agent.html +6 -6
  115. package/dist/docs/guides/agent-to-agent.md +3 -3
  116. package/dist/docs/guides/cloud-runtime.html +6 -6
  117. package/dist/docs/guides/cloud-runtime.md +9 -25
  118. package/dist/docs/guides/convert-automation.html +7 -7
  119. package/dist/docs/guides/convert-automation.md +4 -4
  120. package/dist/docs/guides/github.html +9 -9
  121. package/dist/docs/guides/github.md +16 -28
  122. package/dist/docs/guides/human-in-the-loop.html +4 -4
  123. package/dist/docs/guides/mcp-oauth.html +11 -13
  124. package/dist/docs/guides/mcp-oauth.md +14 -22
  125. package/dist/docs/guides/opentelemetry.html +5 -5
  126. package/dist/docs/guides/slack.html +11 -17
  127. package/dist/docs/guides/slack.md +13 -50
  128. package/dist/docs/guides/webhooks.html +6 -6
  129. package/dist/docs/guides/webhooks.md +3 -3
  130. package/dist/docs/hashmap.json +1 -1
  131. package/dist/docs/hillclimbing.html +6 -6
  132. package/dist/docs/hillclimbing.md +1 -1
  133. package/dist/docs/index.html +6 -6
  134. package/dist/docs/index.md +0 -36
  135. package/dist/docs/llms-full.txt +965 -3633
  136. package/dist/docs/llms.txt +3 -18
  137. package/dist/docs/quickstart.html +6 -6
  138. package/dist/docs/quickstart.md +3 -4
  139. package/dist/docs/reference/agent-config.html +8 -8
  140. package/dist/docs/reference/agent-config.md +10 -15
  141. package/dist/docs/reference/artifacts.html +4 -4
  142. package/dist/docs/reference/channels.html +6 -6
  143. package/dist/docs/reference/channels.md +20 -31
  144. package/dist/docs/reference/cli.html +14 -15
  145. package/dist/docs/reference/cli.md +29 -38
  146. package/dist/docs/reference/connections.html +11 -11
  147. package/dist/docs/reference/connections.md +24 -25
  148. package/dist/docs/reference/hooks.html +6 -6
  149. package/dist/docs/reference/hooks.md +12 -17
  150. package/dist/docs/reference/http-api.html +7 -7
  151. package/dist/docs/reference/http-api.md +25 -37
  152. package/dist/docs/reference/instructions.html +6 -6
  153. package/dist/docs/reference/instructions.md +1 -1
  154. package/dist/docs/reference/playground.html +5 -5
  155. package/dist/docs/reference/playground.md +14 -19
  156. package/dist/docs/reference/project-layout.html +9 -7
  157. package/dist/docs/reference/project-layout.md +7 -3
  158. package/dist/docs/reference/prompt.html +6 -6
  159. package/dist/docs/reference/prompt.md +1 -1
  160. package/dist/docs/reference/schedules.html +6 -6
  161. package/dist/docs/reference/schedules.md +1 -2
  162. package/dist/docs/reference/sessions.html +5 -12
  163. package/dist/docs/reference/sessions.md +8 -19
  164. package/dist/docs/reference/skills.html +8 -8
  165. package/dist/docs/reference/skills.md +3 -3
  166. package/dist/docs/reference/subagents.html +6 -6
  167. package/dist/docs/reference/subagents.md +2 -2
  168. package/dist/docs/reference/tools.html +8 -8
  169. package/dist/docs/reference/tools.md +30 -19
  170. package/dist/docs/scaffolding-agents.html +5 -5
  171. package/dist/docs/scaffolding-agents.md +4 -5
  172. package/dist/docs/storage.html +9 -9
  173. package/dist/docs/storage.md +37 -80
  174. package/dist/docs/templates/agentic-owners.html +7 -7
  175. package/dist/docs/templates/agentic-owners.md +2 -2
  176. package/dist/docs/templates/demo.html +4 -4
  177. package/dist/docs/templates/pr-autofixer.html +6 -6
  178. package/dist/docs/templates/pr-autofixer.md +7 -9
  179. package/dist/docs/templates/security-reviewer.html +5 -5
  180. package/dist/docs/templates/security-reviewer.md +2 -3
  181. package/dist/docs/templates/triage.html +4 -4
  182. package/dist/docs/troubleshooting.html +5 -5
  183. package/dist/docs/troubleshooting.md +8 -8
  184. package/dist/index.d.ts +1 -1
  185. package/dist/index.d.ts.map +1 -1
  186. package/dist/index.js +1 -1
  187. package/dist/internal/advertise-tools.d.ts +11 -0
  188. package/dist/internal/advertise-tools.d.ts.map +1 -1
  189. package/dist/internal/advertise-tools.js +47 -9
  190. package/dist/internal/authored-alias-hooks.d.ts +14 -11
  191. package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
  192. package/dist/internal/authored-alias-hooks.js +14 -11
  193. package/dist/internal/authored-loaders.d.ts +7 -6
  194. package/dist/internal/authored-loaders.d.ts.map +1 -1
  195. package/dist/internal/authored-loaders.js +14 -10
  196. package/dist/internal/cli-deploy.d.ts +1 -1
  197. package/dist/internal/cli-deploy.js +5 -5
  198. package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
  199. package/dist/internal/cli-mcp-oauth.js +7 -4
  200. package/dist/internal/continuation-channel.d.ts +6 -3
  201. package/dist/internal/continuation-channel.d.ts.map +1 -1
  202. package/dist/internal/continuation-channel.js +44 -40
  203. package/dist/internal/continuation-identity.d.ts +17 -16
  204. package/dist/internal/continuation-identity.d.ts.map +1 -1
  205. package/dist/internal/continuation-identity.js +109 -36
  206. package/dist/internal/convert-automation/convert-workflow.d.ts.map +1 -1
  207. package/dist/internal/convert-automation/convert-workflow.js +26 -15
  208. package/dist/internal/convert-automation/slug.d.ts +0 -2
  209. package/dist/internal/convert-automation/slug.d.ts.map +1 -1
  210. package/dist/internal/convert-automation/slug.js +0 -8
  211. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  212. package/dist/internal/cursor/account-mcp.js +5 -1
  213. package/dist/internal/deploy-manifest.d.ts +2 -2
  214. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  215. package/dist/internal/deploy-manifest.js +4 -9
  216. package/dist/internal/discovery.d.ts.map +1 -1
  217. package/dist/internal/discovery.js +91 -13
  218. package/dist/internal/distribution.d.ts +4 -3
  219. package/dist/internal/distribution.d.ts.map +1 -1
  220. package/dist/internal/distribution.js +4 -3
  221. package/dist/internal/hosted-delivery-protocol.d.ts +38 -0
  222. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -0
  223. package/dist/internal/hosted-delivery-protocol.js +70 -0
  224. package/dist/internal/hosted-delivery.d.ts +35 -0
  225. package/dist/internal/hosted-delivery.d.ts.map +1 -0
  226. package/dist/internal/hosted-delivery.js +239 -0
  227. package/dist/internal/http-channel.d.ts.map +1 -1
  228. package/dist/internal/http-channel.js +1 -1
  229. package/dist/internal/mcp-endpoint.js +3 -3
  230. package/dist/internal/mcp-host.d.ts +8 -7
  231. package/dist/internal/mcp-host.d.ts.map +1 -1
  232. package/dist/internal/mcp-host.js +8 -7
  233. package/dist/internal/peer-connections.d.ts.map +1 -1
  234. package/dist/internal/peer-connections.js +5 -1
  235. package/dist/internal/playground/static.d.ts +0 -3
  236. package/dist/internal/playground/static.d.ts.map +1 -1
  237. package/dist/internal/resolved-connections.d.ts.map +1 -1
  238. package/dist/internal/resolved-connections.js +5 -7
  239. package/dist/internal/review-comments.d.ts +186 -63
  240. package/dist/internal/review-comments.d.ts.map +1 -1
  241. package/dist/internal/review-comments.js +350 -168
  242. package/dist/internal/server.d.ts.map +1 -1
  243. package/dist/internal/server.js +134 -175
  244. package/dist/internal/session-engine.d.ts +50 -10
  245. package/dist/internal/session-engine.d.ts.map +1 -1
  246. package/dist/internal/session-engine.js +221 -68
  247. package/dist/internal/shallow-clone.d.ts +8 -2
  248. package/dist/internal/shallow-clone.d.ts.map +1 -1
  249. package/dist/internal/shallow-clone.js +17 -10
  250. package/dist/internal/tool-catalog.d.ts +31 -0
  251. package/dist/internal/tool-catalog.d.ts.map +1 -0
  252. package/dist/internal/tool-catalog.js +67 -0
  253. package/dist/playground/assets/{index-DDvyC2z6.js → index-B3JCyigB.js} +2 -2
  254. package/dist/playground/index.html +1 -1
  255. package/dist/types.d.ts +81 -40
  256. package/dist/types.d.ts.map +1 -1
  257. package/dist/types.js +19 -0
  258. package/docs/README.md +0 -36
  259. package/docs/ab.md +7 -13
  260. package/docs/building-with-agents.md +5 -11
  261. package/docs/concepts.md +13 -17
  262. package/docs/deployment.md +9 -30
  263. package/docs/design/agsh.md +406 -0
  264. package/docs/evals.md +16 -37
  265. package/docs/guides/agent-to-agent.md +3 -3
  266. package/docs/guides/cloud-runtime.md +9 -25
  267. package/docs/guides/convert-automation.md +4 -4
  268. package/docs/guides/github.md +16 -28
  269. package/docs/guides/mcp-oauth.md +14 -22
  270. package/docs/guides/slack.md +14 -51
  271. package/docs/guides/webhooks.md +3 -3
  272. package/docs/hillclimbing.md +1 -1
  273. package/docs/quickstart.md +3 -4
  274. package/docs/reference/agent-config.md +10 -15
  275. package/docs/reference/channels.md +20 -31
  276. package/docs/reference/cli.md +29 -38
  277. package/docs/reference/connections.md +24 -25
  278. package/docs/reference/hooks.md +12 -17
  279. package/docs/reference/http-api.md +26 -38
  280. package/docs/reference/instructions.md +1 -1
  281. package/docs/reference/playground.md +14 -19
  282. package/docs/reference/project-layout.md +7 -3
  283. package/docs/reference/prompt.md +1 -1
  284. package/docs/reference/schedules.md +1 -2
  285. package/docs/reference/sessions.md +8 -19
  286. package/docs/reference/skills.md +3 -3
  287. package/docs/reference/subagents.md +2 -2
  288. package/docs/reference/tools.md +30 -19
  289. package/docs/scaffolding-agents.md +4 -5
  290. package/docs/storage.md +37 -80
  291. package/docs/templates/agentic-owners.md +2 -2
  292. package/docs/templates/pr-autofixer.md +7 -9
  293. package/docs/templates/security-reviewer.md +2 -3
  294. package/docs/troubleshooting.md +8 -8
  295. package/package.json +16 -2
  296. package/skills/create-agent/SKILL.md +6 -13
  297. package/skills/debug/SKILL.md +2 -4
  298. package/skills/evals/SKILL.md +1 -1
  299. package/skills/framework-map/SKILL.md +3 -2
  300. package/skills/mcp-auth/SKILL.md +10 -13
  301. package/skills/setup-slack/SKILL.md +21 -137
  302. package/src/channels/deployments/deployments-channel.ts +32 -2
  303. package/src/channels/deployments/types.ts +8 -0
  304. package/src/channels/github/github-channel.ts +71 -21
  305. package/src/channels/slack/attachments.ts +2 -2
  306. package/src/channels/slack/dispatch.ts +2 -16
  307. package/src/channels/slack/eval-directive.ts +8 -27
  308. package/src/channels/slack/index.ts +0 -6
  309. package/src/channels/slack/setup.ts +8 -15
  310. package/src/channels/slack/slack-channel.ts +14 -125
  311. package/src/channels/slack/types.ts +12 -96
  312. package/src/client.ts +23 -0
  313. package/src/connections.ts +20 -7
  314. package/src/continuation.ts +1 -1
  315. package/src/index.ts +2 -0
  316. package/src/internal/advertise-tools.ts +45 -7
  317. package/src/internal/authored-alias-hooks.ts +14 -11
  318. package/src/internal/authored-loaders.ts +14 -10
  319. package/src/internal/cli-deploy.ts +5 -5
  320. package/src/internal/cli-mcp-oauth.ts +6 -4
  321. package/src/internal/continuation-channel.ts +62 -45
  322. package/src/internal/continuation-identity.ts +123 -38
  323. package/src/internal/convert-automation/convert-workflow.ts +29 -17
  324. package/src/internal/convert-automation/slug.ts +0 -9
  325. package/src/internal/cursor/account-mcp.ts +4 -1
  326. package/src/internal/deploy-manifest.ts +5 -9
  327. package/src/internal/discovery.ts +107 -13
  328. package/src/internal/distribution.ts +4 -3
  329. package/src/internal/fixtures/units-server.ts +52 -0
  330. package/src/internal/hosted-delivery-protocol.ts +114 -0
  331. package/src/internal/hosted-delivery.ts +359 -0
  332. package/src/internal/http-channel.ts +0 -2
  333. package/src/internal/mcp-endpoint.ts +3 -3
  334. package/src/internal/mcp-host.ts +8 -7
  335. package/src/internal/peer-connections.ts +4 -1
  336. package/src/internal/playground/static.ts +1 -3
  337. package/src/internal/resolved-connections.ts +8 -10
  338. package/src/internal/review-comments.ts +542 -229
  339. package/src/internal/server.ts +180 -253
  340. package/src/internal/session-engine.ts +279 -70
  341. package/src/internal/shallow-clone.ts +30 -16
  342. package/src/internal/tool-catalog.ts +106 -0
  343. package/src/types.ts +99 -40
  344. package/templates/pr-autofixer/agent/channels/slack.ts +8 -2
  345. package/templates/triage/README.md +2 -1
  346. package/templates/triage/overlays/jira/agent/mcp-connections/tracker.ts +0 -1
  347. package/templates/triage/overlays/linear/agent/mcp-connections/tracker.ts +0 -1
  348. package/dist/channels/slack/cursor-account.d.ts +0 -87
  349. package/dist/channels/slack/cursor-account.d.ts.map +0 -1
  350. package/dist/channels/slack/cursor-account.js +0 -100
  351. package/dist/docs/assets/building-with-agents.md.DH8A_cHA.js +0 -13
  352. package/dist/docs/assets/chunks/@localSearchIndexroot.Dv-Q0XtU.js +0 -1
  353. package/dist/docs/assets/concepts.md.CRfU3bVg.js +0 -4
  354. package/dist/docs/assets/example-agents_approval-buddy.md.DNL83puR.js +0 -10
  355. package/dist/docs/assets/example-agents_approval-buddy.md.DNL83puR.lean.js +0 -1
  356. package/dist/docs/assets/example-agents_benny.md.C40vHRLc.js +0 -7
  357. package/dist/docs/assets/example-agents_benny.md.C40vHRLc.lean.js +0 -1
  358. package/dist/docs/assets/example-agents_bugbot.md.BRGMi9O2.js +0 -11
  359. package/dist/docs/assets/example-agents_bugbot.md.BRGMi9O2.lean.js +0 -1
  360. package/dist/docs/assets/example-agents_codebase-wiki.md.Dftj_tPp.js +0 -8
  361. package/dist/docs/assets/example-agents_codebase-wiki.md.Dftj_tPp.lean.js +0 -1
  362. package/dist/docs/assets/example-agents_codeowners-review.md.Bfta-lBU.js +0 -8
  363. package/dist/docs/assets/example-agents_codeowners-review.md.Bfta-lBU.lean.js +0 -1
  364. package/dist/docs/assets/example-agents_concierge.md.MrKpQndp.js +0 -23
  365. package/dist/docs/assets/example-agents_concierge.md.MrKpQndp.lean.js +0 -1
  366. package/dist/docs/assets/example-agents_fsd.md.ZWHWWZPE.js +0 -15
  367. package/dist/docs/assets/example-agents_fsd.md.ZWHWWZPE.lean.js +0 -1
  368. package/dist/docs/assets/example-agents_index.md.QZ8mhr6n.js +0 -2
  369. package/dist/docs/assets/example-agents_index.md.QZ8mhr6n.lean.js +0 -1
  370. package/dist/docs/assets/example-agents_knowledge-base.md.DqKqHQ9u.js +0 -11
  371. package/dist/docs/assets/example-agents_knowledge-base.md.DqKqHQ9u.lean.js +0 -1
  372. package/dist/docs/assets/example-agents_oncall.md.DK4XkYTd.js +0 -10
  373. package/dist/docs/assets/example-agents_oncall.md.DK4XkYTd.lean.js +0 -1
  374. package/dist/docs/assets/example-agents_security-reviewer.md.Bai6D0Ee.js +0 -19
  375. package/dist/docs/assets/example-agents_security-reviewer.md.Bai6D0Ee.lean.js +0 -1
  376. package/dist/docs/assets/example-agents_slack-agent.md.D7Kdj5BV.js +0 -5
  377. package/dist/docs/assets/example-agents_slack-agent.md.D7Kdj5BV.lean.js +0 -1
  378. package/dist/docs/assets/example-agents_weather-agent.md.lVEAbWFf.js +0 -25
  379. package/dist/docs/assets/example-agents_weather-agent.md.lVEAbWFf.lean.js +0 -1
  380. package/dist/docs/assets/guides_cloud-runtime.md.BSMLIBHr.js +0 -9
  381. package/dist/docs/assets/guides_cloud-runtime.md.BSMLIBHr.lean.js +0 -1
  382. package/dist/docs/assets/guides_slack.md.DiUmk_Oi.lean.js +0 -1
  383. package/dist/docs/assets/index.md.BAaMXLFd.js +0 -5
  384. package/dist/docs/assets/reference_hooks.md.B9FSgdDe.js +0 -14
  385. package/dist/docs/assets/reference_http-api.md.CSHVobzG.js +0 -11
  386. package/dist/docs/assets/reference_http-api.md.CSHVobzG.lean.js +0 -1
  387. package/dist/docs/assets/reference_playground.md.Dfb92yQf.js +0 -1
  388. package/dist/docs/assets/reference_playground.md.Dfb92yQf.lean.js +0 -1
  389. package/dist/docs/assets/reference_project-layout.md.CwkSbEWT.js +0 -17
  390. package/dist/docs/assets/reference_sessions.md.tUFzz98S.js +0 -8
  391. package/dist/docs/assets/scaffolding-agents.md.CRDDUtYJ.js +0 -1
  392. package/dist/docs/assets/troubleshooting.md.DYECCZiJ.js +0 -1
  393. package/dist/docs/example-agents/approval-buddy.html +0 -36
  394. package/dist/docs/example-agents/approval-buddy.md +0 -266
  395. package/dist/docs/example-agents/benny.html +0 -33
  396. package/dist/docs/example-agents/benny.md +0 -182
  397. package/dist/docs/example-agents/bugbot.html +0 -37
  398. package/dist/docs/example-agents/bugbot.md +0 -229
  399. package/dist/docs/example-agents/codebase-wiki.html +0 -34
  400. package/dist/docs/example-agents/codebase-wiki.md +0 -170
  401. package/dist/docs/example-agents/codeowners-review.html +0 -34
  402. package/dist/docs/example-agents/codeowners-review.md +0 -192
  403. package/dist/docs/example-agents/concierge.html +0 -49
  404. package/dist/docs/example-agents/concierge.md +0 -201
  405. package/dist/docs/example-agents/fsd.html +0 -41
  406. package/dist/docs/example-agents/fsd.md +0 -329
  407. package/dist/docs/example-agents/index.html +0 -28
  408. package/dist/docs/example-agents/index.md +0 -102
  409. package/dist/docs/example-agents/knowledge-base.html +0 -37
  410. package/dist/docs/example-agents/knowledge-base.md +0 -168
  411. package/dist/docs/example-agents/oncall.html +0 -36
  412. package/dist/docs/example-agents/oncall.md +0 -212
  413. package/dist/docs/example-agents/security-reviewer.html +0 -45
  414. package/dist/docs/example-agents/security-reviewer.md +0 -265
  415. package/dist/docs/example-agents/slack-agent.html +0 -31
  416. package/dist/docs/example-agents/slack-agent.md +0 -142
  417. package/dist/docs/example-agents/weather-agent.html +0 -51
  418. package/dist/docs/example-agents/weather-agent.md +0 -296
  419. package/dist/internal/cursor-slack-relay.d.ts +0 -96
  420. package/dist/internal/cursor-slack-relay.d.ts.map +0 -1
  421. package/dist/internal/cursor-slack-relay.js +0 -176
  422. package/docs/example-agents/approval-buddy.md +0 -271
  423. package/docs/example-agents/benny.md +0 -187
  424. package/docs/example-agents/bugbot.md +0 -234
  425. package/docs/example-agents/codebase-wiki.md +0 -175
  426. package/docs/example-agents/codeowners-review.md +0 -197
  427. package/docs/example-agents/concierge.md +0 -206
  428. package/docs/example-agents/fsd.md +0 -334
  429. package/docs/example-agents/index.md +0 -107
  430. package/docs/example-agents/knowledge-base.md +0 -173
  431. package/docs/example-agents/oncall.md +0 -217
  432. package/docs/example-agents/security-reviewer.md +0 -270
  433. package/docs/example-agents/slack-agent.md +0 -147
  434. package/docs/example-agents/weather-agent.md +0 -301
  435. package/src/channels/slack/cursor-account.ts +0 -202
  436. package/src/internal/cursor-slack-relay.ts +0 -249
  437. /package/dist/docs/assets/{guides_agent-to-agent.md.BCeVdJRJ.lean.js → guides_agent-to-agent.md.BDb0t1QV.lean.js} +0 -0
  438. /package/dist/docs/assets/{guides_convert-automation.md.D06eIzea.lean.js → guides_convert-automation.md.B4sjlodG.lean.js} +0 -0
  439. /package/dist/docs/assets/{guides_webhooks.md.BpnIdO0i.lean.js → guides_webhooks.md.DKdA43Qm.lean.js} +0 -0
  440. /package/dist/docs/assets/{hillclimbing.md.ywF3yDAd.lean.js → hillclimbing.md.DhESf3OO.lean.js} +0 -0
  441. /package/dist/docs/assets/{quickstart.md.DsrarzEg.lean.js → quickstart.md.Nj_LjW_a.lean.js} +0 -0
  442. /package/dist/docs/assets/{reference_agent-config.md.Bqylgw50.lean.js → reference_agent-config.md.Cp_x38Nl.lean.js} +0 -0
  443. /package/dist/docs/assets/{reference_project-layout.md.CwkSbEWT.lean.js → reference_project-layout.md.Bv4KOtlB.lean.js} +0 -0
  444. /package/dist/docs/assets/{reference_prompt.md.DZUMtLPD.lean.js → reference_prompt.md.DnaD5dNK.lean.js} +0 -0
  445. /package/dist/docs/assets/{reference_schedules.md.DNipebiG.lean.js → reference_schedules.md.DI_JrHgq.lean.js} +0 -0
  446. /package/dist/docs/assets/{reference_skills.md.B5ZEuHfG.lean.js → reference_skills.md.8son6Hjm.lean.js} +0 -0
  447. /package/dist/docs/assets/{reference_subagents.md.Xoav0AII.lean.js → reference_subagents.md.CfsIloPm.lean.js} +0 -0
  448. /package/dist/docs/assets/{templates_agentic-owners.md.DSJSIpWU.lean.js → templates_agentic-owners.md.DqtPdm6f.lean.js} +0 -0
package/README.md CHANGED
@@ -7,14 +7,14 @@
7
7
  > release, and 0.x versions may ship breaking changes without notice.
8
8
 
9
9
  A filesystem-first framework for building and serving Cursor agents.
10
- Customers define an agent as ordinary files markdown for prose,
11
- TypeScript for typed behavior under an `agent/` directory. The framework
10
+ Customers define an agent as ordinary files: markdown for prose,
11
+ TypeScript for typed behavior, under an `agent/` directory. The framework
12
12
  discovers those files, compiles them into a manifest, and serves the agent
13
13
  over channels, using the Cursor SDK (`@cursor/sdk`) and the Cursor harness
14
14
  as the execution engine.
15
15
 
16
- **User-facing documentation lives in [`docs/`](./docs/README.md)** —
17
- open it with `npx @cursor/july docs`, or at `/docs` on every running
16
+ **User-facing documentation lives in [`docs/`](./docs/README.md)**.
17
+ Open it with `npx @cursor/july docs`, or at `/docs` on every running
18
18
  `agent-sdk serve` host. It covers getting started, concepts, guides (Slack,
19
19
  GitHub webhooks, approvals, agent-to-agent, cloud runtime), evals, live
20
20
  A/B metrics, hillclimbing, deployment, troubleshooting, and reference
@@ -68,15 +68,13 @@ Serve one project with `agent-sdk serve --dir ./my-agent --dev`, or point
68
68
  `serve` at a folder of agent projects to mount every child under its
69
69
  directory name.
70
70
 
71
- ## Node only do not run under Bun
71
+ ## Node only: do not run under Bun
72
72
 
73
- Run the Agent SDK with **Node 22.13+** (from source: `pnpm exec tsx
74
- src/bin/agent-serve.ts …`, or the built `dist/bin/agent-serve.js`). Do not
75
- run it under Bun: Bun's HTTP/2 client corrupts the Cursor SDK's local
76
- harness tool-result streams (`NGHTTP2_FRAME_SIZE_ERROR`), so every built-in
77
- read/grep the model makes fails and turns degrade into failed-read retry
78
- loops (we measured an 8-minute review that takes ~1 minute under Node).
79
- The `mise` tasks in this package already use tsx.
73
+ Run the Agent SDK with **Node 22.13+**. Use `agent-sdk` or
74
+ `npx @cursor/july`. Do not run it under Bun: Bun's HTTP/2 client
75
+ corrupts the Cursor SDK's local harness tool-result streams
76
+ (`NGHTTP2_FRAME_SIZE_ERROR`), so every built-in read/grep the model
77
+ makes fails and turns degrade into failed-read retry loops.
80
78
 
81
79
  ## Serving many agents at once
82
80
 
@@ -86,7 +84,7 @@ one port, each under its own slug (its directory name):
86
84
  ```bash
87
85
  agent-sdk serve --dir ./agents --dev
88
86
  # 2 agents listening
89
- # playground http://127.0.0.1:5273
87
+ # playground <printed URL>
90
88
  ```
91
89
 
92
90
  `serve` always uses multi-agent layout by default: agents are mounted under
@@ -116,7 +114,7 @@ segments.
116
114
 
117
115
  Every mounted agent also serves the **Model Context Protocol** over
118
116
  streamable HTTP at `/<slug>/v1/mcp` (or `/v1/mcp` in single mode), so other
119
- agents and any MCP client can delegate work to it. The surface is
117
+ agents, and any MCP client, can delegate work to it. The surface is
120
118
  stateless (session identity travels in tool arguments) and runs the same
121
119
  route auth chain as the session API. Tools:
122
120
 
@@ -146,15 +144,15 @@ export default defineConnection({
146
144
  ```
147
145
 
148
146
  The parent model then sees the peer's `ask` / `check` (/ `call_tool`) tools
149
- under the `weather` server name subagent-style delegation where the peer
147
+ under the `weather` server name: subagent-style delegation where the peer
150
148
  keeps its **own** instructions, tools, MCP connections, and sessions. Peer URLs
151
149
  resolve when the server starts (so `run` / `eval` ephemeral ports work):
152
150
 
153
151
  - **Local-runtime turns** (and host-side `ctx.host.mcp` / channel handlers)
154
- call the peer over loopback works out of the box under the default
152
+ call the peer over loopback. That works under the default
155
153
  `localDevStrict()` auth.
156
154
  - **Cloud-runtime turns** execute on a cloud VM that cannot reach this
157
- host's loopback address. Pass `--public-url https://agent-serve.example.com`
155
+ host's loopback address. Pass `--public-url https://agents.example.com`
158
156
  (or `serve(dir, { publicUrl })`) so peers resolve to a reachable URL;
159
157
  without it, peers are omitted from cloud turns (the server warns at
160
158
  startup). With `--bearer-token`, the token is attached to peer calls
@@ -163,7 +161,7 @@ resolve when the server starts (so `run` / `eval` ephemeral ports work):
163
161
  Unknown peer slugs and self-references fail at serve startup. Peers require
164
162
  the multi-agent layout (each agent mounted under its slug). There is no
165
163
  cross-host loop protection yet: if agent A's instructions delegate to B and
166
- B's delegate back to A, they can recurse scope each agent's delegation
164
+ B's delegate back to A, they can recurse. Scope each agent's delegation
167
165
  instructions narrowly (the concierge above delegates *weather questions* to
168
166
  `weather-agent`, not everything).
169
167
 
@@ -190,8 +188,8 @@ You are a concise assistant. Use tools when they are available.
190
188
  import { defineAgent } from "@cursor/july";
191
189
 
192
190
  export default defineAgent({
193
- // optional defaults to grok-4.5 with effort=high and fast=true
194
- // runtime: "local", // default Cursor SDK local harness
191
+ // optional: defaults to grok-4.5 with effort=high and fast=true
192
+ // runtime: "local", // default: Cursor SDK local harness
195
193
  // runtime: "cloud",
196
194
  // cloud: {
197
195
  // repos: [{ url: "https://github.com/org/repo", startingRef: "main" }],
@@ -200,7 +198,7 @@ export default defineAgent({
200
198
  ```
201
199
 
202
200
  Serve it (turns run on the Cursor harness, so the host needs a Cursor
203
- credential sign in once, or export an API key):
201
+ credential: sign in once, or export an API key):
204
202
 
205
203
  ```bash
206
204
  agent-sdk login # browser sign-in; mints + stores a revocable API key
@@ -245,7 +243,7 @@ agent-sdk validate --dir . # exit non-zero on error diagnostics
245
243
  ## Terminal client
246
244
 
247
245
  `agent-sdk chat` talks to a running server over the same public API and
248
- renders the reply live streamed text, tool calls, and a per-turn usage
246
+ renders the reply live: streamed text, tool calls, and a per-turn usage
249
247
  footer. Pass `--json` for a compact trajectory (same shape as `run`).
250
248
 
251
249
  ```bash
@@ -326,7 +324,7 @@ import { defineEvalConfig } from "@cursor/july/evals";
326
324
 
327
325
  export default defineEvalConfig({
328
326
  maxConcurrency: 20,
329
- // Optional playground /v1/dev/evals history window (default 20):
327
+ // Optional: playground /v1/dev/evals history window (default 20):
330
328
  // maxPlaygroundRuns: 50,
331
329
  });
332
330
  ```
@@ -349,61 +347,32 @@ evals, hillclimb, GitHub webhooks, Slack setup, debugging).
349
347
 
350
348
  Every served agent ships with a built-in playground. The default multi-agent
351
349
  mode serves it at `http://127.0.0.1:3000/<slug>/playground`.
352
- `--mode single` uses `http://127.0.0.1:3000/playground`. The Vite and React
353
- app uses the same public HTTP API for manual testing and demo recordings:
350
+ `--mode single` uses `http://127.0.0.1:3000/playground`. The playground
351
+ uses the same public HTTP API for manual testing and demo recordings:
354
352
 
355
353
  - chat with the agent and watch text/reasoning stream live, rendered as
356
354
  markdown (headings, lists, tables, blockquotes, links) with syntax
357
355
  highlighting for fenced code blocks (C-like languages, Python, shell,
358
356
  and diffs),
359
357
  - invoke custom channels as **slash commands** in the composer (e.g. a
360
- `/drive https://github.com/org/repo/pull/1` channel route) routes from `GET /v1/info`,
358
+ `/drive https://github.com/org/repo/pull/1` channel route). Routes from `GET /v1/info`,
361
359
  with `/help` and autocomplete; same HTTP as the Agent surface **Try**
362
360
  buttons,
363
361
  - see tool calls inline (args, output, error state) as `actions.requested`
364
362
  / `action.result` events arrive,
365
- - browse every session (chat, custom-channel, and schedule task sessions)
366
- and replay their durable event streams,
363
+ - browse the sessions you own (chat, custom-channel, and schedule
364
+ task sessions) and replay their event streams. In `--dev` on loopback,
365
+ or with `--allow-anonymous`, the list includes every principal,
367
366
  - dispatch schedules by hand in dev mode,
368
367
  - inspect the discovered agent surface (tools, skills, subagents, MCP
369
368
  connections, channels, hooks),
370
369
  - flip on the raw NDJSON pane to see the exact wire events.
371
370
 
372
- The SPA is a static bundle. `agent-sdk serve` auto-builds `dist/playground/`
373
- when it is missing and the local vite toolchain is present (`pnpm run build`
374
- also emits it for publish). The server serves the bundle and every call it
375
- makes runs the normal route auth chain (there's a bearer-token field for
376
- non-loopback setups). Disable it with `--no-playground` (CLI) or
377
- `serve(dir, { playground: false })`. When serving many agents, each has its
378
- own playground at `/<slug>/playground` and `/` is an index of them all (see
379
- "Serving many agents at once").
380
-
381
- ### Developing the playground
382
-
383
- `serve --dev` / `dev` also starts Vite HMR (default `:5273`) and prints that
384
- URL as `playground`. Single-agent proxies `/v1` to the serve URL; multi-agent
385
- serves the agents index at `/` and each SPA at `/<slug>/playground`:
386
-
387
- ```bash
388
- # single agent — auto-build + HMR in one process
389
- pnpm exec tsx src/bin/agent-serve.ts serve --dir ./my-agent --dev
390
-
391
- # monorepo dev: multi-agent HMR
392
- mise //packages/agent-serve:start
393
- # → backend :3000, playground HMR :5273 (open /, then /<slug>/playground)
394
-
395
- # pin one slug at the HMR root, or UI-only against an already-running serve
396
- AGENT_SERVE_BASE=/my-agent mise //packages/agent-serve:start
397
- AGENT_SERVE_MULTI=1 mise //packages/agent-serve:dev-playground
398
- ```
399
-
400
- The Vite dev server proxies API calls to the backend (`AGENT_SERVE_TARGET`,
401
- default `http://127.0.0.1:3000`). Multi-agent HMR proxies `/<slug>/v1/*` as-is
402
- and serves each SPA at `/<slug>/playground`; a single-slug pin uses
403
- `AGENT_SERVE_BASE=/<slug>` at the HMR root. Editing anything under
404
- `playground/src` hot-reloads in the browser. The playground source lives in
405
- `playground/` (entry `playground/src/main.tsx`); markdown rendering and the
406
- trace model are plain modules under `playground/src/lib` with unit tests.
371
+ `agent-sdk serve` serves the playground bundle. Disable it with
372
+ `--no-playground` (CLI) or `serve(dir, { playground: false })`. When
373
+ serving many agents, each has its own playground at `/<slug>/playground`
374
+ and `/` is an index of them all (see "Serving many agents at once").
375
+ `serve --dev` prints a playground URL; open that URL if the UI looks stale.
407
376
 
408
377
  To share the server beyond localhost (a tunnel, a LAN address, a phone),
409
378
  pass `--bearer-token <secret>` (or `serve(dir, { authToken })`). That
@@ -418,32 +387,19 @@ token into the top-right field.
418
387
 
419
388
  Session follow-up, stream, and list routes also bind to the principal that
420
389
  created the session (`403` when a different admitted principal addresses
421
- someone else's handle). Session ids are restricted to a single safe path
422
- segment before they touch `<stateRoot>/sessions`.
390
+ someone else's handle).
423
391
 
424
392
  ## How it runs on the Cursor harness
425
393
 
426
- Every session is one Cursor SDK agent (`Agent.create` / `Agent.resume`).
427
- Local agents use the session id as the SDK agent id; cloud agents persist
428
- a separate `sdkAgentId` (typically `bc-…`). Each session gets its own
429
- workspace directory, materialized from the authored files and handed to
430
- the local harness as its working directory:
431
-
432
- | Folder or file | Runtime mapping |
433
- | ------------------------ | ------------------------------------------------------------------------------- |
434
- | `instructions.*` | Local: `AGENTS.md` in the session workspace. Cloud: prepended to the first prompt. |
435
- | `tools/*.ts` (`execution: "server"`, default) | Local: in-process SDK custom tools. Cloud: authenticated HTTP MCP callbacks to the AgentSDK host. |
436
- | `tools/*.ts` (`execution: "agent"`) | Local: scripts under `.agent-serve/tools/` + catalog in `AGENTS.md`. Cloud: catalog + script bodies on the first prompt. |
437
- | `skills/*` | Local: `.cursor/skills/<name>/SKILL.md` in the workspace. Cloud: native discovery from the Agent Store (`skills/` when hosted; `agent-serve/<agent>/skills/` on the USER store for local serve/run). |
438
- | `mcp-connections/*.ts` | Always three places: Cursor agent via SDK `mcpServers` (local + cloud), host-side `ctx.host.mcp` for in-process tools, and `args.host.mcp` on channel/schedule handlers. |
439
- | `subagents/<id>/` | SDK custom subagents (the model delegates via the harness `task` tool) |
440
- | `sandbox/workspace/**` | Local session workspace seed on first turn; ignored for cloud runtime. |
441
- | `channels/`, `schedules/`, `hooks/` | Served by this framework around the harness |
442
-
443
- Conversation state for local agents persists through the SDK's local store
444
- under `.agent-serve/runner/`, and every session's event stream is recorded
445
- to `.agent-serve/sessions/<id>/events.ndjson` — sessions survive server
446
- restarts, and streams replay from any `startIndex`.
394
+ Each session is one Cursor SDK agent. Local turns run on this host.
395
+ Cloud turns run on a Cursor cloud agent. The session stream records
396
+ `agent.bound` with the cloud conversation URL.
397
+
398
+ Authored files reach the model as instructions, tools, skills, and
399
+ workspace seed files. The mapping differs by runtime; see
400
+ [Cloud runtime](./docs/guides/cloud-runtime.md). Sessions and their
401
+ event streams survive server restarts. Reconnect with `?startIndex=` to
402
+ replay.
447
403
 
448
404
  ## Folder structure
449
405
 
@@ -460,7 +416,7 @@ export default defineAgent({
460
416
  { id: "fast", value: "true" },
461
417
  ],
462
418
  }, // optional; this is the default
463
- runtime: "local", // default or "cloud"
419
+ runtime: "local", // default: or "cloud"
464
420
  // cloud: {
465
421
  // repos: [{ url: "https://github.com/org/repo", startingRef: "main" }],
466
422
  // env: { type: "cloud" },
@@ -476,7 +432,7 @@ and `fast=true`.
476
432
 
477
433
  | Value | Behavior |
478
434
  | --------- | ------- |
479
- | `"local"` | Cursor SDK local harness on this machine. Session id doubles as the SDK agent id. Authored tools, skills, and sandbox seeds apply. |
435
+ | `"local"` | Cursor SDK local harness on this machine. Authored tools, skills, and sandbox seeds apply. |
480
436
  | `"cloud"` | Cursor cloud agents. Pass a `cloud` block with the repositories and environment the agent needs. Server tools work on managed hosting. Self-hosted cloud turns need `--public-url`. |
481
437
 
482
438
  Discovery warns when cloud turns ignore a local-only capability. Authored
@@ -527,7 +483,7 @@ stream emits `action.approval_requested` / `action.approval_resolved`.
527
483
  - Playground Approve / Deny buttons
528
484
  - HTTP: `POST /v1/session/:sessionId/approvals/:callId` with
529
485
  `{"decision":"approve"|"deny"}`
530
- - **Slack** (opt-in channel surface) set `toolApprovals: true` on
486
+ - **Slack** (opt-in channel surface): set `toolApprovals: true` on
531
487
  `slackChannel`, and enable `interactivity` in the Slack app
532
488
  manifest:
533
489
 
@@ -567,7 +523,7 @@ does **not** open cross-owner approval for HTTP sessions. Production and
567
523
  bearer-auth hosts stay strict: Slack resolve must come from Slack interactivity
568
524
  (or a matching principal).
569
525
 
570
- `--allow-anonymous` is for trusted-network demos only every HTTP caller shares
526
+ `--allow-anonymous` is for trusted-network demos only. Every HTTP caller shares
571
527
  the same `anonymous` principal. Prefer `--bearer-token` when the host is shared.
572
528
 
573
529
  Slack cards show **redacted / truncated** args for Block Kit limits; execution
@@ -592,9 +548,9 @@ export default defineTool({
592
548
 
593
549
  Approvals are only supported for `execution: "server"` tools on the
594
550
  `local` runtime. Exact resume of a parked SDK tool call does **not**
595
- survive host process restart pending approvals left after a crash are
551
+ survive host process restart. Pending approvals left after a crash are
596
552
  treated as interrupted.
597
- Agent tool (runs where the Cursor agent runs local harness or cloud VM):
553
+ Agent tool (runs where the Cursor agent runs: local harness or cloud VM):
598
554
 
599
555
  ```ts
600
556
  import { defineTool } from "@cursor/july/tools";
@@ -621,7 +577,7 @@ it explicitly next to `content` and `isError`. For server tools, `ctx` carries
621
577
 
622
578
  #### Deterministic tool calls
623
579
 
624
- Server tools can also be called **deterministically** you pick the tool
580
+ Server tools can also be called **deterministically**. You pick the tool
625
581
  and the input, no model turn decides anything. The input is validated
626
582
  against the tool's schema and `execute` runs in-process; the result comes
627
583
  back exactly as the model would receive it. No Cursor API key is needed.
@@ -646,7 +602,7 @@ agent-sdk call get_weather --url http://127.0.0.1:3000/<slug> --input '{"city":"
646
602
 
647
603
  Programmatically, `callTool(toolName, input, options?)` is available on the
648
604
  serve handle, on channel route handlers and `onStart` args, and on schedule
649
- `run` handlers so a channel can mix deterministic tool calls with model
605
+ `run` handlers, so a channel can mix deterministic tool calls with model
650
606
  turns (e.g. fetch PR metadata deterministically, then `send()` the review
651
607
  prompt):
652
608
 
@@ -655,17 +611,17 @@ const outcome = await handle.callTool("get_weather", { city: "NYC" });
655
611
  // { toolName, callId, isError, result, durationMs }
656
612
  ```
657
613
 
658
- By default the tool runs against an **ephemeral** scratch workspace under
659
- `<stateRoot>/tool-calls/<callId>` with a synthetic `direct` session context
660
- materialized like a session workspace (AGENTS.md, skills, seed files) and
661
- removed once the call returns. Pass `sessionId` (body field over HTTP,
662
- `--session` on the CLI, `options.sessionId` programmatically) to run it
663
- **inside an existing session** instead: the tool sees that session's info
664
- and materialized workspace, and the call is recorded on the session's event
665
- stream as `actions.requested` / `action.result` under a per-call `turnId`
666
- visible in the playground, NDJSON trace, and trajectories like any
667
- model-initiated call. Session-bound calls are serialized with model turns:
668
- while a turn is running the call is rejected with `409 session_busy`.
614
+ By default the tool runs against an ephemeral scratch workspace,
615
+ materialized like a session workspace (AGENTS.md, skills, seed files)
616
+ and removed once the call returns. Pass `sessionId` (body field over
617
+ HTTP, `--session` on the CLI, `options.sessionId` programmatically) to
618
+ run it inside an existing session instead: the tool sees that session's
619
+ info and materialized workspace, and the call is recorded on the
620
+ session's event stream as `actions.requested` / `action.result` under a
621
+ per-call `turnId`. That call is visible in the playground, NDJSON
622
+ trace, and trajectories like any model-initiated call. Session-bound
623
+ calls are serialized with model turns: while a turn is running the call
624
+ is rejected with `409 session_busy`.
669
625
 
670
626
  Unknown tools are rejected with the available tool names, `execution:
671
627
  "agent"` tools cannot be called on the host (400), schema-invalid input is a
@@ -678,7 +634,7 @@ that throws is reported as `isError: true` with the same
678
634
 
679
635
  Skills follow the `SKILL.md` convention: model-loadable procedures the
680
636
  harness advertises by description and loads on demand. Author them as flat
681
- markdown (`skills/forecast.md`, optional `description` frontmatter — the
637
+ markdown (`skills/forecast.md`, optional `description` frontmatter. The
682
638
  first body line is the fallback), packaged directories
683
639
  (`skills/research/SKILL.md` plus `references/…`, which require `description`
684
640
  frontmatter), or TypeScript (`defineSkill` from
@@ -755,7 +711,7 @@ Every MCP connection is always available in three places:
755
711
 
756
712
  1. the Cursor agent (local or cloud), via SDK `mcpServers`
757
713
  2. the serve host, for in-process tools via `ctx.host.mcp`
758
- 3. channel / schedule handlers, via `args.host.mcp` (deterministic no agent loop)
714
+ 3. channel / schedule handlers, via `args.host.mcp` (deterministic; no agent loop)
759
715
 
760
716
  ```ts
761
717
  export default defineTool({
@@ -768,7 +724,7 @@ export default defineTool({
768
724
  ```
769
725
 
770
726
  ```ts
771
- // agent/channels/webhook.ts call MCP directly from a webhook
727
+ // agent/channels/webhook.ts: call MCP directly from a webhook
772
728
  POST("/sync", {
773
729
  bodySchema: z.object({}),
774
730
  handler: async (_req, { host }) => {
@@ -784,8 +740,8 @@ POST("/sync", {
784
740
  ### Subagents (`agent/subagents/<id>/`)
785
741
 
786
742
  A subagent is its own directory with the same `agent.ts` +
787
- `instructions.md` shape. `description` is required the parent model reads
788
- it to decide when to delegate and `model` is optional (`inherit` by
743
+ `instructions.md` shape. `description` is required. The parent model reads
744
+ it to decide when to delegate, and `model` is optional (`inherit` by
789
745
  default). On the Cursor harness, subagents run as SDK custom subagents:
790
746
  they inherit the parent's execution surface, so per-subagent `tools/`,
791
747
  `skills/`, and `mcp-connections/` are reported as warnings and ignored for now.
@@ -795,22 +751,22 @@ they inherit the parent's execution surface, so per-subagent `tools/`,
795
751
  The **built-in HTTP channel** is always mounted (under `/<slug>` in the
796
752
  default multi-agent layout; at the server root with `mode: "single"`):
797
753
 
798
- - `POST /v1/session` start a session (`{"message": "..."}`; returns
754
+ - `POST /v1/session`: start a session (`{"message": "..."}`; returns
799
755
  `sessionId` + `continuationToken`)
800
- - `POST /v1/session/:sessionId` follow-up (`{"message", "continuationToken"}`;
756
+ - `POST /v1/session/:sessionId`: follow-up (`{"message", "continuationToken"}`;
801
757
  rotates the token; works for any chat session including custom channels like
802
758
  `drive`; `409` on stale tokens or task sessions;
803
759
  `403` if the caller is not the session owner)
804
- - `GET /v1/session/:sessionId/stream?startIndex=N` replay + live NDJSON
760
+ - `GET /v1/session/:sessionId/stream?startIndex=N`: replay + live NDJSON
805
761
  (same owner check)
806
- - `GET /v1/session/:sessionId/approvals` pending human-in-the-loop
762
+ - `GET /v1/session/:sessionId/approvals`: pending human-in-the-loop
807
763
  tool approvals for the session
808
- - `POST /v1/session/:sessionId/approvals/:callId` approve or deny
764
+ - `POST /v1/session/:sessionId/approvals/:callId`: approve or deny
809
765
  (`{"decision":"approve"|"deny"}`)
810
- - `GET /v1/sessions` sessions owned by the calling principal
811
- - `POST /v1/tools/:toolName` call a server tool deterministically
766
+ - `GET /v1/sessions`: sessions owned by the calling principal
767
+ - `POST /v1/tools/:toolName`: call a server tool deterministically
812
768
  (`{"input": {...}, "sessionId"?}`; see "Deterministic tool calls")
813
- - `GET /v1/health`, `GET /v1/info` liveness and the manifest snapshot
769
+ - `GET /v1/health`, `GET /v1/info`: liveness and the manifest snapshot
814
770
  Author `agent/channels/http.ts` only to override its defaults:
815
771
 
816
772
  ```ts
@@ -862,7 +818,7 @@ export default defineChannel({
862
818
  ```
863
819
 
864
820
  `GET` requires a Zod `querySchema` and `POST` / `PUT` / `PATCH` require a
865
- Zod `bodySchema` at compile time plain JSON Schema objects will not
821
+ Zod `bodySchema` at compile time. Plain JSON Schema objects will not
866
822
  type-check. Use `z.object({})` or `z.unknown()` when the surface is
867
823
  intentionally open. Schemas are validated by the host before the handler
868
824
  runs (handlers get typed `args.body` / `args.query`) and projected on
@@ -871,15 +827,16 @@ so the composer can offer matching **slash commands** (e.g. `/drive`).
871
827
 
872
828
  Route handlers receive a Fetch `Request` and helpers: `send`, `getSession`,
873
829
  `receive` (cross-channel hand-off), `params`, `requestIp`, `auth`, `host`
874
- (shared host services MCP / GitHub / Slack; same as tool `ctx.host`), and
830
+ (shared host services: MCP / GitHub / Slack; same as tool `ctx.host`), and
875
831
  `waitUntil`. Channel `state` declares initial per-session adapter state,
876
832
  persisted across events; handlers receive it on `channel.state`.
877
833
 
878
- **Auth**: every route runs an auth-policy chain (`auth` on the channel).
879
- The default is `[localDevStrict()]` direct loopback callers only, with
880
- proxy-forwarding headers and non-loopback `Host` rejected — so nothing
881
- is exposed publicly until you add real auth (`bearerAuth(...)`, a custom
882
- policy, or the explicit `allowAll()`).
834
+ **Auth**: channel routes and the session API run an auth-policy chain
835
+ (`auth` on the channel). The host index, docs, and health routes run no
836
+ auth. The default policy is `[localDevStrict()]`: direct loopback
837
+ callers only, with proxy-forwarding headers and non-loopback `Host`
838
+ rejected, so nothing is exposed publicly until you add real auth
839
+ (`bearerAuth(...)`, a custom policy, or the explicit `allowAll()`).
883
840
 
884
841
  **Slack** (`@cursor/july/channels/slack`): a platform channel pack
885
842
  that defaults to **Socket Mode**. Author `agent/channels/slack.ts` with
@@ -888,16 +845,12 @@ that defaults to **Socket Mode**. Author `agent/channels/slack.ts` with
888
845
  ```ts
889
846
  import { slackChannel } from "@cursor/july/channels/slack";
890
847
 
891
- // Single agent SLACK_BOT_TOKEN + SLACK_APP_TOKEN
848
+ // Single agent: SLACK_BOT_TOKEN + SLACK_APP_TOKEN
892
849
  export default slackChannel();
893
850
 
894
- // Multi-agent serve one Slack app (and token pair) per agent
851
+ // Multi-agent serve: one Slack app (and token pair) per agent
895
852
  export default slackChannel({ envPrefix: "WEATHER_AGENT" });
896
853
  // → WEATHER_AGENT_SLACK_BOT_TOKEN + WEATHER_AGENT_SLACK_APP_TOKEN
897
-
898
- // Cursor account connection — no dedicated Slack app. `@Cursor Weatherbot …`
899
- // routes here; replies post as "Weatherbot" through the Cursor Slack app.
900
- export default slackChannel({ cursorAccount: true, agentName: "Weatherbot" });
901
854
  ```
902
855
 
903
856
  Transport uses `@slack/socket-mode` + `@slack/web-api`. Socket Mode starts
@@ -912,7 +865,7 @@ return a prepared `message` / `workspaceFiles` / `cloud` to host-prepare PR
912
865
  reviews or attach
913
866
  cloud repos from an `@mention`.
914
867
 
915
- **Engagement:** by default the agent is summoned, never proactive — it
868
+ **Engagement:** by default the agent is summoned, never proactive. It
916
869
  dispatches only on `app_mention` and DMs. Channel watch is an explicit opt-in:
917
870
 
918
871
  ```ts
@@ -953,28 +906,10 @@ Approve/Deny cards and routes Socket Mode `interactive` clicks to
953
906
  **separate Slack apps**. Requires `SLACK_BOT_TOKEN` + `SLACK_APP_TOKEN`
954
907
  (App-Level Token with `connections:write`).
955
908
 
956
- Most demos under `examples/` use the Cursor Slack connection
957
- (`cursorAccount: true`) with a unique single-token `agentName`
958
- `@Cursor Benny …`, `@Cursor Bugbot …`, `@Cursor ApprovalBuddy …`, etc.
959
- Sign the host in, then mention the agent; no per-agent Slack app required
960
- for chat. Agents that need channel watch or tool approvals keep a Socket
961
- Mode app in a second channel file (e.g. `slack-app.ts`) with their own env
962
- prefix (`<PREFIX>_SLACK_BOT_TOKEN` + `<PREFIX>_SLACK_APP_TOKEN`, derived
963
- from the directory name by `slack create`).
964
-
965
- | Agent | `@Cursor` name | Optional Socket Mode app |
966
- | --- | --- | --- |
967
- | `weather-agent` | Weather | `slack-app.ts` (`WEATHER_AGENT_SLACK_*`, tool approvals) |
968
- | `slack-agent` | SlackAgent | — |
969
- | `bugbot` | Bugbot | — |
970
- | `fsd` | FSD | — |
971
- | `benny` | Benny | `slack-app.ts` (`BENNY_SLACK_*`, channel watch) |
972
- | `approval-buddy` | ApprovalBuddy | — |
973
-
974
- PR-oriented demos (`bugbot`, `fsd`) extract a GitHub PR URL / `owner/repo#N`
975
- from the mention and run the same host path as their HTTP channels.
976
- `security-reviewer` is GitHub-task-only (no Slack channel); `concierge` is
977
- agent-to-agent only (no Slack channel).
909
+ `agent-sdk slack create` mints one dedicated bot and writes
910
+ `<DIR>_SLACK_*` plus `envPrefix` from the directory name. Keep the
911
+ channel file as `slack-app.ts` when the same app should carry tool
912
+ approvals or channel watch.
978
913
 
979
914
  For Socket Mode apps (channel watch / approvals), run
980
915
  `agent-sdk slack create`. It opens the dashboard wizard, creates and
@@ -1014,7 +949,7 @@ export default githubChannel({
1014
949
 
1015
950
  Mounts at `POST /<slug>/v1/channels/github`. When a webhook secret is set the
1016
951
  channel verifies `X-Hub-Signature-256` before parsing (the HMAC becomes the
1017
- request auth); without one it stays loopback-only (`localDevStrict()`) except
952
+ request auth); without one it stays loopback-only (`localDevStrict()`), except
1018
953
  under `serve --dev`, which admits unsigned loopback deliveries so
1019
954
  `gh webhook forward` and fixtures work with zero config. Hooks return
1020
955
  `{ auth }` to start a model turn as the actor, `{ task }` for host-side work
@@ -1032,7 +967,7 @@ auth prefers GitHub App installation tokens when `GITHUB_APP_ID` /
1032
967
  `GITHUB_TOKEN` / `GH_TOKEN` or `gh auth login`. The channel publishes the
1033
968
  webhook events it dispatches on (derived from the declared hooks, or pinned
1034
969
  via `webhookEvents`), so `agent-sdk github …` can forward live
1035
- deliveries with zero hand-listing it wraps [`gh webhook
970
+ deliveries with zero hand-listing. It wraps [`gh webhook
1036
971
  forward`](https://docs.github.com/en/webhooks/testing-and-troubleshooting-webhooks/using-the-github-cli-to-forward-webhooks-for-testing):
1037
972
 
1038
973
  ```bash
@@ -1057,12 +992,12 @@ agent-sdk github forward --dir ./agents
1057
992
  When several channels match (e.g. a folder of agent projects with more than
1058
993
  one github channel), one forwarder fans out to all of them: `gh webhook
1059
994
  forward` runs against a local proxy that re-posts each raw (still-signed)
1060
- delivery to the channels whose event set matches. This is required GitHub
995
+ delivery to the channels whose event set matches. This is required. GitHub
1061
996
  allows only one forwarder per repo, and `gh webhook forward` targets a single
1062
997
  URL, so N processes would collide with `Hook already exists`.
1063
998
 
1064
- `gh webhook forward` needs **admin** on the repo (or org owner for `--org`)
1065
- it registers a real webhook and authenticates its relay with the GitHub CLI's
999
+ `gh webhook forward` needs **admin** on the repo (or org owner for `--org`).
1000
+ It registers a real webhook, and authenticates its relay with the GitHub CLI's
1066
1001
  own login. If `GITHUB_TOKEN` / `GH_TOKEN` is set in your env, deliveries fail
1067
1002
  with **HTTP 401** (the relay rejects env tokens); blank it for the command
1068
1003
  (`GITHUB_TOKEN= GH_TOKEN= agent-sdk github forward …`) or `unset` it.
@@ -1074,12 +1009,12 @@ tunnel), and `--slug` / `--channel` to forward to just one of several agents.
1074
1009
  Against a `--dev` server no secret is needed; set `GITHUB_WEBHOOK_SECRET` (or
1075
1010
  `--secret`) to exercise signature verification (required for a non-dev target).
1076
1011
  Only one forwarder per repo/org at a time (a GitHub limitation). Fixture replay
1077
- still works too `POST` a saved payload with an `x-github-event` header (no
1012
+ still works too: `POST` a saved payload with an `x-github-event` header (no
1078
1013
  signature needed in `--dev`).
1079
1014
 
1080
1015
  **No admin? Hillclimbing? Use `github replay`.** `gh webhook forward` needs repo
1081
1016
  admin and a live event. `agent-sdk github replay <pr_url>` instead **reads**
1082
- the PR (pull access is enough no admin, no relay, and `GITHUB_TOKEN` is fine)
1017
+ the PR (pull access is enough: no admin, no relay, and `GITHUB_TOKEN` is fine)
1083
1018
  and synthesizes GitHub-shaped payloads it POSTs straight at the channel:
1084
1019
 
1085
1020
  ```bash
@@ -1097,7 +1032,7 @@ agent-sdk github replay owner/repo#123 --dir ./my-agent --events '*' --dry-run -
1097
1032
  `--action` / `--conclusion` / `--comment` / `--context` tune each synthesized
1098
1033
  event; `--secret` (or `GITHUB_WEBHOOK_SECRET`) signs them so a secret-configured
1099
1034
  channel verifies. Because replay sends a clean, signed loopback request, it
1100
- passes both the `localDevStrict()` and `allowAll()`+signature auth modes and
1035
+ passes both the `localDevStrict()` and `allowAll()`+signature auth modes, and
1101
1036
  it's fully deterministic, which is what hillclimbing wants.
1102
1037
 
1103
1038
  **Production alternative: pull from Cursor (`--cursor-events`).** If the
@@ -1110,7 +1045,7 @@ Serve fails fast rather than starting with a relay that can never receive
1110
1045
  events.
1111
1046
 
1112
1047
  ### Hooks (`agent/hooks/*.ts`)
1113
- Observe-only subscribers that run after each event is recorded audit
1048
+ Observe-only subscribers that run after each event is recorded: audit
1114
1049
  logs, metrics, mirroring transcripts into your own store. Keys are event
1115
1050
  types (or `*`); handler errors are logged, never fatal.
1116
1051
 
@@ -1148,7 +1083,7 @@ export default defineSchedule({
1148
1083
 
1149
1084
  Cron expressions are standard 5-field, evaluated in UTC with minute
1150
1085
  granularity. In production mode (`agent-sdk serve`) schedules fire on
1151
- cadence; in dev mode (`--dev`) they never fire automatically dispatch one
1086
+ cadence; in dev mode (`--dev`) they never fire automatically. Dispatch one
1152
1087
  by hand, exactly once, through the same path production uses:
1153
1088
 
1154
1089
  ```bash
@@ -1179,19 +1114,18 @@ await handle.createReminder({
1179
1114
  ```
1180
1115
 
1181
1116
  Host/policy packs may pass `run` (return `stop` / `skip` / `delivered`)
1182
- instead of prompts. In `--dev`, use `POST /v1/dev/reminders/:id` (or
1183
- `handle.dispatchReminder`) to fire; auto-timers follow
1184
- `ServeOptions.reminders` (default `!dev`). Run handlers are in-memory —
1185
- after restart those reminders are disarmed (`handler_lost_on_restart`);
1186
- re-arm from enroll/policy.
1117
+ instead of prompts. `--dev` does not auto-fire reminders. Dispatch one
1118
+ with `POST /v1/dev/reminders/:id` or `handle.dispatchReminder`. Run
1119
+ handlers are in-memory. After a restart those reminders are disarmed
1120
+ (`handler_lost_on_restart`); re-arm from enroll/policy.
1187
1121
 
1188
- The NDJSON stream vocabulary one JSON object per line, each carrying
1122
+ The NDJSON stream vocabulary: one JSON object per line, each carrying
1189
1123
  `{ type, index, sessionId, turnId?, at, data }`:
1190
1124
 
1191
1125
  | Event | Meaning |
1192
1126
  | --------------------- | -------------------------------------------------------------- |
1193
1127
  | `session.started` | A durable session was created. |
1194
- | `agent.bound` | Cursor agent id is known (`sdkAgentId`; cloud: `bc-…` + URL). |
1128
+ | `agent.bound` | Cloud conversation URL. |
1195
1129
  | `ab.assigned` | Sticky A/B enrollment (`experiment`, `variant` or `null` skip). |
1196
1130
  | `message.received` | An inbound user message was accepted. |
1197
1131
  | `turn.started` | A turn began. |
@@ -1219,7 +1153,7 @@ import { serve } from "@cursor/july";
1219
1153
 
1220
1154
  const handle = await serve("./my-agent", {
1221
1155
  port: 3000,
1222
- apiKey: process.env.CURSOR_API_KEY, // optional see credential order below
1156
+ apiKey: process.env.CURSOR_API_KEY, // optional: see credential order below
1223
1157
  });
1224
1158
  console.log(`listening on ${handle.url}`);
1225
1159
  // handle.dispatchSchedule("heartbeat"), handle.project, await handle.close()
@@ -1233,22 +1167,21 @@ Cursor dashboard to kill it outright).
1233
1167
 
1234
1168
  Local-dev note: login/account RPCs honor `CURSOR_API_BASE_URL` while the
1235
1169
  Cursor SDK harness honors `CURSOR_BACKEND_URL`. When pointing at a
1236
- non-production backend, set **both** to the same URL a key minted on one
1170
+ non-production backend, set **both** to the same URL. A key minted on one
1237
1171
  backend is rejected by the other.
1238
1172
 
1239
1173
  `serve` refuses to start when discovery produced error diagnostics; run
1240
1174
  `agent-sdk validate` (or read `project.diagnostics`) to see why.
1241
1175
 
1242
- State lives under `<project>/.agent-serve/` (override with `stateRoot` /
1243
- `--state-root`): `sessions/<id>/{session.json,events.ndjson,workspace/}`
1244
- plus the SDK conversation store under `runner/`. Delete a session directory
1245
- to forget that conversation.
1176
+ State lives under the project state directory (override with
1177
+ `--state-root`). Forget a conversation by removing that session from
1178
+ state.
1246
1179
 
1247
- Session workspaces are real Cursor project directories, so the harness also
1248
- loads ambient project config from ancestor directories (nested
1249
- `AGENTS.md` / `.cursor` rules and skills). Nested git checkouts default
1250
- `local.cwd` to `~/.cache/agent-serve/<dir>`. Point `cwd` at a checkout only
1251
- when the agent should inherit that tree.
1180
+ Session workspaces are real Cursor project directories, so the harness
1181
+ also loads ambient project config from ancestor directories. Nested git
1182
+ checkouts default `local.cwd` to a per-project cache directory under
1183
+ `~/.cache`. Point `cwd` at a checkout only when the agent should inherit
1184
+ that tree.
1252
1185
 
1253
1186
  ## Not supported (yet)
1254
1187