@cursor/july 0.1.100 → 0.1.102

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 (484) hide show
  1. package/README.md +27 -0
  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/origin/defaults.d.ts +43 -0
  9. package/dist/channels/origin/defaults.d.ts.map +1 -0
  10. package/dist/channels/origin/defaults.js +111 -0
  11. package/dist/channels/origin/index.d.ts +2 -0
  12. package/dist/channels/origin/index.d.ts.map +1 -1
  13. package/dist/channels/origin/index.js +2 -0
  14. package/dist/channels/origin/origin-channel.d.ts +2 -1
  15. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  16. package/dist/channels/origin/origin-channel.js +24 -3
  17. package/dist/channels/origin/state.d.ts +32 -0
  18. package/dist/channels/origin/state.d.ts.map +1 -0
  19. package/dist/channels/origin/state.js +23 -0
  20. package/dist/channels/origin/types.d.ts +23 -1
  21. package/dist/channels/origin/types.d.ts.map +1 -1
  22. package/dist/channels/slack/api.d.ts +1 -1
  23. package/dist/channels/slack/api.d.ts.map +1 -1
  24. package/dist/channels/slack/api.js +5 -2
  25. package/dist/channels/slack/assistant.d.ts +1 -1
  26. package/dist/channels/slack/assistant.d.ts.map +1 -1
  27. package/dist/channels/slack/code-fences.d.ts +17 -0
  28. package/dist/channels/slack/code-fences.d.ts.map +1 -0
  29. package/dist/channels/slack/code-fences.js +168 -0
  30. package/dist/channels/slack/dispatch.d.ts +3 -2
  31. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  32. package/dist/channels/slack/dispatch.js +28 -8
  33. package/dist/channels/slack/inbound.d.ts +8 -0
  34. package/dist/channels/slack/inbound.d.ts.map +1 -1
  35. package/dist/channels/slack/inbound.js +28 -0
  36. package/dist/channels/slack/index.d.ts +1 -0
  37. package/dist/channels/slack/index.d.ts.map +1 -1
  38. package/dist/channels/slack/index.js +1 -0
  39. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  40. package/dist/channels/slack/live-delivery.js +11 -4
  41. package/dist/channels/slack/manifest.d.ts.map +1 -1
  42. package/dist/channels/slack/manifest.js +2 -1
  43. package/dist/connections.d.ts +18 -2
  44. package/dist/connections.d.ts.map +1 -1
  45. package/dist/connections.js +18 -2
  46. package/dist/docs/404.html +2 -2
  47. package/dist/docs/ab.html +4 -4
  48. package/dist/docs/assets/{app.DZ1e0Ycq.js → app.CLA03RCz.js} +1 -1
  49. package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +1 -0
  50. package/dist/docs/assets/chunks/{VPLocalSearchBox.l8omwc6D.js → VPLocalSearchBox.ifxv-cJV.js} +1 -1
  51. package/dist/docs/assets/chunks/{theme.JVcD6gel.js → theme.DWCwM6p-.js} +2 -2
  52. package/dist/docs/assets/concepts.md.rPzW2HZN.js +1 -0
  53. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.js +9 -0
  54. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.lean.js +1 -0
  55. package/dist/docs/assets/{guides_cloud-runtime.md.CkYbjnAX.js → guides_cloud-runtime.md.BRirbRAN.js} +1 -1
  56. package/dist/docs/assets/index.md.Kiht7ell.js +5 -0
  57. package/dist/docs/assets/{index.md.Bb4k8kUm.lean.js → index.md.Kiht7ell.lean.js} +1 -1
  58. package/dist/docs/assets/{reference_connections.md.BiGoBAk2.js → reference_connections.md.Di6jJAXF.js} +12 -2
  59. package/dist/docs/assets/{reference_connections.md.BiGoBAk2.lean.js → reference_connections.md.Di6jJAXF.lean.js} +1 -1
  60. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.js +56 -0
  61. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +1 -0
  62. package/dist/docs/assets/{reference_http-api.md.BEJx9XVj.js → reference_http-api.md.oySXBO8o.js} +1 -1
  63. package/dist/docs/assets/{reference_project-layout.md.Bv4KOtlB.js → reference_project-layout.md.CA6QP6Lw.js} +2 -2
  64. package/dist/docs/assets/{reference_project-layout.md.Bv4KOtlB.lean.js → reference_project-layout.md.CA6QP6Lw.lean.js} +1 -1
  65. package/dist/docs/assets/{reference_skills.md.BFW9retM.js → reference_skills.md.l2ezAcaN.js} +1 -1
  66. package/dist/docs/assets/{reference_tools.md.CvAHsdSp.js → reference_tools.md.B1up2r9W.js} +1 -1
  67. package/dist/docs/assets/skills_framework-map.md.DDa4MeEW.js +1 -0
  68. package/dist/docs/assets/{skills_framework-map.md.BTi817yv.lean.js → skills_framework-map.md.DDa4MeEW.lean.js} +1 -1
  69. package/dist/docs/building-with-agents.html +4 -4
  70. package/dist/docs/concepts.html +5 -5
  71. package/dist/docs/concepts.md +3 -3
  72. package/dist/docs/deployment.html +4 -4
  73. package/dist/docs/evals.html +4 -4
  74. package/dist/docs/guides/agent-to-agent.html +4 -4
  75. package/dist/docs/guides/cloud-agents.html +35 -0
  76. package/dist/docs/guides/cloud-agents.md +93 -0
  77. package/dist/docs/guides/cloud-runtime.html +6 -6
  78. package/dist/docs/guides/cloud-runtime.md +2 -0
  79. package/dist/docs/guides/convert-automation.html +4 -4
  80. package/dist/docs/guides/github.html +4 -4
  81. package/dist/docs/guides/human-in-the-loop.html +4 -4
  82. package/dist/docs/guides/mcp-oauth.html +4 -4
  83. package/dist/docs/guides/opentelemetry.html +5 -5
  84. package/dist/docs/guides/slack.html +4 -4
  85. package/dist/docs/guides/webhooks.html +4 -4
  86. package/dist/docs/hashmap.json +1 -1
  87. package/dist/docs/hillclimbing.html +4 -4
  88. package/dist/docs/index.html +6 -6
  89. package/dist/docs/index.md +5 -1
  90. package/dist/docs/llms-full.txt +353 -5
  91. package/dist/docs/llms.txt +2 -0
  92. package/dist/docs/quickstart.html +4 -4
  93. package/dist/docs/reference/agent-config.html +4 -4
  94. package/dist/docs/reference/artifacts.html +4 -4
  95. package/dist/docs/reference/channels.html +5 -5
  96. package/dist/docs/reference/cli.html +4 -4
  97. package/dist/docs/reference/connections.html +16 -6
  98. package/dist/docs/reference/connections.md +31 -0
  99. package/dist/docs/reference/extensions.html +82 -0
  100. package/dist/docs/reference/extensions.md +200 -0
  101. package/dist/docs/reference/hooks.html +4 -4
  102. package/dist/docs/reference/http-api.html +6 -6
  103. package/dist/docs/reference/http-api.md +1 -1
  104. package/dist/docs/reference/instructions.html +4 -4
  105. package/dist/docs/reference/playground.html +4 -4
  106. package/dist/docs/reference/project-layout.html +6 -6
  107. package/dist/docs/reference/project-layout.md +3 -0
  108. package/dist/docs/reference/prompt.html +4 -4
  109. package/dist/docs/reference/schedules.html +4 -4
  110. package/dist/docs/reference/sessions.html +4 -4
  111. package/dist/docs/reference/skills.html +6 -6
  112. package/dist/docs/reference/skills.md +2 -0
  113. package/dist/docs/reference/subagents.html +5 -5
  114. package/dist/docs/reference/tools.html +6 -6
  115. package/dist/docs/reference/tools.md +2 -0
  116. package/dist/docs/scaffolding-agents.html +4 -4
  117. package/dist/docs/skills/ab.html +4 -4
  118. package/dist/docs/skills/create-agent.html +4 -4
  119. package/dist/docs/skills/debug.html +4 -4
  120. package/dist/docs/skills/evals.html +4 -4
  121. package/dist/docs/skills/framework-map.html +5 -5
  122. package/dist/docs/skills/framework-map.md +1 -0
  123. package/dist/docs/skills/github.html +4 -4
  124. package/dist/docs/skills/hillclimb.html +4 -4
  125. package/dist/docs/skills/index.html +4 -4
  126. package/dist/docs/skills/mcp-auth.html +4 -4
  127. package/dist/docs/skills/otel.html +4 -4
  128. package/dist/docs/skills/setup-slack.html +4 -4
  129. package/dist/docs/storage.html +4 -4
  130. package/dist/docs/templates/agentic-owners.html +4 -4
  131. package/dist/docs/templates/agents-md.html +4 -4
  132. package/dist/docs/templates/code-wiki.html +4 -4
  133. package/dist/docs/templates/demo.html +4 -4
  134. package/dist/docs/templates/pr-autofixer.html +4 -4
  135. package/dist/docs/templates/security-help.html +4 -4
  136. package/dist/docs/templates/security-reviewer.html +4 -4
  137. package/dist/docs/templates/triage.html +4 -4
  138. package/dist/docs/troubleshooting.html +4 -4
  139. package/dist/extensions/cursor-cloud-agents/extension.d.ts +57 -0
  140. package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -0
  141. package/dist/extensions/cursor-cloud-agents/extension.js +66 -0
  142. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +78 -0
  143. package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -0
  144. package/dist/extensions/cursor-cloud-agents/lib/backend.js +286 -0
  145. package/dist/extensions/cursor-cloud-agents/lib/fleet.d.ts +25 -0
  146. package/dist/extensions/cursor-cloud-agents/lib/fleet.d.ts.map +1 -0
  147. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +85 -0
  148. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts +5 -0
  149. package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts.map +1 -0
  150. package/dist/extensions/cursor-cloud-agents/lib/inputs.js +4 -0
  151. package/dist/extensions/cursor-cloud-agents/lib/repos.d.ts +15 -0
  152. package/dist/extensions/cursor-cloud-agents/lib/repos.d.ts.map +1 -0
  153. package/dist/extensions/cursor-cloud-agents/lib/repos.js +55 -0
  154. package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts +8 -0
  155. package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts.map +1 -0
  156. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +15 -0
  157. package/dist/extensions/cursor-cloud-agents/skills/handoff.md +41 -0
  158. package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts +4 -0
  159. package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts.map +1 -0
  160. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +26 -0
  161. package/dist/extensions/cursor-cloud-agents/tools/dump.d.ts +4 -0
  162. package/dist/extensions/cursor-cloud-agents/tools/dump.d.ts.map +1 -0
  163. package/dist/extensions/cursor-cloud-agents/tools/dump.js +54 -0
  164. package/dist/extensions/cursor-cloud-agents/tools/get.d.ts +4 -0
  165. package/dist/extensions/cursor-cloud-agents/tools/get.d.ts.map +1 -0
  166. package/dist/extensions/cursor-cloud-agents/tools/get.js +25 -0
  167. package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts +4 -0
  168. package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -0
  169. package/dist/extensions/cursor-cloud-agents/tools/launch.js +59 -0
  170. package/dist/extensions/cursor-cloud-agents/tools/list.d.ts +4 -0
  171. package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -0
  172. package/dist/extensions/cursor-cloud-agents/tools/list.js +36 -0
  173. package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts +4 -0
  174. package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts.map +1 -0
  175. package/dist/extensions/cursor-cloud-agents/tools/reply.js +35 -0
  176. package/dist/extensions.d.ts +73 -0
  177. package/dist/extensions.d.ts.map +1 -0
  178. package/dist/extensions.js +112 -0
  179. package/dist/files-backends/cursor-hosted.d.ts +0 -8
  180. package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
  181. package/dist/files-backends/cursor-hosted.js +1 -11
  182. package/dist/files.d.ts +5 -1
  183. package/dist/files.d.ts.map +1 -1
  184. package/dist/files.js +22 -18
  185. package/dist/index.d.ts +4 -3
  186. package/dist/index.d.ts.map +1 -1
  187. package/dist/index.js +3 -2
  188. package/dist/internal/advertise-tools.d.ts +4 -1
  189. package/dist/internal/advertise-tools.d.ts.map +1 -1
  190. package/dist/internal/advertise-tools.js +20 -1
  191. package/dist/internal/as-of.d.ts +18 -0
  192. package/dist/internal/as-of.d.ts.map +1 -1
  193. package/dist/internal/as-of.js +131 -0
  194. package/dist/internal/cli-deploy.d.ts.map +1 -1
  195. package/dist/internal/cli-deploy.js +64 -19
  196. package/dist/internal/continuation-identity.d.ts.map +1 -1
  197. package/dist/internal/continuation-identity.js +3 -1
  198. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  199. package/dist/internal/conversation-mirror.js +13 -15
  200. package/dist/internal/cursor/backend-client.d.ts +8 -1
  201. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  202. package/dist/internal/cursor/backend-client.js +25 -9
  203. package/dist/internal/cursor/hosted-deployment-secrets.d.ts +16 -0
  204. package/dist/internal/cursor/hosted-deployment-secrets.d.ts.map +1 -0
  205. package/dist/internal/cursor/hosted-deployment-secrets.js +61 -0
  206. package/dist/internal/cursor/hosted-store-secrets.d.ts +11 -0
  207. package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -1
  208. package/dist/internal/cursor/hosted-store-secrets.js +15 -0
  209. package/dist/internal/cursor-deployment-relay.d.ts +15 -1
  210. package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
  211. package/dist/internal/cursor-deployment-relay.js +46 -7
  212. package/dist/internal/deploy-client.d.ts +23 -0
  213. package/dist/internal/deploy-client.d.ts.map +1 -1
  214. package/dist/internal/deploy-client.js +54 -12
  215. package/dist/internal/discovery/ab.d.ts +9 -0
  216. package/dist/internal/discovery/ab.d.ts.map +1 -0
  217. package/dist/internal/discovery/ab.js +101 -0
  218. package/dist/internal/discovery/agent-config.d.ts +35 -0
  219. package/dist/internal/discovery/agent-config.d.ts.map +1 -0
  220. package/dist/internal/discovery/agent-config.js +173 -0
  221. package/dist/internal/discovery/agent.d.ts +11 -0
  222. package/dist/internal/discovery/agent.d.ts.map +1 -0
  223. package/dist/internal/discovery/agent.js +306 -0
  224. package/dist/internal/discovery/channels.d.ts +10 -0
  225. package/dist/internal/discovery/channels.d.ts.map +1 -0
  226. package/dist/internal/discovery/channels.js +97 -0
  227. package/dist/internal/discovery/connections.d.ts +17 -0
  228. package/dist/internal/discovery/connections.d.ts.map +1 -0
  229. package/dist/internal/discovery/connections.js +436 -0
  230. package/dist/internal/discovery/context.d.ts +20 -0
  231. package/dist/internal/discovery/context.d.ts.map +1 -0
  232. package/dist/internal/discovery/context.js +30 -0
  233. package/dist/internal/discovery/cursor-plugin.d.ts +25 -0
  234. package/dist/internal/discovery/cursor-plugin.d.ts.map +1 -0
  235. package/dist/internal/discovery/cursor-plugin.js +570 -0
  236. package/dist/internal/discovery/extensions.d.ts +19 -0
  237. package/dist/internal/discovery/extensions.d.ts.map +1 -0
  238. package/dist/internal/discovery/extensions.js +238 -0
  239. package/dist/internal/discovery/fs.d.ts +15 -0
  240. package/dist/internal/discovery/fs.d.ts.map +1 -0
  241. package/dist/internal/discovery/fs.js +115 -0
  242. package/dist/internal/discovery/hooks.d.ts +7 -0
  243. package/dist/internal/discovery/hooks.d.ts.map +1 -0
  244. package/dist/internal/discovery/hooks.js +48 -0
  245. package/dist/internal/discovery/info.d.ts +6 -0
  246. package/dist/internal/discovery/info.d.ts.map +1 -0
  247. package/dist/internal/discovery/info.js +141 -0
  248. package/dist/internal/discovery/instructions.d.ts +7 -0
  249. package/dist/internal/discovery/instructions.d.ts.map +1 -0
  250. package/dist/internal/discovery/instructions.js +95 -0
  251. package/dist/internal/discovery/modules.d.ts +20 -0
  252. package/dist/internal/discovery/modules.d.ts.map +1 -0
  253. package/dist/internal/discovery/modules.js +101 -0
  254. package/dist/internal/discovery/names.d.ts +12 -0
  255. package/dist/internal/discovery/names.d.ts.map +1 -0
  256. package/dist/internal/discovery/names.js +36 -0
  257. package/dist/internal/discovery/project.d.ts +53 -0
  258. package/dist/internal/discovery/project.d.ts.map +1 -0
  259. package/dist/internal/discovery/project.js +239 -0
  260. package/dist/internal/discovery/runtime.d.ts +34 -0
  261. package/dist/internal/discovery/runtime.d.ts.map +1 -0
  262. package/dist/internal/discovery/runtime.js +98 -0
  263. package/dist/internal/discovery/schedules.d.ts +7 -0
  264. package/dist/internal/discovery/schedules.d.ts.map +1 -0
  265. package/dist/internal/discovery/schedules.js +97 -0
  266. package/dist/internal/discovery/seed-files.d.ts +7 -0
  267. package/dist/internal/discovery/seed-files.d.ts.map +1 -0
  268. package/dist/internal/discovery/seed-files.js +41 -0
  269. package/dist/internal/discovery/services.d.ts +17 -0
  270. package/dist/internal/discovery/services.d.ts.map +1 -0
  271. package/dist/internal/discovery/services.js +104 -0
  272. package/dist/internal/discovery/skills.d.ts +16 -0
  273. package/dist/internal/discovery/skills.d.ts.map +1 -0
  274. package/dist/internal/discovery/skills.js +151 -0
  275. package/dist/internal/discovery/subagent.d.ts +13 -0
  276. package/dist/internal/discovery/subagent.d.ts.map +1 -0
  277. package/dist/internal/discovery/subagent.js +19 -0
  278. package/dist/internal/discovery/tools.d.ts +18 -0
  279. package/dist/internal/discovery/tools.d.ts.map +1 -0
  280. package/dist/internal/discovery/tools.js +159 -0
  281. package/dist/internal/discovery.d.ts +8 -62
  282. package/dist/internal/discovery.d.ts.map +1 -1
  283. package/dist/internal/discovery.js +8 -2210
  284. package/dist/internal/distribution.d.ts.map +1 -1
  285. package/dist/internal/distribution.js +5 -0
  286. package/dist/internal/framework-file-storage.d.ts +3 -3
  287. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  288. package/dist/internal/framework-file-storage.js +38 -9
  289. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  290. package/dist/internal/framework-storage-selection.js +8 -7
  291. package/dist/internal/frontmatter.d.ts +11 -3
  292. package/dist/internal/frontmatter.d.ts.map +1 -1
  293. package/dist/internal/frontmatter.js +29 -3
  294. package/dist/internal/hosted-delivery.d.ts +3 -1
  295. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  296. package/dist/internal/hosted-delivery.js +19 -32
  297. package/dist/internal/hosted-execution-diag.d.ts +5 -0
  298. package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
  299. package/dist/internal/hosted-execution-diag.js +5 -0
  300. package/dist/internal/hosted-execution-flush.d.ts +46 -0
  301. package/dist/internal/hosted-execution-flush.d.ts.map +1 -0
  302. package/dist/internal/hosted-execution-flush.js +81 -0
  303. package/dist/internal/mcp-endpoint.js +1 -0
  304. package/dist/internal/mcp-host.d.ts +2 -1
  305. package/dist/internal/mcp-host.d.ts.map +1 -1
  306. package/dist/internal/mcp-host.js +66 -29
  307. package/dist/internal/otel/collector.d.ts +13 -0
  308. package/dist/internal/otel/collector.d.ts.map +1 -1
  309. package/dist/internal/otel/collector.js +84 -17
  310. package/dist/internal/otel/http.d.ts.map +1 -1
  311. package/dist/internal/otel/http.js +2 -10
  312. package/dist/internal/otel/mcp.d.ts +16 -0
  313. package/dist/internal/otel/mcp.d.ts.map +1 -0
  314. package/dist/internal/otel/mcp.js +68 -0
  315. package/dist/internal/otel/propagation.d.ts +6 -0
  316. package/dist/internal/otel/propagation.d.ts.map +1 -0
  317. package/dist/internal/otel/propagation.js +14 -0
  318. package/dist/internal/otel/runtime.d.ts.map +1 -1
  319. package/dist/internal/otel/runtime.js +2 -0
  320. package/dist/internal/review-comments.d.ts +1 -1
  321. package/dist/internal/review-comments.d.ts.map +1 -1
  322. package/dist/internal/review-comments.js +4 -4
  323. package/dist/internal/server.d.ts +3 -0
  324. package/dist/internal/server.d.ts.map +1 -1
  325. package/dist/internal/server.js +79 -104
  326. package/dist/internal/session-engine.d.ts +14 -7
  327. package/dist/internal/session-engine.d.ts.map +1 -1
  328. package/dist/internal/session-engine.js +113 -66
  329. package/dist/internal/session-run-log.d.ts +3 -1
  330. package/dist/internal/session-run-log.d.ts.map +1 -1
  331. package/dist/internal/session-run-log.js +14 -14
  332. package/dist/internal/start-log-store.d.ts +60 -0
  333. package/dist/internal/start-log-store.d.ts.map +1 -0
  334. package/dist/internal/start-log-store.js +149 -0
  335. package/dist/internal/storage-coordinator.d.ts +4 -1
  336. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  337. package/dist/internal/storage-coordinator.js +15 -13
  338. package/dist/internal/tool-catalog.d.ts.map +1 -1
  339. package/dist/internal/tool-catalog.js +9 -6
  340. package/dist/internal/tool-policy.d.ts +8 -0
  341. package/dist/internal/tool-policy.d.ts.map +1 -1
  342. package/dist/internal/tool-policy.js +19 -7
  343. package/dist/internal/turn-cost.d.ts +14 -0
  344. package/dist/internal/turn-cost.d.ts.map +1 -1
  345. package/dist/internal/turn-cost.js +41 -9
  346. package/dist/internal/v2-hosting.d.ts +22 -0
  347. package/dist/internal/v2-hosting.d.ts.map +1 -0
  348. package/dist/internal/v2-hosting.js +23 -0
  349. package/dist/otel.d.ts +16 -0
  350. package/dist/otel.d.ts.map +1 -1
  351. package/dist/otel.js +26 -0
  352. package/dist/playground/assets/index-B6C9S9nG.css +1 -0
  353. package/dist/playground/assets/{index-DVs98vPL.js → index-ZqNoT8Ie.js} +45 -45
  354. package/dist/playground/index.html +2 -2
  355. package/dist/storage-protocol.d.ts +47 -22
  356. package/dist/storage-protocol.d.ts.map +1 -1
  357. package/dist/storage-protocol.js +90 -54
  358. package/dist/storage.d.ts +2 -2
  359. package/dist/storage.d.ts.map +1 -1
  360. package/dist/storage.js +1 -1
  361. package/dist/tools.d.ts +9 -0
  362. package/dist/tools.d.ts.map +1 -1
  363. package/dist/tools.js +9 -0
  364. package/dist/types.d.ts +154 -6
  365. package/dist/types.d.ts.map +1 -1
  366. package/dist/types.js +29 -1
  367. package/docs/README.md +5 -1
  368. package/docs/concepts.md +3 -3
  369. package/docs/guides/cloud-agents.md +98 -0
  370. package/docs/guides/cloud-runtime.md +2 -0
  371. package/docs/reference/connections.md +31 -0
  372. package/docs/reference/extensions.md +205 -0
  373. package/docs/reference/http-api.md +1 -1
  374. package/docs/reference/project-layout.md +3 -0
  375. package/docs/reference/skills.md +2 -0
  376. package/docs/reference/tools.md +2 -0
  377. package/package.json +18 -4
  378. package/skills/framework-map/SKILL.md +1 -0
  379. package/src/bin/agent-serve.ts +11 -2
  380. package/src/channels/deployments/deployments-channel.ts +117 -8
  381. package/src/channels/deployments/types.ts +4 -3
  382. package/src/channels/origin/defaults.ts +143 -0
  383. package/src/channels/origin/index.ts +2 -0
  384. package/src/channels/origin/origin-channel.ts +37 -1
  385. package/src/channels/origin/state.ts +54 -0
  386. package/src/channels/origin/types.ts +24 -0
  387. package/src/channels/slack/api.ts +6 -3
  388. package/src/channels/slack/assistant.ts +1 -1
  389. package/src/channels/slack/code-fences.ts +183 -0
  390. package/src/channels/slack/dispatch.ts +27 -2
  391. package/src/channels/slack/inbound.ts +37 -0
  392. package/src/channels/slack/index.ts +1 -0
  393. package/src/channels/slack/live-delivery.ts +16 -13
  394. package/src/channels/slack/manifest.ts +2 -1
  395. package/src/connections.ts +18 -1
  396. package/src/extensions/cursor-cloud-agents/extension.ts +120 -0
  397. package/src/extensions/cursor-cloud-agents/lib/backend.ts +395 -0
  398. package/src/extensions/cursor-cloud-agents/lib/fleet.ts +109 -0
  399. package/src/extensions/cursor-cloud-agents/lib/inputs.ts +5 -0
  400. package/src/extensions/cursor-cloud-agents/lib/repos.ts +81 -0
  401. package/src/extensions/cursor-cloud-agents/lib/transcript.ts +23 -0
  402. package/src/extensions/cursor-cloud-agents/skills/handoff.md +41 -0
  403. package/src/extensions/cursor-cloud-agents/tools/cancel.ts +19 -0
  404. package/src/extensions/cursor-cloud-agents/tools/dump.ts +51 -0
  405. package/src/extensions/cursor-cloud-agents/tools/get.ts +18 -0
  406. package/src/extensions/cursor-cloud-agents/tools/launch.ts +64 -0
  407. package/src/extensions/cursor-cloud-agents/tools/list.ts +31 -0
  408. package/src/extensions/cursor-cloud-agents/tools/reply.ts +34 -0
  409. package/src/extensions.ts +141 -0
  410. package/src/files-backends/cursor-hosted.ts +1 -17
  411. package/src/files.ts +43 -34
  412. package/src/index.ts +11 -0
  413. package/src/internal/advertise-tools.ts +37 -12
  414. package/src/internal/as-of.ts +163 -0
  415. package/src/internal/cli-deploy.ts +86 -23
  416. package/src/internal/continuation-identity.ts +3 -1
  417. package/src/internal/conversation-mirror.ts +23 -18
  418. package/src/internal/cursor/backend-client.ts +32 -10
  419. package/src/internal/cursor/hosted-deployment-secrets.ts +72 -0
  420. package/src/internal/cursor/hosted-store-secrets.ts +27 -0
  421. package/src/internal/cursor-deployment-relay.ts +65 -8
  422. package/src/internal/deploy-client.ts +73 -18
  423. package/src/internal/discovery/ab.ts +111 -0
  424. package/src/internal/discovery/agent-config.ts +222 -0
  425. package/src/internal/discovery/agent.ts +360 -0
  426. package/src/internal/discovery/channels.ts +103 -0
  427. package/src/internal/discovery/connections.ts +540 -0
  428. package/src/internal/discovery/context.ts +46 -0
  429. package/src/internal/discovery/cursor-plugin.ts +708 -0
  430. package/src/internal/discovery/extensions.ts +348 -0
  431. package/src/internal/discovery/fs.ts +108 -0
  432. package/src/internal/discovery/hooks.ts +45 -0
  433. package/src/internal/discovery/info.ts +179 -0
  434. package/src/internal/discovery/instructions.ts +113 -0
  435. package/src/internal/discovery/modules.ts +107 -0
  436. package/src/internal/discovery/names.ts +44 -0
  437. package/src/internal/discovery/project.ts +270 -0
  438. package/src/internal/discovery/runtime.ts +159 -0
  439. package/src/internal/discovery/schedules.ts +94 -0
  440. package/src/internal/discovery/seed-files.ts +37 -0
  441. package/src/internal/discovery/services.ts +124 -0
  442. package/src/internal/discovery/skills.ts +176 -0
  443. package/src/internal/discovery/subagent.ts +29 -0
  444. package/src/internal/discovery/tools.ts +182 -0
  445. package/src/internal/discovery.ts +20 -2724
  446. package/src/internal/distribution.ts +5 -0
  447. package/src/internal/framework-file-storage.ts +43 -9
  448. package/src/internal/framework-storage-selection.ts +9 -9
  449. package/src/internal/frontmatter.ts +36 -3
  450. package/src/internal/hosted-delivery.ts +38 -63
  451. package/src/internal/hosted-execution-diag.ts +6 -0
  452. package/src/internal/hosted-execution-flush.ts +142 -0
  453. package/src/internal/mcp-endpoint.ts +1 -0
  454. package/src/internal/mcp-host.ts +116 -37
  455. package/src/internal/otel/collector.ts +125 -25
  456. package/src/internal/otel/http.ts +2 -12
  457. package/src/internal/otel/mcp.ts +69 -0
  458. package/src/internal/otel/propagation.ts +17 -0
  459. package/src/internal/otel/runtime.ts +2 -0
  460. package/src/internal/review-comments.ts +5 -2
  461. package/src/internal/server.ts +81 -100
  462. package/src/internal/session-engine.ts +152 -39
  463. package/src/internal/session-run-log.ts +18 -16
  464. package/src/internal/start-log-store.ts +174 -0
  465. package/src/internal/storage-coordinator.ts +19 -16
  466. package/src/internal/tool-catalog.ts +9 -6
  467. package/src/internal/tool-policy.ts +39 -9
  468. package/src/internal/turn-cost.ts +47 -4
  469. package/src/internal/v2-hosting.ts +38 -0
  470. package/src/otel.ts +38 -0
  471. package/src/storage-protocol.ts +126 -79
  472. package/src/storage.ts +5 -0
  473. package/src/tools.ts +18 -0
  474. package/src/types.ts +213 -14
  475. package/dist/docs/assets/chunks/@localSearchIndexroot.j70vvPL4.js +0 -1
  476. package/dist/docs/assets/concepts.md.lwAgBIMI.js +0 -1
  477. package/dist/docs/assets/index.md.Bb4k8kUm.js +0 -5
  478. package/dist/docs/assets/skills_framework-map.md.BTi817yv.js +0 -1
  479. package/dist/playground/assets/index-BszoQDc6.css +0 -1
  480. /package/dist/docs/assets/{concepts.md.lwAgBIMI.lean.js → concepts.md.rPzW2HZN.lean.js} +0 -0
  481. /package/dist/docs/assets/{guides_cloud-runtime.md.CkYbjnAX.lean.js → guides_cloud-runtime.md.BRirbRAN.lean.js} +0 -0
  482. /package/dist/docs/assets/{reference_http-api.md.BEJx9XVj.lean.js → reference_http-api.md.oySXBO8o.lean.js} +0 -0
  483. /package/dist/docs/assets/{reference_skills.md.BFW9retM.lean.js → reference_skills.md.l2ezAcaN.lean.js} +0 -0
  484. /package/dist/docs/assets/{reference_tools.md.CvAHsdSp.lean.js → reference_tools.md.B1up2r9W.lean.js} +0 -0
