@cursor/july 0.1.102 → 0.1.103

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 (715) hide show
  1. package/AGENTS.md +34 -32
  2. package/README.md +10 -12
  3. package/dist/ab.d.ts +1 -1
  4. package/dist/ab.js +1 -1
  5. package/dist/bin/agent-serve.d.ts +12 -12
  6. package/dist/bin/agent-serve.js +114 -36
  7. package/dist/channels/bitbucket/api.d.ts +176 -0
  8. package/dist/channels/bitbucket/api.d.ts.map +1 -0
  9. package/dist/channels/bitbucket/api.js +419 -0
  10. package/dist/channels/bitbucket/binding.d.ts +71 -0
  11. package/dist/channels/bitbucket/binding.d.ts.map +1 -0
  12. package/dist/channels/bitbucket/binding.js +269 -0
  13. package/dist/channels/bitbucket/bitbucket-channel.d.ts +33 -0
  14. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -0
  15. package/dist/channels/bitbucket/bitbucket-channel.js +120 -0
  16. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +61 -0
  17. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -0
  18. package/dist/channels/bitbucket/bitbucket-webhook.js +394 -0
  19. package/dist/channels/bitbucket/checks.d.ts +67 -0
  20. package/dist/channels/bitbucket/checks.d.ts.map +1 -0
  21. package/dist/channels/bitbucket/checks.js +102 -0
  22. package/dist/channels/bitbucket/cursor-account.d.ts +37 -0
  23. package/dist/channels/bitbucket/cursor-account.d.ts.map +1 -0
  24. package/dist/channels/bitbucket/cursor-account.js +65 -0
  25. package/dist/channels/bitbucket/defaults.d.ts +26 -0
  26. package/dist/channels/bitbucket/defaults.d.ts.map +1 -0
  27. package/dist/channels/bitbucket/defaults.js +73 -0
  28. package/dist/channels/bitbucket/events.d.ts +22 -0
  29. package/dist/channels/bitbucket/events.d.ts.map +1 -0
  30. package/dist/channels/bitbucket/events.js +64 -0
  31. package/dist/channels/bitbucket/index.d.ts +34 -0
  32. package/dist/channels/bitbucket/index.d.ts.map +1 -0
  33. package/dist/channels/bitbucket/index.js +33 -0
  34. package/dist/channels/bitbucket/replay.d.ts +63 -0
  35. package/dist/channels/bitbucket/replay.d.ts.map +1 -0
  36. package/dist/channels/bitbucket/replay.js +304 -0
  37. package/dist/channels/bitbucket/state.d.ts +35 -0
  38. package/dist/channels/bitbucket/state.d.ts.map +1 -0
  39. package/dist/channels/bitbucket/state.js +21 -0
  40. package/dist/channels/bitbucket/types.d.ts +229 -0
  41. package/dist/channels/bitbucket/types.d.ts.map +1 -0
  42. package/dist/channels/bitbucket/types.js +1 -0
  43. package/dist/channels/deployments/deployments-channel.d.ts +22 -14
  44. package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
  45. package/dist/channels/deployments/deployments-channel.js +25 -27
  46. package/dist/channels/deployments/types.d.ts +12 -6
  47. package/dist/channels/deployments/types.d.ts.map +1 -1
  48. package/dist/channels/github/binding.d.ts +6 -0
  49. package/dist/channels/github/binding.d.ts.map +1 -1
  50. package/dist/channels/github/binding.js +3 -3
  51. package/dist/channels/github/cursor-account.d.ts +7 -3
  52. package/dist/channels/github/cursor-account.d.ts.map +1 -1
  53. package/dist/channels/github/cursor-account.js +10 -6
  54. package/dist/channels/github/events.d.ts +1 -1
  55. package/dist/channels/github/events.js +1 -1
  56. package/dist/channels/github/forward.d.ts +1 -1
  57. package/dist/channels/github/forward.d.ts.map +1 -1
  58. package/dist/channels/github/forward.js +3 -2
  59. package/dist/channels/github/github-channel.d.ts +29 -39
  60. package/dist/channels/github/github-channel.d.ts.map +1 -1
  61. package/dist/channels/github/github-channel.js +68 -101
  62. package/dist/channels/github/replay.d.ts +1 -1
  63. package/dist/channels/github/replay.js +1 -1
  64. package/dist/channels/github/state.d.ts +2 -0
  65. package/dist/channels/github/state.d.ts.map +1 -1
  66. package/dist/channels/github/state.js +14 -11
  67. package/dist/channels/github/types.d.ts +2 -4
  68. package/dist/channels/github/types.d.ts.map +1 -1
  69. package/dist/channels/gitlab/api.d.ts +91 -0
  70. package/dist/channels/gitlab/api.d.ts.map +1 -0
  71. package/dist/channels/gitlab/api.js +150 -0
  72. package/dist/channels/gitlab/binding.d.ts +58 -0
  73. package/dist/channels/gitlab/binding.d.ts.map +1 -0
  74. package/dist/channels/gitlab/binding.js +139 -0
  75. package/dist/channels/gitlab/checks.d.ts +110 -0
  76. package/dist/channels/gitlab/checks.d.ts.map +1 -0
  77. package/dist/channels/gitlab/checks.js +126 -0
  78. package/dist/channels/gitlab/cursor-account.d.ts +36 -0
  79. package/dist/channels/gitlab/cursor-account.d.ts.map +1 -0
  80. package/dist/channels/gitlab/cursor-account.js +65 -0
  81. package/dist/channels/gitlab/defaults.d.ts +25 -0
  82. package/dist/channels/gitlab/defaults.d.ts.map +1 -0
  83. package/dist/channels/gitlab/defaults.js +60 -0
  84. package/dist/channels/gitlab/events.d.ts +12 -0
  85. package/dist/channels/gitlab/events.d.ts.map +1 -0
  86. package/dist/channels/gitlab/events.js +28 -0
  87. package/dist/channels/gitlab/gitlab-channel.d.ts +33 -0
  88. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -0
  89. package/dist/channels/gitlab/gitlab-channel.js +120 -0
  90. package/dist/channels/gitlab/gitlab-webhook.d.ts +45 -0
  91. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -0
  92. package/dist/channels/gitlab/gitlab-webhook.js +397 -0
  93. package/dist/channels/gitlab/index.d.ts +31 -0
  94. package/dist/channels/gitlab/index.d.ts.map +1 -0
  95. package/dist/channels/gitlab/index.js +30 -0
  96. package/dist/channels/gitlab/replay.d.ts +105 -0
  97. package/dist/channels/gitlab/replay.d.ts.map +1 -0
  98. package/dist/channels/gitlab/replay.js +206 -0
  99. package/dist/channels/gitlab/state.d.ts +33 -0
  100. package/dist/channels/gitlab/state.d.ts.map +1 -0
  101. package/dist/channels/gitlab/state.js +23 -0
  102. package/dist/channels/gitlab/types.d.ts +214 -0
  103. package/dist/channels/gitlab/types.d.ts.map +1 -0
  104. package/dist/channels/gitlab/types.js +1 -0
  105. package/dist/channels/origin/api.d.ts.map +1 -1
  106. package/dist/channels/origin/api.js +4 -2
  107. package/dist/channels/origin/origin-channel.d.ts +4 -9
  108. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  109. package/dist/channels/origin/origin-channel.js +8 -48
  110. package/dist/channels/origin/types.d.ts +20 -2
  111. package/dist/channels/origin/types.d.ts.map +1 -1
  112. package/dist/channels/slack/eval-directive.d.ts.map +1 -1
  113. package/dist/channels/slack/eval-directive.js +1 -7
  114. package/dist/channels/slack/init.d.ts.map +1 -1
  115. package/dist/channels/slack/init.js +3 -3
  116. package/dist/channels/slack/setup.d.ts +1 -1
  117. package/dist/channels/slack/setup.d.ts.map +1 -1
  118. package/dist/channels/slack/setup.js +6 -13
  119. package/dist/channels/slack/types.d.ts +1 -1
  120. package/dist/channels/slack/types.d.ts.map +1 -1
  121. package/dist/channels.d.ts +1 -1
  122. package/dist/channels.d.ts.map +1 -1
  123. package/dist/client.d.ts +1 -1
  124. package/dist/client.js +1 -1
  125. package/dist/connections.d.ts +1 -1
  126. package/dist/connections.js +1 -1
  127. package/dist/docs/404.html +2 -2
  128. package/dist/docs/ab.html +4 -4
  129. package/dist/docs/assets/{app.CLA03RCz.js → app.DW9pXkpL.js} +1 -1
  130. package/dist/docs/assets/chunks/@localSearchIndexroot.nrl1ifBq.js +1 -0
  131. package/dist/docs/assets/chunks/{VPLocalSearchBox.ifxv-cJV.js → VPLocalSearchBox.CdEIUwDg.js} +1 -1
  132. package/dist/docs/assets/chunks/{theme.DWCwM6p-.js → theme.YZMHgPgg.js} +2 -2
  133. package/dist/docs/assets/concepts.md.DgEcZOfT.js +1 -0
  134. package/dist/docs/assets/{concepts.md.rPzW2HZN.lean.js → concepts.md.DgEcZOfT.lean.js} +1 -1
  135. package/dist/docs/assets/{evals.md.CPzDAwoH.js → evals.md.CbMoebP1.js} +1 -1
  136. package/dist/docs/assets/guides_cloud-agents.md.DS8RIjwx.js +9 -0
  137. package/dist/docs/assets/{guides_github.md.BtPr9GaP.js → guides_github.md.DKYiT9do.js} +1 -1
  138. package/dist/docs/assets/{guides_opentelemetry.md.BVTXDCRg.js → guides_opentelemetry.md.COh9jFVg.js} +7 -8
  139. package/dist/docs/assets/{guides_opentelemetry.md.BVTXDCRg.lean.js → guides_opentelemetry.md.COh9jFVg.lean.js} +1 -1
  140. package/dist/docs/assets/{index.md.Kiht7ell.js → index.md.D75GWhPl.js} +1 -1
  141. package/dist/docs/assets/{reference_agent-config.md.BHeYMgme.js → reference_agent-config.md.CHNpiyp4.js} +3 -3
  142. package/dist/docs/assets/{reference_channels.md.Cd2f2iyV.js → reference_channels.md.Dz8Cnudp.js} +2 -2
  143. package/dist/docs/assets/{reference_channels.md.Cd2f2iyV.lean.js → reference_channels.md.Dz8Cnudp.lean.js} +1 -1
  144. package/dist/docs/assets/{reference_cli.md.DfoeyvL0.js → reference_cli.md.CJNc_xYK.js} +1 -1
  145. package/dist/docs/assets/{reference_extensions.md.9WQMZe1l.js → reference_extensions.md.DykHW3qL.js} +11 -5
  146. package/dist/docs/assets/reference_extensions.md.DykHW3qL.lean.js +1 -0
  147. package/dist/docs/assets/reference_hooks.md.Ddt5DdgJ.js +73 -0
  148. package/dist/docs/assets/{reference_hooks.md.a8BJxMR5.lean.js → reference_hooks.md.Ddt5DdgJ.lean.js} +1 -1
  149. package/dist/docs/assets/{reference_playground.md.DnX5nL-B.js → reference_playground.md.4myJPxrf.js} +1 -1
  150. package/dist/docs/assets/{reference_project-layout.md.CA6QP6Lw.js → reference_project-layout.md.DuBu9a96.js} +2 -2
  151. package/dist/docs/assets/reference_result.md.BK5SxDrf.js +19 -0
  152. package/dist/docs/assets/reference_result.md.BK5SxDrf.lean.js +1 -0
  153. package/dist/docs/assets/{reference_sessions.md.NxFP_CAC.js → reference_sessions.md.CueyOHSL.js} +1 -1
  154. package/dist/docs/assets/{reference_sessions.md.NxFP_CAC.lean.js → reference_sessions.md.CueyOHSL.lean.js} +1 -1
  155. package/dist/docs/assets/{reference_tools.md.B1up2r9W.js → reference_tools.md.aGrn99hP.js} +1 -1
  156. package/dist/docs/assets/skills_framework-map.md.haibFyoB.js +1 -0
  157. package/dist/docs/assets/{skills_otel.md.CgiZryR3.js → skills_otel.md.CqhobH3B.js} +3 -3
  158. package/dist/docs/assets/{skills_otel.md.CgiZryR3.lean.js → skills_otel.md.CqhobH3B.lean.js} +1 -1
  159. package/dist/docs/assets/{templates_pr-autofixer.md.x5zl6-GT.js → templates_pr-autofixer.md.Bds_XWcV.js} +2 -2
  160. package/dist/docs/assets/{templates_pr-autofixer.md.x5zl6-GT.lean.js → templates_pr-autofixer.md.Bds_XWcV.lean.js} +1 -1
  161. package/dist/docs/building-with-agents.html +4 -4
  162. package/dist/docs/concepts.html +5 -5
  163. package/dist/docs/concepts.md +2 -4
  164. package/dist/docs/deployment.html +4 -4
  165. package/dist/docs/design/runtime-abstraction.md +2 -3
  166. package/dist/docs/evals.html +6 -6
  167. package/dist/docs/evals.md +9 -7
  168. package/dist/docs/guides/agent-to-agent.html +4 -4
  169. package/dist/docs/guides/cloud-agents.html +6 -6
  170. package/dist/docs/guides/cloud-agents.md +4 -6
  171. package/dist/docs/guides/convert-automation.html +4 -4
  172. package/dist/docs/guides/github.html +6 -6
  173. package/dist/docs/guides/github.md +0 -1
  174. package/dist/docs/guides/human-in-the-loop.html +4 -4
  175. package/dist/docs/guides/mcp-oauth.html +5 -5
  176. package/dist/docs/guides/opentelemetry.html +10 -11
  177. package/dist/docs/guides/opentelemetry.md +41 -17
  178. package/dist/docs/guides/slack.html +4 -4
  179. package/dist/docs/guides/webhooks.html +4 -4
  180. package/dist/docs/hashmap.json +1 -1
  181. package/dist/docs/hillclimbing.html +4 -4
  182. package/dist/docs/index.html +6 -6
  183. package/dist/docs/index.md +2 -2
  184. package/dist/docs/llms-full.txt +501 -262
  185. package/dist/docs/llms.txt +2 -2
  186. package/dist/docs/quickstart.html +4 -4
  187. package/dist/docs/reference/agent-config.html +8 -8
  188. package/dist/docs/reference/agent-config.md +6 -10
  189. package/dist/docs/reference/artifacts.html +5 -5
  190. package/dist/docs/reference/channels.html +6 -6
  191. package/dist/docs/reference/channels.md +18 -8
  192. package/dist/docs/reference/cli.html +5 -5
  193. package/dist/docs/reference/cli.md +3 -4
  194. package/dist/docs/reference/connections.html +4 -4
  195. package/dist/docs/reference/extensions.html +16 -10
  196. package/dist/docs/reference/extensions.md +86 -22
  197. package/dist/docs/reference/hooks.html +69 -10
  198. package/dist/docs/reference/hooks.md +215 -46
  199. package/dist/docs/reference/http-api.html +4 -4
  200. package/dist/docs/reference/instructions.html +4 -4
  201. package/dist/docs/reference/playground.html +5 -5
  202. package/dist/docs/reference/playground.md +3 -0
  203. package/dist/docs/reference/project-layout.html +6 -6
  204. package/dist/docs/reference/project-layout.md +2 -1
  205. package/dist/docs/reference/prompt.html +4 -4
  206. package/dist/docs/reference/result.html +45 -0
  207. package/dist/docs/reference/result.md +89 -0
  208. package/dist/docs/reference/schedules.html +4 -4
  209. package/dist/docs/reference/sessions.html +5 -5
  210. package/dist/docs/reference/sessions.md +3 -1
  211. package/dist/docs/reference/skills.html +4 -4
  212. package/dist/docs/reference/subagents.html +4 -4
  213. package/dist/docs/reference/tools.html +5 -5
  214. package/dist/docs/reference/tools.md +1 -2
  215. package/dist/docs/scaffolding-agents.html +4 -4
  216. package/dist/docs/skills/ab.html +4 -4
  217. package/dist/docs/skills/create-agent.html +4 -4
  218. package/dist/docs/skills/debug.html +4 -4
  219. package/dist/docs/skills/evals.html +4 -4
  220. package/dist/docs/skills/framework-map.html +5 -5
  221. package/dist/docs/skills/framework-map.md +3 -1
  222. package/dist/docs/skills/github.html +4 -4
  223. package/dist/docs/skills/hillclimb.html +4 -4
  224. package/dist/docs/skills/index.html +4 -4
  225. package/dist/docs/skills/mcp-auth.html +4 -4
  226. package/dist/docs/skills/otel.html +7 -7
  227. package/dist/docs/skills/otel.md +8 -3
  228. package/dist/docs/skills/setup-slack.html +4 -4
  229. package/dist/docs/storage.html +4 -4
  230. package/dist/docs/templates/agentic-owners.html +4 -4
  231. package/dist/docs/templates/agents-md.html +4 -4
  232. package/dist/docs/templates/code-wiki.html +4 -4
  233. package/dist/docs/templates/demo.html +4 -4
  234. package/dist/docs/templates/pr-autofixer.html +6 -6
  235. package/dist/docs/templates/pr-autofixer.md +0 -3
  236. package/dist/docs/templates/security-help.html +4 -4
  237. package/dist/docs/templates/security-reviewer.html +4 -4
  238. package/dist/docs/templates/triage.html +4 -4
  239. package/dist/docs/troubleshooting.html +4 -4
  240. package/dist/evals.d.ts +1 -1
  241. package/dist/evals.d.ts.map +1 -1
  242. package/dist/extensions.d.ts +20 -7
  243. package/dist/extensions.d.ts.map +1 -1
  244. package/dist/extensions.js +36 -5
  245. package/dist/files.d.ts +16 -3
  246. package/dist/files.d.ts.map +1 -1
  247. package/dist/files.js +16 -3
  248. package/dist/index.d.ts +4 -4
  249. package/dist/index.d.ts.map +1 -1
  250. package/dist/index.js +3 -3
  251. package/dist/internal/ab-snapshot.d.ts.map +1 -1
  252. package/dist/internal/ab-snapshot.js +0 -1
  253. package/dist/internal/advertise-tools.d.ts.map +1 -1
  254. package/dist/internal/advertise-tools.js +1 -3
  255. package/dist/internal/authored-alias-hooks.d.ts +4 -13
  256. package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
  257. package/dist/internal/authored-alias-hooks.js +4 -20
  258. package/dist/internal/authored-loaders.d.ts +2 -3
  259. package/dist/internal/authored-loaders.d.ts.map +1 -1
  260. package/dist/internal/authored-loaders.js +6 -20
  261. package/dist/internal/channel-dispatch.d.ts +43 -0
  262. package/dist/internal/channel-dispatch.d.ts.map +1 -0
  263. package/dist/internal/channel-dispatch.js +77 -0
  264. package/dist/internal/chat-client.d.ts +1 -1
  265. package/dist/internal/chat-client.js +1 -1
  266. package/dist/internal/cli-ax.d.ts +5 -5
  267. package/dist/internal/cli-ax.d.ts.map +1 -1
  268. package/dist/internal/cli-ax.js +5 -5
  269. package/dist/internal/cli-bitbucket.d.ts +33 -0
  270. package/dist/internal/cli-bitbucket.d.ts.map +1 -0
  271. package/dist/internal/cli-bitbucket.js +359 -0
  272. package/dist/internal/cli-convert-automation.d.ts +1 -1
  273. package/dist/internal/cli-convert-automation.js +2 -2
  274. package/dist/internal/cli-cursor.d.ts +1 -1
  275. package/dist/internal/cli-cursor.d.ts.map +1 -1
  276. package/dist/internal/cli-cursor.js +2 -4
  277. package/dist/internal/cli-deploy.d.ts.map +1 -1
  278. package/dist/internal/cli-deploy.js +2 -6
  279. package/dist/internal/cli-github.d.ts +1 -1
  280. package/dist/internal/cli-github.js +3 -3
  281. package/dist/internal/cli-gitlab.d.ts +37 -0
  282. package/dist/internal/cli-gitlab.d.ts.map +1 -0
  283. package/dist/internal/cli-gitlab.js +380 -0
  284. package/dist/internal/cli-mcp.d.ts.map +1 -1
  285. package/dist/internal/cli-mcp.js +2 -6
  286. package/dist/internal/cli-slack.d.ts +1 -1
  287. package/dist/internal/cli-slack.d.ts.map +1 -1
  288. package/dist/internal/cli-slack.js +2 -4
  289. package/dist/internal/continuation-channel.d.ts +14 -0
  290. package/dist/internal/continuation-channel.d.ts.map +1 -1
  291. package/dist/internal/continuation-channel.js +56 -3
  292. package/dist/internal/continuation-identity.d.ts +14 -15
  293. package/dist/internal/continuation-identity.d.ts.map +1 -1
  294. package/dist/internal/continuation-identity.js +182 -7
  295. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  296. package/dist/internal/conversation-mirror.js +4 -3
  297. package/dist/internal/convert-automation/types.d.ts +1 -1
  298. package/dist/internal/convert-automation/types.js +1 -1
  299. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  300. package/dist/internal/cursor/account-mcp.js +1 -3
  301. package/dist/internal/cursor/backend-client.d.ts +5 -4
  302. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  303. package/dist/internal/cursor/backend-client.js +5 -6
  304. package/dist/internal/cursor/bound-secret-file.d.ts +56 -0
  305. package/dist/internal/cursor/bound-secret-file.d.ts.map +1 -0
  306. package/dist/internal/cursor/bound-secret-file.js +88 -0
  307. package/dist/internal/cursor/credentials.d.ts +39 -5
  308. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  309. package/dist/internal/cursor/credentials.js +58 -8
  310. package/dist/internal/cursor/hosted-bound-secrets.d.ts +41 -0
  311. package/dist/internal/cursor/hosted-bound-secrets.d.ts.map +1 -0
  312. package/dist/internal/cursor/hosted-bound-secrets.js +54 -0
  313. package/dist/internal/cursor/hosted-deployment-secrets.d.ts +19 -5
  314. package/dist/internal/cursor/hosted-deployment-secrets.d.ts.map +1 -1
  315. package/dist/internal/cursor/hosted-deployment-secrets.js +29 -9
  316. package/dist/internal/cursor/hosted-store-secrets.d.ts +1 -1
  317. package/dist/internal/cursor/hosted-store-secrets.js +1 -1
  318. package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
  319. package/dist/internal/cursor-account-mcp-auth.js +2 -4
  320. package/dist/internal/cursor-deployment-relay.d.ts +6 -2
  321. package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
  322. package/dist/internal/cursor-deployment-relay.js +13 -9
  323. package/dist/internal/deploy-manifest.d.ts +1 -1
  324. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  325. package/dist/internal/deploy-manifest.js +1 -1
  326. package/dist/internal/discovery/ab.d.ts +1 -1
  327. package/dist/internal/discovery/ab.d.ts.map +1 -1
  328. package/dist/internal/discovery/ab.js +21 -9
  329. package/dist/internal/discovery/agent.d.ts +6 -1
  330. package/dist/internal/discovery/agent.d.ts.map +1 -1
  331. package/dist/internal/discovery/agent.js +65 -116
  332. package/dist/internal/discovery/channels.d.ts +1 -1
  333. package/dist/internal/discovery/channels.d.ts.map +1 -1
  334. package/dist/internal/discovery/channels.js +14 -14
  335. package/dist/internal/discovery/connections.d.ts +1 -5
  336. package/dist/internal/discovery/connections.d.ts.map +1 -1
  337. package/dist/internal/discovery/connections.js +30 -44
  338. package/dist/internal/discovery/cursor-plugin.d.ts.map +1 -1
  339. package/dist/internal/discovery/cursor-plugin.js +1 -3
  340. package/dist/internal/discovery/extension-overlay.d.ts +32 -0
  341. package/dist/internal/discovery/extension-overlay.d.ts.map +1 -0
  342. package/dist/internal/discovery/extension-overlay.js +191 -0
  343. package/dist/internal/discovery/extensions.d.ts +11 -2
  344. package/dist/internal/discovery/extensions.d.ts.map +1 -1
  345. package/dist/internal/discovery/extensions.js +211 -74
  346. package/dist/internal/discovery/hooks.d.ts +1 -1
  347. package/dist/internal/discovery/hooks.d.ts.map +1 -1
  348. package/dist/internal/discovery/hooks.js +15 -2
  349. package/dist/internal/discovery/info.d.ts.map +1 -1
  350. package/dist/internal/discovery/info.js +7 -1
  351. package/dist/internal/discovery/modules.d.ts.map +1 -1
  352. package/dist/internal/discovery/modules.js +8 -2
  353. package/dist/internal/discovery/names.d.ts +1 -1
  354. package/dist/internal/discovery/names.d.ts.map +1 -1
  355. package/dist/internal/discovery/names.js +1 -0
  356. package/dist/internal/discovery/project.d.ts +0 -2
  357. package/dist/internal/discovery/project.d.ts.map +1 -1
  358. package/dist/internal/discovery/project.js +64 -10
  359. package/dist/internal/discovery/runtime.d.ts.map +1 -1
  360. package/dist/internal/discovery/runtime.js +1 -2
  361. package/dist/internal/discovery/schedules.d.ts +1 -1
  362. package/dist/internal/discovery/schedules.d.ts.map +1 -1
  363. package/dist/internal/discovery/schedules.js +23 -2
  364. package/dist/internal/discovery/services.d.ts +6 -2
  365. package/dist/internal/discovery/services.d.ts.map +1 -1
  366. package/dist/internal/discovery/services.js +31 -1
  367. package/dist/internal/discovery/skills.d.ts +1 -6
  368. package/dist/internal/discovery/skills.d.ts.map +1 -1
  369. package/dist/internal/discovery/skills.js +8 -3
  370. package/dist/internal/discovery/subagent.d.ts +3 -0
  371. package/dist/internal/discovery/subagent.d.ts.map +1 -1
  372. package/dist/internal/discovery/subagent.js +109 -0
  373. package/dist/internal/discovery.d.ts +1 -2
  374. package/dist/internal/discovery.d.ts.map +1 -1
  375. package/dist/internal/discovery.js +1 -2
  376. package/dist/internal/distribution.d.ts +10 -27
  377. package/dist/internal/distribution.d.ts.map +1 -1
  378. package/dist/internal/distribution.js +25 -73
  379. package/dist/internal/docs-site.js +1 -1
  380. package/dist/internal/eval-run-store.d.ts +0 -1
  381. package/dist/internal/eval-run-store.d.ts.map +1 -1
  382. package/dist/internal/eval-runner.d.ts.map +1 -1
  383. package/dist/internal/framework-file-storage.d.ts +8 -0
  384. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  385. package/dist/internal/framework-file-storage.js +8 -8
  386. package/dist/internal/github-fanout.d.ts +1 -1
  387. package/dist/internal/github-fanout.js +1 -1
  388. package/dist/internal/guest-network.d.ts +101 -0
  389. package/dist/internal/guest-network.d.ts.map +1 -0
  390. package/dist/internal/guest-network.js +304 -0
  391. package/dist/internal/host-otel.d.ts +3 -3
  392. package/dist/internal/host-otel.d.ts.map +1 -1
  393. package/dist/internal/host-otel.js +8 -4
  394. package/dist/internal/hosted-admission-adapter.d.ts +8 -7
  395. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  396. package/dist/internal/hosted-delivery-protocol.d.ts +6 -0
  397. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  398. package/dist/internal/hosted-delivery-protocol.js +18 -5
  399. package/dist/internal/hosted-delivery.d.ts +18 -0
  400. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  401. package/dist/internal/hosted-delivery.js +248 -118
  402. package/dist/internal/http-channel.d.ts.map +1 -1
  403. package/dist/internal/http-channel.js +1 -3
  404. package/dist/internal/init-interview.d.ts.map +1 -1
  405. package/dist/internal/init-interview.js +1 -3
  406. package/dist/internal/init-project.d.ts +2 -2
  407. package/dist/internal/init-project.js +2 -2
  408. package/dist/internal/inline-stdio-define-stub.d.ts +1 -1
  409. package/dist/internal/inline-stdio-define-stub.d.ts.map +1 -1
  410. package/dist/internal/inline-stdio-define-stub.js +1 -1
  411. package/dist/internal/is-record.d.ts +2 -0
  412. package/dist/internal/is-record.d.ts.map +1 -0
  413. package/dist/internal/is-record.js +3 -0
  414. package/dist/internal/json-schema.d.ts.map +1 -1
  415. package/dist/internal/json-schema.js +18 -10
  416. package/dist/internal/local-control-plane.d.ts +1 -2
  417. package/dist/internal/local-control-plane.d.ts.map +1 -1
  418. package/dist/internal/local-control-plane.js +3 -20
  419. package/dist/internal/mcp-endpoint.d.ts.map +1 -1
  420. package/dist/internal/mcp-endpoint.js +1 -3
  421. package/dist/internal/otel/collector.d.ts +12 -3
  422. package/dist/internal/otel/collector.d.ts.map +1 -1
  423. package/dist/internal/otel/collector.js +77 -125
  424. package/dist/internal/otel/config.d.ts +0 -2
  425. package/dist/internal/otel/config.d.ts.map +1 -1
  426. package/dist/internal/otel/config.js +17 -20
  427. package/dist/internal/otel/http.d.ts +2 -0
  428. package/dist/internal/otel/http.d.ts.map +1 -1
  429. package/dist/internal/otel/http.js +7 -1
  430. package/dist/internal/otel/mcp.d.ts.map +1 -1
  431. package/dist/internal/otel/mcp.js +3 -16
  432. package/dist/internal/otel/runtime.d.ts +26 -1
  433. package/dist/internal/otel/runtime.d.ts.map +1 -1
  434. package/dist/internal/otel/runtime.js +164 -15
  435. package/dist/internal/package-inline-stdio.d.ts.map +1 -1
  436. package/dist/internal/package-inline-stdio.js +3 -11
  437. package/dist/internal/playground/toolchain.d.ts +1 -1
  438. package/dist/internal/playground/toolchain.d.ts.map +1 -1
  439. package/dist/internal/playground/toolchain.js +1 -1
  440. package/dist/internal/request-error-status.d.ts +12 -0
  441. package/dist/internal/request-error-status.d.ts.map +1 -0
  442. package/dist/internal/request-error-status.js +52 -0
  443. package/dist/internal/resolve-prod-target.d.ts +1 -1
  444. package/dist/internal/resolve-prod-target.d.ts.map +1 -1
  445. package/dist/internal/resolve-prod-target.js +3 -7
  446. package/dist/internal/result-output.d.ts +18 -0
  447. package/dist/internal/result-output.d.ts.map +1 -0
  448. package/dist/internal/result-output.js +33 -0
  449. package/dist/internal/run-client.d.ts +2 -2
  450. package/dist/internal/run-client.js +2 -2
  451. package/dist/internal/runtime-dispatch-runner.d.ts +1 -11
  452. package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
  453. package/dist/internal/runtime-dispatch-runner.js +2 -15
  454. package/dist/internal/sdk-runner.d.ts.map +1 -1
  455. package/dist/internal/sdk-runner.js +3 -6
  456. package/dist/internal/server.d.ts.map +1 -1
  457. package/dist/internal/server.js +110 -35
  458. package/dist/internal/session-cost.d.ts +3 -3
  459. package/dist/internal/session-cost.d.ts.map +1 -1
  460. package/dist/internal/session-cost.js +3 -3
  461. package/dist/internal/session-engine.d.ts +26 -11
  462. package/dist/internal/session-engine.d.ts.map +1 -1
  463. package/dist/internal/session-engine.js +146 -76
  464. package/dist/internal/session-run-log.d.ts.map +1 -1
  465. package/dist/internal/session-run-log.js +1 -3
  466. package/dist/internal/skills-sync.d.ts +1 -4
  467. package/dist/internal/skills-sync.d.ts.map +1 -1
  468. package/dist/internal/skills-sync.js +10 -50
  469. package/dist/internal/sleep.d.ts +2 -0
  470. package/dist/internal/sleep.d.ts.map +1 -0
  471. package/dist/internal/sleep.js +3 -0
  472. package/dist/internal/store-mirror.d.ts +29 -0
  473. package/dist/internal/store-mirror.d.ts.map +1 -0
  474. package/dist/internal/store-mirror.js +70 -0
  475. package/dist/internal/tenant-slack/relay.d.ts +73 -0
  476. package/dist/internal/tenant-slack/relay.d.ts.map +1 -0
  477. package/dist/internal/tenant-slack/relay.js +138 -0
  478. package/dist/internal/testing/scm-continuation-fixtures.d.ts +33 -0
  479. package/dist/internal/testing/scm-continuation-fixtures.d.ts.map +1 -0
  480. package/dist/internal/testing/scm-continuation-fixtures.js +253 -0
  481. package/dist/internal/workspace-sync.d.ts +22 -0
  482. package/dist/internal/workspace-sync.d.ts.map +1 -0
  483. package/dist/internal/workspace-sync.js +49 -0
  484. package/dist/internal/workspace.d.ts +7 -0
  485. package/dist/internal/workspace.d.ts.map +1 -1
  486. package/dist/internal/workspace.js +13 -0
  487. package/dist/otel.d.ts +23 -1
  488. package/dist/otel.d.ts.map +1 -1
  489. package/dist/otel.js +93 -2
  490. package/dist/playground/assets/index-59KvgREd.js +67 -0
  491. package/dist/playground/assets/index-MbMxXg-y.css +1 -0
  492. package/dist/playground/index.html +2 -2
  493. package/dist/result.d.ts +24 -0
  494. package/dist/result.d.ts.map +1 -0
  495. package/dist/result.js +27 -0
  496. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  497. package/dist/storage-backends/cursor-hosted.js +7 -4
  498. package/dist/storage-protocol.d.ts.map +1 -1
  499. package/dist/storage-protocol.js +1 -3
  500. package/dist/types.d.ts +90 -23
  501. package/dist/types.d.ts.map +1 -1
  502. package/docs/README.md +2 -2
  503. package/docs/concepts.md +2 -4
  504. package/docs/design/runtime-abstraction.md +2 -3
  505. package/docs/evals.md +9 -7
  506. package/docs/guides/cloud-agents.md +4 -6
  507. package/docs/guides/github.md +0 -1
  508. package/docs/guides/opentelemetry.md +41 -17
  509. package/docs/reference/agent-config.md +6 -10
  510. package/docs/reference/channels.md +18 -8
  511. package/docs/reference/cli.md +3 -4
  512. package/docs/reference/extensions.md +87 -23
  513. package/docs/reference/hooks.md +215 -46
  514. package/docs/reference/playground.md +3 -0
  515. package/docs/reference/project-layout.md +2 -1
  516. package/docs/reference/result.md +94 -0
  517. package/docs/reference/sessions.md +3 -1
  518. package/docs/reference/tools.md +1 -2
  519. package/docs/templates/pr-autofixer.md +0 -3
  520. package/package.json +29 -10
  521. package/skills/framework-map/SKILL.md +3 -1
  522. package/skills/otel/SKILL.md +8 -3
  523. package/src/ab.ts +1 -1
  524. package/src/bin/agent-serve.ts +121 -21
  525. package/src/channels/bitbucket/api.ts +623 -0
  526. package/src/channels/bitbucket/binding.ts +414 -0
  527. package/src/channels/bitbucket/bitbucket-channel.ts +182 -0
  528. package/src/channels/bitbucket/bitbucket-webhook.ts +576 -0
  529. package/src/channels/bitbucket/checks.ts +154 -0
  530. package/src/channels/bitbucket/cursor-account.ts +117 -0
  531. package/src/channels/bitbucket/defaults.ts +110 -0
  532. package/src/channels/bitbucket/events.ts +84 -0
  533. package/src/channels/bitbucket/index.ts +49 -0
  534. package/src/channels/bitbucket/replay.ts +439 -0
  535. package/src/channels/bitbucket/state.ts +59 -0
  536. package/src/channels/bitbucket/types.ts +266 -0
  537. package/src/channels/deployments/deployments-channel.ts +25 -43
  538. package/src/channels/deployments/types.ts +12 -6
  539. package/src/channels/github/binding.ts +8 -1
  540. package/src/channels/github/cursor-account.ts +17 -6
  541. package/src/channels/github/events.ts +1 -1
  542. package/src/channels/github/forward.ts +3 -2
  543. package/src/channels/github/github-channel.ts +74 -221
  544. package/src/channels/github/replay.ts +1 -1
  545. package/src/channels/github/state.ts +6 -0
  546. package/src/channels/github/types.ts +2 -5
  547. package/src/channels/gitlab/api.ts +228 -0
  548. package/src/channels/gitlab/binding.ts +233 -0
  549. package/src/channels/gitlab/checks.ts +243 -0
  550. package/src/channels/gitlab/cursor-account.ts +114 -0
  551. package/src/channels/gitlab/defaults.ts +93 -0
  552. package/src/channels/gitlab/events.ts +44 -0
  553. package/src/channels/gitlab/gitlab-channel.ts +176 -0
  554. package/src/channels/gitlab/gitlab-webhook.ts +555 -0
  555. package/src/channels/gitlab/index.ts +43 -0
  556. package/src/channels/gitlab/replay.ts +347 -0
  557. package/src/channels/gitlab/state.ts +55 -0
  558. package/src/channels/gitlab/types.ts +263 -0
  559. package/src/channels/origin/api.ts +4 -2
  560. package/src/channels/origin/origin-channel.ts +19 -94
  561. package/src/channels/origin/types.ts +23 -2
  562. package/src/channels/slack/eval-directive.ts +1 -6
  563. package/src/channels/slack/init.ts +6 -3
  564. package/src/channels/slack/setup.ts +7 -6
  565. package/src/channels/slack/types.ts +1 -1
  566. package/src/channels.ts +0 -1
  567. package/src/client.ts +1 -1
  568. package/src/connections.ts +1 -1
  569. package/src/evals.ts +1 -1
  570. package/src/extensions.ts +47 -5
  571. package/src/files.ts +21 -3
  572. package/src/index.ts +20 -28
  573. package/src/internal/ab-snapshot.ts +0 -3
  574. package/src/internal/advertise-tools.ts +1 -4
  575. package/src/internal/authored-alias-hooks.ts +4 -21
  576. package/src/internal/authored-loaders.ts +6 -23
  577. package/src/internal/channel-dispatch.ts +160 -0
  578. package/src/internal/chat-client.ts +1 -1
  579. package/src/internal/cli-ax.ts +5 -5
  580. package/src/internal/cli-bitbucket.ts +477 -0
  581. package/src/internal/cli-convert-automation.ts +7 -7
  582. package/src/internal/cli-cursor.ts +2 -5
  583. package/src/internal/cli-deploy.ts +2 -8
  584. package/src/internal/cli-github.ts +3 -3
  585. package/src/internal/cli-gitlab.ts +485 -0
  586. package/src/internal/cli-mcp.ts +2 -7
  587. package/src/internal/cli-slack.ts +2 -5
  588. package/src/internal/continuation-channel.ts +82 -1
  589. package/src/internal/continuation-identity.ts +229 -11
  590. package/src/internal/conversation-mirror.ts +4 -3
  591. package/src/internal/convert-automation/types.ts +1 -1
  592. package/src/internal/cursor/account-mcp.ts +1 -4
  593. package/src/internal/cursor/backend-client.ts +9 -10
  594. package/src/internal/cursor/bound-secret-file.ts +108 -0
  595. package/src/internal/cursor/credentials.ts +75 -10
  596. package/src/internal/cursor/hosted-bound-secrets.ts +75 -0
  597. package/src/internal/cursor/hosted-deployment-secrets.ts +42 -11
  598. package/src/internal/cursor/hosted-store-secrets.ts +1 -1
  599. package/src/internal/cursor-account-mcp-auth.ts +2 -5
  600. package/src/internal/cursor-deployment-relay.ts +11 -7
  601. package/src/internal/deploy-manifest.ts +4 -2
  602. package/src/internal/discovery/ab.ts +29 -9
  603. package/src/internal/discovery/agent.ts +94 -135
  604. package/src/internal/discovery/channels.ts +15 -13
  605. package/src/internal/discovery/connections.ts +55 -50
  606. package/src/internal/discovery/cursor-plugin.ts +1 -4
  607. package/src/internal/discovery/extension-overlay.ts +274 -0
  608. package/src/internal/discovery/extensions.ts +330 -105
  609. package/src/internal/discovery/hooks.ts +20 -2
  610. package/src/internal/discovery/info.ts +7 -0
  611. package/src/internal/discovery/modules.ts +8 -2
  612. package/src/internal/discovery/names.ts +2 -1
  613. package/src/internal/discovery/project.ts +80 -9
  614. package/src/internal/discovery/runtime.ts +1 -2
  615. package/src/internal/discovery/schedules.ts +28 -2
  616. package/src/internal/discovery/services.ts +37 -1
  617. package/src/internal/discovery/skills.ts +13 -3
  618. package/src/internal/discovery/subagent.ts +107 -0
  619. package/src/internal/discovery.ts +0 -2
  620. package/src/internal/distribution.ts +35 -83
  621. package/src/internal/docs-site.ts +1 -1
  622. package/src/internal/eval-run-store.ts +0 -7
  623. package/src/internal/eval-runner.ts +0 -1
  624. package/src/internal/framework-file-storage.ts +8 -8
  625. package/src/internal/github-fanout.ts +1 -1
  626. package/src/internal/guest-network.ts +383 -0
  627. package/src/internal/host-otel.ts +8 -4
  628. package/src/internal/hosted-admission-adapter.ts +8 -8
  629. package/src/internal/hosted-delivery-protocol.ts +26 -1
  630. package/src/internal/hosted-delivery.ts +376 -192
  631. package/src/internal/http-channel.ts +1 -4
  632. package/src/internal/init-interview.ts +1 -4
  633. package/src/internal/init-project.ts +2 -2
  634. package/src/internal/inline-stdio-define-stub.ts +1 -1
  635. package/src/internal/is-record.ts +3 -0
  636. package/src/internal/json-schema.ts +19 -10
  637. package/src/internal/local-control-plane.ts +5 -24
  638. package/src/internal/mcp-endpoint.ts +1 -4
  639. package/src/internal/otel/collector.ts +94 -159
  640. package/src/internal/otel/config.ts +10 -14
  641. package/src/internal/otel/http.ts +14 -1
  642. package/src/internal/otel/mcp.ts +3 -16
  643. package/src/internal/otel/runtime.ts +240 -25
  644. package/src/internal/package-inline-stdio.ts +3 -12
  645. package/src/internal/playground/toolchain.ts +1 -1
  646. package/src/internal/request-error-status.ts +72 -0
  647. package/src/internal/resolve-prod-target.ts +3 -8
  648. package/src/internal/result-output.ts +34 -0
  649. package/src/internal/run-client.ts +2 -2
  650. package/src/internal/runtime-dispatch-runner.ts +3 -21
  651. package/src/internal/sdk-runner.ts +3 -7
  652. package/src/internal/server.ts +153 -44
  653. package/src/internal/session-cost.ts +3 -3
  654. package/src/internal/session-engine.ts +182 -74
  655. package/src/internal/session-run-log.ts +1 -4
  656. package/src/internal/skills-sync.ts +13 -63
  657. package/src/internal/sleep.ts +3 -0
  658. package/src/internal/store-mirror.ts +86 -0
  659. package/src/internal/tenant-slack/relay.ts +179 -0
  660. package/src/internal/testing/scm-continuation-fixtures.ts +286 -0
  661. package/src/internal/workspace-sync.ts +55 -0
  662. package/src/internal/workspace.ts +14 -0
  663. package/src/otel.ts +143 -3
  664. package/src/result.ts +36 -0
  665. package/src/storage-backends/cursor-hosted.ts +7 -4
  666. package/src/storage-protocol.ts +1 -4
  667. package/src/types.ts +105 -34
  668. package/templates/triage/agent/lib/types.ts +0 -2
  669. package/dist/continuation.d.ts +0 -20
  670. package/dist/continuation.d.ts.map +0 -1
  671. package/dist/continuation.js +0 -18
  672. package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +0 -1
  673. package/dist/docs/assets/concepts.md.rPzW2HZN.js +0 -1
  674. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.js +0 -9
  675. package/dist/docs/assets/guides_cloud-runtime.md.BRirbRAN.js +0 -9
  676. package/dist/docs/assets/guides_cloud-runtime.md.BRirbRAN.lean.js +0 -1
  677. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +0 -1
  678. package/dist/docs/assets/reference_hooks.md.a8BJxMR5.js +0 -14
  679. package/dist/docs/assets/skills_framework-map.md.DDa4MeEW.js +0 -1
  680. package/dist/docs/guides/cloud-runtime.html +0 -35
  681. package/dist/docs/guides/cloud-runtime.md +0 -117
  682. package/dist/internal/convert-automation/index.d.ts +0 -3
  683. package/dist/internal/convert-automation/index.d.ts.map +0 -1
  684. package/dist/internal/convert-automation/index.js +0 -1
  685. package/dist/internal/grokbot/runner.d.ts +0 -64
  686. package/dist/internal/grokbot/runner.d.ts.map +0 -1
  687. package/dist/internal/grokbot/runner.js +0 -282
  688. package/dist/internal/managed-delivery.d.ts +0 -80
  689. package/dist/internal/managed-delivery.d.ts.map +0 -1
  690. package/dist/internal/managed-delivery.js +0 -86
  691. package/dist/internal/review-comments.d.ts +0 -370
  692. package/dist/internal/review-comments.d.ts.map +0 -1
  693. package/dist/internal/review-comments.js +0 -921
  694. package/dist/internal/shallow-clone.d.ts +0 -176
  695. package/dist/internal/shallow-clone.d.ts.map +0 -1
  696. package/dist/internal/shallow-clone.js +0 -419
  697. package/dist/playground/assets/index-B6C9S9nG.css +0 -1
  698. package/dist/playground/assets/index-ZqNoT8Ie.js +0 -69
  699. package/docs/guides/cloud-runtime.md +0 -122
  700. package/src/continuation.ts +0 -49
  701. package/src/internal/convert-automation/index.ts +0 -10
  702. package/src/internal/grokbot/runner.ts +0 -370
  703. package/src/internal/managed-delivery.ts +0 -125
  704. package/src/internal/review-comments.ts +0 -1363
  705. package/src/internal/shallow-clone.ts +0 -609
  706. /package/dist/docs/assets/{evals.md.CPzDAwoH.lean.js → evals.md.CbMoebP1.lean.js} +0 -0
  707. /package/dist/docs/assets/{guides_cloud-agents.md.DumwWXba.lean.js → guides_cloud-agents.md.DS8RIjwx.lean.js} +0 -0
  708. /package/dist/docs/assets/{guides_github.md.BtPr9GaP.lean.js → guides_github.md.DKYiT9do.lean.js} +0 -0
  709. /package/dist/docs/assets/{index.md.Kiht7ell.lean.js → index.md.D75GWhPl.lean.js} +0 -0
  710. /package/dist/docs/assets/{reference_agent-config.md.BHeYMgme.lean.js → reference_agent-config.md.CHNpiyp4.lean.js} +0 -0
  711. /package/dist/docs/assets/{reference_cli.md.DfoeyvL0.lean.js → reference_cli.md.CJNc_xYK.lean.js} +0 -0
  712. /package/dist/docs/assets/{reference_playground.md.DnX5nL-B.lean.js → reference_playground.md.4myJPxrf.lean.js} +0 -0
  713. /package/dist/docs/assets/{reference_project-layout.md.CA6QP6Lw.lean.js → reference_project-layout.md.DuBu9a96.lean.js} +0 -0
  714. /package/dist/docs/assets/{reference_tools.md.B1up2r9W.lean.js → reference_tools.md.aGrn99hP.lean.js} +0 -0
  715. /package/dist/docs/assets/{skills_framework-map.md.DDa4MeEW.lean.js → skills_framework-map.md.haibFyoB.lean.js} +0 -0
