@cursor/july 0.1.99 → 0.1.101

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 (420) hide show
  1. package/AGENTS.md +4 -2
  2. package/dist/bin/agent-serve.js +3 -2
  3. package/dist/channels/deployments/deployments-channel.d.ts +41 -5
  4. package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
  5. package/dist/channels/deployments/deployments-channel.js +88 -8
  6. package/dist/channels/deployments/types.d.ts +4 -3
  7. package/dist/channels/deployments/types.d.ts.map +1 -1
  8. package/dist/channels/github/defaults.d.ts.map +1 -1
  9. package/dist/channels/github/defaults.js +28 -3
  10. package/dist/channels/github/progress.d.ts +7 -0
  11. package/dist/channels/github/progress.d.ts.map +1 -1
  12. package/dist/channels/origin/defaults.d.ts +43 -0
  13. package/dist/channels/origin/defaults.d.ts.map +1 -0
  14. package/dist/channels/origin/defaults.js +111 -0
  15. package/dist/channels/origin/index.d.ts +2 -0
  16. package/dist/channels/origin/index.d.ts.map +1 -1
  17. package/dist/channels/origin/index.js +2 -0
  18. package/dist/channels/origin/origin-channel.d.ts +2 -1
  19. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  20. package/dist/channels/origin/origin-channel.js +24 -3
  21. package/dist/channels/origin/state.d.ts +32 -0
  22. package/dist/channels/origin/state.d.ts.map +1 -0
  23. package/dist/channels/origin/state.js +23 -0
  24. package/dist/channels/origin/types.d.ts +23 -1
  25. package/dist/channels/origin/types.d.ts.map +1 -1
  26. package/dist/channels/slack/api.d.ts +16 -7
  27. package/dist/channels/slack/api.d.ts.map +1 -1
  28. package/dist/channels/slack/api.js +31 -14
  29. package/dist/channels/slack/code-fences.d.ts +17 -0
  30. package/dist/channels/slack/code-fences.d.ts.map +1 -0
  31. package/dist/channels/slack/code-fences.js +168 -0
  32. package/dist/channels/slack/constants.d.ts +6 -0
  33. package/dist/channels/slack/constants.d.ts.map +1 -1
  34. package/dist/channels/slack/constants.js +6 -0
  35. package/dist/channels/slack/defaults.d.ts +9 -4
  36. package/dist/channels/slack/defaults.d.ts.map +1 -1
  37. package/dist/channels/slack/defaults.js +154 -76
  38. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  39. package/dist/channels/slack/dispatch.js +3 -3
  40. package/dist/channels/slack/inbound.d.ts +9 -0
  41. package/dist/channels/slack/inbound.d.ts.map +1 -1
  42. package/dist/channels/slack/inbound.js +14 -0
  43. package/dist/channels/slack/index.d.ts +2 -0
  44. package/dist/channels/slack/index.d.ts.map +1 -1
  45. package/dist/channels/slack/index.js +2 -0
  46. package/dist/channels/slack/live-delivery.d.ts +5 -0
  47. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  48. package/dist/channels/slack/live-delivery.js +116 -21
  49. package/dist/channels/slack/reasoning-card.d.ts +38 -0
  50. package/dist/channels/slack/reasoning-card.d.ts.map +1 -0
  51. package/dist/channels/slack/reasoning-card.js +104 -0
  52. package/dist/channels/slack/redact.d.ts +2 -0
  53. package/dist/channels/slack/redact.d.ts.map +1 -0
  54. package/dist/channels/slack/redact.js +5 -0
  55. package/dist/channels/slack/reply-options.d.ts +40 -0
  56. package/dist/channels/slack/reply-options.d.ts.map +1 -0
  57. package/dist/channels/slack/reply-options.js +150 -0
  58. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  59. package/dist/channels/slack/slack-channel.js +8 -4
  60. package/dist/channels/slack/stream.d.ts +22 -10
  61. package/dist/channels/slack/stream.d.ts.map +1 -1
  62. package/dist/channels/slack/stream.js +9 -16
  63. package/dist/channels/slack/tool-cards.d.ts +22 -0
  64. package/dist/channels/slack/tool-cards.d.ts.map +1 -0
  65. package/dist/channels/slack/tool-cards.js +178 -0
  66. package/dist/channels/slack/types.d.ts +145 -6
  67. package/dist/channels/slack/types.d.ts.map +1 -1
  68. package/dist/connections.d.ts +18 -2
  69. package/dist/connections.d.ts.map +1 -1
  70. package/dist/connections.js +18 -2
  71. package/dist/docs/404.html +2 -2
  72. package/dist/docs/ab.html +6 -6
  73. package/dist/docs/ab.md +1 -1
  74. package/dist/docs/assets/{ab.md.DJo5r4R-.js → ab.md.mlVgqvSk.js} +1 -1
  75. package/dist/docs/assets/{app.BplEAZ3S.js → app.BASO9Kih.js} +1 -1
  76. package/dist/docs/assets/{building-with-agents.md.DI4mEzlt.js → building-with-agents.md.CUSWxlP_.js} +2 -2
  77. package/dist/docs/assets/chunks/@localSearchIndexroot.DbFXINq2.js +1 -0
  78. package/dist/docs/assets/chunks/{VPLocalSearchBox.CHXyv4wP.js → VPLocalSearchBox.DwkqxoE0.js} +1 -1
  79. package/dist/docs/assets/chunks/{theme.BTcsZmjQ.js → theme.CCil_13e.js} +2 -2
  80. package/dist/docs/assets/{evals.md.lfJoEVc8.js → evals.md.CPzDAwoH.js} +1 -1
  81. package/dist/docs/assets/{guides_github.md.Cnh2mL4a.js → guides_github.md.BtPr9GaP.js} +1 -1
  82. package/dist/docs/assets/{guides_mcp-oauth.md.CN-6YmTJ.js → guides_mcp-oauth.md.Dp6cDP7f.js} +1 -1
  83. package/dist/docs/assets/{guides_opentelemetry.md.bmPmkvJu.js → guides_opentelemetry.md.BVTXDCRg.js} +2 -2
  84. package/dist/docs/assets/{guides_slack.md.VDXQV3ja.js → guides_slack.md.9oHPye9o.js} +19 -3
  85. package/dist/docs/assets/{guides_slack.md.VDXQV3ja.lean.js → guides_slack.md.9oHPye9o.lean.js} +1 -1
  86. package/dist/docs/assets/hillclimbing.md.CpTGTCle.js +4 -0
  87. package/dist/docs/assets/{index.md.CVeRUOeZ.js → index.md.Bb4k8kUm.js} +1 -1
  88. package/dist/docs/assets/{quickstart.md.Nj_LjW_a.js → quickstart.md.DdQOF7Y8.js} +1 -1
  89. package/dist/docs/assets/{reference_connections.md.DxldvyIB.js → reference_connections.md.Di6jJAXF.js} +13 -3
  90. package/dist/docs/assets/{reference_connections.md.DxldvyIB.lean.js → reference_connections.md.Di6jJAXF.lean.js} +1 -1
  91. package/dist/docs/assets/{reference_http-api.md.BEJx9XVj.js → reference_http-api.md.oySXBO8o.js} +1 -1
  92. package/dist/docs/assets/scaffolding-agents.md.em43xlY1.js +1 -0
  93. package/dist/docs/assets/skills_ab.md.CsFNatVx.js +26 -0
  94. package/dist/docs/assets/skills_ab.md.CsFNatVx.lean.js +1 -0
  95. package/dist/docs/assets/skills_create-agent.md.BVoWPcan.js +8 -0
  96. package/dist/docs/assets/skills_create-agent.md.BVoWPcan.lean.js +1 -0
  97. package/dist/docs/assets/skills_debug.md.CDbPhHfg.js +1 -0
  98. package/dist/docs/assets/skills_debug.md.CDbPhHfg.lean.js +1 -0
  99. package/dist/docs/assets/skills_evals.md.723kpUmA.js +25 -0
  100. package/dist/docs/assets/skills_evals.md.723kpUmA.lean.js +1 -0
  101. package/dist/docs/assets/skills_framework-map.md.BTi817yv.js +1 -0
  102. package/dist/docs/assets/skills_framework-map.md.BTi817yv.lean.js +1 -0
  103. package/dist/docs/assets/skills_github.md.D0JahM8c.js +16 -0
  104. package/dist/docs/assets/skills_github.md.D0JahM8c.lean.js +1 -0
  105. package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.js +7 -0
  106. package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.lean.js +1 -0
  107. package/dist/docs/assets/skills_index.md.DKwIxzGg.js +1 -0
  108. package/dist/docs/assets/skills_index.md.DKwIxzGg.lean.js +1 -0
  109. package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.js +18 -0
  110. package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.lean.js +1 -0
  111. package/dist/docs/assets/skills_otel.md.CgiZryR3.js +8 -0
  112. package/dist/docs/assets/skills_otel.md.CgiZryR3.lean.js +1 -0
  113. package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.js +20 -0
  114. package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.lean.js +1 -0
  115. package/dist/docs/assets/{troubleshooting.md.DCiPBhYs.js → troubleshooting.md.Cus_YZga.js} +1 -1
  116. package/dist/docs/building-with-agents.html +6 -6
  117. package/dist/docs/building-with-agents.md +14 -11
  118. package/dist/docs/concepts.html +4 -4
  119. package/dist/docs/deployment.html +4 -4
  120. package/dist/docs/evals.html +6 -6
  121. package/dist/docs/evals.md +1 -1
  122. package/dist/docs/guides/agent-to-agent.html +4 -4
  123. package/dist/docs/guides/cloud-runtime.html +4 -4
  124. package/dist/docs/guides/convert-automation.html +4 -4
  125. package/dist/docs/guides/github.html +5 -5
  126. package/dist/docs/guides/github.md +1 -1
  127. package/dist/docs/guides/human-in-the-loop.html +4 -4
  128. package/dist/docs/guides/mcp-oauth.html +5 -5
  129. package/dist/docs/guides/mcp-oauth.md +1 -1
  130. package/dist/docs/guides/opentelemetry.html +7 -7
  131. package/dist/docs/guides/opentelemetry.md +2 -2
  132. package/dist/docs/guides/slack.html +22 -6
  133. package/dist/docs/guides/slack.md +80 -1
  134. package/dist/docs/guides/webhooks.html +5 -5
  135. package/dist/docs/hashmap.json +1 -1
  136. package/dist/docs/hillclimbing.html +6 -6
  137. package/dist/docs/hillclimbing.md +5 -5
  138. package/dist/docs/index.html +6 -6
  139. package/dist/docs/index.md +1 -1
  140. package/dist/docs/llms-full.txt +1073 -31
  141. package/dist/docs/llms.txt +14 -0
  142. package/dist/docs/quickstart.html +5 -5
  143. package/dist/docs/quickstart.md +1 -1
  144. package/dist/docs/reference/agent-config.html +4 -4
  145. package/dist/docs/reference/artifacts.html +4 -4
  146. package/dist/docs/reference/channels.html +4 -4
  147. package/dist/docs/reference/cli.html +4 -4
  148. package/dist/docs/reference/connections.html +17 -7
  149. package/dist/docs/reference/connections.md +32 -1
  150. package/dist/docs/reference/hooks.html +4 -4
  151. package/dist/docs/reference/http-api.html +6 -6
  152. package/dist/docs/reference/http-api.md +1 -1
  153. package/dist/docs/reference/instructions.html +4 -4
  154. package/dist/docs/reference/playground.html +4 -4
  155. package/dist/docs/reference/project-layout.html +4 -4
  156. package/dist/docs/reference/prompt.html +4 -4
  157. package/dist/docs/reference/schedules.html +4 -4
  158. package/dist/docs/reference/sessions.html +4 -4
  159. package/dist/docs/reference/skills.html +4 -4
  160. package/dist/docs/reference/subagents.html +4 -4
  161. package/dist/docs/reference/tools.html +4 -4
  162. package/dist/docs/scaffolding-agents.html +5 -5
  163. package/dist/docs/scaffolding-agents.md +3 -3
  164. package/dist/docs/skills/ab.html +52 -0
  165. package/dist/docs/skills/ab.md +50 -0
  166. package/dist/docs/skills/create-agent.html +34 -0
  167. package/dist/docs/skills/create-agent.md +160 -0
  168. package/dist/docs/skills/debug.html +27 -0
  169. package/dist/docs/skills/debug.md +36 -0
  170. package/dist/docs/skills/evals.html +51 -0
  171. package/dist/docs/skills/evals.md +99 -0
  172. package/dist/docs/skills/framework-map.html +27 -0
  173. package/dist/docs/skills/framework-map.md +95 -0
  174. package/dist/docs/skills/github.html +42 -0
  175. package/dist/docs/skills/github.md +93 -0
  176. package/dist/docs/skills/hillclimb.html +33 -0
  177. package/dist/docs/skills/hillclimb.md +55 -0
  178. package/dist/docs/skills/index.html +27 -0
  179. package/dist/docs/skills/index.md +21 -0
  180. package/dist/docs/skills/mcp-auth.html +44 -0
  181. package/dist/docs/skills/mcp-auth.md +76 -0
  182. package/dist/docs/skills/otel.html +34 -0
  183. package/dist/docs/skills/otel.md +48 -0
  184. package/dist/docs/skills/setup-slack.html +46 -0
  185. package/dist/docs/skills/setup-slack.md +141 -0
  186. package/dist/docs/storage.html +4 -4
  187. package/dist/docs/templates/agentic-owners.html +4 -4
  188. package/dist/docs/templates/agents-md.html +4 -4
  189. package/dist/docs/templates/code-wiki.html +4 -4
  190. package/dist/docs/templates/demo.html +4 -4
  191. package/dist/docs/templates/pr-autofixer.html +4 -4
  192. package/dist/docs/templates/security-help.html +4 -4
  193. package/dist/docs/templates/security-reviewer.html +4 -4
  194. package/dist/docs/templates/triage.html +4 -4
  195. package/dist/docs/troubleshooting.html +5 -5
  196. package/dist/docs/troubleshooting.md +1 -1
  197. package/dist/extensions/cursor-cloud-agents/extension.d.ts +55 -0
  198. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -0
  199. package/dist/extensions/cursor-cloud-agents/extension.js +64 -0
  200. package/dist/extensions/cursor-cloud-agents/lib/cloud.d.ts +30 -0
  201. package/dist/extensions/cursor-cloud-agents/lib/cloud.d.ts.map +1 -0
  202. package/dist/extensions/cursor-cloud-agents/lib/cloud.js +45 -0
  203. package/dist/extensions/cursor-cloud-agents/lib/fleet.d.ts +25 -0
  204. package/dist/extensions/cursor-cloud-agents/lib/fleet.d.ts.map +1 -0
  205. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +85 -0
  206. package/dist/extensions/cursor-cloud-agents/lib/repos.d.ts +15 -0
  207. package/dist/extensions/cursor-cloud-agents/lib/repos.d.ts.map +1 -0
  208. package/dist/extensions/cursor-cloud-agents/lib/repos.js +55 -0
  209. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +27 -0
  210. package/dist/extensions/cursor-cloud-agents/tools/follow_up.d.ts +4 -0
  211. package/dist/extensions/cursor-cloud-agents/tools/follow_up.d.ts.map +1 -0
  212. package/dist/extensions/cursor-cloud-agents/tools/follow_up.js +37 -0
  213. package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts +4 -0
  214. package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -0
  215. package/dist/extensions/cursor-cloud-agents/tools/launch.js +83 -0
  216. package/dist/extensions/cursor-cloud-agents/tools/list.d.ts +4 -0
  217. package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -0
  218. package/dist/extensions/cursor-cloud-agents/tools/list.js +36 -0
  219. package/dist/extensions/cursor-cloud-agents/tools/status.d.ts +4 -0
  220. package/dist/extensions/cursor-cloud-agents/tools/status.d.ts.map +1 -0
  221. package/dist/extensions/cursor-cloud-agents/tools/status.js +41 -0
  222. package/dist/extensions.d.ts +49 -0
  223. package/dist/extensions.d.ts.map +1 -0
  224. package/dist/extensions.js +75 -0
  225. package/dist/files-backends/cursor-hosted.d.ts +6 -0
  226. package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
  227. package/dist/files-backends/cursor-hosted.js +6 -9
  228. package/dist/index.d.ts +2 -1
  229. package/dist/index.d.ts.map +1 -1
  230. package/dist/index.js +2 -1
  231. package/dist/internal/advertise-tools.d.ts +4 -1
  232. package/dist/internal/advertise-tools.d.ts.map +1 -1
  233. package/dist/internal/advertise-tools.js +20 -1
  234. package/dist/internal/as-of.d.ts +18 -0
  235. package/dist/internal/as-of.d.ts.map +1 -1
  236. package/dist/internal/as-of.js +131 -0
  237. package/dist/internal/cli-deploy.d.ts.map +1 -1
  238. package/dist/internal/cli-deploy.js +66 -21
  239. package/dist/internal/continuation-identity.d.ts.map +1 -1
  240. package/dist/internal/continuation-identity.js +3 -1
  241. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  242. package/dist/internal/conversation-mirror.js +3 -4
  243. package/dist/internal/cursor/hosted-deployment-secrets.d.ts +16 -0
  244. package/dist/internal/cursor/hosted-deployment-secrets.d.ts.map +1 -0
  245. package/dist/internal/cursor/hosted-deployment-secrets.js +61 -0
  246. package/dist/internal/cursor/hosted-store-secrets.d.ts +15 -0
  247. package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -0
  248. package/dist/internal/cursor/hosted-store-secrets.js +48 -0
  249. package/dist/internal/cursor-deployment-relay.d.ts +15 -1
  250. package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
  251. package/dist/internal/cursor-deployment-relay.js +46 -7
  252. package/dist/internal/deploy-client.d.ts +29 -6
  253. package/dist/internal/deploy-client.d.ts.map +1 -1
  254. package/dist/internal/deploy-client.js +61 -19
  255. package/dist/internal/discovery.d.ts.map +1 -1
  256. package/dist/internal/discovery.js +426 -121
  257. package/dist/internal/distribution.d.ts.map +1 -1
  258. package/dist/internal/distribution.js +5 -0
  259. package/dist/internal/framework-file-storage.d.ts +15 -8
  260. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  261. package/dist/internal/framework-file-storage.js +70 -10
  262. package/dist/internal/framework-storage-selection.d.ts +12 -12
  263. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  264. package/dist/internal/framework-storage-selection.js +33 -39
  265. package/dist/internal/hosted-delivery.d.ts +3 -1
  266. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  267. package/dist/internal/hosted-delivery.js +19 -32
  268. package/dist/internal/hosted-execution-diag.d.ts +5 -0
  269. package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
  270. package/dist/internal/hosted-execution-diag.js +5 -0
  271. package/dist/internal/hosted-execution-flush.d.ts +46 -0
  272. package/dist/internal/hosted-execution-flush.d.ts.map +1 -0
  273. package/dist/internal/hosted-execution-flush.js +81 -0
  274. package/dist/internal/mcp-endpoint.js +1 -0
  275. package/dist/internal/mcp-host.d.ts +2 -1
  276. package/dist/internal/mcp-host.d.ts.map +1 -1
  277. package/dist/internal/mcp-host.js +35 -15
  278. package/dist/internal/review-comments.d.ts +1 -1
  279. package/dist/internal/review-comments.d.ts.map +1 -1
  280. package/dist/internal/review-comments.js +4 -4
  281. package/dist/internal/server.d.ts +3 -0
  282. package/dist/internal/server.d.ts.map +1 -1
  283. package/dist/internal/server.js +79 -104
  284. package/dist/internal/session-engine.d.ts +9 -7
  285. package/dist/internal/session-engine.d.ts.map +1 -1
  286. package/dist/internal/session-engine.js +45 -34
  287. package/dist/internal/session-run-log.d.ts +5 -4
  288. package/dist/internal/session-run-log.d.ts.map +1 -1
  289. package/dist/internal/session-run-log.js +8 -8
  290. package/dist/internal/start-log-store.d.ts +60 -0
  291. package/dist/internal/start-log-store.d.ts.map +1 -0
  292. package/dist/internal/start-log-store.js +151 -0
  293. package/dist/internal/storage-coordinator.d.ts +0 -6
  294. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  295. package/dist/internal/storage-coordinator.js +1 -9
  296. package/dist/internal/tool-policy.d.ts +8 -0
  297. package/dist/internal/tool-policy.d.ts.map +1 -1
  298. package/dist/internal/tool-policy.js +19 -7
  299. package/dist/playground/assets/{index-jzNbJENa.js → index-BnNN1-EK.js} +45 -45
  300. package/dist/playground/assets/index-DBQCwFp0.css +1 -0
  301. package/dist/playground/index.html +2 -2
  302. package/dist/storage-backends/cursor-hosted-v2.d.ts +83 -0
  303. package/dist/storage-backends/cursor-hosted-v2.d.ts.map +1 -0
  304. package/dist/storage-backends/cursor-hosted-v2.js +164 -0
  305. package/dist/storage-backends/cursor-hosted.d.ts +6 -0
  306. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  307. package/dist/storage-backends/cursor-hosted.js +6 -1
  308. package/dist/storage-protocol.d.ts +24 -0
  309. package/dist/storage-protocol.d.ts.map +1 -1
  310. package/dist/storage-protocol.js +33 -0
  311. package/dist/storage.d.ts +1 -1
  312. package/dist/storage.d.ts.map +1 -1
  313. package/dist/storage.js +1 -1
  314. package/dist/types.d.ts +123 -6
  315. package/dist/types.d.ts.map +1 -1
  316. package/dist/types.js +29 -1
  317. package/docs/README.md +1 -1
  318. package/docs/ab.md +1 -1
  319. package/docs/building-with-agents.md +14 -11
  320. package/docs/evals.md +1 -1
  321. package/docs/guides/github.md +1 -1
  322. package/docs/guides/mcp-oauth.md +1 -1
  323. package/docs/guides/opentelemetry.md +2 -2
  324. package/docs/guides/slack.md +80 -1
  325. package/docs/hillclimbing.md +5 -5
  326. package/docs/quickstart.md +1 -1
  327. package/docs/reference/connections.md +32 -1
  328. package/docs/reference/http-api.md +1 -1
  329. package/docs/scaffolding-agents.md +3 -3
  330. package/docs/skills/index.md +26 -0
  331. package/docs/troubleshooting.md +1 -1
  332. package/package.json +18 -4
  333. package/src/bin/agent-serve.ts +11 -2
  334. package/src/channels/deployments/deployments-channel.ts +117 -8
  335. package/src/channels/deployments/types.ts +4 -3
  336. package/src/channels/github/defaults.ts +36 -3
  337. package/src/channels/github/progress.ts +7 -0
  338. package/src/channels/origin/defaults.ts +143 -0
  339. package/src/channels/origin/index.ts +2 -0
  340. package/src/channels/origin/origin-channel.ts +37 -1
  341. package/src/channels/origin/state.ts +54 -0
  342. package/src/channels/origin/types.ts +24 -0
  343. package/src/channels/slack/api.ts +37 -18
  344. package/src/channels/slack/code-fences.ts +183 -0
  345. package/src/channels/slack/constants.ts +6 -0
  346. package/src/channels/slack/defaults.ts +173 -92
  347. package/src/channels/slack/dispatch.ts +8 -1
  348. package/src/channels/slack/inbound.ts +17 -0
  349. package/src/channels/slack/index.ts +2 -0
  350. package/src/channels/slack/live-delivery.ts +142 -28
  351. package/src/channels/slack/reasoning-card.ts +140 -0
  352. package/src/channels/slack/redact.ts +6 -0
  353. package/src/channels/slack/reply-options.ts +229 -0
  354. package/src/channels/slack/slack-channel.ts +7 -2
  355. package/src/channels/slack/stream.ts +31 -24
  356. package/src/channels/slack/tool-cards.ts +221 -0
  357. package/src/channels/slack/types.ts +159 -6
  358. package/src/connections.ts +18 -1
  359. package/src/extensions/cursor-cloud-agents/extension.ts +118 -0
  360. package/src/extensions/cursor-cloud-agents/lib/cloud.ts +79 -0
  361. package/src/extensions/cursor-cloud-agents/lib/fleet.ts +109 -0
  362. package/src/extensions/cursor-cloud-agents/lib/repos.ts +81 -0
  363. package/src/extensions/cursor-cloud-agents/skills/handoff.md +27 -0
  364. package/src/extensions/cursor-cloud-agents/tools/follow_up.ts +29 -0
  365. package/src/extensions/cursor-cloud-agents/tools/launch.ts +84 -0
  366. package/src/extensions/cursor-cloud-agents/tools/list.ts +31 -0
  367. package/src/extensions/cursor-cloud-agents/tools/status.ts +39 -0
  368. package/src/extensions.ts +98 -0
  369. package/src/files-backends/cursor-hosted.ts +15 -5
  370. package/src/index.ts +2 -0
  371. package/src/internal/advertise-tools.ts +37 -12
  372. package/src/internal/as-of.ts +163 -0
  373. package/src/internal/cli-deploy.ts +88 -25
  374. package/src/internal/continuation-identity.ts +3 -1
  375. package/src/internal/conversation-mirror.ts +3 -8
  376. package/src/internal/cursor/hosted-deployment-secrets.ts +72 -0
  377. package/src/internal/cursor/hosted-store-secrets.ts +72 -0
  378. package/src/internal/cursor-deployment-relay.ts +65 -8
  379. package/src/internal/deploy-client.ts +83 -28
  380. package/src/internal/discovery.ts +479 -114
  381. package/src/internal/distribution.ts +5 -0
  382. package/src/internal/framework-file-storage.ts +80 -10
  383. package/src/internal/framework-storage-selection.ts +31 -44
  384. package/src/internal/hosted-delivery.ts +38 -63
  385. package/src/internal/hosted-execution-diag.ts +6 -0
  386. package/src/internal/hosted-execution-flush.ts +142 -0
  387. package/src/internal/mcp-endpoint.ts +1 -0
  388. package/src/internal/mcp-host.ts +40 -14
  389. package/src/internal/review-comments.ts +5 -2
  390. package/src/internal/server.ts +81 -100
  391. package/src/internal/session-engine.ts +56 -28
  392. package/src/internal/session-run-log.ts +8 -12
  393. package/src/internal/start-log-store.ts +177 -0
  394. package/src/internal/storage-coordinator.ts +1 -11
  395. package/src/internal/tool-policy.ts +39 -9
  396. package/src/storage-backends/cursor-hosted-v2.ts +219 -0
  397. package/src/storage-backends/cursor-hosted.ts +6 -1
  398. package/src/storage-protocol.ts +37 -0
  399. package/src/storage.ts +1 -0
  400. package/src/types.ts +177 -14
  401. package/dist/docs/assets/chunks/@localSearchIndexroot.DpuI4i7Z.js +0 -1
  402. package/dist/docs/assets/hillclimbing.md.DhESf3OO.js +0 -4
  403. package/dist/docs/assets/scaffolding-agents.md.D7UUkWw0.js +0 -1
  404. package/dist/internal/null-kv-storage.d.ts +0 -48
  405. package/dist/internal/null-kv-storage.d.ts.map +0 -1
  406. package/dist/internal/null-kv-storage.js +0 -58
  407. package/dist/playground/assets/index-D7rGZNjy.css +0 -1
  408. package/src/internal/null-kv-storage.ts +0 -74
  409. /package/dist/docs/assets/{ab.md.DJo5r4R-.lean.js → ab.md.mlVgqvSk.lean.js} +0 -0
  410. /package/dist/docs/assets/{building-with-agents.md.DI4mEzlt.lean.js → building-with-agents.md.CUSWxlP_.lean.js} +0 -0
  411. /package/dist/docs/assets/{evals.md.lfJoEVc8.lean.js → evals.md.CPzDAwoH.lean.js} +0 -0
  412. /package/dist/docs/assets/{guides_github.md.Cnh2mL4a.lean.js → guides_github.md.BtPr9GaP.lean.js} +0 -0
  413. /package/dist/docs/assets/{guides_mcp-oauth.md.CN-6YmTJ.lean.js → guides_mcp-oauth.md.Dp6cDP7f.lean.js} +0 -0
  414. /package/dist/docs/assets/{guides_opentelemetry.md.bmPmkvJu.lean.js → guides_opentelemetry.md.BVTXDCRg.lean.js} +0 -0
  415. /package/dist/docs/assets/{hillclimbing.md.DhESf3OO.lean.js → hillclimbing.md.CpTGTCle.lean.js} +0 -0
  416. /package/dist/docs/assets/{index.md.CVeRUOeZ.lean.js → index.md.Bb4k8kUm.lean.js} +0 -0
  417. /package/dist/docs/assets/{quickstart.md.Nj_LjW_a.lean.js → quickstart.md.DdQOF7Y8.lean.js} +0 -0
  418. /package/dist/docs/assets/{reference_http-api.md.BEJx9XVj.lean.js → reference_http-api.md.oySXBO8o.lean.js} +0 -0
  419. /package/dist/docs/assets/{scaffolding-agents.md.D7UUkWw0.lean.js → scaffolding-agents.md.em43xlY1.lean.js} +0 -0
  420. /package/dist/docs/assets/{troubleshooting.md.DCiPBhYs.lean.js → troubleshooting.md.Cus_YZga.lean.js} +0 -0