@@ -0,0 +1,98 @@
1
+ ---
2
+ title: "Cursor cloud agents"
3
+ description: "Let an agent-sdk agent hand coding work to Cursor cloud agents and steer them: mount the extension, pick the repositories it may touch, and decide what needs approval."
4
+ ---
5
+
6
+ # Cursor cloud agents
7
+
8
+ The `cursor-cloud-agents` extension lets an agent delegate coding work
9
+ to Cursor cloud agents and stay in the conversation while they do it.
10
+ The cloud agents work on real repository checkouts and push branches and
11
+ pull requests; your agent hands off the task, reports back, and answers
12
+ questions in the meantime. A Slack triage agent turns a bug report into
13
+ a PR, a planner fans a refactor out across repositories, a reviewer asks
14
+ a cloud agent to address its own comments.
15
+
16
+ This is different from the [cloud runtime](./cloud-runtime.md). The
17
+ runtime moves *this* agent's turns onto a cloud VM. The extension keeps
18
+ the agent where it is and lets it start *other* cloud agents.
19
+
20
+ ## Mount it
21
+
22
+ The extension ships with `@cursor/july`. Mount it with one file.
23
+
24
+ ```ts
25
+ // agent/extensions/cloud.ts
26
+ import cursorCloudAgents from "@cursor/july/extensions/cursor-cloud-agents";
27
+
28
+ export default cursorCloudAgents({
29
+ cloud: {
30
+ repos: [{ url: "https://github.com/acme/api", startingRef: "main" }],
31
+ autoCreatePR: true,
32
+ },
33
+ });
34
+ ```
35
+
36
+ Launches run under the host's signed-in account (`agent-sdk login` or
37
+ `CURSOR_API_KEY`) and spend its cloud-agent budget. Name the
38
+ repositories the agent may target, and keep approval on when you can't.
39
+
40
+ Mount it on an agent that runs on the local runtime; that is where
41
+ launches park for approval. On the
42
+ [cloud runtime](./cloud-runtime.md#what-changes-on-cloud) approvals
43
+ don't resolve.
44
+
45
+ ## What the agent can do
46
+
47
+ With the extension mounted, the agent can hand off coding work and stay
48
+ in the conversation while it happens:
49
+
50
+ - **Hand off a task.** Launch a cloud agent on one of your repositories,
51
+ or on a pull request, with a self-contained brief. It gets back an
52
+ agent id and a URL to share.
53
+ - **Check on it.** See whether the agent is still running, what it
54
+ produced, and which branches or pull requests it pushed.
55
+ - **Read what was done.** Pull the agent's full conversation into the
56
+ workspace, quote its final report, or trace the exact edits before
57
+ summarizing for a person.
58
+ - **Steer or stop.** Send a follow-up to an agent it launched; it queues
59
+ behind the current run, or interrupts it on request. Cancel a run that
60
+ went sideways.
61
+ - **Keep track.** List the agents launched in this conversation, or
62
+ everything it has launched before.
63
+
64
+ A skill teaches the model when to delegate, how to write a brief a cloud
65
+ agent can act on alone, and how to follow up. Everything the extension
66
+ launches stays bound to whoever launched it: an agent started by another
67
+ user, or outside the extension, is out of reach. That separation is only
68
+ as fine as your host's auth; a shared bearer token or `--allow-anonymous`
69
+ makes every caller one principal, so use
70
+ [authored auth](../reference/channels.md#auth-policies) when callers need
71
+ their own.
72
+
73
+ ## Configure it
74
+
75
+ | Option | What it controls |
76
+ | --- | --- |
77
+ | `cloud` | Launch defaults, in the same shape as the agent's own [cloud options](../reference/agent-config.md#cloud-options). |
78
+ | `cloud.repos` | The repositories the agent may hand work to, with a default branch or pull request for each. Without it, launches run with no repository and the model can't name one, so secrets in `cloud.envVars` never reach a repository you didn't list. |
79
+ | `model` | The model launched agents run. Omit it to use the account default. |
80
+ | `needsApproval` | Park launches and follow-ups for a [human decision](./human-in-the-loop.md). Defaults to `true` when no `cloud.repos` are configured, `false` otherwise. |
81
+ | `apiKey` | A Cursor API key to launch with instead of the host's own. |
82
+
83
+ ## Adjust it
84
+
85
+ To take a capability away, such as sending follow-ups, mount as a
86
+ directory and disable that tool; see
87
+ [overlays](../reference/extensions.md#adjust-a-mounted-extension).
88
+
89
+ ## What's next
90
+
91
+ Continue with these pages:
92
+
93
+ - [Extensions](../reference/extensions.md): how mounts, namespaces, and
94
+ overrides work
95
+ - [Human-in-the-loop approvals](./human-in-the-loop.md): where parked
96
+ launches get approved
97
+ - [Cloud runtime](./cloud-runtime.md): run the agent's own turns on
98
+ cloud agents instead
@@ -118,3 +118,5 @@ Continue with these pages:
118
118
  `cloud` fields
119
119
  - [GitHub guide](./github.md): the webhook patterns that pair with
120
120
  cloud triage
121
+ - [Cursor cloud agents](./cloud-agents.md): keep the agent local and
122
+ let it launch cloud agents instead
@@ -124,6 +124,37 @@ be called through the direct tool API.
124
124
  In a dry-run session, MCP tools marked read-only run normally. Tools marked
125
125
  as writes are stubbed. Tools without effect annotations are unavailable.
126
126
 
127
+ ## Restrict which tools a connection serves
128
+
129
+ Use `tools` the same way you allowlist harness tools on the agent. When
130
+ set, the connection serves only those names. Use `disallowedTools` to
131
+ drop names instead. The two combine as deny-wins, same as the Cursor
132
+ SDK. The model and `host.mcp` only see what remains. On a model-visible
133
+ connection, set `advertiseTools: true` so the raw server is not attached.
134
+
135
+ ```ts
136
+ export default defineConnection({
137
+ url: "https://mcp.example.com/inventory",
138
+ advertiseTools: true,
139
+ tools: ["search_skus", "get_stock"],
140
+ });
141
+
142
+ export default defineConnection({
143
+ url: "https://mcp.example.com/inventory",
144
+ advertiseTools: true,
145
+ disallowedTools: ["place_order", "delete_sku"],
146
+ });
147
+ ```
148
+
149
+ Names are the server's `tools/list` names. Unknown names are omitted. A
150
+ filter that matches nothing on the server fails the turn. Combine with
151
+ `effects: "read"` to keep only the listed tools the server classifies as
152
+ reads.
153
+
154
+ A list of names is an allowlist. An object of handlers authors TypeScript
155
+ tools. On `host-connections/`, a name list restricts `host.mcp` without
156
+ advertising.
157
+
127
158
  ## Local stdio MCP server
128
159
 
129
160
  Run a local MCP server as a child process with `command`.
@@ -0,0 +1,205 @@
1
+ ---
2
+ title: "Extensions"
3
+ description: "Mount a package of tools and skills or a Cursor plugin under a namespace with one file, adjust what it contributes, and author your own as a directory laid out like agent/."
4
+ ---
5
+
6
+ # Extensions
7
+
8
+ An extension packages tools and skills an agent installs as one unit. You
9
+ mount it with a single file under `agent/extensions/`, and its
10
+ contributions join the agent under a namespace. The package updates
11
+ like any other dependency; nothing is copied into your project. A Cursor
12
+ plugin mounts the same way; see [Mount a Cursor plugin](#mount-a-cursor-plugin).
13
+
14
+ ## Mount an extension
15
+
16
+ Install the package, then add one file. The filename is the namespace.
17
+
18
+ ```ts
19
+ // agent/extensions/ci.ts
20
+ import ci from "@acme/ci-triage";
21
+
22
+ export default ci({ org: "acme", token: process.env.BUILDKITE_TOKEN! });
23
+ ```
24
+
25
+ Every contribution is exposed as `<namespace>__<name>`. A `failed_jobs`
26
+ tool from this mount runs in the agent as `ci__failed_jobs`, and a
27
+ `triage` skill loads as `ci__triage`. `agent-sdk info` lists each mount
28
+ with what it contributed, and `GET /v1/info` returns the same under
29
+ `extensions`.
30
+
31
+ Pass the configuration the extension asks for. The extension validates it
32
+ when the agent loads, so a missing or mistyped field fails
33
+ `agent-sdk validate` instead of a tool call later.
34
+
35
+ Namespaces follow the tool-name rule, and `__` is reserved: an authored
36
+ `agent/tools/ci__failed_jobs.ts` fails discovery, so nothing outside a
37
+ mount can pose as one of its tools.
38
+
39
+ ## Adjust a mounted extension
40
+
41
+ To replace or remove a contribution, mount the extension as a directory
42
+ and overlay the slot you want to change.
43
+
44
+ ```text
45
+ agent/extensions/ci/
46
+ ├── extension.ts # the mount: export default ci({ ... })
47
+ ├── tools/
48
+ │ ├── job_log.ts # replaces ci__job_log with your own defineTool
49
+ │ └── retry_job.ts # export default disableTool() removes ci__retry_job
50
+ └── skills/
51
+ └── triage.md # replaces ci__triage
52
+ ```
53
+
54
+ Use the extension's own names inside the directory, without the
55
+ namespace. A file with a name the extension doesn't contribute adds a
56
+ new tool or skill under the namespace. `disableTool()` comes from
57
+ `@cursor/july/extensions` and fails discovery when it names a tool the
58
+ extension doesn't have, so a typo can't silently keep a tool alive.
59
+ A Cursor plugin mount overlays its MCP servers the same way; see below.
60
+
61
+ ## Mount a Cursor plugin
62
+
63
+ A Cursor plugin is a directory with `.cursor-plugin/plugin.json` (or
64
+ `.claude-plugin/plugin.json`, or `plugin.json`) and any of `skills/`,
65
+ `commands/`, `agents/`, and `mcp.json`. Copy the plugin into your project
66
+ and mount it with `cursorPlugin`. The filename is the namespace, as with
67
+ any extension.
68
+
69
+ ```ts
70
+ // agent/extensions/notion.ts
71
+ import { cursorPlugin } from "@cursor/july/extensions";
72
+
73
+ export default cursorPlugin({
74
+ path: "plugins/notion-workspace", // relative to the project root
75
+ variables: { NOTION_TOKEN: process.env.NOTION_TOKEN! },
76
+ });
77
+ ```
78
+
79
+ The plugin joins the agent under that namespace:
80
+
81
+ | Plugin content | Becomes |
82
+ | --- | --- |
83
+ | `skills/<name>/SKILL.md` | skill `notion__<name>` |
84
+ | `commands/<name>.md` | skill `notion__<name>`, since a command is a procedure the model runs on request |
85
+ | `agents/<name>.md` | subagent `notion__<name>` |
86
+ | MCP servers in `mcp.json` or the manifest | connection `notion__<server>` |
87
+
88
+ `variables` fills the `${NAME}` placeholders the plugin's MCP config
89
+ declares; names you leave out come from the environment by exact name. A
90
+ placeholder nothing fills fails `agent-sdk validate`, so a server never
91
+ attaches half configured. A server that declares an OAuth client
92
+ authorizes through [host MCP OAuth](../guides/mcp-oauth.md) as
93
+ `agent-sdk mcp oauth notion__<server>`; its secret names collapse the
94
+ namespace separator, so `notion__notion` stores `MCP_OAUTH_NOTION_NOTION_*`.
95
+ A server that lists `enabledTools` mounts as an advertised connection with
96
+ that allowlist and requires the local runtime; `agent-sdk validate` fails
97
+ otherwise.
98
+
99
+ Mounting a plugin trusts it like authored code: its servers run the
100
+ commands and read the environment variables its config names. Review a
101
+ plugin before you vendor it.
102
+
103
+ Plugin rules and hooks are not mounted; `agent-sdk validate` warns when a
104
+ plugin carries them. To drop or reconfigure one of the plugin's servers,
105
+ mount as a directory and overlay `mcp-connections/<server>.ts`. An
106
+ overlaid server is never read from the plugin, so it needs no variables.
107
+
108
+ ```text
109
+ agent/extensions/cloudflare/
110
+ ├── extension.ts # export default cursorPlugin({ path: "plugins/cloudflare" })
111
+ └── mcp-connections/
112
+ ├── cloudflare-docs.ts # replaces cloudflare__cloudflare-docs with your defineConnection
113
+ └── cloudflare-bindings.ts # export default disableConnection() drops it
114
+ ```
115
+
116
+ `disableConnection()` comes from `@cursor/july/extensions` and fails
117
+ discovery when it names a server the plugin doesn't declare.
118
+
119
+ ## Build an extension
120
+
121
+ An extension is a directory laid out like `agent/`. `extension.ts`
122
+ declares it; `tools/` and `skills/` hold the contributions in the same
123
+ authoring forms as [Tools](./tools.md) and [Skills](./skills.md).
124
+
125
+ ```text
126
+ @acme/ci-triage/
127
+ ├── package.json
128
+ ├── extension.ts # defineExtension
129
+ ├── tools/
130
+ │ ├── failed_jobs.ts
131
+ │ ├── job_log.ts
132
+ │ └── retry_job.ts
133
+ ├── skills/
134
+ │ └── triage.md
135
+ └── lib/
136
+ └── buildkite.ts # shared code, never discovered
137
+ ```
138
+
139
+ Declare the extension with its root and, when consumers must configure
140
+ it, a schema for their settings.
141
+
142
+ ```ts
143
+ // extension.ts
144
+ import { defineExtension } from "@cursor/july/extensions";
145
+ import { z } from "zod";
146
+
147
+ export default defineExtension({
148
+ root: import.meta.dirname,
149
+ description: "Investigate failing CI builds on Buildkite.",
150
+ config: z.object({
151
+ org: z.string(),
152
+ token: z.string(),
153
+ logTailLines: z.number().int().positive().default(200),
154
+ }),
155
+ });
156
+ ```
157
+
158
+ The default export is what consumers call to mount the extension, and it
159
+ is also how your own modules read the consumer's settings. Import it and
160
+ read `extension.config`; the value is validated and has defaults applied.
161
+
162
+ ```ts
163
+ // tools/job_log.ts
164
+ import { defineTool } from "@cursor/july/tools";
165
+ import { z } from "zod";
166
+ import extension from "../extension.js";
167
+ import { jobLogTail } from "../lib/buildkite.js";
168
+
169
+ export default defineTool({
170
+ description: "Read the tail of a CI job's log.",
171
+ effect: "read",
172
+ inputSchema: z.object({ pipeline: z.string(), build: z.number(), job: z.string() }),
173
+ async execute({ pipeline, build, job }) {
174
+ const { org, token, logTailLines } = extension.config;
175
+ return jobLogTail({ org, token, pipeline, build, job, lines: logTailLines });
176
+ },
177
+ });
178
+ ```
179
+
180
+ Because the consumer picks the namespace, have skills and tool
181
+ descriptions refer to sibling tools by their short names and say they
182
+ appear under the mount's namespace (`<namespace>__job_log`).
183
+
184
+ Publish the built `extension.js` as the package entry point with
185
+ `tools/` and `skills/` beside it. `root` is read from the built file, so
186
+ copy `skills/*.md` into the build output or author skills as `.ts` with
187
+ `defineSkill`.
188
+
189
+ Only `tools/` and `skills/` are mounted from an extension tree.
190
+ Instructions, connections, hooks, channels, and the runtime
191
+ configuration belong to the agent that mounts the extension;
192
+ `agent-sdk validate` warns when a tree carries agent slots such as
193
+ `instructions.md`, `connections/`, `hooks/`, `channels/`, or
194
+ `schedules/`.
195
+
196
+ ## What's next
197
+
198
+ Continue with these pages:
199
+
200
+ - [Cursor cloud agents](../guides/cloud-agents.md): the extension that
201
+ lets an agent launch and steer cloud agents
202
+ - [Tools](./tools.md): the tool contract extensions contribute to
203
+ - [Skills](./skills.md): the skill forms an extension can carry
204
+ - [Project layout](./project-layout.md): where `agent/extensions/` sits
205
+ in the tree
@@ -53,7 +53,7 @@ and `playgroundUrl` deep-links the session in the playground.
53
53
  | `message` | Required user message |
54
54
  | `title` | Session title |
55
55
  | `dryRun` | Run read tools and stub write tools |
56
- | `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 |
56
+ | `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 |
57
57
  | `workspaceFiles` | UTF-8 files written into the session workspace |
58
58
  | `cloud` | Per-session cloud options merged over the agent defaults |
59
59
 
@@ -21,6 +21,8 @@ experiments can override their file-derived name.
21
21
  | `agent/host-connections/anytool.ts` | Host MCP connection `anytool` (host + `mcp oauth` only) |
22
22
  | `agent/skills/pr-review.md` | skill `pr-review` |
23
23
  | `agent/subagents/reviewer/` | subagent `reviewer` |
24
+ | `agent/extensions/ci.ts` | extension mount `ci`; its tools and skills become `ci__<name>` |
25
+ | `agent/extensions/notion.ts` | Cursor plugin mount `notion` (`cursorPlugin`); its skills, agents, and MCP servers become `notion__<name>` |
24
26
  | `agent/channels/drive.ts` | channel `drive`, routes under `/v1/channels/drive` |
25
27
  | `agent/ab.ts` | A/B experiment `ab` unless `name` overrides it |
26
28
  | `agent/ab/concise.ts` | A/B experiment `concise` unless `name` overrides it |
@@ -71,6 +73,7 @@ Each path maps to a capability and a reference page.
71
73
  | `agent/mcp-connections/<name>.ts` | MCP servers, available to the model, to server tools (`ctx.host.mcp`), and to channel/schedule handlers (`args.host.mcp`) | [MCP connections](./connections.md) |
72
74
  | `agent/host-connections/<name>.ts` | Privileged MCP servers for `ctx.host.mcp` and `mcp oauth`. The model never sees them. | [MCP connections](./connections.md) |
73
75
  | `agent/subagents/<id>/` | Child agent directory; `description` required | [Subagents](./subagents.md) |
76
+ | `agent/extensions/<ns>.ts` or `agent/extensions/<ns>/` | A mounted extension or Cursor plugin; its contributions become `<ns>__<name>` | [Extensions](./extensions.md) |
74
77
  | `agent/channels/*.ts` | HTTP surfaces beyond the built-in session API; `slack.ts` and `github.ts` use the platform packs | [Channels](./channels.md) |
75
78
  | `agent/hooks/*.ts` | Observe-only event subscribers, never fatal | [Hooks](./hooks.md) |
76
79
  | `agent/otel.ts` | `defineOtel` OTLP export (traces, metrics, optional logs) | [OpenTelemetry](../guides/opentelemetry.md) |
@@ -85,4 +85,6 @@ Continue with these pages:
85
85
 
86
86
  - [Instructions](./instructions.md): what stays always-on
87
87
  - [Tools](./tools.md): when prose needs to become code
88
+ - [Extensions](./extensions.md): skills installed as a package under a
89
+ namespace
88
90
  - [Project layout](./project-layout.md): where skills sit in the tree
@@ -343,4 +343,6 @@ Continue with these pages:
343
343
  lifecycle in full
344
344
  - [MCP connections](./connections.md): tools that come from MCP servers
345
345
  instead
346
+ - [Extensions](./extensions.md): tools installed as a package under a
347
+ namespace
346
348
  - [Evals](../evals.md): gating tool decisions with `calledTool`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cursor/july",
3
- "version": "0.1.100",
3
+ "version": "0.1.102",
4
4
  "description": "(early alpha) Filesystem-first framework for defining Cursor agents as markdown and TypeScript and serving them over channels with the Cursor SDK.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "repository": {
@@ -95,6 +95,20 @@
95
95
  "import": "./dist/skills.js",
96
96
  "default": "./dist/skills.js"
97
97
  },
98
+ "./extensions": {
99
+ "anysphere-source": "./src/extensions.ts",
100
+ "bun": "./dist/extensions.js",
101
+ "types": "./dist/extensions.d.ts",
102
+ "import": "./dist/extensions.js",
103
+ "default": "./dist/extensions.js"
104
+ },
105
+ "./extensions/cursor-cloud-agents": {
106
+ "anysphere-source": "./src/extensions/cursor-cloud-agents/extension.ts",
107
+ "bun": "./dist/extensions/cursor-cloud-agents/extension.js",
108
+ "types": "./dist/extensions/cursor-cloud-agents/extension.d.ts",
109
+ "import": "./dist/extensions/cursor-cloud-agents/extension.js",
110
+ "default": "./dist/extensions/cursor-cloud-agents/extension.js"
111
+ },
98
112
  "./schedules": {
99
113
  "anysphere-source": "./src/schedules.ts",
100
114
  "types": "./dist/schedules.d.ts",
@@ -215,7 +229,7 @@
215
229
  }
216
230
  },
217
231
  "scripts": {
218
- "build": "tsgo -p tsconfig.build.json && node scripts/bundle-publish-shims.mjs && pnpm run build:playground && pnpm run docs:build",
232
+ "build": "tsgo -p tsconfig.build.json && node scripts/bundle-publish-shims.mjs && node scripts/copy-extension-assets.mjs && pnpm run build:playground && pnpm run docs:build",
219
233
  "build:dist": "node scripts/build-hosted-dist.mjs",
220
234
  "postinstall": "node -e \"try{const p='./scripts/install-cursor-skills.mjs';if(require('fs').existsSync(p))require('child_process').execFileSync(process.execPath,[p],{stdio:'inherit'})}catch{}\"",
221
235
  "build:playground": "vite build --config playground/vite.config.ts",
@@ -240,7 +254,7 @@
240
254
  },
241
255
  "dependencies": {
242
256
  "@bazel/runfiles": "6.5.0",
243
- "@cursor/sdk": "1.0.30",
257
+ "@cursor/sdk": "1.0.31",
244
258
  "@modelcontextprotocol/sdk": "1.25.1",
245
259
  "@octokit/auth-app": "^7.2.0",
246
260
  "@octokit/rest": "^21.1.1",
@@ -303,4 +317,4 @@
303
317
  "yaml": "^2.4.2",
304
318
  "zustand": "^5.0.9"
305
319
  }
306
- }
320
+ }
@@ -44,6 +44,7 @@ Path is identity. Full list: README "Folder structure".
44
44
  | `agent/mcp-connections/<name>.ts` | MCP. Never name an account file `cursor.ts`. `advertiseTools: true` for named local tools |