@@ -506,6 +506,7 @@ name. For example, `agent/tools/get_weather.ts` creates a tool named
506
506
  | `agent/host-connections/<name>.ts` | Privileged MCP servers for host tools only |
507
507
  | `agent/channels/*.ts` | HTTP, Slack, and GitHub entry points |
508
508
  | `agent/ab.ts` or `agent/ab/*.ts` | Sticky variants and live performance metrics |
509
+ | `agent/result.ts` | Optional host `commit` on the final assistant text |
509
510
  | `evals/**/*.eval.ts` | Repeatable checks at the project root |
510
511
 
511
512
  Other folders add subagents, extensions, hooks, schedules, and workspace
@@ -581,7 +582,7 @@ Choose a runtime in `agent/agent.ts`:
581
582
  | Approvals (`needsApproval`) | Supported | Not supported (local runtime only) |
582
583
  | Agent tool scripts | Supported | Supported |
583
584
  | Skills | Added to the session workspace | Available automatically |
584
- | Seeded files | Added to the session workspace | Ignored |
585
+ | Seeded files | Added to the session workspace | Available in a shared directory the first prompt names |
585
586
  | Repository | You provide it | The cloud agent checks it out |
586
587
 
587
588
  Use the local runtime when the host has the tools and files the agent
@@ -589,8 +590,6 @@ needs. Use the cloud runtime when each turn needs an isolated repository
589
590
  checkout. `agent-sdk validate` warns when a cloud agent uses a