@@ -336,7 +336,7 @@ Continue with these pages:
336
336
  `ab.assigned` event and durable log
337
337
  - [Playground](/docs/reference/playground.md): the A/Bs tab
338
338
  - [HTTP API](/docs/reference/http-api.md): `GET /v1/abs`
339
- - [Live A/B metrics skill](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/ab/SKILL.md): have a coding agent
339
+ - [Live A/B metrics skill](/docs/skills/ab.md): have a coding agent
340
340
  wire an experiment
341
341
 
342
342
  ---
@@ -367,7 +367,7 @@ and verify the result without reading terminal prose.
367
367
  ## How do I create an agent with the built-in skill?
368
368
 
369
369
  Have the coding agent read
370
- [`skills/create-agent/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/create-agent/SKILL.md) and
370
+ [`skills/create-agent/SKILL.md`](/docs/skills/create-agent.md) and
371
371
  follow it.
372
372
 
373
373
  The skill asks about your agent's purpose, runtime, model, channels, MCP
@@ -386,18 +386,20 @@ the first end-to-end turn works.
386
386
 
387
387
  ## Which built-in skill should I use?
388
388
 
389
- The package ships task-specific guides under [`skills/`](https://github.com/cursor/cursor/tree/main/packages/agent-serve/skills/):
389
+ The package ships task-specific guides under [`skills/`](/docs/skills/index.md):
390
390
 
391
391
  | What you want to do | Skill |
392
392
  | --- | --- |
393
- | Understand the project layout and runtimes | [`framework-map`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/framework-map/SKILL.md) |
394
- | Create and verify a new agent | [`create-agent`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/create-agent/SKILL.md) |
395
- | Write fixtures and regression checks | [`evals`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/evals/SKILL.md) |
396
- | Live A/B metrics on traffic (`defineAB`) | [`ab`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/ab/SKILL.md) |
397
- | Improve an agent against fixed inputs | [`hillclimb`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/hillclimb/SKILL.md) |
398
- | Add GitHub webhooks and replay events | [`github`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/github/SKILL.md) |
399
- | Connect an agent to Slack | [`setup-slack`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/setup-slack/SKILL.md) |
400
- | Diagnose a local run | [`debug`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/debug/SKILL.md) |
393
+ | Understand the project layout and runtimes | [`framework-map`](/docs/skills/framework-map.md) |
394
+ | Create and verify a new agent | [`create-agent`](/docs/skills/create-agent.md) |
395
+ | Write fixtures and regression checks | [`evals`](/docs/skills/evals.md) |
396
+ | Live A/B metrics on traffic (`defineAB`) | [`ab`](/docs/skills/ab.md) |
397
+ | Export OpenTelemetry traces | [`otel`](/docs/skills/otel.md) |
398
+ | Improve an agent against fixed inputs | [`hillclimb`](/docs/skills/hillclimb.md) |
399
+ | Add GitHub webhooks and replay events | [`github`](/docs/skills/github.md) |
400
+ | Connect an agent to Slack | [`setup-slack`](/docs/skills/setup-slack.md) |
401
+ | Authorize host MCP OAuth | [`mcp-auth`](/docs/skills/mcp-auth.md) |
402
+ | Diagnose a local run | [`debug`](/docs/skills/debug.md) |
401
403
 
402
404
  Point your coding agent at the matching `SKILL.md`. The guide contains
403
405
  the workflow, commands, and common mistakes for that task.
@@ -450,7 +452,7 @@ smoke turn passes, give the hillclimb skill:
450
452
  evals that must stay unchanged
451
453
 
452
454
  Have the coding agent read
453
- [`skills/hillclimb/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/hillclimb/SKILL.md). It measures
455
+ [`skills/hillclimb/SKILL.md`](/docs/skills/hillclimb.md). It measures
454
456
  the current run, proposes one change, remeasures the same fixtures, and