45
45
  | `agent/host-connections/<name>.ts` | Privileged MCP for `ctx.host.mcp` / `mcp oauth` |
46
46
  | `agent/subagents/<id>/` | Child agent (`description` required) |
47
+ | `agent/extensions/<ns>.ts` | Mounted extension or Cursor plugin (`cursorPlugin({ path })`); contributions are `<ns>__<name>` |
47
48
  | `agent/channels/*.ts` | Slack / GitHub / custom HTTP |
48
49
  | `agent/hooks/*.ts` | Observe-only |
49
50
  | `agent/ab.ts` or `agent/ab/*.ts` | Live A/B (`defineAB`) |
@@ -426,8 +426,8 @@ Options:
426
426
  --all deploy: every child agent under a multi-agent --dir
427
427
  (skips the interactive picker; mutually exclusive with
428
428
  --slug).
429
- --cursor-events-repo deploy: repo (owner/name) whose SCM events the
430
- deployed engine pulls (repeatable).
429
+ --cursor-events-repo deploy: repo (owner/name) the deployed agent
430
+ watches (repeatable).
431
431
  --allow-domain deploy: egress domain the engine pod may reach
432
432
  (repeatable; unioned with hosting.egressDomains from the
433
433
  agent manifest). Repo-backed deploys only.