590
591
  local-only capability.
591
592
 
592
- See [Cloud runtime](/docs/guides/cloud-runtime.md) for setup and trade-offs.
593
-
594
593
  ## What files can a local session access?
595
594
 
596
595
  Each local session gets its own workspace. The Agent SDK writes the
@@ -638,7 +637,6 @@ See [Agent-to-agent](/docs/guides/agent-to-agent.md) for a complete example.
638
637
  - [Sessions and streaming](/docs/reference/sessions.md)
639
638
  - [Channels](/docs/reference/channels.md)
640
639
  - [Live A/B metrics](/docs/ab.md)
641
- - [Cloud runtime](/docs/guides/cloud-runtime.md)
642
640
 
643
641
  ---
644
642
 
@@ -1100,8 +1098,8 @@ Source: /docs/design/runtime-abstraction.md
1100
1098
  > until this document has been reviewed.
1101
1099
  > **Audience:** Agent SDK and cursor-sdk maintainers; change-monitor as the
1102
1100
  > first consumer that is already faking a third runtime.
1103
- > **Companions:** [cloud-runtime.md](/docs/guides/cloud-runtime.md) (today's
1104
- > user-facing contract),
1101
+ > **Companions:** [agent-config.md](/docs/reference/agent-config.md#choose-a-runtime)
1102
+ > (today's user-facing contract),
1105
1103
  > [factory/change-monitor/docs/tools.md](https://github.com/cursor/cursor/blob/main/factory/change-monitor/docs/tools.md)
1106
1104
  > (why change-monitor is pinned to local),
1107
1105
  > [factory/change-monitor/docs/computer-use.md](https://github.com/cursor/cursor/blob/main/factory/change-monitor/docs/computer-use.md)
@@ -2699,7 +2697,6 @@ sandbox })`, next to `cloudRuntime({ repos })`. Sibling
2699
2697
  | Page | Change |
2700
2698
  |---|---|
2701
2699
  | [reference/agent-config.md](/docs/reference/agent-config.md) | `runtime` type becomes constructors **or** the deprecated string. Table + "Choose a runtime" show `localRuntime(opts)` / `cloudRuntime(opts)` / `virtualRuntime(fs)` first. Move cwd / sandbox / workspaceDir onto the `localRuntime` section. Mark sibling `local` / `cloud` and string `runtime` deprecated. |
2702
- | [guides/cloud-runtime.md](/docs/guides/cloud-runtime.md) | Open with `cloudRuntime({ repos })`. Keep `runtime: "cloud"` as the still-supported form. Cloud is a turn host, not a filesystem. Hybrid is `send({ runtime: cloudRuntime(opts) })`; local overlay is `send({ runtime: localRuntime(opts) })`. `send({ cloud })` / `send({ workspaceDir })` deprecated. |
2703
2700
  | [concepts.md](/docs/concepts.md) | Local vs cloud table: same facts, constructor names. Add one line that `virtualRuntime` is local-with-your-files, not a third host. |
2704
2701
 
2705
2702
  **New page**
@@ -3009,17 +3006,19 @@ Drive the agent with `t.send(message, options?)`. It runs one turn and
3009
3006
  waits for the session to park or fail. Multiple sends in one case share
3010
3007
  the session, which is how you write multi-turn evals.
3011
3008
 
3012
- Each `t.send` resolves to a turn result with `message`, `sessionId`,
3013
- `events`, `toolCalls`, `ok`, and `index`. The turn carries the same
3014
- assertion vocabulary as `t`, scoped to that turn, so you can grade an
3015
- intermediate turn before the next send overwrites `t.reply`.
3016
- `turn.expectOk()` throws when the turn failed, for later steps that
3017
- depend on it.
3009
+ Each `t.send` resolves to a turn result with `message`,
3010
+ `sessionId`, `events`, `toolCalls`, `ok`, and `index`. The turn carries
3011
+ the same assertion vocabulary as `t`, scoped to that turn, so you can
3012
+ grade an intermediate turn before the next send overwrites `t.reply`.
3013
+ `turn.expectOk()` throws when the turn failed, for later
3014
+ steps that depend on it.
3018
3015
 
3019
3016
  Read the full case state with `t.reply` (the last assistant text),
3020
3017
  `t.events` (session events captured so far), `t.turns` (settled
3021
3018
  turns, oldest first), and `t.sessionId`. `t.signal` aborts when the
3022
- case hits its timeout; pass it to your own async work.
3019
+ case hits its timeout; pass it to your own async work. A thrown
3020
+ [turn result](/docs/reference/result.md) `commit` fails the turn, so
3021
+ `t.succeeded()` fails too.
3023
3022
 
3024
3023
  Assert with the gates:
3025
3024
 
@@ -3448,7 +3447,8 @@ questions in the meantime. A Slack triage agent turns a bug report into
3448
3447
  a PR, a planner fans a refactor out across repositories, a reviewer asks
3449
3448
  a cloud agent to address its own comments.
3450
3449
 
3451
- This is different from the [cloud runtime](/docs/guides/cloud-runtime.md). The
3450
+ This is different from
3451
+ [`runtime: "cloud"`](/docs/reference/agent-config.md#choose-a-runtime). The
3452
3452
  runtime moves *this* agent's turns onto a cloud VM. The extension keeps
3453
3453
  the agent where it is and lets it start *other* cloud agents.
3454
3454
 
@@ -3473,9 +3473,8 @@ Launches run under the host's signed-in account (`agent-sdk login` or
3473
3473
  repositories the agent may target, and keep approval on when you can't.
3474
3474
 
3475
3475
  Mount it on an agent that runs on the local runtime; that is where
3476
- launches park for approval. On the
3477
- [cloud runtime](/docs/guides/cloud-runtime.md#what-changes-on-cloud) approvals
3478
- don't resolve.
3476
+ launches park for approval. On the cloud runtime approvals don't
3477
+ resolve.
3479
3478
 
3480
3479
  ## What the agent can do
3481
3480
 
@@ -3529,130 +3528,6 @@ Continue with these pages:
3529
3528
  overrides work
3530
3529
  - [Human-in-the-loop approvals](/docs/guides/human-in-the-loop.md): where parked
3531
3530
  launches get approved
3532
- - [Cloud runtime](/docs/guides/cloud-runtime.md): run the agent's own turns on
3533
- cloud agents instead
3534
-
3535
- ---
3536
-
3537
- Source: /docs/guides/cloud-runtime.md
3538
-
3539
- # Cloud runtime
3540
-
3541
- By default, turns execute on the Cursor SDK's local harness, on the same
3542
- machine as the server. Set `runtime: "cloud"` and turns execute on
3543
- Cursor cloud agents instead. They're ephemeral VMs that carry a repo
3544
- checkout, run `gh`, `git`, and tests for real, and scale past what one
3545
- host's disk and CPU can do. The serve host keeps handling routing, host
3546
- preparation, sessions, and bookkeeping.
3547
-
3548
- A canonical use is a PR driver whose triage runs on cloud VMs. The
3549
- patterns in this guide come from running one against real PR traffic.
3550
-
3551
- ## When to switch
3552
-
3553
- A guideline from running PR agents at scale: per-PR worktrees on the serve host
3554
- don't scale to hundreds of engineers opening PRs. When the job needs a
3555
- repo checkout at scale, use cloud. The signals:
3556
-
3557
- - The agent must run repo commands (tests, builds, `git`) against many
3558
- different refs concurrently.
3559
- - Turns are long and heavy, and you don't want them competing with the
3560
- server for resources.
3561
- - The work product is a PR or branch the VM can push, not a local file.
3562
-
3563
- Stay local when the agent is conversational, tool-driven against APIs,
3564
- or works over host-prepared evidence. Local turns are cheaper, start
3565
- faster, and support the full authored surface.
3566
-
3567
- ## Configure it
3568
-
3569
- Cloud runtime is two fields on the agent config.
3570
-
3571
- ```ts
3572
- import { defineAgent } from "@cursor/july";
3573
-
3574
- export default defineAgent({
3575
- runtime: "cloud",
3576
- cloud: {
3577
- repos: [{ url: "https://github.com/org/repo", startingRef: "main" }],
3578
- // env / envVars / … forwarded to the Cursor SDK
3579
- },
3580
- });
3581
- ```
3582
-
3583
- The host must be signed in (`agent-sdk login` or `CURSOR_API_KEY`).
3584
-
3585
- > [!IMPORTANT]
3586
- > Cloud agents run against the Cursor backend under the signed-in
3587
- > account, and every wake spends real cloud-agent budget. Decide
3588
- > explicitly what may trigger one.
3589
-
3590
- ## What changes on cloud
3591
-
3592
- Cloud turns run on a VM without your authored files, so the runtime
3593
- mapping shifts:
3594
-
3595
- | Folder or file | Local runtime | Cloud runtime |
3596
- | --- | --- | --- |
3597
- | `instructions.*` | `AGENTS.md` in the session workspace | prepended to the first prompt |
3598
- | Server tools (`execution: "server"`) | in-process SDK custom tools | authenticated HTTP MCP back to the AgentSDK host, when `--public-url` or `--cloud-tools-url` is set |
3599
- | Agent tools (`execution: "agent"`) | scripts in the session workspace | catalog + script bodies on the first prompt |
3600
- | `skills/*` | `.cursor/skills/` in the workspace | native discovery after the first turn, from the hosted store or the signed-in account |
3601
- | `mcp-connections/*.ts` | SDK `mcpServers` | SDK `mcpServers` (peers need `--public-url`) |
3602
- | `host-connections/*.ts` | `ctx.host.mcp` only | `ctx.host.mcp` only |
3603
- | `sandbox/workspace/**` | seeded into the session workspace | ignored |
3604
- | Tool approvals (`needsApproval`) | supported | not supported; keep approval-gated tools on local turns |
3605
-
3606
- Authored skills are discovered natively after the first cloud turn,
3607
- using the hosted store or the signed-in account.
3608
-
3609
- Approvals are a local-runtime contract. On cloud, a `needsApproval` tool
3610
- call rides one HTTP MCP request from the VM, and a parked call would
3611
- hold that request open until it times out; there is no durable approval
3612
- flow for cloud turns.
3613
-
3614
- Peer MCP connections need `--public-url` for cloud turns. Without one,
3615
- peers are omitted and the server warns at startup.
3616
-
3617
- ## Hybrid: local agent, cloud sessions
3618
-
3619
- A local-runtime agent can still open cloud-attached sessions per send.
3620
- Channel handlers may pass a `cloud` block (repos pinned to a PR ref, say)
3621
- in `send` options, and Slack handlers may return `cloud` from a mention
3622
- hook. A PR driver works this way: chat stays local, and the `drive`
3623
- flow attaches the PR to a cloud VM. The agent-level `cloud` config is the
3624
- base that per-session options merge over.
3625
-
3626
- ## Patterns that hold up
3627
-
3628
- These come from running a PR driver against real PR traffic:
3629
-
3630
- - One cloud session per unit of work, keyed with a stable continuation
3631
- token (`pr:owner/repo#N`) so every wake lands on the same conversation.
3632
- - Keep the host deterministic: fetch briefs and metadata on the host,
3633
- send the VM a compact prompt, and let the VM re-read source of truth
3634
- with its own `gh` and `git` instead of trusting payload snapshots.
3635
- - Limit exposure: add repository allowlists on webhook channels,
3636
- because every wake spends the account's budget.
3637
-
3638
- ## Verify cloud agents
3639
-
3640
- `agent-sdk run` and `eval` work unchanged. The trajectory records the
3641
- same event vocabulary plus `agent.bound` with the cloud URL, so you can
3642
- open the cloud conversation for any session. Cloud turns take minutes.
3643
- Pass generous `--timeout-ms` values, and keep curl timeouts long when
3644
- driving channels directly.
3645
-
3646
- ## What's next
3647
-
3648
- Continue with these pages:
3649
-
3650
- - [Agent config](/docs/reference/agent-config.md): the `runtime` and
3651
- `cloud` fields
3652
- - [GitHub guide](/docs/guides/github.md): the webhook patterns that pair with
3653
- cloud triage
3654
- - [Cursor cloud agents](/docs/guides/cloud-agents.md): keep the agent local and
3655
- let it launch cloud agents instead
3656
3531
 
3657
3532
  ---
3658
3533
 
@@ -4106,7 +3981,6 @@ key. Handlers you author replace the matching defaults (same as
4106
3981
  - [Webhooks and custom channels](/docs/guides/webhooks.md): the HTTP mechanism under
4107
3982
  this pack
4108
3983
  - [Evals](/docs/evals.md): turn replay snapshots into regression fixtures
4109
- - [Cloud runtime](/docs/guides/cloud-runtime.md): attach PRs to cloud VMs
4110
3984
  - [Hooks](/docs/reference/hooks.md): observe-only; use channel `progress` for
4111
3985
  GitHub surfaces
4112
3986
 
@@ -4424,7 +4298,7 @@ Source: /docs/guides/opentelemetry.md
4424
4298
  Agent SDK can push traces, metrics, and logs from the serve process to
4425
4299
  an OTLP collector you run. Point the process at the collector with
4426
4300
  standard `OTEL_EXPORTER_OTLP_*` env, or author `agent/otel.ts`. Traces
4427
- cover the inbound request, the session, each turn, and every tool call.
4301
+ cover the inbound request, each turn, and every tool call.
4428
4302
 
4429
4303
  Export is opt-in. Nothing leaves the process until you set an endpoint
4430
4304
  or a `defineOtel` config.
@@ -4433,7 +4307,7 @@ or a `defineOtel` config.
4433
4307
 
4434
4308
  | Signal | Default | What you get |
4435
4309
  | --- | --- | --- |
4436
- | Traces | on | `agent_sdk.http` `agent_sdk.session` `agent_sdk.turn` → `agent_sdk.tool` / `agent_sdk.subagent` |
4310
+ | Traces | on | `agent_sdk.http` (per request) and `agent_sdk.turn` → `agent_sdk.tool` / `agent_sdk.subagent` |
4437
4311
  | Metrics | on | `cursor.token.usage`, `cursor.tool.calls`, `cursor.cost.usage`, plus `agent_sdk.*` session and turn counts |
4438
4312
  | Logs | off | Session events as log records. Prompt text, tool payloads, and failure messages stay off unless you opt in |
4439
4313
 
@@ -4505,7 +4379,17 @@ destination with `signals: ["traces"]`.
4505
4379
 
4506
4380
  You can also pass the same object to `serve(dir, { otel })`. Precedence
4507
4381
  is `serve({ otel })` over `agent/otel.ts` over env. An empty
4508
- `defineOtel()` still enables export when `OTEL_EXPORTER_OTLP_*` is set.
4382
+ `defineOtel()` still records traces; export starts when
4383
+ `OTEL_EXPORTER_OTLP_*` or a factory-returned `exporters` list appears.
4384
+
4385
+ Hosted v2 binds deployment secrets after bake, onto the already-listening
4386
+ process. Pass a factory so flush can re-read them. Spans record from
4387
+ bake; the hosted handler flush constructs the OTLP client and sends the
4388
+ queued batch.
4389
+
4390
+ ```ts
4391
+ export default defineOtel(() => resolveMyOtelConfig());
4392
+ ```
4509
4393
 
4510
4394
  The companion skill is [`skills/otel/SKILL.md`](/docs/skills/otel.md).
4511
4395
 
@@ -4513,17 +4397,23 @@ The companion skill is [`skills/otel/SKILL.md`](/docs/skills/otel.md).
4513
4397
 
4514
4398
  ```text
4515
4399
  agent_sdk.http inbound channel request (W3C traceparent)
4516
- └─ agent_sdk.session cursor.conversation.id = session id
4517
- └─ agent_sdk.turn
4518
- ├─ agent_sdk.tool
4519
- └─ agent_sdk.subagent
4520
- └─ agent_sdk.tool
4400
+ agent_sdk.turn one root per turn (`agent_sdk.session_id` = session id)
4401
+ ├─ agent_sdk.tool
4402
+ └─ agent_sdk.subagent
4403
+ └─ agent_sdk.tool
4521
4404
  ```
4522
4405
 
4523
- Inbound HTTP extracts W3C `traceparent`, so a channel request parents
4524
- the session span when the turn starts in that request. Turns that
4525
- resume after restore, or a direct `callTool` with no `turn.started` in
4526
- this process, open a synthetic turn span so tool calls still nest.
4406
+ Conversational sessions stay on `session.waiting` and can take more
4407
+ turns, so there is no `agent_sdk.session` span it would never end
4408
+ and OTel only exports ended spans. Each turn is its own root. Inbound
4409
+ HTTP is a separate SERVER span (it extracts W3C `traceparent`) and
4410
+ does not parent the turn, so the turn tree can export when the turn
4411
+ ends. Hosted flush ends that SERVER span before the one-shot export so
4412
+ `agent_sdk.http` is in the same batch.
4413
+
4414
+ Turns that resume after restore, or a direct `callTool` with no
4415
+ `turn.started` in this process, open a synthetic turn span so tool
4416
+ calls still nest.
4527
4417
 
4528
4418
  ## Which attributes land on the wire?
4529
4419
 
@@ -4534,6 +4424,12 @@ Every signal carries these resource attributes:
4534
4424
  - `cursor.surface=unspecified`
4535
4425
  - `agent_sdk.framework=@cursor/july`
4536
4426
 
4427
+ Span attributes (not process resource attributes — one serve process
4428
+ handles many sessions):
4429
+
4430
+ - `agent_sdk.session_id` / `cursor.conversation.id`: the session id.
4431
+ Search all turns for one conversation with `@agent_sdk.session_id`.
4432
+
4537
4433
  Shared names (same keys as enterprise export):
4538
4434
 
4539
4435
  - `cursor.conversation.id`: the session id
@@ -4544,22 +4440,24 @@ Shared names (same keys as enterprise export):
4544
4440
  `cursor.tool.status`
4545
4441
  - `cursor.cost.usage` (USD)
4546
4442
 
4547
- Agent SDK only (`agent_sdk.*`): agent name, turn id, channel, call id,
4548
- subagent name, session mode, and HTTP duration (`agent_sdk.http.duration`).
4443
+ Agent SDK only (`agent_sdk.*`): session id, agent name, turn id, channel,
4444
+ call id, subagent name, session mode, and HTTP duration
4445
+ (`agent_sdk.http.duration`).
4549
4446
 
4550
4447
  ## How do I emit my own metrics?
4551
4448
 
4552
4449
  `ctx.host.otel` is always present on tools, hooks, and channel
4553
4450
  handlers. Counters and histograms no-op when no meter is running.
4554
- `setAttributes` still tags the open session when a collector is
4451
+ `setAttributes` still tags open turn/tool spans when a collector is
4555
4452
  attached.
4556
4453
 
4557
4454
  Prefix metric names with your team or agent. First-party names
4558
4455
  (`cursor.token.usage`, `cursor.tool.calls`, `cursor.cost.usage`,
4559
4456
  `agent_sdk.session.count`, `agent_sdk.turn.count`,
4560
4457
  `agent_sdk.subagent.count`, `agent_sdk.http.duration`) and join keys
4561
- (`cursor.conversation.id`, `agent_sdk.agent`, `agent_sdk.turn_id`,
4562
- `agent_sdk.framework`) are reserved. Custom spans are not on this
4458
+ (`cursor.conversation.id`, `agent_sdk.session_id`, `agent_sdk.agent`,
4459
+ `agent_sdk.turn_id`, `agent_sdk.framework`) are reserved. Custom spans
4460
+ are not on this
4563
4461
  surface.
4564
4462
 
4565
4463
  ```ts
@@ -5569,8 +5467,6 @@ npx @cursor/july docs
5569
5467
  on hosted deployments (`--store`).
5570
5468
  - [Agent-to-agent](/docs/guides/agent-to-agent.md): every agent is an MCP
5571
5469
  server; agents can delegate to each other.
5572
- - [Cloud runtime](/docs/guides/cloud-runtime.md): run turns on Cursor cloud
5573
- agents instead of the local harness.
5574
5470
  - [Cursor cloud agents](/docs/guides/cloud-agents.md): let the agent launch
5575
5471
  and steer cloud agents through the `cursor-cloud-agents` extension.
5576
5472
  - [OpenTelemetry](/docs/guides/opentelemetry.md): push session, turn, and
@@ -5597,6 +5493,8 @@ npx @cursor/july docs
5597
5493
  - [Channels](/docs/reference/channels.md) ·
5598
5494
  [Schedules and reminders](/docs/reference/schedules.md) ·
5599
5495
  [Hooks](/docs/reference/hooks.md) ·
5496
+ [Artifacts](/docs/reference/artifacts.md) ·
5497
+ [Turn result](/docs/reference/result.md) ·
5600
5498
  [Sessions and streaming](/docs/reference/sessions.md) ·
5601
5499
  [Playground](/docs/reference/playground.md)
5602
5500
  - [CLI](/docs/reference/cli.md) · [HTTP API](/docs/reference/http-api.md)
@@ -6074,11 +5972,10 @@ the first prompt, because the local session workspace is not the cloud
6074
5972
  VM.
6075
5973
 
6076
5974
  `validate` warns when `runtime: "cloud"` is combined with agent tools
6077
- or sandbox seeds (they only materialize into local session workspaces),
6078
- when skills are present (they sync onto an Agent Store for native
6079
- discovery rather than the session workspace), and when the `cloud`
6080
- block is missing. The full capability matrix and the patterns that hold
6081
- up are in the [Cloud runtime guide](/docs/guides/cloud-runtime.md).
5975
+ (they are described on the first prompt instead of written to the VM),
5976
+ when skills or sandbox seeds are present (they sync onto an Agent Store
5977
+ rather than the session workspace), and when the `cloud` block is
5978
+ missing.
6082
5979
 
6083
5980
  ## Local options
6084
5981
 
@@ -6164,9 +6061,8 @@ set `local: { sandbox: true }`.
6164
6061
  Cloud agent defaults forwarded to the Cursor SDK: `repos` (each
6165
6062
  `{ url, startingRef? }`), environment selection, `envVars`, and the
6166
6063
  rest. A local agent uses the same block as the base config when a
6167
- channel opens a cloud-attached session per send. That hybrid pattern is
6168
- covered in
6169
- [Cloud runtime](/docs/guides/cloud-runtime.md#hybrid-local-agent-cloud-sessions).
6064
+ channel opens a cloud-attached session per send (the `cloud` option on
6065
+ [`send`](/docs/reference/channels.md#handler-arguments)).
6170
6066
 
6171
6067
  ## Concurrency
6172
6068
 
@@ -6243,8 +6139,6 @@ Continue with these pages:
6243
6139
 
6244
6140
  - [Instructions](/docs/reference/instructions.md): the required half of a minimal
6245
6141
  agent
6246
- - [Cloud runtime](/docs/guides/cloud-runtime.md): when and how to leave
6247
- the host
6248
6142
  - [CLI](/docs/reference/cli.md): the `serve` flags `serve()` accepts
6249
6143
 
6250
6144
  ---
@@ -6507,8 +6401,10 @@ The `events` map subscribes the channel to stream events for the
6507
6401
  sessions it owns. Keys are event types from the
6508
6402
  [event vocabulary](/docs/reference/sessions.md#which-events-can-i-stream), or `"*"`.
6509
6403
  Handlers receive `(event, channel, ctx)`, where `channel.state` is the
6510
- per-session adapter state and `ctx` exposes session info and host
6511
- services. This is where a channel delivers replies back to its surface.
6404
+ per-session adapter state, `ctx.session` is the session info, and
6405
+ `ctx.host` is the shared host services, bound to that session as in a
6406
+ [hook](/docs/reference/hooks.md#handler-context). This is where a channel delivers
6407
+ replies back to its surface.
6512
6408
 
6513
6409
  ## State and lifecycle
6514
6410
 
@@ -6581,13 +6477,21 @@ converge a merge-box check and sticky PR comment from default stream
6581
6477
  events. Guide: [GitHub](/docs/guides/github.md).
6582
6478
 
6583
6479
  **Deployments** (`@cursor/july/channels/deployments`): pull deploy
6584
- events. Subscribe per deploy source with `deploySourceUris`, narrow
6585
- with `environments` / `events`, and handle each event in `onEvent`.
6586
- `deploySourceUris` must match `Deployment.deploy_source_uri` as your
6480
+ events. Declare `events` and handle each one in `onEvent`. Each event
6481
+ carries `deploySourceUri` and `deployVersion`. Author
6482
+ `agent/channels/deployments.ts` with `deploymentsChannel()`.
6483
+
6484
+ Omit `deploySourceUris` on hosted v2. The control plane binds
6485
+ `deploy_source` edges from the deploy's watched `repositories` and the
6486
+ channel admits what it is sent, which is what makes it multi-tenant
6487
+ safe.
6488
+
6489
+ Name sources to narrow below that scope, or to drive the self-hosted
6490
+ pull relay, which has no deploy scope to inherit. There, subscribe per
6491
+ deploy source with `deploySourceUris` and narrow with `environments` /
6492
+ `events`. Each entry must match `Deployment.deploy_source_uri` as your
6587
6493
  deployment writer records it; matching is case-insensitive but
6588
- otherwise literal. Each event carries `deploySourceUri` and
6589
- `deployVersion`. Author `agent/channels/deployments.ts` with
6590
- `deploymentsChannel()`. It uses the host credential. A restart resumes
6494
+ otherwise literal. It uses the host credential. A restart resumes
6591
6495
  rather than dropping events. An empty `deploySourceUris` list mounts
6592
6496
  the channel but starts no pull, so an env-configured agent stays inert
6593
6497
  until its deploy sources are set.
@@ -6619,10 +6523,9 @@ Source: /docs/reference/cli.md
6619
6523
 
6620
6524
  # CLI reference
6621
6525
 
6622
- `@cursor/july` installs `july` (so `npx @cursor/july docs` works) and
6623
- `agent-sdk`. The examples on this page use `agent-sdk`. Run the CLI with
6624
- Node 22.13 or newer. Don't run it with Bun; Bun corrupts tool-result
6625
- streams from the Cursor SDK.
6526
+ `@cursor/july` installs one command, `agent-sdk`; `npx @cursor/july <cmd>`
6527
+ runs it. Run the CLI with Node 22.13 or newer. Don't run it with Bun; Bun
6528
+ corrupts tool-result streams from the Cursor SDK.
6626
6529
 
6627
6530
  `agent-sdk help` prints the built-in summary. The Slack and GitHub packs
6628
6531
  also provide `agent-sdk slack help` and `agent-sdk github help`.
@@ -7897,11 +7800,16 @@ Source: /docs/reference/extensions.md
7897
7800
 
7898
7801
  # Extensions
7899
7802
 
7900
- An extension packages tools and skills an agent installs as one unit. You
7901
- mount it with a single file under `agent/extensions/`, and its
7902
- contributions join the agent under a namespace. The package updates
7903
- like any other dependency; nothing is copied into your project. A Cursor
7904
- plugin mounts the same way; see [Mount a Cursor plugin](#mount-a-cursor-plugin).
7803
+ An extension packages the same contributions an agent authors under
7804
+ `agent/` and installs them as one unit. You mount it with a single file
7805
+ under `agent/extensions/`, and its contributions join the agent under a
7806
+ namespace. The package updates like any other dependency; nothing is
7807
+ copied into your project. A Cursor plugin mounts the same way; see
7808
+ [Mount a Cursor plugin](#mount-a-cursor-plugin).
7809
+
7810
+ Extensions are native to the Agent SDK. Slot files use the `@cursor/july`
7811
+ helpers, so a package built on another agent framework fails
7812
+ `agent-sdk validate` until you rewrite it onto `@cursor/july`.
7905
7813
 
7906
7814
  ## Mount an extension
7907
7815
 
@@ -7928,6 +7836,48 @@ Namespaces follow the tool-name rule, and `__` is reserved: an authored
7928
7836
  `agent/tools/ci__failed_jobs.ts` fails discovery, so nothing outside a
7929
7837
  mount can pose as one of its tools.
7930
7838
 
7839
+ ## What an extension can contribute
7840
+
7841
+ An extension tree uses the same slots as [`agent/`](/docs/reference/project-layout.md).
7842
+ Each shareable contribution lands on the agent under the mount's
7843
+ namespace:
7844
+
7845
+ | Path | Becomes |
7846
+ | --- | --- |
7847
+ | `tools/<name>.ts` | tool `<ns>__<name>` |
7848
+ | `skills/<name>` | skill `<ns>__<name>` |
7849
+ | `mcp-connections/<name>.ts` | connection `<ns>__<name>` |
7850
+ | `host-connections/<name>.ts` | host connection `<ns>__<name>` |
7851
+ | `hooks/<name>.ts` | hook `<ns>__<name>` |
7852
+ | `channels/<name>.ts` | channel `<ns>__<name>` |
7853
+ | `schedules/<name>` | schedule `<ns>__<name>` |
7854
+ | `subagents/<id>/` | subagent `<ns>__<id>` |
7855
+ | `instructions.md` / `.ts` / dir | appended to the agent's system prompt |
7856
+ | `sandbox/workspace/**` | seeded into each local session workspace |
7857
+ | `ab.ts` / `ab/<name>.ts` | A/B experiment `<ns>__<name>` |
7858
+ | `artifacts.ts` | artifact kinds `<ns>__<kind>` |
7859
+
7860
+ The root agent still needs its own `instructions.md`. Extension
7861
+ instructions are extra fragments, not a substitute.
7862
+
7863
+ `httpChannel()` stays on the agent. An extension authors
7864
+ `defineChannel` only; a file named `http.ts` becomes `<ns>__http`.
7865
+
7866
+ These stay on the agent that mounts the extension. Each is a singleton
7867
+ or is outside discovery:
7868
+
7869
+ | Path | Why it stays on the agent |
7870
+ | --- | --- |
7871
+ | `agent.ts` | One `defineAgent` runtime per agent |
7872
+ | `storage.ts` | One `host.kv` / `host.files` backend |
7873
+ | `otel.ts` | One OTLP exporter |
7874
+ | `ab.config.ts` | One experiment-platform config; `ab.ts` / `ab/` still merge |
7875
+ | `playground/` | Custom chips are a Vite glob of the agent tree, not a discovery walk |
7876
+ | `extensions/` | Nested mounts are not loaded |
7877
+ | `sandbox.ts` | Custom sandbox backends stay on the agent |
7878
+
7879
+ `agent-sdk validate` warns when a tree carries those paths.
7880
+
7931
7881
  ## Adjust a mounted extension
7932
7882
 
7933
7883
  To replace or remove a contribution, mount the extension as a directory
@@ -7939,15 +7889,35 @@ agent/extensions/ci/
7939
7889
  ├── tools/
7940
7890
  │ ├── job_log.ts # replaces ci__job_log with your own defineTool
7941
7891
  │ └── retry_job.ts # export default disableTool() removes ci__retry_job
7892
+ ├── hooks/
7893
+ │ └── audit.ts # export default disableHook() removes ci__audit
7942
7894
  └── skills/
7943
- └── triage.md # replaces ci__triage
7895
+ └── triage.ts # export default disableSkill() removes ci__triage
7944
7896
  ```
7945
7897
 
7946
7898
  Use the extension's own names inside the directory, without the
7947
7899
  namespace. A file with a name the extension doesn't contribute adds a
7948
- new tool or skill under the namespace. `disableTool()` comes from
7949
- `@cursor/july/extensions` and fails discovery when it names a tool the
7950
- extension doesn't have, so a typo can't silently keep a tool alive.
7900
+ new contribution under the namespace. Each helper comes from
7901
+ `@cursor/july/extensions` and fails discovery when it names a
7902
+ contribution the extension doesn't have, so a typo can't silently keep
7903
+ it alive.
7904
+
7905
+ | Slot | Helper |
7906
+ | --- | --- |
7907
+ | `tools/<name>.ts` | `disableTool()` |
7908
+ | `mcp-connections/<name>.ts` / `host-connections/<name>.ts` | `disableConnection()` |
7909
+ | `skills/<name>.ts` | `disableSkill()` |
7910
+ | `hooks/<name>.ts` | `disableHook()` |
7911
+ | `channels/<name>.ts` | `disableChannel()` |
7912
+ | `schedules/<name>.ts` | `disableSchedule()` |
7913
+ | `subagents/<id>.ts` | `disableSubagent()` |
7914
+ | `instructions.ts` | `disableInstructions()` |
7915
+ | `ab.ts` / `ab/<name>.ts` | `disableAB()` |
7916
+ | `artifacts.ts` | `disableArtifacts()` |
7917
+
7918
+ `disable()` is the same brand as the slot helpers above and works in
7919
+ any of those files.
7920
+
7951
7921
  A Cursor plugin mount overlays its MCP servers the same way; see below.
7952
7922
 
7953
7923
  ## Mount a Cursor plugin
@@ -8011,8 +7981,8 @@ discovery when it names a server the plugin doesn't declare.
8011
7981
  ## Build an extension
8012
7982
 
8013
7983
  An extension is a directory laid out like `agent/`. `extension.ts`
8014
- declares it; `tools/` and `skills/` hold the contributions in the same
8015
- authoring forms as [Tools](/docs/reference/tools.md) and [Skills](/docs/reference/skills.md).
7984
+ declares it; the slots in [What an extension can contribute](#what-an-extension-can-contribute)
7985
+ use the same authoring forms as the rest of this reference.
8016
7986
 
8017
7987
  ```text
8018
7988
  @acme/ci-triage/
@@ -8024,6 +7994,10 @@ authoring forms as [Tools](/docs/reference/tools.md) and [Skills](/docs/referenc
8024
7994
  │ └── retry_job.ts
8025
7995
  ├── skills/
8026
7996
  │ └── triage.md
7997
+ ├── hooks/
7998
+ │ └── audit.ts
7999
+ ├── mcp-connections/
8000
+ │ └── buildkite.ts
8027
8001
  └── lib/
8028
8002
  └── buildkite.ts # shared code, never discovered
8029
8003
  ```
@@ -8073,17 +8047,10 @@ Because the consumer picks the namespace, have skills and tool
8073
8047
  descriptions refer to sibling tools by their short names and say they
8074
8048
  appear under the mount's namespace (`<namespace>__job_log`).
8075
8049
 
8076
- Publish the built `extension.js` as the package entry point with
8077
- `tools/` and `skills/` beside it. `root` is read from the built file, so
8078
- copy `skills/*.md` into the build output or author skills as `.ts` with
8079
- `defineSkill`.
8080
-
8081
- Only `tools/` and `skills/` are mounted from an extension tree.
8082
- Instructions, connections, hooks, channels, and the runtime
8083
- configuration belong to the agent that mounts the extension;
8084
- `agent-sdk validate` warns when a tree carries agent slots such as
8085
- `instructions.md`, `connections/`, `hooks/`, `channels/`, or
8086
- `schedules/`.
8050
+ Publish the built `extension.js` as the package entry point with the
8051
+ slot directories beside it. `root` is read from the built file, so copy
8052
+ `skills/*.md` and `instructions.md` into the build output or author them
8053
+ as `.ts`.
8087
8054
 
8088
8055
  ## What's next
8089
8056
 
@@ -8102,56 +8069,119 @@ Source: /docs/reference/hooks.md
8102
8069
 
8103
8070
  # Hooks
8104
8071
 
8105
- A hook is an observe-only subscriber to the session event stream. Hooks
8106
- run after each event is recorded. They cannot change the event or the
8107
- turn. That makes them the home for audit logging, metrics, mirroring
8108
- transcripts into your own store, and maintaining derived state. Handler
8109
- errors are logged and never fatal. A hook can't inject context into the
8110
- next turn or block a turn.
8072
+ A hook subscribes to the session event stream and runs a side effect
8073
+ after each event is recorded: an audit line, a metric, a copy of the
8074
+ transcript in your own store, or derived state for later turns. Hooks
8075
+ run in the serving process for every session of the agent, on local and
8076
+ cloud runtime turns alike.
8077
+
8078
+ Hooks observe. They can't change the turn, the prompt, or the reply, and
8079
+ a handler that throws is logged and skipped. Treat the event as
8080
+ read-only; later subscribers see the same object. That makes hooks safe
8081
+ to add to a production agent, and the wrong tool for anything that must
8082
+ happen before the model runs or must fail a turn; see
8083
+ [When not to use a hook](#when-not-to-use-a-hook).
8084
+
8085
+ `defineHook` is unrelated to
8086
+ [Cursor Agent hooks](https://cursor.com/docs/agent/hooks), the
8087
+ `.cursor/hooks.json` scripts that can observe, block, or modify the
8088
+ agent loop. Those still run inside a local session workspace.
8111
8089
 
8112
- For deterministic context composition before the model runs, use the
8113
- host path that already owns the wake: channel handlers (fetch, `callTool`,
8114
- `workspaceFiles`, and the message you pass to `send`), plus
8115
- `instructions.md`, skills, and `sandbox/workspace/` seed files. Hooks
8116
- observe what happened; they do not assemble the prompt.
8090
+ ## Author a hook
8117
8091
 
8118
8092
  Author `agent/hooks/<name>.ts` with `defineHook` from
8119
- `@cursor/july/hooks`:
8093
+ `@cursor/july/hooks`. This one meters tokens:
8120
8094
 
8121
8095
  ```ts
8096
+ // agent/hooks/usage.ts
8122
8097
  import { defineHook } from "@cursor/july/hooks";
8123
8098
 
8124
8099
  export default defineHook({
8125
8100
  events: {
8126
8101
  async "turn.completed"(event, ctx) {
8127
- const prior = await ctx.host.kv.get("last-result");
8128
- const notes = await ctx.host.files.read("notes.md");
8129
- console.log("turn done", ctx.session.id, event.data.usage, prior, notes);
8102
+ if (ctx.session.purpose === "eval" || event.data.usage === undefined) {
8103
+ return;
8104
+ }
8105
+ const { inputTokens, outputTokens } = event.data.usage;
8106
+ ctx.host.otel.increment("acme.tokens.input", inputTokens);
8107
+ ctx.host.otel.increment("acme.tokens.output", outputTokens);
8130
8108
  },
8131
- async "turn.failed"(event, ctx) {
8132
- // page, count, or record
8109
+ async "turn.failed"(_event, ctx) {
8110
+ ctx.host.otel.increment("acme.turn.failed", { channel: ctx.channel.id });
8133
8111
  },
8134
8112
  },
8135
8113
  });
8136
8114
  ```
8137
8115
 
8138
- Keys are event types (see the
8139
- [event vocabulary](/docs/reference/sessions.md#which-events-can-i-stream)), or `"*"`
8140
- for everything. Handlers receive the event with its envelope (`index`,
8141
- `sessionId`, `turnId?`, `at`) and a `HookContext`:
8116
+ Any module under `agent/hooks/`, subfolders included, is a hook named by
8117
+ its path without the extension: `agent/hooks/audit/usage.ts` is
8118
+ `audit/usage`. `*.test.ts` and `*.spec.ts` files are skipped. The
8119
+ default export must be `defineHook(...)`, names can't contain `__`, and
8120
+ an empty `events` map skips the hook with a warning; `agent-sdk validate`
8121
+ reports all three. An extension mounts its hooks as `<ns>__<name>`, and
8122
+ `disableHook()` removes one
8123
+ ([Adjust a mounted extension](/docs/reference/extensions.md#adjust-a-mounted-extension)).
8124
+
8125
+ `agent-sdk init` scaffolds `agent/hooks/memory.ts`, which exports
8126
+ `memoryHook()` from `@cursor/july/memory` and journals every turn for
8127
+ later sessions to read. Delete the file to opt out.
8128
+
8129
+ ## Events and payloads
8130
+
8131
+ Keys are event types from the
8132
+ [event vocabulary](/docs/reference/sessions.md#which-events-can-i-stream), or `"*"`
8133
+ for every event. A typed key narrows `event.data`; a `"*"` handler
8134
+ receives the union, so switch on `event.type`. Every event carries the
8135
+ stream envelope `{ type, index, sessionId, turnId?, at, data }`, with
8136
+ `turnId` set on turn-scoped events.
8137
+
8138
+ The payloads hooks read most often:
8139
+
8140
+ | Event | `event.data` |
8141
+ | --- | --- |
8142
+ | `message.received` | `{ text }` |
8143
+ | `turn.completed` | `{ result?, usage?, cost? }`. `usage` has `inputTokens`, `outputTokens`, `cacheReadTokens`, `cacheWriteTokens`, and optional `reasoningTokens`. `cost` has `totalUsd` and the `model` it was priced against |
8144
+ | `turn.failed` | `{ message }` |
8145
+ | `actions.requested` | `{ calls: [{ callId, toolName, args? }] }`. A call with `parentCallId` belongs to a subagent |
8146
+ | `action.result` | `{ callId, toolName, output?, isError, stubbed? }`. `stubbed` means a dry-run session answered a write without running it |
8147
+
8148
+ The types are `SessionEvent`, `SessionEventType`, and `HookContext`,
8149
+ exported from `@cursor/july`.
8150
+
8151
+ ## Handler context
8142
8152
 
8143
8153
  | Member | What it is |
8144
8154
  | --- | --- |
8145
- | `ctx.session` | Read-only session info: id, channel, mode, auth |
8155
+ | `ctx.session` | Read-only session info: `id`, `channelId`, `mode` (`chat` or `task`), `purpose` (`live` or `eval`), `auth`, plus `title`, `sdkAgentId`, and `abs` when set |
8146
8156
  | `ctx.agent` | `{ name }` of the agent the event belongs to |
8147
- | `ctx.channel` | `{ id, continuationToken }` for the owning channel |
8148
- | `ctx.stateRoot` | The agent's durable state root. Prefer `ctx.host.kv` / `ctx.host.files` for derived state; this tree resets on hosted replace |
8149
- | `ctx.host` | Shared host services; same as a tool's `ctx.host`. Pull JSON with `ctx.host.kv` and file-shaped state with `ctx.host.files` (session-bound by default; pass `{ scope: "deployment" }` for agent-wide files) |
8150
- | `ctx.artifacts` | Session-bound [artifacts](/docs/reference/artifacts.md) facade: `tag` auto-fills the session |
8157
+ | `ctx.channel` | `{ id, continuationToken }`. The token is `null` when the session can't take follow-ups |
8158
+ | `ctx.host.kv` | Durable JSON, shared by every session of the agent; the [storage backend](/docs/storage.md#author-kv-ctx-host-kv) decides whether it survives a hosted replace. Prefix keys with `ctx.session.id` for per-session state |
8159
+ | `ctx.host.files` | Durable files, bound to this session. Pass `{ scope: "deployment" }` for agent-wide files |
8160
+ | `ctx.host.otel` | Counters, histograms, and tags, attributed to this session |
8161
+ | `ctx.host.mcp`, `ctx.host.github`, `ctx.host.slack` | The same shared clients tools get |
8162
+ | `ctx.host.reminders` | Per-session [reminders](/docs/reference/schedules.md), the same API tools get |
8163
+ | `ctx.artifacts` | Session-bound [artifacts](/docs/reference/artifacts.md) facade: `tag` fills in `sessionId` and `turnId` |
8164
+ | `ctx.stateRoot` | Absolute path of the local state root. It resets when a hosted deployment is replaced; keep derived state in `kv` or `files` |
8165
+
8166
+ ## When hooks run
8167
+
8168
+ A hook runs after the event is durably recorded. It never delays the
8169
+ model turn and never sees an event that wasn't recorded.
8151
8170
 
8152
- Hook context includes `ctx.host`, the same shared services a tool
8153
- gets. Persist JSON with `ctx.host.kv` and file-shaped state with
8154
- `ctx.host.files`. Hooks observe; they do not own delivery surfaces.
8171
+ Within one session, events dispatch in order, one at a time: the
8172
+ channel's `events` handlers first, then each hook in discovery order.
8173
+ Sessions don't wait on each other.
8174
+
8175
+ Two consequences:
8176
+
8177
+ - A slow handler holds up the next event's handlers for that session,
8178
+ not the model. Keep handlers short and queue anything slow.
8179
+ - Hooks fire for eval sessions too. Check
8180
+ `ctx.session.purpose === "eval"` before metering or paging.
8181
+
8182
+ Each event reaches a hook at most once. A restart doesn't replay the log
8183
+ into hooks, so a mirror needs no dedupe, and the event log rather than
8184
+ the hook's copy is the source of truth.
8155
8185
 
8156
8186
  ## Hooks, channel events, evals, or A/B?
8157
8187
 
@@ -8159,37 +8189,143 @@ All of them consume the same stream, for different jobs:
8159
8189
 
8160
8190
  | | Hooks | Channel `events` | Evals | A/B (`defineAB`) |
8161
8191
  | --- | --- | --- | --- | --- |
8162
- | Scope | every session on the agent | sessions the channel owns | one test turn | every live session; enrollment at creation, metrics on each turn |
8163
- | Job | observe: audit, metrics, mirrors, derived state | deliver: replies back to the channel's surface | assert: gates over the trajectory | `ab.assigned` + fold stream `onSample` |
8192
+ | Scope | every session of the agent | sessions the channel owns | one test turn | every live session; enrollment at creation, metrics on each turn |
8193
+ | Job | observe: audit, metrics, mirrors, derived state | deliver: replies back to the channel's surface | assert: gates over the trajectory | compare: sticky arms, then fold the stream into `onSample` metrics |
8194
+ | Context | `ctx.host`, `ctx.artifacts`, session info | `channel.state`, `setContinuationToken`, `ctx.host`, session info | the `t` assertion helpers | per-session samples in `onSample` |
8164
8195
  | Can affect the run | no | yes, it owns the surface | n/a | yes through arm instructions or `session.abs`; collection is observe-only |
8165
8196
  | Authored at | `agent/hooks/*.ts` | channel config | `evals/**/*.eval.ts` | [`agent/ab.ts` or `agent/ab/*.ts`](/docs/ab.md) |
8166
8197
 
8167
- For GitHub merge-box checks and sticky PR banners, use
8168
- `githubChannel({ progress: { commitStatus, banner } })` from
8169
- `@cursor/july/channels/github`. That is the supported Autofix-style
8170
- path. See [GitHub: Show PR progress](/docs/guides/github.md#show-pr-progress).
8171
- Override channel `events` only when the lifecycle is custom, such as
8172
- never-red status from tool output. Do not use `defineHook` for those
8173
- writes.
8198
+ ## When not to use a hook
8199
+
8200
+ | You want to | Use instead |
8201
+ | --- | --- |
8202
+ | Add context before the model runs | The channel's `send` message and `workspaceFiles`, `instructions.md`, skills, or `sandbox/workspace/` seed files |
8203
+ | Reply on Slack, comment on a PR, or post any other delivery | The channel's `events` map, or the Slack and GitHub packs |
8204
+ | Show PR progress (merge-box check, sticky banner) | `githubChannel({ progress: { commitStatus, banner } })`; see [Show PR progress](/docs/guides/github.md#show-pr-progress) |
8205
+ | Block, approve, or rewrite a tool call | [`needsApproval`](/docs/reference/tools.md#gate-a-tool-on-human-approval) on the tool |
8206
+ | Act on the final assistant text, or fail a bad turn | [`defineResult`](/docs/reference/result.md) |
8207
+ | Gate a change on behavior | [Evals](/docs/evals.md) |
8208
+ | Compare two prompts on live traffic | [`defineAB`](/docs/ab.md) |
8174
8209
 
8175
8210
  ## Patterns
8176
8211
 
8177
- Usage metering: subscribe to `turn.completed` and forward
8178
- `event.data.usage` (token counts) to your metrics system.
8212
+ Usage metering is the [authoring example](#author-a-hook). Three more:
8179
8213
 
8180
- Failure alerting: `turn.failed` carries the message, and
8181
- `ctx.session.id` points at the trace.
8214
+ ### Alert on failure
8182
8215
 
8183
- Derived state: persist ids that must survive hosted replace with
8184
- `ctx.host.kv` or `ctx.host.files`. `stateRoot` resets on replace.
8216
+ `turn.failed` carries the message, and `ctx.session.id` points at the
8217
+ trace. Skip interrupted turns; those are preemptions, not failures. Read
8218
+ secrets inside the handler: hosted deployments bind them after the
8219
+ process starts, so a module-scope read stays empty. Give the call a
8220
+ timeout, since a stalled request holds up later handlers on that
8221
+ session.
8185
8222
 
8186
- Transcript export: subscribe to `"*"` and append to your own store.
8223
+ ```ts
8224
+ // agent/hooks/page-on-failure.ts
8225
+ import { defineHook } from "@cursor/july/hooks";
8226
+
8227
+ export default defineHook({
8228
+ events: {
8229
+ async "turn.failed"(event, ctx) {
8230
+ const pagerUrl = process.env.PAGER_WEBHOOK_URL;
8231
+ if (
8232
+ pagerUrl === undefined ||
8233
+ ctx.session.purpose === "eval" ||
8234
+ event.data.message === "turn interrupted"
8235
+ ) {
8236
+ return;
8237
+ }
8238
+ await fetch(pagerUrl, {
8239
+ method: "POST",
8240
+ headers: { "content-type": "application/json" },
8241
+ body: JSON.stringify({
8242
+ agent: ctx.agent.name,
8243
+ session: ctx.session.id,
8244
+ channel: ctx.channel.id,
8245
+ message: event.data.message,
8246
+ }),
8247
+ signal: AbortSignal.timeout(5_000),
8248
+ });
8249
+ },
8250
+ },
8251
+ });
8252
+ ```
8253
+
8254
+ ### Mirror the transcript
8255
+
8256
+ Subscribe to `"*"` and write one file per event, skipping the
8257
+ `*.appended` deltas: they arrive per token, and `message.completed`
8258
+ carries the final text. Session scope keeps transcripts apart without a
8259
+ session id in the path. The mirror holds reasoning text and raw tool
8260
+ arguments and outputs, so pick the store accordingly, and write to your
8261
+ own store instead when you need cross-session queries.
8262
+
8263
+ ```ts
8264
+ // agent/hooks/mirror.ts
8265
+ import { defineHook } from "@cursor/july/hooks";
8266
+
8267
+ export default defineHook({
8268
+ events: {
8269
+ async "*"(event, ctx) {
8270
+ if (event.type.endsWith(".appended")) {
8271
+ return;
8272
+ }
8273
+ const name = String(event.index).padStart(6, "0");
8274
+ await ctx.host.files.write(
8275
+ `transcript/${name}.json`,
8276
+ JSON.stringify(event)
8277
+ );
8278
+ },
8279
+ },
8280
+ });
8281
+ ```
8282
+
8283
+ ### Keep derived state across a replace
8284
+
8285
+ Write it to `ctx.host.kv` under a session-prefixed key; a tool reads it
8286
+ back with `ctx.host.kv.get`.
8287
+
8288
+ ```ts
8289
+ // agent/hooks/last-result.ts
8290
+ import { defineHook } from "@cursor/july/hooks";
8291
+
8292
+ export default defineHook({
8293
+ events: {
8294
+ async "turn.completed"(event, ctx) {
8295
+ await ctx.host.kv.put(`last-result/${ctx.session.id}`, {
8296
+ at: event.at,
8297
+ result: event.data.result ?? null,
8298
+ });
8299
+ },
8300
+ },
8301
+ });
8302
+ ```
8303
+
8304
+ ## Test and debug a hook
8305
+
8306
+ A hook definition is a plain object, so a unit test calls
8307
+ `hook.events["turn.completed"]` directly with an event and a stub
8308
+ `HookContext`. Discovery skips `*.test.ts`, so the test can live next to
8309
+ the hook.
8310
+
8311
+ At runtime:
8312
+
8313
+ - `agent-sdk validate --dir .` reports discovery errors and the
8314
+ empty-handlers warning.
8315
+ - `agent-sdk info --dir . --json` lists the loaded hooks under
8316
+ `agents[].hooks`.
8317
+ - Send a turn with `agent-sdk dev` or `agent-sdk run --dir . --message "…"`
8318
+ and watch the serve log for
8319
+ `hook "<name>" handler for <event> threw: …`. `run` prints that log on
8320
+ stderr. On hosting, read it with [`agent-sdk logs`](/docs/reference/cli.md#logs).
8187
8321
 
8188
8322
  ## What's next
8189
8323
 
8190
8324
  Continue with these pages:
8191
8325
 
8326
+ - [Turn result](/docs/reference/result.md): fail a turn from `commit`, not from a hook
8192
8327
  - [Sessions and streaming](/docs/reference/sessions.md): the event vocabulary hooks observe
8328
+ - [Storage](/docs/storage.md): where `ctx.host.kv` and `ctx.host.files` live
8193
8329
  - [OpenTelemetry](/docs/guides/opentelemetry.md): OTLP traces and metrics
8194
8330
  from the same event stream
8195
8331
  - [Deployment](/docs/deployment.md#observability): runtime logs and export
@@ -8572,6 +8708,9 @@ Use the playground to chat, try channel routes, and inspect sessions.
8572
8708
  `/v1/dev/evals`). Schedule hand-dispatch still requires `--dev`.
8573
8709
  - **The surface**: inspect the discovered tools, skills, subagents, MCP
8574
8710
  connections, channels, and hooks.
8711
+ - **Custom tool chips**: drop `agent/playground/tools/<toolName>.tsx` to
8712
+ change how that tool renders. Chips compile from the agent tree;
8713
+ an [extension](/docs/reference/extensions.md) cannot contribute them.
8575
8714
  - **Raw events pane**: flip it on to inspect the event stream.
8576
8715
  - **Logs tab**: recent server log lines, polled from `GET /v1/logs`.
8577
8716
  - **A/Bs tab**: per-session and aggregate
@@ -8623,7 +8762,7 @@ experiments can override their file-derived name.
8623
8762
  | `agent/host-connections/anytool.ts` | Host MCP connection `anytool` (host + `mcp oauth` only) |
8624
8763
  | `agent/skills/pr-review.md` | skill `pr-review` |
8625
8764
  | `agent/subagents/reviewer/` | subagent `reviewer` |
8626
- | `agent/extensions/ci.ts` | extension mount `ci`; its tools and skills become `ci__<name>` |
8765
+ | `agent/extensions/ci.ts` | extension mount `ci`; its contributions become `ci__<name>` |
8627
8766
  | `agent/extensions/notion.ts` | Cursor plugin mount `notion` (`cursorPlugin`); its skills, agents, and MCP servers become `notion__<name>` |
8628
8767
  | `agent/channels/drive.ts` | channel `drive`, routes under `/v1/channels/drive` |
8629
8768
  | `agent/ab.ts` | A/B experiment `ab` unless `name` overrides it |
@@ -8683,6 +8822,7 @@ Each path maps to a capability and a reference page.
8683
8822
  | `agent/ab.config.ts` | `defineABConfig` shared A/B settings | [Live A/B metrics](/docs/ab.md) |
8684
8823
  | `agent/storage.ts` | `defineStorage` backend for the durable `host.kv` / `host.files` APIs | [Storage](/docs/storage.md) |
8685
8824
  | `agent/artifacts.ts` | `defineArtifacts` kinds, the `tag_artifact` opt-in, and retention | [Artifacts](/docs/reference/artifacts.md) |
8825
+ | `agent/result.ts` | `defineResult` host `commit` on the final assistant text | [Turn result](/docs/reference/result.md) |
8686
8826
  | `agent/schedules/*` | Cron-driven runs (UTC, 5-field; never auto-fire under `--dev`) | [Schedules](/docs/reference/schedules.md) |
8687
8827
  | `agent/sandbox/workspace/**` | Seed files copied into each local session workspace | [Sessions](/docs/reference/sessions.md#what-goes-into-a-local-session-workspace) |
8688
8828
  | `agent/playground/` | Custom playground tool chips | [Playground](/docs/reference/playground.md) |
@@ -8769,6 +8909,100 @@ context: prompt.lines`
8769
8909
 
8770
8910
  ---
8771
8911
 
8912
+ Source: /docs/reference/result.md
8913
+
8914
+ # Turn result
8915
+
8916
+ Judgment agents need a place to act on the model's last message: parse
8917
+ it, then page, comment, or close a ticket. Author `agent/result.ts`
8918
+ with `defineResult` from `@cursor/july/result`. When that file exists,
8919
+ every finished turn runs `commit` on the serving host with the full
8920
+ assistant text.
8921
+
8922
+ A thrown `commit` fails the turn. Empty assistant text fails it too.
8923
+ Hooks still observe only; they cannot fail a valid turn.
8924
+
8925
+ Use this for an end-of-turn actuation. Mid-turn actions belong in
8926
+ [tools](/docs/reference/tools.md). Durable records that outlive a session belong in
8927
+ [artifacts](/docs/reference/artifacts.md).
8928
+
8929
+ ## Author `agent/result.ts`
8930
+
8931
+ ```ts
8932
+ import { defineResult } from "@cursor/july/result";
8933
+ import { applyDecision, parseDecision } from "./lib/actuate.js";
8934
+
8935
+ export default defineResult({
8936
+ async commit(ctx) {
8937
+ if (ctx.session.purpose === "eval") {
8938
+ return;
8939
+ }
8940
+ await applyDecision(parseDecision(ctx.text), ctx.host);
8941
+ },
8942
+ });
8943
+ ```
8944
+
8945
+ `commit` is required. Parse `ctx.text` however the agent needs. Tell
8946
+ the model the document shape in `instructions.md`. The Agent SDK does
8947
+ not inject a schema.
8948
+
8949
+ Put `result.ts` on the root agent only. A copy under a subagent is
8950
+ ignored with a warning.
8951
+
8952
+ ## Commit on the host
8953
+
8954
+ `commit` runs in the serving process after the model finishes, before
8955
+ the turn completes. `ctx` is the same host surface a server tool gets,
8956
+ plus the turn text:
8957
+
8958
+ | Member | What it is |
8959
+ | --- | --- |
8960
+ | `ctx.session` | The session that produced this turn, including `purpose` |
8961
+ | `ctx.host` | Shared host services (`kv`, `files`, `mcp`) |
8962
+ | `ctx.artifacts` | Session-bound [artifacts](/docs/reference/artifacts.md) facade |
8963
+ | `ctx.stateRoot` | The agent's durable state root |
8964
+ | `ctx.workspaceDir` | The session workspace |
8965
+ | `ctx.text` | The full assistant string |
8966
+
8967
+ A dry-run session skips `commit` and still completes. Eval sessions do
8968
+ run `commit`; return early when `ctx.session.purpose === "eval"` if the
8969
+ handler must not actuate.
8970
+
8971
+ On cloud runtime, the model still runs on the VM. `commit` runs on the
8972
+ serving host after the turn returns.
8973
+
8974
+ `GET /v1/info` reports `result: true` when the file is authored.
8975
+
8976
+ ## Assert in evals
8977
+
8978
+ `t.succeeded()` fails when `commit` throws or the turn produced no
8979
+ text, because those are turn failures. Read the document on `t.reply`.
8980
+
8981
+ ```ts
8982
+ import { defineEval, includes } from "@cursor/july/evals";
8983
+
8984
+ export default defineEval({
8985
+ async test(t) {
8986
+ await t.send("Triage LIN-1842. It duplicates LIN-1801.");
8987
+ t.succeeded();
8988
+ t.check(t.reply, includes("duplicate"));
8989
+ },
8990
+ });
8991
+ ```
8992
+
8993
+ ## What's next
8994
+
8995
+ Continue with these pages:
8996
+
8997
+ - [Evals](/docs/evals.md): `t.succeeded` and `t.reply`
8998
+ - [Sessions and streaming](/docs/reference/sessions.md): `turn.completed` and
8999
+ `turn.failed`
9000
+ - [Hooks](/docs/reference/hooks.md): observe the stream after the turn has already
9001
+ settled
9002
+ - [Project layout](/docs/reference/project-layout.md): where `agent/result.ts` lives
9003
+
9004
+ ---
9005
+
8772
9006
  Source: /docs/reference/schedules.md
8773
9007
 
8774
9008
  # Schedules and reminders
@@ -9081,7 +9315,9 @@ within one session. The `at` field is an ISO-8601 timestamp.
9081
9315
 
9082
9316
  Pair `actions.requested` with `action.result` to reconstruct the tool
9083
9317
  trajectory. Read `turn.completed.data.usage` for input, output, and
9084
- cache token counts.
9318
+ cache token counts. When `agent/result.ts` is authored, a thrown
9319
+ `commit` or empty assistant text emits `turn.failed` instead of
9320
+ `turn.completed`. See [Turn result](/docs/reference/result.md).
9085
9321
 
9086
9322
  ## How do I stream or replay session events?
9087
9323
 
@@ -9338,8 +9574,7 @@ access to `process.env` and your `agent/lib/` code. Local turns call
9338
9574
  server tools as SDK custom tools. Cloud turns reach them over
9339
9575
  authenticated HTTP MCP back to the serve host when `--public-url` or
9340
9576
  `--cloud-tools-url` is set; without either, the server warns at startup
9341
- and cloud turns omit them (see
9342
- [Cloud runtime](/docs/guides/cloud-runtime.md#what-changes-on-cloud)).
9577
+ and cloud turns omit them.
9343
9578
 
9344
9579
  ```ts
9345
9580
  // agent/tools/inspect_pr.ts
@@ -10207,9 +10442,11 @@ Path is identity. Full list: README "Folder structure".
10207
10442
  | `agent/mcp-connections/<name>.ts` | MCP. Never name an account file `cursor.ts`. `advertiseTools: true` for named local tools |
10208
10443
  | `agent/host-connections/<name>.ts` | Privileged MCP for `ctx.host.mcp` / `mcp oauth` |
10209
10444
  | `agent/subagents/<id>/` | Child agent (`description` required) |
10210
- | `agent/extensions/<ns>.ts` | Mounted extension or Cursor plugin (`cursorPlugin({ path })`); contributions are `<ns>__<name>` |
10445
+ | `agent/extensions/<ns>.ts` | Mounted extension or Cursor plugin (`cursorPlugin`); contributions are `<ns>__<name>` |
10211
10446
  | `agent/channels/*.ts` | Slack / GitHub / custom HTTP |
10212
10447
  | `agent/hooks/*.ts` | Observe-only |
10448
+ | `agent/artifacts.ts` | Durable tagged outputs (`defineArtifacts`) |
10449
+ | `agent/result.ts` | Host `commit` on the final assistant text (`defineResult`) |
10213
10450
  | `agent/ab.ts` or `agent/ab/*.ts` | Live A/B (`defineAB`) |
10214
10451
  | `agent/otel.ts` | OpenTelemetry (`defineOtel`) |
10215
10452
  | `agent/schedules/*` | Cron. Never auto-fire under `--dev` |
@@ -10563,9 +10800,13 @@ export default defineOtel({
10563
10800
  3. `serve(dir, { otel: { … } })`. `otel: false` disables env and
10564
10801
  authored config.
10565
10802
 
10803
+ Hosted v2 secrets arrive after bake. Use `defineOtel(() => …)` so flush
10804
+ re-resolves exporters. Authored `agent/otel.ts` records from process
10805
+ start even when the factory returns no exporters yet.
10806
+
10566
10807
  | Signal | Default |
10567
10808
  | --- | --- |
10568
- | Traces | on (`agent_sdk.http` → session → turn → tool / subagent) |
10809
+ | Traces | on (`agent_sdk.http`; `agent_sdk.turn` → tool / subagent) |
10569
10810
  | Metrics | on (`cursor.token.usage`, `cursor.tool.calls`, `cursor.cost.usage`) |
10570
10811
  | Logs | off (`logs: true` or `OTEL_LOGS_EXPORTER=otlp`) |
10571
10812
 
@@ -10581,8 +10822,9 @@ ctx.host.otel.record("abc.approval.duration_ms", 1420);
10581
10822
  ```
10582
10823
 
10583
10824
  Prefix names with team or agent. No custom spans. Join on
10584
- `cursor.conversation.id` and `agent_sdk.agent`. Run `serve` as its
10585
- own process when Agent SDK should own the destination.
10825
+ `agent_sdk.session_id` / `cursor.conversation.id` and
10826
+ `agent_sdk.agent`. Run `serve` as its own process when Agent SDK
10827
+ should own the destination.
10586
10828
 
10587
10829
  ---
10588
10830
 
@@ -11424,9 +11666,6 @@ Run it from the agent's git checkout. It infers repository, ref, path,
11424
11666
  and slug, builds on Cursor-managed hosting, and prints the URL.
11425
11667
  `agent-sdk deployments` shows status.
11426
11668
 
11427
- See [Cloud runtime](/docs/guides/cloud-runtime.md) for what changes on
11428
- the VM.
11429
-
11430
11669
  ---
11431
11670
 
11432
11671
  Source: /docs/templates/security-help.md