455
457
  adds an eval for each kept improvement.
456
458
 
@@ -458,6 +460,7 @@ adds an eval for each kept improvement.
458
460
 
459
461
  - [Create your first agent](/docs/quickstart.md)
460
462
  - [Scaffold an agent with Cursor](/docs/scaffolding-agents.md)
463
+ - [Coding-agent skills](/docs/skills/index.md)
461
464
  - [Evals](/docs/evals.md)
462
465
  - [Hillclimbing](/docs/hillclimbing.md)
463
466
  - [CLI reference](/docs/reference/cli.md)
@@ -3277,7 +3280,7 @@ resolution for other file formats).
3277
3280
  `maxConcurrency` limits parallel datapoints. It does not limit model or
3278
3281
  API fan-out inside one datapoint. Materialized fixtures prevent a large
3279
3282
  suite from exhausting provider and GitHub rate limits. The
3280
- [evals skill](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/evals/SKILL.md) has the full fixture workflow.
3283
+ [evals skill](/docs/skills/evals.md) has the full fixture workflow.
3281
3284
 
3282
3285
  ## Keep improvements with regression evals
3283
3286
 
@@ -3739,7 +3742,7 @@ event stream for repos you've connected to Cursor. You still declare a
3739
3742
  `githubChannel` so hooks decide what each event does.
3740
3743
 
3741
3744
  The companion skill for coding agents is
3742
- [`skills/github/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/github/SKILL.md).
3745
+ [`skills/github/SKILL.md`](/docs/skills/github.md).
3743
3746
 
3744
3747
  ## Pull events from Cursor
3745
3748
 
@@ -4152,7 +4155,7 @@ deployment as secrets so prod can reconnect after a redeploy. Hosted
4152
4155
  Connect lets the current process retry.
4153
4156
 
4154
4157
  The companion skill is
4155
- [`skills/mcp-auth/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/mcp-auth/SKILL.md).
4158
+ [`skills/mcp-auth/SKILL.md`](/docs/skills/mcp-auth.md).
4156
4159
 
4157
4160
  ## What can host MCP OAuth do?
4158
4161
 
@@ -4404,7 +4407,7 @@ You can also pass the same object to `serve(dir, { otel })`. Precedence
4404
4407
  is `serve({ otel })` over `agent/otel.ts` over env. An empty
4405
4408
  `defineOtel()` still enables export when `OTEL_EXPORTER_OTLP_*` is set.
4406
4409
 
4407
- The companion skill is [`skills/otel/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/otel/SKILL.md).
4410
+ The companion skill is [`skills/otel/SKILL.md`](/docs/skills/otel.md).
4408
4411
 
4409
4412
  ## What spans does a session produce?
4410
4413
 
@@ -4519,7 +4522,7 @@ through `serve({ otel })` or env.
4519
4522
 
4520
4523
  ## What's next
4521
4524
 
4522
- - [`skills/otel/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/otel/SKILL.md): compact
4525
+ - [`skills/otel/SKILL.md`](/docs/skills/otel.md): compact
4523
4526
  `defineOtel` reference for coding agents