@@ -1160,6 +1160,15 @@ async function main(argv: string[]): Promise<number> {
1160
1160
  info.skills.map((s) => `${s.name} — ${s.description}`)
1161
1161
  )
1162
1162
  );
1163
+ lines.push(
1164
+ section(
1165
+ "extensions",
1166
+ info.extensions.map(
1167
+ (e) =>
1168
+ `${e.name} — ${[...e.tools, ...e.skills].join(", ") || "(nothing contributed)"}`
1169
+ )
1170
+ )
1171
+ );
1163
1172
  lines.push(
1164
1173
  section(
1165
1174
  "MCP connections",
@@ -1,7 +1,11 @@
1
1
  import { z } from "zod";
2
2
 
3
3
  import { defineChannel, localDevStrict, POST } from "../../channels.js";
4
- import { resolveDeploymentSubscriptions } from "../../internal/cursor-deployment-relay.js";
4
+ import {
5
+ deploymentEventMatches,
6
+ resolveDeploymentSubscriptions,
7
+ } from "../../internal/cursor-deployment-relay.js";
8
+ import { attachHostedAdmissionAdapter } from "../../internal/hosted-admission-adapter.js";
5
9
  import { bindLocalIngressSend } from "../../internal/local-ingress.js";
6
10
  import type { ChannelDefinition, ChannelHandlerArgs } from "../../types.js";
7
11
  import {
@@ -43,14 +47,28 @@ export function getDeploymentsChannelOptions(
43
47
  /**
44
48
  * Events a {@link deploymentsChannel} dispatches on, unioned from its
45
49
  * subscriptions. Published as `meta.deploymentEventTypes` so the deploy
46
- * manifest can extract `eventTypes`. An empty deploy-source list is an
47
- * inert channel and yields no events.
50
+ * manifest can extract `eventTypes`.
51
+ *
52
+ * A channel with no resolved subscriptions declares the full event set:
53
+ * deploy sources usually come from env vars read at module load, and the
54
+ * hosted freeze bakes hermetically (no customer env/secrets), so deriving
55
+ * `[]` there would leave the manifest without event types and no
56
+ * subscription edge could ever materialize (invariant 26). Capability is
57
+ * the channel's code shape — `onEvent` handles any deployment event —
58
+ * while sources/environments/event narrowing are runtime subscription
59
+ * config; the hosted-admission adapter re-applies them before authored
60
+ * code runs. Inertness is still guaranteed by scope: a deploy that names
61
+ * no deploy sources binds no edges.
48
62
  */
49
63
  export function deriveDeploymentEventTypes(
50
64
  options: Pick<DeploymentsChannelOptions, "deploySourceUris" | "events">
51
65
  ): string[] {
66
+ const subscriptions = resolveDeploymentSubscriptions(options);
67
+ if (subscriptions.length === 0) {
68
+ return [...DEPLOYMENT_EVENT_TYPES].sort();
69
+ }
52
70
  const events = new Set<string>();
53
- for (const subscription of resolveDeploymentSubscriptions(options)) {
71
+ for (const subscription of subscriptions) {
54
72
  for (const event of subscription.events) {
55
73
  events.add(event);
56
74
  }
@@ -59,9 +77,9 @@ export function deriveDeploymentEventTypes(
59
77
  }
60
78
 
61
79
  /**
62
- * Core deployment-event dispatch, used by the channel's replay route and by
63
- * the serve host's relay fan-out. Whether the event matches this channel's
64
- * subscriptions is the caller's decision.
80
+ * Core deployment-event dispatch, used by the channel's replay route, the
81
+ * serve host's relay fan-out, and the hosted-admission adapter. Whether the
82
+ * event matches this channel's subscriptions is the caller's decision.
65
83
  */
66
84
  export async function dispatchDeploymentEvent(input: {
67
85
  options: DeploymentsChannelOptions;
@@ -77,7 +95,61 @@ export async function dispatchDeploymentEvent(input: {
77
95
  payload: input.event,
78
96
  })
79
97
  );
80
- return Response.json({ ok: true });
98
+ // "task": authored `onEvent` ran to completion without a captured send.
99
+ // Hosted admission only consults this when no send was captured.
100
+ return withDispatchOutcome(Response.json({ ok: true }), "task");
101
+ }
102
+
103
+ export type DeploymentsDispatchOutcome = "skip" | "task";
104
+
105
+ const dispatchOutcomeByResponse = new WeakMap<
106
+ Response,
107
+ DeploymentsDispatchOutcome
108
+ >();
109
+
110
+ function withDispatchOutcome(
111
+ response: Response,
112
+ outcome: DeploymentsDispatchOutcome
113
+ ): Response {
114
+ dispatchOutcomeByResponse.set(response, outcome);
115
+ return response;
116
+ }
117
+
118
+ export function getDeploymentsDispatchOutcome(
119
+ response: Response
120
+ ): DeploymentsDispatchOutcome | undefined {
121
+ return dispatchOutcomeByResponse.get(response);
122
+ }
123
+
124
+ /**
125
+ * Whether this channel admits the event on a hosted pod. The hosted
126
+ * control plane fans out on `(deploy_source, eventType, team)` edges only —
127
+ * environments are not edge identity — so this is where the environment
128
+ * filter (and a stale-edge guard for sources/events) lives, mirroring what
129
+ * the v1 relay does before `onEvent`.
130
+ *
131
+ * A channel with NO resolved subscriptions admits everything the control
132
+ * plane delivered: deploy sources usually come from env vars read at
133
+ * module load, and the hosted freeze bakes hermetically (no customer env),
134
+ * so on a restored pod an env-configured channel resolves empty — the
135
+ * deploy-time edges (bound from the watched repositories) already carry
136
+ * the customer's scope, and refusing here would silently drop every
137
+ * delivery. Same posture as {@link deriveDeploymentEventTypes}: authored
138
+ * subscriptions narrow; an unconfigured channel defers to the deploy scope.
139
+ */
140
+ export function deploymentEventMatchesChannel(
141
+ options: DeploymentsChannelOptions,
142
+ event: DeploymentEvent
143
+ ): boolean {
144
+ const subscriptions = resolveDeploymentSubscriptions(options);
145
+ if (subscriptions.length === 0) {
146
+ return true;
147
+ }
148
+ return subscriptions.some(
149
+ (subscription) =>
150
+ subscription.deploySourceUri === event.deploySourceUri.toLowerCase() &&
151
+ deploymentEventMatches(subscription, event)
152
+ );
81
153
  }
82
154
 
83
155
  /**
@@ -102,6 +174,13 @@ export async function dispatchDeploymentEvent(input: {
102
174
  * have. Nothing is pushed to this deployment and no shared secret exists on
103
175
  * either side.
104
176
  *
177
+ * Hosted v2 deployments do not poll: the control plane fans verified factory
178
+ * deployment events out on `deploy_source` subscription edges — derived from
179
+ * the deploy's watched `repositories`, since factory records deploy sources
180
+ * as Origin repo URLs — and delivers through hosted admission. The attached
181
+ * adapter re-applies this channel's subscription filter — environments are
182
+ * not edge identity — and skips before authored code runs.
183
+ *
105
184
  * The route on this channel exists for local replay (`agent-sdk` and tests):
106
185
  * POST an event body and it runs the same `onEvent`.
107
186
  */
@@ -136,5 +215,35 @@ export function deploymentsChannel(
136
215
  ],
137
216
  });
138
217
  deploymentsChannelOptionsByDefinition.set(definition, options);
218
+ // Hosted v2 delivery: the control plane admits a deployments mailbox item
219
+ // (deploy_source edge match) and posts the claim-checked factory envelope
220
+ // here. Environments are not edge identity, so non-matching environments
221
+ // (and stale-edge sources/events) are filtered to `skip` before authored
222
+ // code runs — the same pre-`onEvent` filter the v1 relay applies.
223
+ attachHostedAdmissionAdapter(definition, {
224
+ kind: DEPLOYMENTS_CHANNEL_KIND,
225
+ dispatch: async ({ payload, args }) => {
226
+ const parsed = deploymentEventSchema.safeParse(payload);
227
+ if (!parsed.success) {
228
+ return Response.json(
229
+ { ok: false, error: "invalid_deployment_event" },
230
+ { status: 400 }
231
+ );
232
+ }
233
+ const event = parsed.data as DeploymentEvent;
234
+ if (!deploymentEventMatchesChannel(options, event)) {
235
+ return withDispatchOutcome(
236
+ Response.json({
237
+ ok: true,
238
+ skipped: true,
239
+ reason: "subscription_mismatch",
240
+ }),
241
+ "skip"
242
+ );
243
+ }
244
+ return dispatchDeploymentEvent({ options, event, args });
245
+ },
246
+ getOutcome: (response) => getDeploymentsDispatchOutcome(response),
247
+ });
139
248
  return definition;
140
249
  }
@@ -54,9 +54,10 @@ export interface DeploymentsChannelOptions {
54
54
  * and then receives nothing. A bare string takes the default environment and
55
55
  * event filters.
56
56
  *
57
- * There is no team-wide subscription: every deploy source is named. At least
58
- * one is required — an empty list is how a consumer *deregisters*, so it
59
- * cannot also mean "everything".
57
+ * There is no team-wide subscription: every deploy source is named. An
58
+ * empty list is how a consumer *deregisters*, so it cannot also mean
59
+ * "everything". A live array that starts empty and is filled later is
60
+ * re-read on each registration heartbeat.
60
61
  */
61
62
  deploySourceUris: readonly (string | DeploymentSubscription)[];
62
63
  /**