4524
4527
  - [Hooks](/docs/reference/hooks.md): observe the same session event stream
4525
4528
  in-process
@@ -4539,7 +4542,7 @@ Replies stream there, with thinking steps and suggested prompts.
4539
4542
  Use `agent-sdk slack create` when Cursor should own the Slack app. Use
4540
4543
  `agent-sdk slack init --manual` when you own it. Commands and flags live
4541
4544
  in the [CLI reference](/docs/reference/cli.md#slack). Coding agents should
4542
- follow [`skills/setup-slack/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/setup-slack/SKILL.md).
4545
+ follow [`skills/setup-slack/SKILL.md`](/docs/skills/setup-slack.md).
4543
4546
 
4544
4547
  ## Define the channel
4545
4548
 
@@ -4582,6 +4585,85 @@ export default slackChannel({
4582
4585
  });
4583
4586
  ```
4584
4587
 
4588
+ ## Choose how the reply arrives
4589
+
4590
+ Slack gives an agent two places to show progress while a turn runs: the
4591
+ status chip under the thread ("Running grep…") and the reply message
4592
+ itself. It won't fill both at once. While a message is streaming, Slack
4593
+ shows its own "is working…" chip and hides any status text you set. Cards
4594
+ only exist inside a streamed message. `reply.mode` picks which one you get.
4595
+
4596
+ ### `post` (default): status chip, then one message
4597
+
4598
+ Tool calls and the first line of each reasoning block show in the chip as
4599
+ they happen. The answer lands as a single message when the turn finishes.
4600
+
4601
+ ```ts
4602
+ export default slackChannel({
4603
+ reply: {
4604
+ mode: "post",
4605
+ status: {
4606
+ reasoning: true,
4607
+ tools: true,
4608
+ idle: ["Checking the monorepo…", "Poking Datadog…"],
4609
+ },
4610
+ },
4611
+ });
4612
+ ```
4613
+
4614
+ `idle` is the rotation Slack cycles through when nothing more specific is
4615
+ known, up to 5 lines of 50 characters. Pass a function to `tools` to write
4616
+ your own line from the calls in flight.
4617
+
4618
+ ### `stream`: live text, with cards
4619
+
4620
+ The answer streams into one message as the model writes it. Slack owns the
4621
+ chip for the duration, so live feedback inside the message comes from
4622
+ cards. Both are off unless you turn them on.
4623
+
4624
+ ```ts
4625
+ export default slackChannel({
4626
+ reply: {
4627
+ mode: "stream",
4628
+ reasoningCard: true,
4629
+ toolCards: { group: "per-tool" },
4630
+ },
4631
+ toolLabels: { grep: "Searching code", read: "Reading files" },
4632
+ });
4633
+ ```
4634
+
4635
+ The reasoning card is one task card, titled "Thinking", that receives the
4636
+ model's reasoning as it streams and completes when the answer text starts.
4637
+ `maxChars` (default 1500) caps how much it collects. Slack caps a streamed
4638
+ message near 12k characters including cards; when an answer outgrows that,
4639
+ the streamed message closes where it stands and the rest continues in a
4640
+ new message.
4641
+
4642
+ Tool cards default to one card per tool name with a call count in the title
4643
+ (`grep ×3`), updated in place as calls finish. `group: "per-call"` shows one
4644
+ card per call instead.
4645
+
4646
+ Cards are collapsible by default: each call adds one line under the title,
4647
+ the same summary the playground shows in a tool's header (the grep pattern,
4648
+ the file path, the shell command), and the group expands the same way the
4649
+ reasoning card does. `collapsible: false` keeps cards to their titles. On a
4650
+ collapsible card, `details(call)` returns the line to add when a call starts
4651
+ and `output(result)` the text to add when it finishes.
4652
+
4653
+ `toolLabels` renames tools everywhere they appear: the chip, card titles,
4654
+ and the default `Running …` line.
4655
+
4656
+ ### Migrating from `streaming` and `thinkingSteps`
4657
+
4658
+ `streaming: false` is `reply: { mode: "post" }`. `streaming: true` is
4659
+ `reply: { mode: "stream", toolCards: { group: "per-call", collapsible:
4660
+ false } }`, the title-only cards it used to show. `loadingMessages` moves
4661
+ to `reply.status.idle`. The old options still work and `agent-sdk validate`
4662
+ prints the rewrite for each one.
4663
+
4664
+ A channel that set none of these used to stream. It now posts. Set
4665
+ `reply: { mode: "stream" }` to keep streaming.
4666
+
4585
4667
  ## Set it up
4586
4668
 
4587
4669
  `slack create` opens the Cursor dashboard wizard. Finish Slack consent
@@ -5213,7 +5295,7 @@ flowchart LR
5213
5295
 
5214
5296
  ## How do I hillclimb an agent with a coding agent?
5215
5297
 
5216
- Have Cursor read [`skills/hillclimb/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/hillclimb/SKILL.md).
5298
+ Have Cursor read [`skills/hillclimb/SKILL.md`](/docs/skills/hillclimb.md).
5217
5299
 
5218
5300
  Tell it:
5219
5301
 
@@ -5227,10 +5309,10 @@ Other skills cover the edges:
5227
5309
 
5228
5310
  | When you need… | Skill |
5229
5311
  | --- | --- |
5230
- | The measured improvement loop | [`skills/hillclimb/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/hillclimb/SKILL.md) |
5231
- | An eval that locks a kept win | [`skills/evals/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/evals/SKILL.md) |
5232
- | Repeatable GitHub webhook inputs | [`skills/github/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/github/SKILL.md) |
5233
- | A run that misbehaves | [`skills/debug/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/debug/SKILL.md) |
5312
+ | The measured improvement loop | [`skills/hillclimb/SKILL.md`](/docs/skills/hillclimb.md) |
5313
+ | An eval that locks a kept win | [`skills/evals/SKILL.md`](/docs/skills/evals.md) |
5314
+ | Repeatable GitHub webhook inputs | [`skills/github/SKILL.md`](/docs/skills/github.md) |
5315
+ | A run that misbehaves | [`skills/debug/SKILL.md`](/docs/skills/debug.md) |
5234
5316
 
5235
5317
  See [Building agents with agents](/docs/building-with-agents.md) for every framework skill and a good first prompt.
5236
5318
 
@@ -5435,7 +5517,7 @@ Confirm `agent-sdk whoami` shows the expected account.
5435
5517
  ## Related documentation
5436
5518
 
5437
5519
  - Package reference: [`README.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/README.md)
5438
- - Coding-agent workflows: [`skills/`](https://github.com/cursor/cursor/tree/main/packages/agent-serve/skills/)
5520
+ - Coding-agent workflows: [`skills/`](/docs/skills/index.md)
5439
5521
 
5440
5522
  ---
5441
5523
 
@@ -5451,7 +5533,7 @@ review. Add GitHub event handling so pull requests can trigger reviews.
5451
5533
 
5452
5534
  - **Get started with an agent in Cursor:** follow
5453
5535
  [Scaffold an agent with Cursor](/docs/scaffolding-agents.md) and ask Cursor
5454
- to read [`skills/create-agent/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/create-agent/SKILL.md).
5536
+ to read [`skills/create-agent/SKILL.md`](/docs/skills/create-agent.md).
5455
5537
  - **Get started in the CLI:** continue below.
5456
5538
 
5457
5539
  ## Prerequisites
@@ -7454,7 +7536,7 @@ agent-sdk mcp oauth inventory --store # also upsert deployment secrets
7454
7536
  ```
7455
7537
 
7456
7538
  Full walkthrough: [Host MCP OAuth](/docs/guides/mcp-oauth.md). Companion
7457
- skill: [`skills/mcp-auth/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/mcp-auth/SKILL.md).
7539
+ skill: [`skills/mcp-auth/SKILL.md`](/docs/skills/mcp-auth.md).
7458
7540
 
7459
7541
  Account MCP (`cursorAccount: true`) is the right choice for connectors
7460
7542
  already linked in the Cursor dashboard. Omit `servers` (or pass `"*"`)
@@ -7524,6 +7606,37 @@ be called through the direct tool API.
7524
7606
  In a dry-run session, MCP tools marked read-only run normally. Tools marked
7525
7607
  as writes are stubbed. Tools without effect annotations are unavailable.
7526
7608
 
7609
+ ## Restrict which tools a connection serves
7610
+
7611
+ Use `tools` the same way you allowlist harness tools on the agent. When
7612
+ set, the connection serves only those names. Use `disallowedTools` to
7613
+ drop names instead. The two combine as deny-wins, same as the Cursor
7614
+ SDK. The model and `host.mcp` only see what remains. On a model-visible
7615
+ connection, set `advertiseTools: true` so the raw server is not attached.
7616
+
7617
+ ```ts
7618
+ export default defineConnection({
7619
+ url: "https://mcp.example.com/inventory",
7620
+ advertiseTools: true,
7621
+ tools: ["search_skus", "get_stock"],
7622
+ });
7623
+
7624
+ export default defineConnection({
7625
+ url: "https://mcp.example.com/inventory",
7626
+ advertiseTools: true,
7627
+ disallowedTools: ["place_order", "delete_sku"],
7628
+ });
7629
+ ```
7630
+
7631
+ Names are the server's `tools/list` names. Unknown names are omitted. A
7632
+ filter that matches nothing on the server fails the turn. Combine with
7633
+ `effects: "read"` to keep only the listed tools the server classifies as
7634
+ reads.
7635
+
7636
+ A list of names is an allowlist. An object of handlers authors TypeScript
7637
+ tools. On `host-connections/`, a name list restricts `host.mcp` without
7638
+ advertising.
7639
+
7527
7640
  ## Local stdio MCP server
7528
7641
 
7529
7642
  Run a local MCP server as a child process with `command`.
@@ -7830,7 +7943,7 @@ and `playgroundUrl` deep-links the session in the playground.
7830
7943
  | `message` | Required user message |
7831
7944
  | `title` | Session title |
7832
7945
  | `dryRun` | Run read tools and stub write tools |
7833
- | `asOf` | ISO-8601 instant with a timezone, frozen at create; the prompt states it, `ctx.now()` returns it, and tools declaring `timeArgs` refuse calls not bounded at or before it. `400` when unusable |
7946
+ | `asOf` | ISO-8601 instant with a timezone, frozen at create; the prompt states it, `ctx.now()` returns it, and tool calls with relative, later-than-`asOf`, or omitted schema-declared time bounds are refused. `400` when unusable |
7834
7947
  | `workspaceFiles` | UTF-8 files written into the session workspace |
7835
7948
  | `cloud` | Per-session cloud options merged over the agent defaults |
7836
7949
 
@@ -9249,7 +9362,7 @@ decision.
9249
9362
  ## What does the create-agent skill do?
9250
9363
 
9251
9364
  The bundled
9252
- [`create-agent` skill](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/create-agent/SKILL.md) turns your goal
9365
+ [`create-agent` skill](/docs/skills/create-agent.md) turns your goal
9253
9366
  into a small working project. Have Cursor read that file and follow it.
9254
9367
 
9255
9368
  Where to find the file depends on how you got the package:
@@ -9264,7 +9377,7 @@ Where to find the file depends on how you got the package:
9264
9377
  - Installed `@cursor/july` as a dependency? The skill also ships inside
9265
9378
  the package at `node_modules/@cursor/july/skills/create-agent/SKILL.md`.
9266
9379
  - Working from this package's source? The skill is at
9267
- [`skills/create-agent/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/create-agent/SKILL.md). Run
9380
+ [`skills/create-agent/SKILL.md`](/docs/skills/create-agent.md). Run
9268
9381
  `agent-sdk install-skills` if you want the same copies in
9269
9382
  `~/.cursor/skills/agentsdk/` (the package postinstall skips the
9270
9383
  source checkout).
@@ -9357,7 +9470,7 @@ without a Cursor credential. Model turns and evals need
9357
9470
 
9358
9471
  Choose one to three fixed inputs, define what should improve, and name
9359
9472
  what must stay unchanged. Then have Cursor follow
9360
- [`skills/hillclimb/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/hillclimb/SKILL.md).
9473
+ [`skills/hillclimb/SKILL.md`](/docs/skills/hillclimb.md).
9361
9474
 
9362
9475
  The hillclimb skill measures a baseline, changes one lever, runs the same
9363
9476
  inputs again, and adds an eval for each improvement you keep.
@@ -9373,6 +9486,935 @@ inputs again, and adds an eval for each improvement you keep.
9373
9486
 
9374
9487
  ---
9375
9488
 
9489
+ Source: /docs/skills/ab.md
9490
+
9491
+ # Agent SDK A/B metrics (`defineAB`)
9492
+
9493
+ Live metrics plug-in. No `agent-sdk ab` CLI. No assertion API.
9494
+ Reference: `docs/ab.md`.
9495
+
9496
+ | | `defineEval` | `defineAB` |
9497
+ | --- | --- | --- |
9498
+ | Job | Gates on frozen fixtures | Metrics on live runs |
9499
+ | Location | `evals/**/*.eval.ts` | `agent/ab.ts` or `agent/ab/<name>.ts` |
9500
+ | How it runs | `agent-sdk eval` | Under `serve` / `run` |
9501
+
9502
+ ```ts
9503
+ import { defineAB, splitBySessionHash } from "@cursor/july/ab";
9504
+
9505
+ export default defineAB({
9506
+ name: "concise-instructions",
9507
+ variants: {
9508
+ control: { label: "Baseline" },
9509
+ treatment: {
9510
+ label: "Shorter",
9511
+ instructions: "Keep replies to one short paragraph.",
9512
+ },
9513
+ },
9514
+ split: splitBySessionHash({ holdout: 0.1 }),
9515
+ derive: {
9516
+ weatherCalls: (event) =>
9517
+ event.type === "action.result" && event.data.toolName === "get_weather"
9518
+ ? 1
9519
+ : null,
9520
+ },
9521
+ onSample(sample) {
9522
+ console.log(sample.variant, sample.metrics.toolCalls, sample.metrics.wallTimeMs);
9523
+ },
9524
+ });
9525
+ ```
9526
+
9527
+ ```ts
9528
+ async execute(input, ctx) {
9529
+ if (ctx.session.abs?.["concise-instructions"] === "treatment") {
9530
+ // treatment-specific behavior
9531
+ }
9532
+ }
9533
+ ```
9534
+
9535
+ Enrollment is at session creation. Eval sessions skip it. Do not
9536
+ use `splitIf` to filter evals. Split helpers and `onSample`
9537
+ fields: `docs/ab.md`.
9538
+
9539
+ Pick a name, arm labels, a split, and a real `onSample` sink. Do
9540
+ not invent credentials.
9541
+
9542
+ ---
9543
+
9544
+ Source: /docs/skills/create-agent.md
9545
+
9546
+ # Create an Agent SDK agent
9547
+
9548
+ 1. **Interview.** Two `AskQuestion` rounds, then a plan gate.
9549
+ 2. **Scaffold.** `agent-sdk init`, then shape the files.
9550
+ 3. **Verify.** `validate` / `info` / `call`, then a model turn.
9551
+ 4. **Channels.** Slack, GitHub, webhook, or schedule as chosen.
9552
+ 5. **Hillclimb.** `skills/hillclimb/SKILL.md`.
9553
+
9554
+ Read `skills/framework-map/SKILL.md` if you have not. CLI is
9555
+ `agent-sdk`. Public docs:
9556
+ `node_modules/@cursor/july/dist/docs/llms.txt` or `/docs/llms.txt`
9557
+ on a running host.
9558
+
9559
+ ## Interview
9560
+
9561
+ `AskQuestion`: batched, recommended option first and labeled
9562
+ `(recommended)`.
9563
+
9564
+ - Mine the invoking message. Target: two rounds, then files.
9565
+ - Round 1 is identity. Round 2 is the surface, tailored by round 1.
9566
+ - Multi-select for channels, MCP, capabilities. Other where a
9567
+ custom answer is plausible.
9568
+ - Ask decisions, not how to build it. File layout, tool names,
9569
+ env prefix, and eval shape are yours.
9570
+ - If `AskQuestion` is missing or the user skips, state defaults
9571
+ in one list and proceed.
9572
+
9573
+ ### Round 1: identity
9574
+
9575
+ | Question | Options |
9576
+ | --- | --- |
9577
+ | **Purpose** | chat assistant · PR / repo automation · domain assistant over APIs/tools · scheduled reporter · Other |
9578
+ | **Name** | 2–3 slugs from the purpose + Other. Directory: `[A-Za-z0-9][A-Za-z0-9_-]*`, not `v1`/`playground`/`docs` |
9579
+ | **Location** | `./<slug>` (default) · another directory |
9580
+
9581
+ ### Round 2: surface
9582
+
9583
+ | Question | Options | Guidance |
9584
+ | --- | --- | --- |
9585
+ | **Runtime** | `local` (default) · `cloud` | Cloud needs `cloud.repos`. Approvals and sandbox seeds are local only. Recommend local unless the job needs a cloud checkout. |
9586
+ | **Model** | `grok-4.5` + `effort=high`, `fast=true` · Other id | Params, not id suffixes: `{ id: "grok-4.5", params: [{ id: "effort", value: "high" }, { id: "fast", value: "true" }] }` |
9587
+ | **Channels** (multi) | playground + HTTP (always on) · Slack · GitHub · custom webhook · schedule | Slack: `skills/setup-slack/SKILL.md`. GitHub: `skills/github/SKILL.md`. No Discord/Teams pack; offer custom webhook. |
9588
+ | **MCP** (multi) | none · remote URL · local stdio · Cursor account connectors · Other | One file under `agent/mcp-connections/`. Account file is `account.ts`, never `cursor.ts`. Named local tools need `advertiseTools: true`. Privileged servers go in `agent/host-connections/`. |
9589
+ | **Capabilities** (multi) | server tools · agent tools · skills · subagents · hooks · sandbox seeds · approvals · evals (recommend) | Always recommend one smoke eval. |
9590
+
9591
+ Close with the plan and file tree, then "Scaffold it" / "Adjust
9592
+ something". Write files only after approval.
9593
+
9594
+ ## Fill the blanks
9595
+
9596
+ | Purpose | Shape |
9597
+ | --- | --- |
9598
+ | Slack chat | `slackChannel({ envPrefix })` + suggested prompts. `agent-sdk slack create` mints the bot. Prefix: `skills/setup-slack/SKILL.md` |
9599
+ | PR review with host prep | Channel `callTool` into a trimmed workspace `pr/` tree |
9600
+ | GitHub automation | `githubChannel()` hooks, replay fixtures |
9601
+ | Domain assistant | Server tools + one MCP connection + a skill |
9602
+ | Wrap an existing pipeline | GitHub `{ task }` over a thin `agent/lib/` loop |
9603
+
9604
+ Defaults:
9605
+
9606
+ - Instructions + 1–2 tools + chosen channels + one smoke eval.
9607
+ - `local.cwd` stays outside a monorepo checkout (default: a cache
9608
+ directory under `~/.cache`) unless the agent must inherit that
9609
+ tree.
9610
+ - `agent/instructions.md`: identity, when to use which tool,
9611
+ output shape.
9612
+ - One tool per file. Prefer `execution: "server"` + zod
9613
+ `inputSchema`. Gate side effects with `needsApproval: true`.
9614
+ - Long prompts: `prompt\`…\`` / `prompt.lines\`…\`` from
9615
+ `@cursor/july`.
9616
+ - Host prep is for evidence (`callTool`, `workspaceFiles`), not
9617
+ judgment, formatting, or replies.
9618
+
9619
+ ### Deterministic-path budget
9620
+
9621
+ Default to instructions and skills. Promote to TypeScript only
9622
+ when it earns the left column:
9623
+
9624
+ | Code owns | Model owns |
9625
+ | --- | --- |
9626
+ | Side-effect gates (approve, deploy, post) | Human-facing output to a stated shape |
9627
+ | Dedupe of external writes | Summarizing, classifying, wording |
9628
+ | Auth and signature checks | What to do next from ground truth |
9629
+ | Evidence seeding | Soft-failure retries |
9630
+ | Hard API caps | Formatting under those caps |
9631
+
9632
+ Smells: prose builders in `.ts` (write `.md`); `agent/lib/` +
9633
+ `tools/` dwarfing instructions + skills on a first cut.
9634
+
9635
+ ## Scaffold
9636
+
9637
+ ```bash
9638
+ agent-sdk init ./<slug>
9639
+ ```
9640
+
9641
+ `init` writes the project, runs `npm install`, and may wait on
9642
+ `login`. Then shape it:
9643
+
9644
+ 1. `defineAgent` with the chosen model/runtime. Add
9645
+ `cloud: { repos: [...] }` for cloud.
9646
+ 2. Real `instructions.md`. Replace `echo.ts`.
9647
+ 3. Chosen `channels/`, `mcp-connections/`, `skills/`,
9648
+ `subagents/<id>/` (needs `description`), `schedules/`, `hooks/`.
9649
+ Slack: `agent-sdk slack create --dir ./<slug> --name "<Name>"`,
9650
+ not a hand-written channel. Manual Slack app:
9651
+ `agent-sdk slack init --manual` (Slack CLI, or paste at
9652
+ api.slack.com).
9653
+ 4. `evals/evals.config.ts` with `maxConcurrency: 20` (required;
9654
+ cap 200) plus `evals/**/*.eval.ts`. Assert `t.succeeded()` +
9655
+ `t.calledTool(...)`. API: `skills/evals/SKILL.md`.
9656
+
9657
+ Stay on deps the Agent SDK already ships (`zod`,
9658
+ `@modelcontextprotocol/sdk`, `tsx`).
9659
+
9660
+ ## Verify
9661
+
9662
+ ```bash
9663
+ agent-sdk validate --dir ./<slug>
9664
+ agent-sdk info --dir ./<slug> --json
9665
+ agent-sdk call <tool> --dir ./<slug> --input '{…}'
9666
+ agent-sdk eval --dir ./<slug> --list
9667
+ npx tsc --noEmit -p ./<slug>
9668
+ ```
9669
+
9670
+ tsx does not typecheck. Tool `execute` must return JSON-shaped
9671
+ values: object literals or `type` aliases, not `interface` types.
9672
+
9673
+ Model turns need `CURSOR_API_KEY`. Without one, finish the
9674
+ key-free checks, confirm `run` fails with only the API-key error,
9675
+ and hand these over:
9676
+
9677
+ ```bash
9678
+ agent-sdk run --dir ./<slug> --message "<fixture prompt>"
9679
+ agent-sdk serve --dir ./<slug> --mode single --dev
9680
+ # http://127.0.0.1:3000/playground
9681
+ agent-sdk eval --dir ./<slug>
9682
+ ```
9683
+
9684
+ Serve only this agent's directory. Session files land in the
9685
+ project state directory (`--state-root`). That is not harness cwd.
9686
+
9687
+ ## Channel setup
9688
+
9689
+ - **Slack.** `skills/setup-slack/SKILL.md`
9690
+ - **GitHub.** `skills/github/SKILL.md`
9691
+ - **Custom webhook.** `POST /v1/channels/<id>/<route>`.
9692
+ Loopback-only until you add `bearerAuth(...)`.
9693
+ - **Schedules.** Never auto-fire under `--dev`.
9694
+ `POST /v1/dev/schedules/<id>`.
9695
+
9696
+ ## Hillclimb handoff
9697
+
9698
+ Once a smoke turn passes, agree fixtures, success criteria, and a
9699
+ freeze line, then follow `skills/hillclimb/SKILL.md`. Seed from
9700
+ the smoke session under the project state directory. GitHub:
9701
+ snapshot `agent-sdk github replay ... --dry-run --out fixtures/github`.
9702
+
9703
+ Do not deploy or post to real Slack/GitHub beyond the smoke the
9704
+ user asked for. If the plan grows past ~10 files, cut scope.
9705
+ Re-check the budget at hand-off.
9706
+
9707
+ ---
9708
+
9709
+ Source: /docs/skills/debug.md
9710
+
9711
+ # Debugging the Agent SDK locally
9712
+
9713
+ Local `agent-sdk serve`. Hosted start or health failures:
9714
+ `docs/troubleshooting.md` and `docs/deployment.md`.
9715
+
9716
+ 1. **Validate.** `agent-sdk validate --dir <project>`
9717
+ 2. **Info.** `curl -s http://127.0.0.1:3000/<slug>/v1/info | jq .`
9718
+ 3. **Trace.** Session events under the project state directory.
9719
+ Then match the table.
9720
+
9721
+ | Symptom | Fix |
9722
+ | --- | --- |
9723
+ | Playground blank / "no agents" | Start `serve`. A built SPA with no backend serves nothing. |
9724
+ | Playground UI edits do not show | Open the URL `serve --dev` prints as `playground`, not `:3000`. |
9725
+ | Sessions on disk, empty playground list | List is the calling principal. `--dev` or `--allow-anonymous` shows all. Or `?sessionId=ses_...`. |
9726
+ | Built-in read/grep fail; retry loops | Bun. Rerun under Node. The tell is `NGHTTP2_FRAME_SIZE_ERROR`. |
9727
+ | `github forward` 401s; hook created | Blank `GITHUB_TOKEN`/`GH_TOKEN`. Relay uses `gh` login. |
9728
+ | `Hook already exists` | One forwarder per repo. `forward --dir <parent>`. |
9729
+ | Answers cite ancestor `AGENTS.md` | Nested checkout. Default `local.cwd` is a cache directory under `~/.cache`. |
9730
+ | Model lists IDE `cursor` tools, never MCP | `advertiseTools: true`. Check `GET /v1/info`. |
9731
+ | Port 3000 in use | `lsof -iTCP:3000 -sTCP:LISTEN` and kill that pid. |
9732
+ | Approval vanished after restart | Parked calls do not survive restart. Re-run. |
9733
+ | Schedule / reminder silent under `--dev` | Dev never auto-fires. `POST /<slug>/v1/dev/schedules/<id>`. |
9734
+ | `409` on follow-up | Stale `continuationToken`, busy session, or a task session. |
9735
+ | `409 session_busy` on `call --session` | Wait, or drop `--session`. |
9736
+ | `403` on stream | Wrong principal. Same auth as create; beyond loopback send `--bearer-token`. |
9737
+ | Works on loopback, blocked via tunnel | `localDevStrict()` rejects forwarded headers. Use `--bearer-token`. Never `--allow-anonymous` with account MCP. |
9738
+ | Slack `channel idle … missing credentials` | Expected. `slack doctor --prefix <PREFIX>`. |
9739
+ | Immediate API-key error | Model turns need `CURSOR_API_KEY`. |
9740
+ | Approvals or sandbox seeds missing | `runtime: "cloud"`. Those are local only. `validate` warns. |
9741
+ | `validate` clean, CI typecheck fails | tsx skipped types. JSON-shaped returns; `type` not `interface`. |
9742
+
9743
+ Count `action.result` by `toolName` before blaming latency.
9744
+ `turn.failed` + `"turn interrupted"` is a follow-up or stop, not a
9745
+ crash. `agent-sdk trajectory --events <file>` renders a saved
9746
+ trace.
9747
+
9748
+ ---
9749
+
9750
+ Source: /docs/skills/evals.md
9751
+
9752
+ # Agent SDK evals
9753
+
9754
+ Fixed input, model turn, gates on the trajectory. Files live at
9755
+ project-root `evals/**/*.eval.ts`. `agent/evals/` is ignored.
9756
+
9757
+ Live traffic variants: `skills/ab/SKILL.md`. That is not a test
9758
+ runner.
9759
+
9760
+ ```bash
9761
+ agent-sdk eval --dir . --list
9762
+ agent-sdk eval --dir . --json
9763
+ agent-sdk eval --dir . weather/nyc
9764
+ agent-sdk eval --dir . --tag smoke
9765
+ ```
9766
+
9767
+ | Form | Case id |
9768
+ | --- | --- |
9769
+ | `evals/weather.eval.ts` + `test` | `weather` |
9770
+ | `evals/weather/nyc.eval.ts` + `test` | `weather/nyc` |
9771
+ | `evals/weather.eval.ts` + `{ id: "nyc" }` | `weather/nyc` |
9772
+
9773
+ `eval` boots an ephemeral server and a temp state root. `--url`
9774
+ points at a running agent. Model turns need `CURSOR_API_KEY`.
9775
+
9776
+ ## Seeding
9777
+
9778
+ Creating or expanding cases: `AskQuestion` first.
9779
+
9780
+ | Question | Options |
9781
+ | --- | --- |
9782
+ | **How should we get eval samples?** | Generate test eval samples for me `(recommended)` · I will add / upload the data manually |
9783
+
9784
+ 1. **Manual.** They provide files or paste. Show the shape below.
9785
+ Do not invent cases. Then `eval --list` and wire gates.
9786
+ API-backed pointers (PR URLs, SHAs, gold labels): materialize
9787
+ under `fixtures/` first.
9788
+ 2. **Generated.** Ask count (`3` recommended). Append to an
9789
+ existing `cases` array when it fits. Never overwrite or weaken
9790
+ a datapoint. Create `evals/evals.config.ts` if missing
9791
+ (`maxConcurrency: 20`; cap 200).
9792
+
9793
+ ## API
9794
+
9795
+ ```ts
9796
+ import { defineEval, includes, satisfies } from "@cursor/july/evals";
9797
+
9798
+ export default defineEval({
9799
+ tags: ["smoke", "weather"],
9800
+ cases: [
9801
+ {
9802
+ id: "nyc",
9803
+ description: "NYC temperature.",
9804
+ async test(t) {
9805
+ await t.send("What's the temperature in NYC?");
9806
+ t.succeeded();
9807
+ t.calledTool("get_weather");
9808
+ t.notCalledTool("save_weather_note");
9809
+ t.check(t.reply, includes(/°|[FC]/));
9810
+ },
9811
+ },
9812
+ ],
9813
+ });
9814
+ ```
9815
+
9816
+ ```ts
9817
+ import { defineEvalConfig } from "@cursor/july/evals";
9818
+
9819
+ export default defineEvalConfig({
9820
+ maxConcurrency: 20,
9821
+ });
9822
+ ```
9823
+
9824
+ Either `test(t)` or `cases`, not both. `t.send` waits for park/fail.
9825
+ `workspaceFiles` seeds the first turn. Assert with `t.succeeded()`,
9826
+ `calledTool` / `notCalledTool`, `t.check(t.reply, …)`, `t.metric`.
9827
+
9828
+ ## What to gate
9829
+
9830
+ Decisions and shape, not prose.
9831
+
9832
+ 1. `t.succeeded()` first
9833
+ 2. Intended tool + the tempting wrong one
9834
+ 3. A shape regex or `satisfies` on parsed fields
9835
+ 4. If formatting keeps failing, tighten instructions. Do not move
9836
+ rendering into a host tool.
9837
+
9838
+ Anti-patterns: exact phrasing; more than ~5 gates (split); live
9839
+ drifting inputs (pin them).
9840
+
9841
+ | Surface | Fixture |
9842
+ | --- | --- |
9843
+ | Chat | One frozen prompt |
9844
+ | Tool-heavy | `agent-sdk call` first, then the prompt |
9845
+ | GitHub | `github replay … --dry-run --out fixtures/github` |
9846
+ | Host-prep PR review | A team-owned PR; gate findings shape, not counts |
9847
+ | Workspace | `workspaceFiles` in `t.send` |
9848
+
9849
+ Every kept hillclimb change lands an eval that would have failed
9850
+ before it. Never weaken a gate to pass a round.
9851
+
9852
+ ---
9853
+
9854
+ Source: /docs/skills/framework-map.md
9855
+
9856
+ # Agent SDK framework map
9857
+
9858
+ `@cursor/july` discovers files under `agent/` and serves the agent
9859
+ over HTTP, Slack, and GitHub. Markdown is prose. TypeScript is typed
9860
+ behavior. Ground truth: package `README.md` and `AGENTS.md`.
9861
+
9862
+ CLI is `agent-sdk` (Node, never Bun).
9863
+
9864
+ Public docs: `node_modules/@cursor/july/dist/docs/llms.txt` or
9865
+ `/docs/llms.txt` on a running host.
9866
+
9867
+ ## Invariants
9868
+
9869
+ 1. **Node 22.13+, never Bun.** Bun corrupts harness tool-result
9870
+ streams (`NGHTTP2_FRAME_SIZE_ERROR`).
9871
+ 2. **Evals live at project-root `evals/`.** `agent/evals/` is ignored.
9872
+ 3. **tsx does not typecheck.** Tool `execute` must return JSON-shaped
9873
+ values: object literals or `type` aliases, not `interface` types.
9874
+ 4. **Nested git checkouts.** Discovery sets `local.cwd` to a
9875
+ per-project cache directory under `~/.cache`. Point cwd at a
9876
+ checkout only when the agent must inherit that tree.
9877
+ 5. **Attached MCP is nameless** until `advertiseTools: true`.
9878
+ 6. **Model turns need `CURSOR_API_KEY`.** `validate`, `info`, `call`,
9879
+ and `serve` bring-up do not.
9880
+
9881
+ ## Folder structure
9882
+
9883
+ Path is identity. Full list: README "Folder structure".
9884
+
9885
+ | Path | Role |
9886
+ | --- | --- |
9887
+ | `agent/agent.ts` | `defineAgent({ model?, runtime?, cloud?, local? })` |
9888
+ | `agent/instructions.md` | Always-on system prompt (required) |
9889
+ | `agent/tools/<name>.ts` | One tool. `execution: "server"` or `"agent"` |
9890
+ | `agent/skills/*` | On-demand procedures |
9891
+ | `agent/mcp-connections/<name>.ts` | MCP. Never name an account file `cursor.ts`. `advertiseTools: true` for named local tools |
9892
+ | `agent/host-connections/<name>.ts` | Privileged MCP for `ctx.host.mcp` / `mcp oauth` |
9893
+ | `agent/subagents/<id>/` | Child agent (`description` required) |
9894
+ | `agent/channels/*.ts` | Slack / GitHub / custom HTTP |
9895
+ | `agent/hooks/*.ts` | Observe-only |
9896
+ | `agent/ab.ts` or `agent/ab/*.ts` | Live A/B (`defineAB`) |
9897
+ | `agent/otel.ts` | OpenTelemetry (`defineOtel`) |
9898
+ | `agent/schedules/*` | Cron. Never auto-fire under `--dev` |
9899
+ | `agent/sandbox/workspace/` | Session seed files (local only) |
9900
+ | `agent/lib/` | Import-only. Never discovered |
9901
+ | `evals/**/*.eval.ts` | Case id is the path under `evals/` |
9902
+
9903
+ ## Local vs cloud
9904
+
9905
+ `runtime: "local"` (default) runs on the serve host.
9906
+ `runtime: "cloud"` needs `cloud: { repos: [...] }`.
9907
+
9908
+ | Capability | local | cloud |
9909
+ | --- | --- | --- |
9910
+ | Server tools | yes | yes on managed hosting; self-hosted needs `--public-url` |
9911
+ | Tool approvals | yes | no |
9912
+ | Agent tools / skills | yes | yes |
9913
+ | sandbox seeds | yes | no |
9914
+ | Checkout | you arrange it | the VM carries it |
9915
+
9916
+ Use cloud when the job needs a checkout at scale. `validate` warns
9917
+ when cloud is combined with local-only capabilities.
9918
+
9919
+ ## Sessions
9920
+
9921
+ - **continuationToken** continues a conversation. HTTP follow-ups
9922
+ rotate it. Stale tokens return `409`.
9923
+ - **sessionId** is the inspect handle
9924
+ (`GET /v1/session/:id/stream?startIndex=N`).
9925
+
9926
+ A follow-up to a busy HTTP/MCP session interrupts the in-flight
9927
+ turn. Slack coalesces. Routes: `docs/reference/http-api.md`.
9928
+ Session files live under the project state directory
9929
+ (`--state-root`).
9930
+
9931
+ ## Where logic belongs
9932
+
9933
+ Code: side-effect gates, write dedupe, auth, evidence seeding, hard
9934
+ API caps. Model: formatting, summarizing, classification, replies.
9935
+ Budget: `skills/create-agent/SKILL.md`.
9936
+
9937
+ Loop: `validate` / `info` / `call` / `run` / `eval` / `serve`. Serve
9938
+ only this agent's directory.
9939
+
9940
+ | Task | Skill |
9941
+ | --- | --- |
9942
+ | Scaffold | `skills/create-agent/SKILL.md` |
9943
+ | Evals | `skills/evals/SKILL.md` |
9944
+ | Live A/B | `skills/ab/SKILL.md` |
9945
+ | OpenTelemetry | `skills/otel/SKILL.md` |
9946
+ | GitHub | `skills/github/SKILL.md` |
9947
+ | Slack | `skills/setup-slack/SKILL.md` |
9948
+ | Host MCP OAuth | `skills/mcp-auth/SKILL.md` |
9949
+ | Local triage | `skills/debug/SKILL.md` |
9950
+ | Measured improvement | `skills/hillclimb/SKILL.md` |
9951
+
9952
+ ---
9953
+
9954
+ Source: /docs/skills/github.md
9955
+
9956
+ # GitHub channels in the Agent SDK
9957
+
9958
+ Author `agent/channels/github.ts`. Production wakes:
9959
+ `cursorAccount` + `serve --cursor-events`. No public webhook URL.
9960
+ Use the HTTP route for fixtures, replay, and hosts that already
9961
+ terminate GitHub webhooks.
9962
+
9963
+ Guide: `docs/guides/github.md`.
9964
+
9965
+ ```ts
9966
+ import { defaultGitHubAuth, githubChannel } from "@cursor/july/channels/github";
9967
+
9968
+ export default githubChannel({
9969
+ botName: "my-agent",
9970
+ cursorAccount: { repos: ["owner/repo"] }, // permissions?: "read" | "pr-write" | "contents-write"
9971
+
9972
+ onPullRequest: (ctx, pr) =>
9973
+ pr.action === "opened" ? { auth: defaultGitHubAuth(ctx) } : null,
9974
+ onCheckSuite: (ctx, suite) =>
9975
+ suite.conclusion === "failure" ? { task: () => triage(ctx) } : null,
9976
+ });
9977
+ ```
9978
+
9979
+ Hooks: `onPullRequest`, `onComment`, `onIssue`, `onCheckSuite`,
9980
+ `onCheckRun`, `onWorkflowRun`, `onStatus`, plus `onEvent` and
9981
+ `onStart`/`onStop`.
9982
+
9983
+ | Return | Meaning |
9984
+ | --- | --- |
9985
+ | `{ auth }` | Model turn. Session shows in the playground. `workspaceFiles` can be a function. |
9986
+ | `{ task }` | Host work. No chat session. Use when the work can outlive a webhook timeout. |
9987
+ | `null` | Skip |
9988
+
9989
+ To keep repo scope in deploy config, use `cursorAccount: true`
9990
+ and pass `--repo owner/name` at serve / `--cursor-events-repo`
9991
+ at deploy. Repos must share one GitHub owner.
9992
+
9993
+ ## Event sources
9994
+
9995
+ | Source | When |
9996
+ | --- | --- |
9997
+ | `cursorAccount` + `serve --cursor-events` | Preferred. Signed-in host (`agent-sdk login` / `CURSOR_API_KEY`). Repos from the channel and from repeatable `--repo owner/name`. Cap 20, one GitHub owner |
9998
+ | HTTP `POST /<slug>/v1/channels/github` with a webhook secret | `allowAll()` + `X-Hub-Signature-256` |
9999
+ | HTTP, no secret | Loopback only. `serve --dev` also admits unsigned loopback (fixtures / forward) |
10000
+
10001
+ `permissions`: `"read"` inspect; `"pr-write"` (default) comments /
10002
+ PR writes; `"contents-write"` push or merge-box checks.
10003
+ `progress.commitStatus` needs check-write; see the GitHub guide.
10004
+ Set `checks: true` when channel code posts its own Checks API
10005
+ runs through `ctx.github.createCheck`. The flag grants access.
10006
+ It does not post a check.
10007
+
10008
+ Without `cursorAccount`, outbound calls prefer App installation
10009
+ tokens (`GITHUB_APP_ID` + `GITHUB_APP_PRIVATE_KEY`). Local tests
10010
+ can use `GITHUB_TOKEN` / `gh auth login`.
10011
+
10012
+ The Cursor stream is metadata, not full webhook bodies. Re-read
10013
+ the PR from GitHub.
10014
+
10015
+ ## Test locally
10016
+
10017
+ 1. **Fixtures** (offline, `--dev`, no signature):
10018
+
10019
+ ```bash
10020
+ curl -s -X POST http://127.0.0.1:3000/<slug>/v1/channels/github \
10021
+ -H 'content-type: application/json' \
10022
+ -H 'x-github-event: pull_request' \
10023
+ -d @fixtures/github/pull_request.synchronize.json
10024
+ ```
10025
+
10026
+ 2. **Replay** (hillclimb tier; pull access is enough):
10027
+
10028
+ ```bash
10029
+ agent-sdk github replay owner/repo#123 --dir <project>
10030
+ agent-sdk github replay owner/repo#123 --dir <project> --events '*' --dry-run --out fixtures/github
10031
+ ```
10032
+
10033
+ 3. **Forward** (live; repo admin). One forwarder per repo. Blank
10034
+ `GITHUB_TOKEN`/`GH_TOKEN` or every delivery 401s:
10035
+
10036
+ ```bash
10037
+ agent-sdk github doctor --install
10038
+ GITHUB_TOKEN= GH_TOKEN= agent-sdk github forward --dir <project>
10039
+ ```
10040
+
10041
+ 4. **Cursor pull** (same as production):
10042
+
10043
+ ```bash
10044
+ agent-sdk serve --dir <project> --cursor-events --repo owner/repo
10045
+ ```
10046
+
10047
+ Volume, debounce, and `progress.commitStatus` / `progress.banner`
10048
+ live in `docs/guides/github.md`. Do not preinstall them.
10049
+
10050
+ ---
10051
+
10052
+ Source: /docs/skills/hillclimb.md
10053
+
10054
+ # Agent SDK hillclimb
10055
+
10056
+ Measure → change one lever → remeasure. One failure mode per round.
10057
+
10058
+ Siblings: `skills/evals/SKILL.md`, `skills/github/SKILL.md`,
10059
+ `skills/debug/SKILL.md`.
10060
+
10061
+ ## Preconditions
10062
+
10063
+ From the user or the invoking message:
10064
+
10065
+ 1. **Target.** Path or slug
10066
+ 2. **Fixtures.** Fixed inputs
10067
+ 3. **Success.** What better means this round
10068
+ 4. **Freeze line.** What must not change
10069
+
10070
+ Ask before editing if any are missing. A moving fixture is noise.
10071
+
10072
+ | Surface | Pin it |
10073
+ | --- | --- |
10074
+ | GitHub | `agent-sdk github replay <pr> --dir <project>` (`--dry-run --out fixtures/github`) |
10075
+ | One tool | `agent-sdk call <tool> --dir <project> --input '{...}'` |
10076
+ | Chat | `agent-sdk run --dir <project> --message "<fixture>"` |
10077
+
10078
+ ## Loop
10079
+
10080
+ 1. **Serve.** `agent-sdk serve --dir <project> --mode single --dev`
10081
+ Playground: `http://127.0.0.1:3000/playground`.
10082
+ 2. **Hit it.** Same path a user would. Record status, wall time,
10083
+ `sessionId`, output, and `action.result` counts by `toolName`.
10084
+ 3. **Name the failure.** Score correctness, efficiency, harness
10085
+ fit. One dominant failure this round.
10086
+ 4. **Change one lever.** Smallest first. Delete the code or prompt
10087
+ that caused it. Then instructions / skills, evidence shape,
10088
+ host prep (`workspaceFiles`, channel `callTool`) for wandering
10089
+ and latency (not formatting or judgment), remove or gate
10090
+ wandering tools, framework only if the agent cannot express
10091
+ the fix. Hypothesis: *If we X, metric Y should move because Z.*
10092
+ 5. **Remeasure.** Same fixtures. Keep only if the target metric
10093
+ improves and the freeze line holds.
10094
+ 6. **Lock.** A kept change gets an eval that would have failed
10095
+ before it (`skills/evals/SKILL.md`). Never weaken a gate to
10096
+ pass a round.
10097
+
10098
+ ```markdown
10099
+ ### Hillclimb round N. `<slug>`
10100
+ - Fixture(s): …
10101
+ - Hypothesis: …
10102
+ - Change: …
10103
+ - Before → after: tools …; wall …; quality …
10104
+ - Verdict: keep | revert | narrow
10105
+ - Next failure mode:
10106
+ ```
10107
+
10108
+ Do not deploy or post real GitHub reviews unless asked.
10109
+
10110
+ ---
10111
+
10112
+ Source: /docs/skills/index.md
10113
+
10114
+ # Coding-agent skills
10115
+
10116
+ Each skill is a procedure a coding agent can follow. Installing
10117
+ `@cursor/july` copies them into `~/.cursor/skills/agentsdk/`. This site
10118
+ publishes the same files.
10119
+
10120
+ See [Building agents with agents](/docs/building-with-agents.md) for when
10121
+ to use each one.
10122
+
10123
+ | Skill | Use it to |
10124
+ | --- | --- |
10125
+ | [framework-map](/docs/skills/framework-map.md) | Learn the project layout and runtimes |
10126
+ | [create-agent](/docs/skills/create-agent.md) | Scaffold and verify a new agent |
10127
+ | [evals](/docs/skills/evals.md) | Write fixtures and regression checks |
10128
+ | [ab](/docs/skills/ab.md) | Compare variants on live traffic |
10129
+ | [otel](/docs/skills/otel.md) | Export OpenTelemetry traces |
10130
+ | [hillclimb](/docs/skills/hillclimb.md) | Improve an agent against fixed inputs |
10131
+ | [github](/docs/skills/github.md) | Add GitHub webhooks and replay events |
10132
+ | [setup-slack](/docs/skills/setup-slack.md) | Connect an agent to Slack |
10133
+ | [mcp-auth](/docs/skills/mcp-auth.md) | Authorize host MCP OAuth |
10134
+ | [debug](/docs/skills/debug.md) | Diagnose a local run |
10135
+
10136
+ ---
10137
+
10138
+ Source: /docs/skills/mcp-auth.md
10139
+
10140
+ # Host MCP OAuth
10141
+
10142
+ Guide: `docs/guides/mcp-oauth.md`.
10143
+
10144
+ | Need | Use |
10145
+ | --- | --- |
10146
+ | Connector already in the Cursor dashboard | `defineConnection({ cursorAccount: true })` or `servers: "*"` / `servers: […]` |
10147
+ | Remote URL that speaks OAuth; host holds tokens | `defineConnection({ url, oauth: true })` + this skill |
10148
+ | Static bearer / API key | `headers` / env on `{ url }` |
10149
+
10150
+ `advertiseTools: true` puts named tools on local turns. Host tools
10151
+ can still call `ctx.host.mcp`.
10152
+
10153
+ ## Checklist
10154
+
10155
+ 1. **Declare the connection.** `agent/mcp-connections/<name>.ts`
10156
+ with `url` + `oauth: true`. Use `agent/host-connections/` when
10157
+ the model must not see it.
10158
+ 2. **Name the secrets** if you will `--store`:
10159
+ `hosting.secretNames` lists
10160
+ `MCP_OAUTH_<NAME>_{ACCESS_TOKEN,REFRESH_TOKEN,CLIENT_ID}`.
10161
+ 3. **Allow egress** on hosted non-bootstrap hosts:
10162
+ `hosting.egressDomains`.
10163
+ 4. **Authorize.** Local: `agent-sdk mcp oauth <name>`. Hosted:
10164
+ finish Connect so the current process can retry, then
10165
+ `agent-sdk mcp oauth <name> --store` and `agent-sdk deploy` so
10166
+ the next pod gets `MCP_OAUTH_*`. `secrets list` shows the names.
10167
+ Secrets are deployment-wide, not per caller. `cursorAccount: true`
10168
+ stays on the Cursor backend.
10169
+
10170
+ ```ts
10171
+ // agent/mcp-connections/inventory.ts
10172
+ export default defineConnection({
10173
+ url: "https://mcp.example.com/inventory",
10174
+ oauth: true,
10175
+ });
10176
+ ```
10177
+
10178
+ ```ts
10179
+ // agent/agent.ts
10180
+ export default defineAgent({
10181
+ hosting: {
10182
+ secretNames: [
10183
+ "MCP_OAUTH_INVENTORY_ACCESS_TOKEN",
10184
+ "MCP_OAUTH_INVENTORY_REFRESH_TOKEN",
10185
+ "MCP_OAUTH_INVENTORY_CLIENT_ID",
10186
+ ],
10187
+ egressDomains: ["mcp.example.com"],
10188
+ },
10189
+ });
10190
+ ```
10191
+
10192
+ File `inventory.ts` → prefix `MCP_OAUTH_INVENTORY`. Do not put
10193
+ `CURSOR_*` names in `secretNames`.
10194
+
10195
+ ```bash
10196
+ agent-sdk mcp oauth <connection>
10197
+ agent-sdk mcp oauth <connection> --store [--slug <slug>]
10198
+ agent-sdk secrets list <slug>
10199
+ agent-sdk deploy
10200
+ ```
10201
+
10202
+ Browser callback: `http://127.0.0.1:8787/callback`. Tokens live in
10203
+ the CLI config directory (`mcp-auth.json` or
10204
+ `$AGENT_SERVE_CONFIG_DIR`). URL change drops the old entry; re-run.
10205
+ `--store` does not restart a running engine.
10206
+
10207
+ | Symptom | Fix |
10208
+ | --- | --- |
10209
+ | `must be defineConnection({ url, oauth: true })` | Wrong name or missing `oauth: true` |
10210
+ | `Unknown MCP connection` | Filename must match the CLI arg |
10211
+ | Callback hang | Free port 8787; finish the browser flow here |
10212
+ | Hosted 401 | `secrets list`; Connect or `--store`; redeploy |
10213
+ | Model invents `mcp_auth` / IDE MCP | `advertiseTools: true` on local turns |
10214
+
10215
+ No raw tokens in git.
10216
+
10217
+ ---
10218
+
10219
+ Source: /docs/skills/otel.md
10220
+
10221
+ # Agent SDK OpenTelemetry (`defineOtel`)
10222
+
10223
+ Push traces and metrics from the serve process to an OTLP
10224
+ collector. Logs are off until you opt in.
10225
+
10226
+ Guide: `docs/guides/opentelemetry.md`.
10227
+
10228
+ ## Enable
10229
+
10230
+ Any one of:
10231
+
10232
+ 1. `OTEL_EXPORTER_OTLP_ENDPOINT` (optional
10233
+ `OTEL_SERVICE_NAME`, `OTEL_EXPORTER_OTLP_HEADERS`,
10234
+ `OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf|http/json`)
10235
+ 2. `agent/otel.ts`:
10236
+
10237
+ ```ts
10238
+ import { defineOtel } from "@cursor/july/otel";
10239
+
10240
+ export default defineOtel({
10241
+ serviceName: "cursor",
10242
+ exporters: [{ url: "https://otel.example.com", protocol: "http/protobuf" }],
10243
+ });
10244
+ ```
10245
+
10246
+ 3. `serve(dir, { otel: { … } })`. `otel: false` disables env and
10247
+ authored config.
10248
+
10249
+ | Signal | Default |
10250
+ | --- | --- |
10251
+ | Traces | on (`agent_sdk.http` → session → turn → tool / subagent) |
10252
+ | Metrics | on (`cursor.token.usage`, `cursor.tool.calls`, `cursor.cost.usage`) |
10253
+ | Logs | off (`logs: true` or `OTEL_LOGS_EXPORTER=otlp`) |
10254
+
10255
+ Prompt text and tool payloads stay off the wire unless you set
10256
+ `OTEL_LOG_USER_PROMPTS` / `OTEL_LOG_TOOL_CONTENT`.
10257
+
10258
+ ## Custom metrics
10259
+
10260
+ ```ts
10261
+ ctx.host.otel.setAttributes({ "abc.ticket_id": "INC-123" });
10262
+ ctx.host.otel.increment("abc.ticket.resolved");
10263
+ ctx.host.otel.record("abc.approval.duration_ms", 1420);
10264
+ ```
10265
+
10266
+ Prefix names with team or agent. No custom spans. Join on
10267
+ `cursor.conversation.id` and `agent_sdk.agent`. Run `serve` as its
10268
+ own process when Agent SDK should own the destination.
10269
+
10270
+ ---
10271
+
10272
+ Source: /docs/skills/setup-slack.md
10273
+
10274
+ # Setup Slack for the Agent SDK
10275
+
10276
+ Dedicated Socket Mode bot. `agent-sdk slack create` opens the
10277
+ signed-in dashboard wizard. Tokens land in `.env.local` and as
10278
+ deployment secrets. Never print token values.
10279
+
10280
+ Do not generate manifests or ask anyone to paste tokens unless
10281
+ they asked for `slack init --manual`.
10282
+
10283
+ Existing `<PREFIX>_SLACK_BOT_TOKEN` + `_SLACK_APP_TOKEN` in
10284
+ `.env.local` keep working. Do not force those onto the wizard.
10285
+
10286
+ Guide: `docs/guides/slack.md`.
10287
+
10288
+ ## 1. Wizard (default)
10289
+
10290
+ ```bash
10291
+ agent-sdk login
10292
+ agent-sdk slack create --dir .
10293
+ ```
10294
+
10295
+ Same Cursor account in the browser. **Add Slack to this agent**,
10296
+ approve Slack, pick the bot name. CLI writes
10297
+ `<PREFIX>_SLACK_BOT_TOKEN` / `<PREFIX>_SLACK_APP_TOKEN` and runs
10298
+ `doctor`.
10299
+
10300
+ Prefix is the directory basename in upper snake (`jenny` →
10301
+ `JENNY`, `pr-approver` → `PR_APPROVER` → `PR_APPROVER_SLACK_*`).
10302
+ `--prefix` / `--no-prefix` override. Dev and prod are separate
10303
+ apps; `--prod` is the prod app. `--name` / `--icon` /
10304
+ `--channel-posts` / `--slack-team` prefill the wizard.
10305
+
10306
+ If Slack needs workspace-admin approval, keep the CLI running.
10307
+ Open the **Request approval** link it prints. Managed install
10308
+ does not file the request. After approval, **Retry** in the
10309
+ wizard.
10310
+
10311
+ `create` scaffolds `agent/channels/slack.ts` when missing:
10312
+
10313
+ ```ts
10314
+ export default slackChannel({
10315
+ envPrefix: "JENNY",
10316
+ suggestedPrompts: [{ title: "Help", message: "How can you help me?" }],
10317
+ });
10318
+ ```
10319
+
10320
+ Return from dispatch handlers. Do not await long work in the
10321
+ handler.
10322
+
10323
+ A second `slack create` for the same agent and env overwrites the
10324
+ app (same Slack app id, new manifest and tokens).
10325
+ `agent-sdk slack destroy` deletes it.
10326
+
10327
+ Local serve does not need a hosted engine. Next
10328
+ `agent-sdk deploy` injects the stored secrets.
10329
+
10330
+ ## 2. Manual (`slack init --manual`)
10331
+
10332
+ Only when they own the app. Preferred: Slack CLI
10333
+ (`~/.slack/bin/slack`). Paste at api.slack.com if the CLI is
10334
+ missing. Never `slack deploy`; Agent SDK serve owns Socket Mode.
10335
+
10336
+ ```bash
10337
+ agent-sdk slack init --manual --dir . --name "My Agent"
10338
+ # --slack-team T0123ABCD when several workspaces are logged in
10339
+ # --no-install to scaffold only
10340
+ ```
10341
+
10342
+ Writes `agent/channels/slack.ts` (`envPrefix` from the directory),
10343
+ manifests, a `.slack/` project (`get-manifest` → those JSON files),
10344
+ and `env.example`. `--channel-posts` subscribes `message.channels`
10345
+ / `message.groups`. If Slack CLI is logged in, this installs the
10346
+ app. `--install` fails when that cannot run.
10347
+
10348
+ Human gates, one at a time. Stop after each.
10349
+
10350
+ 1. **Install the app.** If `next` starts with "Ask the user to
10351
+ install this Slack app", stop and prompt them. Slack CLI: they
10352
+ run `slack login --no-prompt`, send `/slackauthticket <ticket>`,
10353
+ then `slack login --ticket <ticket> --challenge <code>`, then
10354
+ `slack app install --environment local --team <T> --force`.
10355
+ Prod: `SLACK_ENV=deployed slack app install --environment
10356
+ deployed --team <T> --force`. Fallback: Create New App → From a
10357
+ manifest, start with `.slack/manifest.dev.json`.
10358
+ 2. **Tokens.** Slack CLI leaves xoxb / xapp in that process only.
10359
+ Copy the bot token from the app's OAuth page. Mint an app-level
10360
+ token with `connections:write`. Put both in `.env.local` using
10361
+ `env.example` names. If Slack CLI wrote `SLACK_*` to `.env`,
10362
+ copy those values to the prefixed keys.
10363
+ 3. **Doctor.**
10364
+
10365
+ ## 3. Doctor and smoke
10366
+
10367
+ ```bash
10368
+ agent-sdk slack doctor --prefix JENNY
10369
+ agent-sdk serve --dir . --dev
10370
+ ```
10371
+
10372
+ Green: `app_token`, `connections_open`, `bot_token`, `auth_test`.
10373
+ Log: `[agent-sdk/slack] Socket Mode connected`. Missing tokens
10374
+ idle the channel; `serve` continues.
10375
+
10376
+ 1. Invite the bot
10377
+ 2. `@mention` or DM
10378
+ 3. Thinking / Working, then a threaded reply
10379
+ 4. Logs: `inbound kind=app_mention`, `session start`,
10380
+ `reply delivered via postMessage|stream`
10381
+
10382
+ ## Watch channels (opt-in)
10383
+
10384
+ Default is mentions + DMs only. To wake on new posts:
10385
+
10386
+ ```ts
10387
+ export default slackChannel({
10388
+ envPrefix: "JENNY",
10389
+ engagement: {
10390
+ channelPosts: {
10391
+ allow: ["#alerts"], // ["*"] for every joined channel
10392
+ posts: "top-level",
10393
+ },
10394
+ },
10395
+ onChannelPost: async (ctx, message) => ({}), // null = skip
10396
+ });
10397
+ ```
10398
+
10399
+ Pass `--channel-posts` on `create` / `init --manual`. Invite the
10400
+ bot to each watched channel. Mentions stay on `app_mention`; a
10401
+ later mention continues the watch thread.
10402
+
10403
+ ## Approvals (opt-in)
10404
+
10405
+ ```ts
10406
+ export default slackChannel({
10407
+ envPrefix: "JENNY",
10408
+ toolApprovals: true,
10409
+ });
10410
+ ```
10411
+
10412
+ Wizard enables interactivity when this is set. Server tools on
10413
+ `local` only. Parked calls die on host restart. Cards truncate
10414
+ args; execution uses the full input.
10415
+
10416
+ ---
10417
+
9376
10418
  Source: /docs/storage.md
9377
10419
 
9378
10420
  # Storage
@@ -10399,7 +11441,7 @@ not on `PATH`, use `npx @cursor/july`.
10399
11441
  | Model asks for `mcp_auth` or IDE MCP for a connector it already has | Attached MCP is behind meta-tools. Set `advertiseTools: true` for named tools on local turns, or call it from a host tool via `ctx.host.mcp`. |
10400
11442
 
10401
11443
  See [Host MCP OAuth](/docs/guides/mcp-oauth.md) and
10402
- [`skills/mcp-auth/SKILL.md`](https://github.com/cursor/cursor/blob/main/packages/agent-serve/skills/mcp-auth/SKILL.md).
11444
+ [`skills/mcp-auth/SKILL.md`](/docs/skills/mcp-auth.md).
10403
11445
 
10404
11446
  ## What if a secret showed up in a terminal transcript?
10405
11447