@cursor/july 0.1.107 → 0.1.109

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 (523) hide show
  1. package/AGENTS.md +2 -6
  2. package/README.md +13 -11
  3. package/dist/bin/agent-serve.js +30 -8
  4. package/dist/channels/bitbucket/api.d.ts +41 -0
  5. package/dist/channels/bitbucket/api.d.ts.map +1 -1
  6. package/dist/channels/bitbucket/api.js +260 -0
  7. package/dist/channels/bitbucket/binding.d.ts +4 -0
  8. package/dist/channels/bitbucket/binding.d.ts.map +1 -1
  9. package/dist/channels/bitbucket/binding.js +16 -0
  10. package/dist/channels/bitbucket/index.d.ts +1 -1
  11. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  12. package/dist/channels/bitbucket/index.js +1 -1
  13. package/dist/channels/github/github-channel.js +8 -5
  14. package/dist/channels/github/types.d.ts +5 -1
  15. package/dist/channels/github/types.d.ts.map +1 -1
  16. package/dist/channels/gitlab/api.d.ts +27 -0
  17. package/dist/channels/gitlab/api.d.ts.map +1 -1
  18. package/dist/channels/gitlab/api.js +88 -0
  19. package/dist/channels/gitlab/binding.d.ts +5 -0
  20. package/dist/channels/gitlab/binding.d.ts.map +1 -1
  21. package/dist/channels/gitlab/binding.js +10 -0
  22. package/dist/channels/gitlab/index.d.ts +1 -1
  23. package/dist/channels/gitlab/index.d.ts.map +1 -1
  24. package/dist/channels/gitlab/index.js +1 -1
  25. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  26. package/dist/channels/origin/origin-channel.js +27 -13
  27. package/dist/channels/origin/types.d.ts +5 -1
  28. package/dist/channels/origin/types.d.ts.map +1 -1
  29. package/dist/channels/slack/dispatch.d.ts +10 -0
  30. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  31. package/dist/channels/slack/dispatch.js +20 -3
  32. package/dist/channels/slack/slack-channel.d.ts +12 -5
  33. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  34. package/dist/channels/slack/slack-channel.js +59 -8
  35. package/dist/channels.d.ts +45 -0
  36. package/dist/channels.d.ts.map +1 -1
  37. package/dist/channels.js +106 -7
  38. package/dist/connections.d.ts +2 -1
  39. package/dist/connections.d.ts.map +1 -1
  40. package/dist/connections.js +2 -1
  41. package/dist/docs/404.html +2 -2
  42. package/dist/docs/assets/{app.CtuckIiL.js → app.Cr-wVbnB.js} +1 -1
  43. package/dist/docs/assets/{building-with-agents.md.CUSWxlP_.js → building-with-agents.md.D0KbSkJn.js} +2 -2
  44. package/dist/docs/assets/{building-with-agents.md.CUSWxlP_.lean.js → building-with-agents.md.D0KbSkJn.lean.js} +1 -1
  45. package/dist/docs/assets/chunks/@localSearchIndexroot.CFVQ4S17.js +1 -0
  46. package/dist/docs/assets/chunks/{VPLocalSearchBox.Bkkhnu8K.js → VPLocalSearchBox.CVQERt56.js} +1 -1
  47. package/dist/docs/assets/chunks/{theme.DhpIe0Pa.js → theme.Dnsd3XOn.js} +2 -2
  48. package/dist/docs/assets/concepts.md.B4o63Gul.js +1 -0
  49. package/dist/docs/assets/{deployment.md.MFPKqsqI.js → deployment.md.JenwuCCB.js} +4 -4
  50. package/dist/docs/assets/{deployment.md.MFPKqsqI.lean.js → deployment.md.JenwuCCB.lean.js} +1 -1
  51. package/dist/docs/assets/evals.md.C7JLjoEP.js +211 -0
  52. package/dist/docs/assets/evals.md.C7JLjoEP.lean.js +1 -0
  53. package/dist/docs/assets/guides_bitbucket.md.DZPzmUjU.js +10 -0
  54. package/dist/docs/assets/guides_bitbucket.md.DZPzmUjU.lean.js +1 -0
  55. package/dist/docs/assets/guides_cloud-agents.md.BsloyHdY.js +9 -0
  56. package/dist/docs/assets/{guides_cloud-agents.md.DS8RIjwx.lean.js → guides_cloud-agents.md.BsloyHdY.lean.js} +1 -1
  57. package/dist/docs/assets/{guides_github.md.c0gdGJ-D.js → guides_github.md.TZaTZlfz.js} +13 -3
  58. package/dist/docs/assets/{guides_github.md.c0gdGJ-D.lean.js → guides_github.md.TZaTZlfz.lean.js} +1 -1
  59. package/dist/docs/assets/guides_gitlab.md.BmqwQfdG.js +14 -0
  60. package/dist/docs/assets/guides_gitlab.md.BmqwQfdG.lean.js +1 -0
  61. package/dist/docs/assets/{guides_grokbot-agents.md.DVqdhBKb.js → guides_grokbot-agents.md.DyV-WArv.js} +1 -1
  62. package/dist/docs/assets/guides_improve.md.BGVk32bK.js +14 -0
  63. package/dist/docs/assets/guides_improve.md.BGVk32bK.lean.js +1 -0
  64. package/dist/docs/assets/{guides_slack.md.9oHPye9o.js → guides_slack.md.D4RVMM4G.js} +3 -3
  65. package/dist/docs/assets/{guides_slack.md.9oHPye9o.lean.js → guides_slack.md.D4RVMM4G.lean.js} +1 -1
  66. package/dist/docs/assets/{guides_webhooks.md.DKdA43Qm.js → guides_webhooks.md.CJK484ex.js} +2 -2
  67. package/dist/docs/assets/{hillclimbing.md.CpTGTCle.js → hillclimbing.md.BOiVo1tf.js} +1 -1
  68. package/dist/docs/assets/index.md.DD9Q2XuJ.js +5 -0
  69. package/dist/docs/assets/{index.md.BW_6tOgR.lean.js → index.md.DD9Q2XuJ.lean.js} +1 -1
  70. package/dist/docs/assets/{reference_agent-config.md.CHNpiyp4.js → reference_agent-config.md.CvoL6pof.js} +1 -1
  71. package/dist/docs/assets/{reference_channels.md.D-qTqwcq.js → reference_channels.md.CAo-iK4j.js} +2 -2
  72. package/dist/docs/assets/{reference_channels.md.D-qTqwcq.lean.js → reference_channels.md.CAo-iK4j.lean.js} +1 -1
  73. package/dist/docs/assets/{reference_cli.md.Dm67hd2D.js → reference_cli.md.Deg7849l.js} +7 -7
  74. package/dist/docs/assets/{reference_cli.md.Dm67hd2D.lean.js → reference_cli.md.Deg7849l.lean.js} +1 -1
  75. package/dist/docs/assets/{reference_connections.md.Di6jJAXF.js → reference_connections.md.BojkC6c5.js} +1 -1
  76. package/dist/docs/assets/{reference_extensions.md.CGmMLblt.js → reference_extensions.md.ZAVUyuEX.js} +3 -3
  77. package/dist/docs/assets/{reference_hooks.md.Ddt5DdgJ.js → reference_hooks.md.BlM_bOg6.js} +3 -3
  78. package/dist/docs/assets/{reference_hooks.md.Ddt5DdgJ.lean.js → reference_hooks.md.BlM_bOg6.lean.js} +1 -1
  79. package/dist/docs/assets/{reference_http-api.md.oySXBO8o.js → reference_http-api.md.BwaCo-VO.js} +1 -1
  80. package/dist/docs/assets/{reference_playground.md.4myJPxrf.js → reference_playground.md.DLnoaczX.js} +1 -1
  81. package/dist/docs/assets/{reference_playground.md.4myJPxrf.lean.js → reference_playground.md.DLnoaczX.lean.js} +1 -1
  82. package/dist/docs/assets/{reference_project-layout.md.DuBu9a96.js → reference_project-layout.md.BEU8MtQV.js} +3 -3
  83. package/dist/docs/assets/{reference_project-layout.md.DuBu9a96.lean.js → reference_project-layout.md.BEU8MtQV.lean.js} +1 -1
  84. package/dist/docs/assets/reference_sessions.md.CyXV1MUw.js +1 -0
  85. package/dist/docs/assets/{scaffolding-agents.md.em43xlY1.js → scaffolding-agents.md.Kctn3OVb.js} +1 -1
  86. package/dist/docs/assets/{skills_create-agent.md.BVoWPcan.js → skills_create-agent.md.Q3h6Je-e.js} +1 -1
  87. package/dist/docs/assets/{skills_debug.md.CDbPhHfg.js → skills_debug.md.CVjCXMFF.js} +1 -1
  88. package/dist/docs/assets/{skills_debug.md.CDbPhHfg.lean.js → skills_debug.md.CVjCXMFF.lean.js} +1 -1
  89. package/dist/docs/assets/skills_deploy.md.CWqi_ZxW.js +35 -0
  90. package/dist/docs/assets/skills_deploy.md.CWqi_ZxW.lean.js +1 -0
  91. package/dist/docs/assets/skills_evals.md.DFxYPErF.js +25 -0
  92. package/dist/docs/assets/skills_evals.md.DFxYPErF.lean.js +1 -0
  93. package/dist/docs/assets/skills_framework-map.md.BxLSOhSY.js +1 -0
  94. package/dist/docs/assets/{skills_framework-map.md.haibFyoB.lean.js → skills_framework-map.md.BxLSOhSY.lean.js} +1 -1
  95. package/dist/docs/assets/{skills_github.md.D0JahM8c.js → skills_github.md.hgFX_oKY.js} +1 -1
  96. package/dist/docs/assets/skills_index.md.DL7EHaQ-.js +1 -0
  97. package/dist/docs/assets/skills_index.md.DL7EHaQ-.lean.js +1 -0
  98. package/dist/docs/assets/{storage.md.BOHeqk2M.js → storage.md.BUrhJ-Zz.js} +4 -4
  99. package/dist/docs/assets/{storage.md.BOHeqk2M.lean.js → storage.md.BUrhJ-Zz.lean.js} +1 -1
  100. package/dist/docs/assets/troubleshooting.md.CYEAO9bM.js +1 -0
  101. package/dist/docs/building-with-agents.html +5 -5
  102. package/dist/docs/building-with-agents.md +3 -2
  103. package/dist/docs/concepts.html +5 -5
  104. package/dist/docs/concepts.md +2 -4
  105. package/dist/docs/deployment.html +7 -7
  106. package/dist/docs/deployment.md +7 -2
  107. package/dist/docs/evals.html +161 -35
  108. package/dist/docs/evals.md +612 -296
  109. package/dist/docs/guides/agent-to-agent.html +4 -4
  110. package/dist/docs/guides/bitbucket.html +36 -0
  111. package/dist/docs/guides/bitbucket.md +84 -0
  112. package/dist/docs/guides/cloud-agents.html +6 -6
  113. package/dist/docs/guides/cloud-agents.md +4 -3
  114. package/dist/docs/guides/convert-automation.html +4 -4
  115. package/dist/docs/guides/github.html +17 -7
  116. package/dist/docs/guides/github.md +33 -1
  117. package/dist/docs/guides/gitlab.html +40 -0
  118. package/dist/docs/guides/gitlab.md +92 -0
  119. package/dist/docs/guides/grokbot-agents.html +6 -6
  120. package/dist/docs/guides/grokbot-agents.md +2 -2
  121. package/dist/docs/guides/human-in-the-loop.html +4 -4
  122. package/dist/docs/guides/improve.html +40 -0
  123. package/dist/docs/guides/improve.md +91 -0
  124. package/dist/docs/guides/mcp-oauth.html +4 -4
  125. package/dist/docs/guides/opentelemetry.html +5 -5
  126. package/dist/docs/guides/slack.html +7 -7
  127. package/dist/docs/guides/slack.md +2 -1
  128. package/dist/docs/guides/webhooks.html +6 -6
  129. package/dist/docs/guides/webhooks.md +4 -2
  130. package/dist/docs/hashmap.json +1 -1
  131. package/dist/docs/hillclimbing.html +6 -6
  132. package/dist/docs/hillclimbing.md +2 -2
  133. package/dist/docs/index.html +6 -6
  134. package/dist/docs/index.md +14 -6
  135. package/dist/docs/llms-full.txt +1274 -814
  136. package/dist/docs/llms.txt +7 -5
  137. package/dist/docs/quickstart.html +4 -4
  138. package/dist/docs/reference/agent-config.html +6 -6
  139. package/dist/docs/reference/agent-config.md +5 -2
  140. package/dist/docs/reference/artifacts.html +4 -4
  141. package/dist/docs/reference/channels.html +6 -6
  142. package/dist/docs/reference/channels.md +16 -3
  143. package/dist/docs/reference/cli.html +11 -11
  144. package/dist/docs/reference/cli.md +24 -15
  145. package/dist/docs/reference/connections.html +6 -6
  146. package/dist/docs/reference/connections.md +2 -1
  147. package/dist/docs/reference/extensions.html +8 -8
  148. package/dist/docs/reference/extensions.md +2 -3
  149. package/dist/docs/reference/hooks.html +7 -7
  150. package/dist/docs/reference/hooks.md +9 -12
  151. package/dist/docs/reference/http-api.html +6 -6
  152. package/dist/docs/reference/http-api.md +2 -3
  153. package/dist/docs/reference/instructions.html +4 -4
  154. package/dist/docs/reference/playground.html +5 -5
  155. package/dist/docs/reference/playground.md +0 -4
  156. package/dist/docs/reference/project-layout.html +7 -7
  157. package/dist/docs/reference/project-layout.md +1 -8
  158. package/dist/docs/reference/prompt.html +4 -4
  159. package/dist/docs/reference/result.html +4 -4
  160. package/dist/docs/reference/schedules.html +4 -4
  161. package/dist/docs/reference/sessions.html +5 -5
  162. package/dist/docs/reference/sessions.md +1 -2
  163. package/dist/docs/reference/skills.html +4 -4
  164. package/dist/docs/reference/subagents.html +4 -4
  165. package/dist/docs/reference/tools.html +4 -4
  166. package/dist/docs/scaffolding-agents.html +5 -5
  167. package/dist/docs/scaffolding-agents.md +2 -1
  168. package/dist/docs/skills/create-agent.html +6 -6
  169. package/dist/docs/skills/create-agent.md +1 -1
  170. package/dist/docs/skills/debug.html +5 -5
  171. package/dist/docs/skills/debug.md +1 -1
  172. package/dist/docs/skills/deploy.html +61 -0
  173. package/dist/docs/skills/deploy.md +161 -0
  174. package/dist/docs/skills/evals.html +8 -8
  175. package/dist/docs/skills/evals.md +44 -6
  176. package/dist/docs/skills/framework-map.html +5 -5
  177. package/dist/docs/skills/framework-map.md +5 -4
  178. package/dist/docs/skills/github.html +6 -6
  179. package/dist/docs/skills/github.md +1 -1
  180. package/dist/docs/skills/hillclimb.html +4 -4
  181. package/dist/docs/skills/index.html +6 -6
  182. package/dist/docs/skills/index.md +1 -1
  183. package/dist/docs/skills/mcp-auth.html +4 -4
  184. package/dist/docs/skills/otel.html +4 -4
  185. package/dist/docs/skills/setup-slack.html +4 -4
  186. package/dist/docs/storage.html +8 -8
  187. package/dist/docs/storage.md +15 -24
  188. package/dist/docs/templates/agentic-owners.html +4 -4
  189. package/dist/docs/templates/agents-md.html +4 -4
  190. package/dist/docs/templates/code-wiki.html +4 -4
  191. package/dist/docs/templates/demo.html +4 -4
  192. package/dist/docs/templates/grokbot-agents.html +4 -4
  193. package/dist/docs/templates/pr-autofixer.html +4 -4
  194. package/dist/docs/templates/security-help.html +4 -4
  195. package/dist/docs/templates/security-reviewer.html +4 -4
  196. package/dist/docs/templates/triage.html +4 -4
  197. package/dist/docs/troubleshooting.html +5 -5
  198. package/dist/docs/troubleshooting.md +1 -1
  199. package/dist/extensions/improve/extension.d.ts +46 -0
  200. package/dist/extensions/improve/extension.d.ts.map +1 -0
  201. package/dist/extensions/improve/extension.js +41 -0
  202. package/dist/extensions/improve/skills/yourself.d.ts +4 -0
  203. package/dist/extensions/improve/skills/yourself.d.ts.map +1 -0
  204. package/dist/extensions/improve/skills/yourself.js +43 -0
  205. package/dist/extensions.d.ts +2 -3
  206. package/dist/extensions.d.ts.map +1 -1
  207. package/dist/extensions.js +2 -5
  208. package/dist/index.d.ts +2 -3
  209. package/dist/index.d.ts.map +1 -1
  210. package/dist/index.js +1 -2
  211. package/dist/internal/authored-alias-hooks.d.ts +5 -0
  212. package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
  213. package/dist/internal/authored-alias-hooks.js +17 -0
  214. package/dist/internal/authored-loaders.d.ts +4 -0
  215. package/dist/internal/authored-loaders.d.ts.map +1 -1
  216. package/dist/internal/authored-loaders.js +21 -2
  217. package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -1
  218. package/dist/internal/builtin-tools/artifacts.js +2 -3
  219. package/dist/internal/channel-route-dispatch.d.ts +13 -0
  220. package/dist/internal/channel-route-dispatch.d.ts.map +1 -0
  221. package/dist/internal/channel-route-dispatch.js +62 -0
  222. package/dist/internal/channel-state.d.ts +17 -0
  223. package/dist/internal/channel-state.d.ts.map +1 -0
  224. package/dist/internal/channel-state.js +78 -0
  225. package/dist/internal/cli-ax.d.ts +8 -2
  226. package/dist/internal/cli-ax.d.ts.map +1 -1
  227. package/dist/internal/cli-ax.js +100 -3
  228. package/dist/internal/cli-cursor.d.ts.map +1 -1
  229. package/dist/internal/cli-cursor.js +2 -0
  230. package/dist/internal/cli-deploy.d.ts.map +1 -1
  231. package/dist/internal/cli-deploy.js +38 -14
  232. package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
  233. package/dist/internal/cli-mcp-oauth.js +15 -0
  234. package/dist/internal/cli-mcp.d.ts.map +1 -1
  235. package/dist/internal/cli-mcp.js +12 -0
  236. package/dist/internal/cli-slack.d.ts.map +1 -1
  237. package/dist/internal/cli-slack.js +8 -2
  238. package/dist/internal/continuation-channel.d.ts.map +1 -1
  239. package/dist/internal/continuation-channel.js +2 -2
  240. package/dist/internal/continuation-identity.js +8 -3
  241. package/dist/internal/cursor/credentials.d.ts +8 -2
  242. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  243. package/dist/internal/cursor/credentials.js +27 -5
  244. package/dist/internal/deploy-client.d.ts +27 -0
  245. package/dist/internal/deploy-client.d.ts.map +1 -1
  246. package/dist/internal/deploy-client.js +32 -0
  247. package/dist/internal/deploy-manifest.d.ts +23 -0
  248. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  249. package/dist/internal/deploy-manifest.js +84 -1
  250. package/dist/internal/describe-error.d.ts +1 -0
  251. package/dist/internal/describe-error.d.ts.map +1 -1
  252. package/dist/internal/describe-error.js +25 -0
  253. package/dist/internal/discovery/agent.d.ts +1 -1
  254. package/dist/internal/discovery/agent.d.ts.map +1 -1
  255. package/dist/internal/discovery/agent.js +0 -5
  256. package/dist/internal/discovery/extension-overlay.d.ts +1 -2
  257. package/dist/internal/discovery/extension-overlay.d.ts.map +1 -1
  258. package/dist/internal/discovery/extension-overlay.js +0 -14
  259. package/dist/internal/discovery/extensions.d.ts +1 -2
  260. package/dist/internal/discovery/extensions.d.ts.map +1 -1
  261. package/dist/internal/discovery/extensions.js +4 -22
  262. package/dist/internal/discovery/info.d.ts.map +1 -1
  263. package/dist/internal/discovery/info.js +42 -24
  264. package/dist/internal/discovery/modules.js +0 -1
  265. package/dist/internal/discovery/project.d.ts.map +1 -1
  266. package/dist/internal/discovery/project.js +0 -16
  267. package/dist/internal/eval-runner.js +0 -1
  268. package/dist/internal/framework-file-storage.d.ts +4 -5
  269. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  270. package/dist/internal/framework-file-storage.js +4 -5
  271. package/dist/internal/framework-storage-selection.d.ts +2 -2
  272. package/dist/internal/framework-storage-selection.js +2 -2
  273. package/dist/internal/guest-network.d.ts +4 -10
  274. package/dist/internal/guest-network.d.ts.map +1 -1
  275. package/dist/internal/guest-network.js +42 -26
  276. package/dist/internal/hosted-admission-adapter.d.ts +2 -0
  277. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  278. package/dist/internal/hosted-catch-protocol.d.ts +51 -0
  279. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -0
  280. package/dist/internal/hosted-catch-protocol.js +103 -0
  281. package/dist/internal/hosted-catch.d.ts +40 -0
  282. package/dist/internal/hosted-catch.d.ts.map +1 -0
  283. package/dist/internal/hosted-catch.js +149 -0
  284. package/dist/internal/hosted-delivery-protocol.d.ts +41 -0
  285. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  286. package/dist/internal/hosted-delivery-protocol.js +249 -0
  287. package/dist/internal/hosted-delivery.d.ts +10 -1
  288. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  289. package/dist/internal/hosted-delivery.js +100 -22
  290. package/dist/internal/hosted-execution-diag.d.ts +4 -1
  291. package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
  292. package/dist/internal/hosted-execution-diag.js +13 -4
  293. package/dist/internal/hosted-execution-flush.d.ts +3 -0
  294. package/dist/internal/hosted-execution-flush.d.ts.map +1 -1
  295. package/dist/internal/hosted-execution-flush.js +2 -4
  296. package/dist/internal/http-control-plane-session.d.ts +30 -0
  297. package/dist/internal/http-control-plane-session.d.ts.map +1 -0
  298. package/dist/internal/http-control-plane-session.js +83 -0
  299. package/dist/internal/init-scaffold.d.ts.map +1 -1
  300. package/dist/internal/init-scaffold.js +1 -2
  301. package/dist/internal/install-cursor-skills.d.ts +5 -2
  302. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  303. package/dist/internal/install-cursor-skills.js +25 -5
  304. package/dist/internal/legacy-command-guard.d.ts +22 -0
  305. package/dist/internal/legacy-command-guard.d.ts.map +1 -0
  306. package/dist/internal/legacy-command-guard.js +51 -0
  307. package/dist/internal/platform-timers.d.ts +7 -0
  308. package/dist/internal/platform-timers.d.ts.map +1 -1
  309. package/dist/internal/platform-timers.js +139 -0
  310. package/dist/internal/reminder-control-plane-protocol.d.ts +2 -0
  311. package/dist/internal/reminder-control-plane-protocol.d.ts.map +1 -1
  312. package/dist/internal/reminder-control-plane-protocol.js +9 -2
  313. package/dist/internal/reminder-runner.d.ts +8 -0
  314. package/dist/internal/reminder-runner.d.ts.map +1 -1
  315. package/dist/internal/reminder-runner.js +36 -9
  316. package/dist/internal/resolve-prod-target.d.ts +2 -0
  317. package/dist/internal/resolve-prod-target.d.ts.map +1 -1
  318. package/dist/internal/resolve-prod-target.js +13 -0
  319. package/dist/internal/run-client.d.ts +1 -1
  320. package/dist/internal/sdk-runner.d.ts.map +1 -1
  321. package/dist/internal/sdk-runner.js +5 -4
  322. package/dist/internal/server.d.ts.map +1 -1
  323. package/dist/internal/server.js +57 -70
  324. package/dist/internal/session-engine.d.ts +7 -41
  325. package/dist/internal/session-engine.d.ts.map +1 -1
  326. package/dist/internal/session-engine.js +110 -227
  327. package/dist/internal/storage-coordinator.d.ts +5 -19
  328. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  329. package/dist/internal/storage-coordinator.js +3 -62
  330. package/dist/internal/storage-roles.d.ts +4 -9
  331. package/dist/internal/storage-roles.d.ts.map +1 -1
  332. package/dist/internal/storage-roles.js +2 -2
  333. package/dist/playground/assets/index-Bhxzrcf6.css +1 -0
  334. package/dist/playground/assets/index-CqLX5uF3.js +67 -0
  335. package/dist/playground/index.html +2 -2
  336. package/dist/storage-backends/cursor-hosted-v2.d.ts +4 -5
  337. package/dist/storage-backends/cursor-hosted-v2.d.ts.map +1 -1
  338. package/dist/storage-backends/cursor-hosted-v2.js +4 -5
  339. package/dist/storage-backends/cursor-hosted.d.ts +7 -2
  340. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  341. package/dist/storage-backends/cursor-hosted.js +29 -31
  342. package/dist/storage-backends/file-kv.d.ts +9 -12
  343. package/dist/storage-backends/file-kv.d.ts.map +1 -1
  344. package/dist/storage-backends/file-kv.js +11 -47
  345. package/dist/storage-protocol.d.ts +3 -11
  346. package/dist/storage-protocol.d.ts.map +1 -1
  347. package/dist/storage-protocol.js +3 -11
  348. package/dist/storage.d.ts +8 -36
  349. package/dist/storage.d.ts.map +1 -1
  350. package/dist/storage.js +8 -44
  351. package/dist/types.d.ts +53 -62
  352. package/dist/types.d.ts.map +1 -1
  353. package/docs/README.md +14 -6
  354. package/docs/building-with-agents.md +3 -2
  355. package/docs/concepts.md +2 -4
  356. package/docs/deployment.md +7 -2
  357. package/docs/evals.md +613 -297
  358. package/docs/guides/bitbucket.md +89 -0
  359. package/docs/guides/cloud-agents.md +4 -3
  360. package/docs/guides/github.md +33 -1
  361. package/docs/guides/gitlab.md +97 -0
  362. package/docs/guides/grokbot-agents.md +2 -2
  363. package/docs/guides/improve.md +96 -0
  364. package/docs/guides/slack.md +2 -1
  365. package/docs/guides/webhooks.md +4 -2
  366. package/docs/hillclimbing.md +2 -2
  367. package/docs/reference/agent-config.md +5 -2
  368. package/docs/reference/channels.md +16 -3
  369. package/docs/reference/cli.md +24 -15
  370. package/docs/reference/connections.md +2 -1
  371. package/docs/reference/extensions.md +2 -3
  372. package/docs/reference/hooks.md +9 -12
  373. package/docs/reference/http-api.md +2 -3
  374. package/docs/reference/playground.md +0 -4
  375. package/docs/reference/project-layout.md +1 -8
  376. package/docs/reference/sessions.md +1 -2
  377. package/docs/scaffolding-agents.md +2 -1
  378. package/docs/skills/index.md +2 -2
  379. package/docs/storage.md +15 -24
  380. package/docs/troubleshooting.md +1 -1
  381. package/package.json +8 -7
  382. package/skills/create-agent/SKILL.md +1 -1
  383. package/skills/debug/SKILL.md +1 -1
  384. package/skills/deploy/SKILL.md +169 -0
  385. package/skills/evals/SKILL.md +45 -8
  386. package/skills/framework-map/SKILL.md +5 -4
  387. package/skills/github/SKILL.md +1 -1
  388. package/src/bin/agent-serve.ts +27 -2
  389. package/src/channels/bitbucket/api.ts +341 -0
  390. package/src/channels/bitbucket/binding.ts +25 -0
  391. package/src/channels/bitbucket/index.ts +2 -0
  392. package/src/channels/github/github-channel.ts +8 -8
  393. package/src/channels/github/types.ts +5 -0
  394. package/src/channels/gitlab/api.ts +123 -0
  395. package/src/channels/gitlab/binding.ts +12 -0
  396. package/src/channels/gitlab/index.ts +1 -0
  397. package/src/channels/origin/origin-channel.ts +29 -13
  398. package/src/channels/origin/types.ts +5 -0
  399. package/src/channels/slack/dispatch.ts +30 -0
  400. package/src/channels/slack/slack-channel.ts +69 -7
  401. package/src/channels.ts +157 -10
  402. package/src/connections.ts +2 -1
  403. package/src/extensions/improve/extension.ts +70 -0
  404. package/src/extensions/improve/skills/yourself.ts +50 -0
  405. package/src/extensions.ts +2 -6
  406. package/src/index.ts +0 -3
  407. package/src/internal/authored-alias-hooks.ts +32 -0
  408. package/src/internal/authored-loaders.ts +26 -2
  409. package/src/internal/builtin-tools/artifacts.ts +2 -3
  410. package/src/internal/channel-route-dispatch.ts +66 -0
  411. package/src/internal/channel-state.ts +96 -0
  412. package/src/internal/cli-ax.ts +111 -3
  413. package/src/internal/cli-cursor.ts +4 -1
  414. package/src/internal/cli-deploy.ts +50 -10
  415. package/src/internal/cli-mcp-oauth.ts +18 -0
  416. package/src/internal/cli-mcp.ts +11 -0
  417. package/src/internal/cli-slack.ts +15 -2
  418. package/src/internal/continuation-channel.ts +2 -1
  419. package/src/internal/continuation-identity.ts +10 -2
  420. package/src/internal/cursor/credentials.ts +35 -7
  421. package/src/internal/deploy-client.ts +54 -0
  422. package/src/internal/deploy-manifest.ts +115 -1
  423. package/src/internal/describe-error.ts +28 -0
  424. package/src/internal/discovery/agent.ts +1 -7
  425. package/src/internal/discovery/extension-overlay.ts +0 -18
  426. package/src/internal/discovery/extensions.ts +2 -26
  427. package/src/internal/discovery/info.ts +3 -13
  428. package/src/internal/discovery/modules.ts +0 -1
  429. package/src/internal/discovery/project.ts +0 -16
  430. package/src/internal/eval-runner.ts +0 -1
  431. package/src/internal/framework-file-storage.ts +4 -5
  432. package/src/internal/framework-storage-selection.ts +2 -2
  433. package/src/internal/guest-network.ts +43 -29
  434. package/src/internal/hosted-admission-adapter.ts +2 -0
  435. package/src/internal/hosted-catch-protocol.ts +130 -0
  436. package/src/internal/hosted-catch.ts +192 -0
  437. package/src/internal/hosted-delivery-protocol.ts +387 -0
  438. package/src/internal/hosted-delivery.ts +155 -22
  439. package/src/internal/hosted-execution-diag.ts +21 -3
  440. package/src/internal/hosted-execution-flush.ts +6 -3
  441. package/src/internal/http-control-plane-session.ts +104 -0
  442. package/src/internal/init-scaffold.ts +1 -2
  443. package/src/internal/install-cursor-skills.ts +38 -5
  444. package/src/internal/legacy-command-guard.ts +59 -0
  445. package/src/internal/platform-timers.ts +191 -0
  446. package/src/internal/reminder-control-plane-protocol.ts +15 -2
  447. package/src/internal/reminder-runner.ts +60 -9
  448. package/src/internal/resolve-prod-target.ts +15 -0
  449. package/src/internal/run-client.ts +1 -1
  450. package/src/internal/sdk-runner.ts +3 -2
  451. package/src/internal/server.ts +89 -95
  452. package/src/internal/session-engine.ts +155 -285
  453. package/src/internal/storage-coordinator.ts +5 -76
  454. package/src/internal/storage-roles.ts +4 -9
  455. package/src/storage-backends/cursor-hosted-v2.ts +4 -7
  456. package/src/storage-backends/cursor-hosted.ts +40 -38
  457. package/src/storage-backends/file-kv.ts +10 -51
  458. package/src/storage-protocol.ts +3 -17
  459. package/src/storage.ts +10 -101
  460. package/src/types.ts +58 -62
  461. package/templates/demo/README.md +10 -6
  462. package/templates/demo/agent/channels/github.ts +2 -0
  463. package/templates/demo/agent/channels/queue.ts +6 -2
  464. package/templates/demo/agent/lib/repos.ts +5 -0
  465. package/templates/demo/init.json +25 -0
  466. package/dist/ab.d.ts +0 -209
  467. package/dist/ab.d.ts.map +0 -1
  468. package/dist/ab.js +0 -246
  469. package/dist/docs/ab.html +0 -80
  470. package/dist/docs/ab.md +0 -332
  471. package/dist/docs/assets/ab.md.mlVgqvSk.js +0 -54
  472. package/dist/docs/assets/ab.md.mlVgqvSk.lean.js +0 -1
  473. package/dist/docs/assets/chunks/@localSearchIndexroot.DXXZxiMv.js +0 -1
  474. package/dist/docs/assets/concepts.md.DgEcZOfT.js +0 -1
  475. package/dist/docs/assets/evals.md.CbMoebP1.js +0 -85
  476. package/dist/docs/assets/evals.md.CbMoebP1.lean.js +0 -1
  477. package/dist/docs/assets/guides_cloud-agents.md.DS8RIjwx.js +0 -9
  478. package/dist/docs/assets/index.md.BW_6tOgR.js +0 -5
  479. package/dist/docs/assets/reference_sessions.md.CueyOHSL.js +0 -1
  480. package/dist/docs/assets/skills_ab.md.CsFNatVx.js +0 -26
  481. package/dist/docs/assets/skills_ab.md.CsFNatVx.lean.js +0 -1
  482. package/dist/docs/assets/skills_evals.md.723kpUmA.js +0 -25
  483. package/dist/docs/assets/skills_evals.md.723kpUmA.lean.js +0 -1
  484. package/dist/docs/assets/skills_framework-map.md.haibFyoB.js +0 -1
  485. package/dist/docs/assets/skills_index.md.DKwIxzGg.js +0 -1
  486. package/dist/docs/assets/skills_index.md.DKwIxzGg.lean.js +0 -1
  487. package/dist/docs/assets/troubleshooting.md.Cus_YZga.js +0 -1
  488. package/dist/docs/skills/ab.html +0 -52
  489. package/dist/docs/skills/ab.md +0 -50
  490. package/dist/internal/ab-collector.d.ts +0 -44
  491. package/dist/internal/ab-collector.d.ts.map +0 -1
  492. package/dist/internal/ab-collector.js +0 -142
  493. package/dist/internal/ab-fold.d.ts +0 -36
  494. package/dist/internal/ab-fold.d.ts.map +0 -1
  495. package/dist/internal/ab-fold.js +0 -175
  496. package/dist/internal/ab-snapshot.d.ts +0 -68
  497. package/dist/internal/ab-snapshot.d.ts.map +0 -1
  498. package/dist/internal/ab-snapshot.js +0 -208
  499. package/dist/internal/discovery/ab.d.ts +0 -9
  500. package/dist/internal/discovery/ab.d.ts.map +0 -1
  501. package/dist/internal/discovery/ab.js +0 -113
  502. package/dist/playground/assets/index-Bq2HpEQB.js +0 -67
  503. package/dist/playground/assets/index-CZKKNlmb.css +0 -1
  504. package/docs/ab.md +0 -337
  505. package/skills/ab/SKILL.md +0 -58
  506. package/src/ab.ts +0 -430
  507. package/src/internal/ab-collector.ts +0 -200
  508. package/src/internal/ab-fold.ts +0 -232
  509. package/src/internal/ab-snapshot.ts +0 -331
  510. package/src/internal/discovery/ab.ts +0 -131
  511. /package/dist/docs/assets/{concepts.md.DgEcZOfT.lean.js → concepts.md.B4o63Gul.lean.js} +0 -0
  512. /package/dist/docs/assets/{guides_grokbot-agents.md.DVqdhBKb.lean.js → guides_grokbot-agents.md.DyV-WArv.lean.js} +0 -0
  513. /package/dist/docs/assets/{guides_webhooks.md.DKdA43Qm.lean.js → guides_webhooks.md.CJK484ex.lean.js} +0 -0
  514. /package/dist/docs/assets/{hillclimbing.md.CpTGTCle.lean.js → hillclimbing.md.BOiVo1tf.lean.js} +0 -0
  515. /package/dist/docs/assets/{reference_agent-config.md.CHNpiyp4.lean.js → reference_agent-config.md.CvoL6pof.lean.js} +0 -0
  516. /package/dist/docs/assets/{reference_connections.md.Di6jJAXF.lean.js → reference_connections.md.BojkC6c5.lean.js} +0 -0
  517. /package/dist/docs/assets/{reference_extensions.md.CGmMLblt.lean.js → reference_extensions.md.ZAVUyuEX.lean.js} +0 -0
  518. /package/dist/docs/assets/{reference_http-api.md.oySXBO8o.lean.js → reference_http-api.md.BwaCo-VO.lean.js} +0 -0
  519. /package/dist/docs/assets/{reference_sessions.md.CueyOHSL.lean.js → reference_sessions.md.CyXV1MUw.lean.js} +0 -0
  520. /package/dist/docs/assets/{scaffolding-agents.md.em43xlY1.lean.js → scaffolding-agents.md.Kctn3OVb.lean.js} +0 -0
  521. /package/dist/docs/assets/{skills_create-agent.md.BVoWPcan.lean.js → skills_create-agent.md.Q3h6Je-e.lean.js} +0 -0
  522. /package/dist/docs/assets/{skills_github.md.D0JahM8c.lean.js → skills_github.md.hgFX_oKY.lean.js} +0 -0
  523. /package/dist/docs/assets/{troubleshooting.md.Cus_YZga.lean.js → troubleshooting.md.CYEAO9bM.lean.js} +0 -0
@@ -3,6 +3,7 @@ import type {
3
3
  AuthPolicy,
4
4
  ChannelHandlerArgs,
5
5
  SendMessageOptions,
6
+ TurnOutcome,
6
7
  } from "../types.js";
7
8
  import { dispatchOutcome } from "./channel-dispatch.js";
8
9
  import {
@@ -20,7 +21,6 @@ import {
20
21
  GuestNetworkUnavailableError,
21
22
  type GuestNetworkWaitResult,
22
23
  type GuestNetworkWaitStats,
23
- isQuietGuestConnectStallMessage,
24
24
  waitForGuestNetworkReady,
25
25
  } from "./guest-network.js";
26
26
  import {
@@ -40,10 +40,13 @@ import {
40
40
  HOSTED_GUEST_RETRY_TRANSIENT,
41
41
  type HostedAdmission,
42
42
  type HostedGuestRetryDisposition,
43
+ type HostedReminderFireDescriptorPayload,
44
+ hostedFailureClassification,
43
45
  hostedGuestErrorResponse,
44
46
  isHostedReminderAdmission,
45
47
  parseHostedAdmission,
46
48
  parseHostedExecution,
49
+ parseHostedReminderFireDescriptorPayload,
47
50
  parseHostedReminderFirePayload,
48
51
  } from "./hosted-delivery-protocol.js";
49
52
  import {
@@ -63,7 +66,10 @@ import {
63
66
  ReminderValidationError,
64
67
  UnknownReminderError,
65
68
  } from "./reminder-runner.js";
66
- import { statusForThrownRequestError } from "./request-error-status.js";
69
+ import {
70
+ mapThrownRequestError,
71
+ statusForThrownRequestError,
72
+ } from "./request-error-status.js";
67
73
  import type { Router } from "./router.js";
68
74
  import type { SessionRunExecutionWrite } from "./session-run-log.js";
69
75
 
@@ -170,6 +176,31 @@ function nonRetryableRejection(error: unknown): AdmissionDispatch | undefined {
170
176
  };
171
177
  }
172
178
 
179
+ /**
180
+ * Prefer the shared throw → HTTP mapper (guest network / connect stall /
181
+ * session busy / …) before collapsing into agent_admission_threw or
182
+ * background_dispatch_failed. Those agent codes otherwise hide typed
183
+ * transient failures that the outer handleRequest boundary never sees.
184
+ */
185
+ function mappedAdmissionFailure(error: unknown): AdmissionDispatch | undefined {
186
+ const rejected = nonRetryableRejection(error);
187
+ if (rejected !== undefined) {
188
+ return rejected;
189
+ }
190
+ const mapped = mapThrownRequestError(error);
191
+ if (mapped === undefined) {
192
+ return undefined;
193
+ }
194
+ return {
195
+ response: hostedGuestErrorResponse({
196
+ status: mapped.status,
197
+ error: mapped.code,
198
+ retry: mapped.retry,
199
+ message: boundedMessage(mapped.message),
200
+ }),
201
+ };
202
+ }
203
+
173
204
  /**
174
205
  * Run authored admission without creating a framework session. Authored
175
206
  * `task` callbacks execute as sessionless work; the first `send` is captured
@@ -210,9 +241,57 @@ async function dispatchHostedReminderAdmission(
210
241
  outcome: "fired" | "noop";
211
242
  reason?: string;
212
243
  }>;
244
+ /**
245
+ * Architecture v2: execute an immutable CP descriptor and apply the
246
+ * structured outcome. Must not GET/PUT reminder lifecycle documents.
247
+ */
248
+ executeReminderDescriptor?(
249
+ descriptor: HostedReminderFireDescriptorPayload
250
+ ): Promise<{
251
+ reminderId: string;
252
+ outcome: "fired" | "noop";
253
+ reason?: string;
254
+ }>;
213
255
  },
214
256
  delivery: HostedAdmission
215
257
  ): Promise<Response> {
258
+ const descriptor = parseHostedReminderFireDescriptorPayload(delivery.payload);
259
+ if (descriptor !== undefined) {
260
+ if (input.executeReminderDescriptor === undefined) {
261
+ return transientHostedError(
262
+ 503,
263
+ "reminder_dispatch_unavailable",
264
+ "This guest has no reminder CP executor wired for hosted admission."
265
+ );
266
+ }
267
+ try {
268
+ const result = await input.executeReminderDescriptor(descriptor);
269
+ const outcome = result.outcome === "noop" ? "skip" : "task";
270
+ return Response.json({
271
+ ok: true,
272
+ v: HOSTED_DELIVERY_PROTOCOL_VERSION,
273
+ outcome,
274
+ });
275
+ } catch (error) {
276
+ if (error instanceof UnknownReminderError) {
277
+ return terminalHostedError(
278
+ 404,
279
+ "unknown_reminder",
280
+ boundedMessage(error.message)
281
+ );
282
+ }
283
+ if (error instanceof ReminderValidationError) {
284
+ return terminalHostedError(
285
+ 400,
286
+ "invalid_reminder",
287
+ boundedMessage(error.message)
288
+ );
289
+ }
290
+ // Transient CP apply/fetch failures must remain retryable.
291
+ throw error;
292
+ }
293
+ }
294
+
216
295
  if (input.fireReminder === undefined) {
217
296
  return transientHostedError(
218
297
  503,
@@ -225,7 +304,7 @@ async function dispatchHostedReminderAdmission(
225
304
  return terminalHostedError(
226
305
  400,
227
306
  "invalid_reminder_payload",
228
- "Expected reminder payload { reminderId, fireCount }."
307
+ "Expected reminder descriptor or legacy payload { reminderId, fireCount }."
229
308
  );
230
309
  }
231
310
  try {
@@ -281,17 +360,24 @@ async function runAdmission(
281
360
  let dispatched: Response;
282
361
  try {
283
362
  dispatched = await adapter.dispatch({
363
+ channelId: input.delivery.channelId,
284
364
  eventType: input.delivery.eventType,
285
365
  payload: input.delivery.payload,
286
366
  deliveryId: input.delivery.deliveryId,
287
367
  args,
288
368
  });
289
369
  } catch (error) {
290
- const rejected = nonRetryableRejection(error);
291
- if (rejected !== undefined) {
292
- return rejected;
370
+ const mapped = mappedAdmissionFailure(error);
371
+ if (mapped !== undefined) {
372
+ return mapped;
293
373
  }
294
- throw error;
374
+ return {
375
+ response: terminalHostedError(
376
+ 500,
377
+ "agent_admission_threw",
378
+ boundedMessage(error instanceof Error ? error.message : String(error))
379
+ ),
380
+ };
295
381
  }
296
382
  if (!dispatched.ok) {
297
383
  return {
@@ -305,9 +391,9 @@ async function runAdmission(
305
391
  try {
306
392
  await Promise.all(background);
307
393
  } catch (error) {
308
- const rejected = nonRetryableRejection(error);
309
- if (rejected !== undefined) {
310
- return rejected;
394
+ const mapped = mappedAdmissionFailure(error);
395
+ if (mapped !== undefined) {
396
+ return mapped;
311
397
  }
312
398
  return {
313
399
  response: terminalHostedError(
@@ -436,6 +522,17 @@ export function registerHostedDeliveryRoute(input: {
436
522
  outcome: "fired" | "noop";
437
523
  reason?: string;
438
524
  }>;
525
+ /**
526
+ * Architecture v2: execute an immutable CP fire descriptor and apply the
527
+ * structured outcome via the hosted ReminderControlPlane client.
528
+ */
529
+ executeReminderDescriptor?(
530
+ descriptor: HostedReminderFireDescriptorPayload
531
+ ): Promise<{
532
+ reminderId: string;
533
+ outcome: "fired" | "noop";
534
+ reason?: string;
535
+ }>;
439
536
  /**
440
537
  * Await the session's durable mirror (dispatch chain + storage queue)
441
538
  * before the execution reply: the control plane may park the pod the
@@ -735,8 +832,13 @@ export function registerHostedDeliveryRoute(input: {
735
832
  abortReason?:
736
833
  | ReturnType<typeof abortReasonFromTurnStatus>
737
834
  | "execute_throw";
835
+ failureCode?: string;
738
836
  error?: unknown;
739
837
  }): Promise<void> => {
838
+ const classification =
839
+ fields.failureCode === undefined
840
+ ? undefined
841
+ : hostedFailureClassification(fields.failureCode);
740
842
  await flushHostedExecutionRecord(sinks, {
741
843
  executionId,
742
844
  sessionPublicId: execution.sessionPublicId,
@@ -752,6 +854,8 @@ export function registerHostedDeliveryRoute(input: {
752
854
  ...(fields.abortReason === undefined
753
855
  ? {}
754
856
  : { abortReason: fields.abortReason }),
857
+ failureCode: fields.failureCode,
858
+ classification,
755
859
  ...(fields.error === undefined ? {} : { error: fields.error }),
756
860
  });
757
861
  };
@@ -788,28 +892,30 @@ export function registerHostedDeliveryRoute(input: {
788
892
  session.id,
789
893
  execution.sessionPublicId
790
894
  );
895
+ const hostedFailure =
896
+ outcome.status === "finished"
897
+ ? undefined
898
+ : hostedFailureForUnfinishedTurn(outcome);
791
899
  await writeDiag({
792
900
  sessionId: session.id,
793
901
  turnStatus: outcome.status,
794
902
  message: outcome.errorMessage,
795
903
  abortReason: abortReasonFromTurnStatus(
796
904
  outcome.status,
797
- outcome.errorMessage
905
+ outcome.cancellationReason
798
906
  ),
907
+ failureCode: hostedFailure?.error,
799
908
  });
800
- if (outcome.status !== "finished") {
801
- // waitForCompletion resolves (does not throw) on a quiet
802
- // Connect abort. Map that to guest_connect_stalled so TAS
803
- // retries the same pod. Real runner failures stay turn_failed.
804
- const hostedFailure = hostedFailureForUnfinishedTurn(
805
- outcome.errorMessage
806
- );
909
+ if (hostedFailure !== undefined) {
807
910
  return {
808
911
  status: 503,
809
912
  body: {
810
913
  ok: false,
811
914
  error: hostedFailure.error,
812
915
  retry: hostedFailure.retry,
916
+ classification: hostedFailureClassification(
917
+ hostedFailure.error
918
+ ),
813
919
  turnStatus: outcome.status,
814
920
  message: outcome.errorMessage,
815
921
  },
@@ -834,6 +940,7 @@ export function registerHostedDeliveryRoute(input: {
834
940
  turnStatus: "error",
835
941
  message: error instanceof Error ? error.message : String(error),
836
942
  abortReason: "execute_throw",
943
+ failureCode: "internal_error",
837
944
  error,
838
945
  });
839
946
  throw error;
@@ -862,19 +969,45 @@ function evictHostedSdkSessions(
862
969
  }
863
970
  }
864
971
 
865
- function hostedFailureForUnfinishedTurn(errorMessage: string | undefined): {
866
- error: typeof GUEST_CONNECT_STALLED | "turn_failed";
972
+ const TRANSIENT_TURN_ERROR_CODES: ReadonlySet<string> = new Set([
973
+ "ABORT_ERR",
974
+ "UND_ERR_BODY_TIMEOUT",
975
+ "UND_ERR_HEADERS_TIMEOUT",
976
+ "canceled",
977
+ "unavailable",
978
+ "unknown",
979
+ ]);
980
+
981
+ function hostedFailureForUnfinishedTurn(outcome: TurnOutcome): {
982
+ error:
983
+ | typeof GUEST_CONNECT_STALLED
984
+ | "agent_dependency_failed"
985
+ | "turn_cancelled"
986
+ | "turn_failed";
867
987
  retry: HostedGuestRetryDisposition;
868
988
  } {
989
+ if (outcome.errorCode === "agent_dependency_failed") {
990
+ return {
991
+ error: "agent_dependency_failed",
992
+ retry: HOSTED_GUEST_RETRY_TERMINAL,
993
+ };
994
+ }
869
995
  if (
870
- errorMessage !== undefined &&
871
- isQuietGuestConnectStallMessage(errorMessage)
996
+ outcome.status === "error" &&
997
+ outcome.errorCode !== undefined &&
998
+ TRANSIENT_TURN_ERROR_CODES.has(outcome.errorCode)
872
999
  ) {
873
1000
  return {
874
1001
  error: GUEST_CONNECT_STALLED,
875
1002
  retry: HOSTED_GUEST_RETRY_TRANSIENT,
876
1003
  };
877
1004
  }
1005
+ if (outcome.status === "cancelled") {
1006
+ return {
1007
+ error: "turn_cancelled",
1008
+ retry: HOSTED_GUEST_RETRY_TERMINAL,
1009
+ };
1010
+ }
878
1011
  return { error: "turn_failed", retry: HOSTED_GUEST_RETRY_TERMINAL };
879
1012
  }
880
1013
 
@@ -8,7 +8,11 @@ import { createHash, randomBytes } from "node:crypto";
8
8
  import { mkdir, rename, unlink, writeFile } from "node:fs/promises";
9
9
  import { join } from "node:path";
10
10
 
11
- import { HOSTED_EXECUTION_DIAG_FILENAME } from "./hosted-delivery-protocol.js";
11
+ import {
12
+ HOSTED_EXECUTION_DIAG_FILENAME,
13
+ type HostedFailureClassification,
14
+ parseHostedFailureClassification,
15
+ } from "./hosted-delivery-protocol.js";
12
16
 
13
17
  export const HOSTED_EXECUTION_DIAG_VERSION = 1;
14
18
  /** Cap so a runaway message cannot fill the guest disk or the host log. */
@@ -57,6 +61,8 @@ export type HostedExecutionDiag = {
57
61
  signalAborted?: boolean;
58
62
  requestId?: string;
59
63
  abortReason?: HostedExecutionDiagAbortReason;
64
+ failureCode?: string;
65
+ classification?: HostedFailureClassification;
60
66
  };
61
67
 
62
68
  /** Written before the turn starts so a stalled execution still has a record. */
@@ -75,6 +81,8 @@ const DIAG_KEYS = new Set([
75
81
  "signalAborted",
76
82
  "requestId",
77
83
  "abortReason",
84
+ "failureCode",
85
+ "classification",
78
86
  ]);
79
87
 
80
88
  const ABORT_REASONS = new Set<HostedExecutionDiagAbortReason>([
@@ -137,13 +145,13 @@ export function hostedExecutionDiagPath(stateRoot: string): string {
137
145
 
138
146
  export function abortReasonFromTurnStatus(
139
147
  status: string,
140
- message: string | undefined
148
+ cancellationReason: "signal" | "runner" | undefined
141
149
  ): HostedExecutionDiagAbortReason | undefined {
142
150
  if (status === "finished") {
143
151
  return undefined;
144
152
  }
145
153
  if (status === "cancelled") {
146
- return message !== undefined && /abort/i.test(message)
154
+ return cancellationReason === "signal"
147
155
  ? "signal_abort"
148
156
  : "runner_cancelled";
149
157
  }
@@ -197,6 +205,14 @@ export function parseHostedExecutionDiag(
197
205
  HOSTED_ERROR_SNIPPET_MAX_CHARS
198
206
  );
199
207
  const requestId = boundedOptionalString(body.requestId, 128);
208
+ const failureCode = boundedOptionalString(body.failureCode, 64);
209
+ const classification =
210
+ body.classification === undefined
211
+ ? undefined
212
+ : parseHostedFailureClassification(body.classification);
213
+ if (body.classification !== undefined && classification === undefined) {
214
+ return undefined;
215
+ }
200
216
  const abortReason =
201
217
  body.abortReason === undefined
202
218
  ? undefined
@@ -226,6 +242,8 @@ export function parseHostedExecutionDiag(
226
242
  ...(body.signalAborted === true ? { signalAborted: true } : {}),
227
243
  ...(requestId === undefined ? {} : { requestId }),
228
244
  ...(abortReason === undefined ? {} : { abortReason }),
245
+ ...(failureCode === undefined ? {} : { failureCode }),
246
+ ...(classification === undefined ? {} : { classification }),
229
247
  };
230
248
  }
231
249
 
@@ -9,6 +9,7 @@
9
9
  * so TAS does not treat a previous delivery's terminal record as this one.
10
10
  */
11
11
 
12
+ import type { HostedFailureClassification } from "./hosted-delivery-protocol.js";
12
13
  import {
13
14
  type HostedExecutionDiagAbortReason,
14
15
  hostedErrorStackSnippet,
@@ -46,6 +47,8 @@ export type HostedExecutionFlushFields = {
46
47
  durationMs: number;
47
48
  message?: string;
48
49
  abortReason?: HostedExecutionDiagAbortReason;
50
+ failureCode?: string;
51
+ classification?: HostedFailureClassification;
49
52
  error?: unknown;
50
53
  };
51
54
 
@@ -75,12 +78,12 @@ export async function flushHostedExecutionRecord(
75
78
  durationMs: fields.durationMs,
76
79
  ...(message === undefined ? {} : { message }),
77
80
  ...(stack === undefined || stack.length === 0 ? {} : { stack }),
78
- ...(message !== undefined && /abort/i.test(message)
79
- ? { signalAborted: true }
80
- : {}),
81
+ signalAborted: fields.abortReason === "signal_abort" ? true : undefined,
81
82
  ...(fields.abortReason === undefined
82
83
  ? {}
83
84
  : { abortReason: fields.abortReason }),
85
+ failureCode: fields.failureCode,
86
+ classification: fields.classification,
84
87
  });
85
88
  }
86
89
  if (sinks.persistSessionRun !== undefined) {
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Built-in HTTP channel admission for control-plane session starts.
3
+ *
4
+ * `agent-sdk run --prod` reaches the authenticated CP start route, which
5
+ * delivers `agentsdk.session` to the built-in `http` channel of every v2
6
+ * agent. The wake is `send(message, { dryRun, asOf })`; the session id, when
7
+ * the caller resumed an explicit `ses_…`, arrives through the hosted
8
+ * execution (never through this payload), so authored code cannot pick one.
9
+ */
10
+
11
+ import type { ChannelHandlerArgs, HttpChannelDefinition } from "../types.js";
12
+ import { skipped, turnStarted } from "./channel-dispatch.js";
13
+ import { attachHostedAdmissionAdapter } from "./hosted-admission-adapter.js";
14
+ import {
15
+ AGENT_SDK_HTTP_CHANNEL_KIND,
16
+ AGENT_SDK_SESSION_EVENT_TYPE,
17
+ } from "./hosted-catch-protocol.js";
18
+
19
+ export type ControlPlaneSessionPayload = {
20
+ message: string;
21
+ dryRun?: boolean | undefined;
22
+ asOf?: string | undefined;
23
+ };
24
+
25
+ const PAYLOAD_KEYS = new Set(["message", "dryRun", "asOf"]);
26
+ const MAX_MESSAGE_CHARS = 64 * 1024;
27
+
28
+ function isRecord(value: unknown): value is Record<string, unknown> {
29
+ return typeof value === "object" && value !== null && !Array.isArray(value);
30
+ }
31
+
32
+ export function parseControlPlaneSessionPayload(
33
+ payload: unknown
34
+ ):
35
+ | { ok: true; data: ControlPlaneSessionPayload }
36
+ | { ok: false; error: string } {
37
+ if (!isRecord(payload)) {
38
+ return { ok: false, error: "payload must be an object" };
39
+ }
40
+ if (Object.keys(payload).some((key) => !PAYLOAD_KEYS.has(key))) {
41
+ return { ok: false, error: "payload carries an unsupported field" };
42
+ }
43
+ const message =
44
+ typeof payload.message === "string" ? payload.message.trim() : "";
45
+ if (message.length === 0 || message.length > MAX_MESSAGE_CHARS) {
46
+ return { ok: false, error: "payload.message is required" };
47
+ }
48
+ if (payload.dryRun !== undefined && typeof payload.dryRun !== "boolean") {
49
+ return { ok: false, error: "payload.dryRun must be a boolean" };
50
+ }
51
+ if (
52
+ payload.asOf !== undefined &&
53
+ (typeof payload.asOf !== "string" || payload.asOf.trim().length === 0)
54
+ ) {
55
+ return { ok: false, error: "payload.asOf must be a non-empty string" };
56
+ }
57
+ return {
58
+ ok: true,
59
+ data: {
60
+ message,
61
+ dryRun: payload.dryRun === true ? true : undefined,
62
+ asOf: typeof payload.asOf === "string" ? payload.asOf.trim() : undefined,
63
+ },
64
+ };
65
+ }
66
+
67
+ export async function dispatchHttpControlPlaneSession(input: {
68
+ eventType: string;
69
+ payload: unknown;
70
+ args: ChannelHandlerArgs;
71
+ onMessage?: HttpChannelDefinition["onMessage"];
72
+ }): Promise<Response> {
73
+ if (input.eventType !== AGENT_SDK_SESSION_EVENT_TYPE) {
74
+ return skipped("not a control-plane session");
75
+ }
76
+ const parsed = parseControlPlaneSessionPayload(input.payload);
77
+ if (!parsed.ok) {
78
+ return Response.json({ ok: false, error: parsed.error }, { status: 400 });
79
+ }
80
+ const message =
81
+ input.onMessage === undefined
82
+ ? parsed.data.message
83
+ : await input.onMessage(parsed.data.message, { auth: null });
84
+ const session = await input.args.send(message, {
85
+ dryRun: parsed.data.dryRun,
86
+ asOf: parsed.data.asOf,
87
+ });
88
+ return turnStarted(session);
89
+ }
90
+
91
+ export function attachHttpControlPlaneAdmission(
92
+ definition: HttpChannelDefinition
93
+ ): void {
94
+ attachHostedAdmissionAdapter(definition, {
95
+ kind: AGENT_SDK_HTTP_CHANNEL_KIND,
96
+ dispatch: ({ eventType, payload, args }) =>
97
+ dispatchHttpControlPlaneSession({
98
+ eventType,
99
+ payload,
100
+ args,
101
+ onMessage: definition.onMessage,
102
+ }),
103
+ });
104
+ }
@@ -20,7 +20,6 @@ const EMPTY_DIRS: readonly string[] = [
20
20
  "agent/subagents",
21
21
  "agent/channels",
22
22
  "agent/hooks",
23
- "agent/ab",
24
23
  "agent/schedules",
25
24
  "agent/sandbox/workspace",
26
25
  "agent/lib",
@@ -101,7 +100,7 @@ Run the CLI under Node, never Bun.
101
100
  ## Pointers
102
101
 
103
102
  - Package loop: \`node_modules/${PACKAGE_NAME}/AGENTS.md\`
104
- - Skills: \`node_modules/${PACKAGE_NAME}/skills/\` (\`create-agent\`, \`evals\`, \`hillclimb\`, \`debug\`)
103
+ - Skills: \`node_modules/${PACKAGE_NAME}/skills/\` (\`create-agent\`, \`deploy\`, \`evals\`, \`hillclimb\`, \`debug\`)
105
104
  - Docs: \`npx ${PACKAGE_NAME} docs\`
106
105
  - LLM docs index: \`node_modules/${PACKAGE_NAME}/dist/docs/llms.txt\`
107
106
  `;
@@ -57,6 +57,8 @@ export interface PackageSkill {
57
57
  leafDir: string;
58
58
  /** Absolute path to the source skill directory in the package. */
59
59
  sourceDir: string;
60
+ /** Exact package version that supplied this skill. */
61
+ packageVersion: string;
60
62
  }
61
63
 
62
64
  export function cursorSkillsHome(home?: string): string {
@@ -116,6 +118,7 @@ export async function listShippedPackageSkills(
116
118
  } catch {
117
119
  return [];
118
120
  }
121
+ const packageVersion = await readPackageVersion(packageRoot);
119
122
 
120
123
  const skills: PackageSkill[] = [];
121
124
  for (const entry of entries) {
@@ -133,12 +136,23 @@ export async function listShippedPackageSkills(
133
136
  const name =
134
137
  parseFrontmatter(raw).data.name ||
135
138
  `${CURSOR_SKILLS_NAMESPACE}-${entry.name}`;
136
- skills.push({ name, leafDir: entry.name, sourceDir });
139
+ skills.push({ name, leafDir: entry.name, sourceDir, packageVersion });
137
140
  }
138
141
  skills.sort((a, b) => a.leafDir.localeCompare(b.leafDir));
139
142
  return skills;
140
143
  }
141
144
 
145
+ const PACKAGE_VERSION_PLACEHOLDER = "__CURSOR_JULY_VERSION__";
146
+
147
+ async function readPackageVersion(packageRoot: string): Promise<string> {
148
+ const raw = await readFile(join(packageRoot, "package.json"), "utf8");
149
+ const manifest = JSON.parse(raw) as { version?: unknown };
150
+ if (typeof manifest.version !== "string" || manifest.version.trim() === "") {
151
+ throw new Error("The @cursor/july package must declare a version.");
152
+ }
153
+ return manifest.version;
154
+ }
155
+
142
156
  /**
143
157
  * Skills that do not yet have a SKILL.md under ~/.cursor/skills/agentsdk/.
144
158
  * Install still overwrites every shipped skill when the user confirms — this
@@ -200,7 +214,10 @@ export async function installCursorSkills(
200
214
  await makeTreeWritable(target);
201
215
  const skillMdPath = join(target, "SKILL.md");
202
216
  const raw = await readFile(skillMdPath, "utf8");
203
- const adjusted = prepareSkillMarkdownForCursorInstall(raw);
217
+ const adjusted = prepareSkillMarkdownForCursorInstall(
218
+ raw,
219
+ skill.packageVersion
220
+ );
204
221
  if (adjusted !== raw) {
205
222
  await writeFile(skillMdPath, adjusted, "utf8");
206
223
  }
@@ -276,9 +293,13 @@ async function hasLegacyCursorSkillsNamespace(
276
293
 
277
294
  /**
278
295
  * Drop monorepo `paths` globs, set `alwaysApply: true` so Cursor injects the
279
- * body as a global rule, and fix package doc links for ~/.cursor installs.
296
+ * body as a global rule, bind package commands to the installing version, and
297
+ * fix package doc links for ~/.cursor installs.
280
298
  */
281
- export function prepareSkillMarkdownForCursorInstall(content: string): string {
299
+ export function prepareSkillMarkdownForCursorInstall(
300
+ content: string,
301
+ packageVersion?: string
302
+ ): string {
282
303
  const match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(content);
283
304
  if (match === null) {
284
305
  return content;
@@ -291,7 +312,19 @@ export function prepareSkillMarkdownForCursorInstall(content: string): string {
291
312
  /\[`docs\/([^`]+)`\]\(\.\.\/\.\.\/docs\/[^)]+\)/g,
292
313
  "docs/$1 in the @cursor/july package"
293
314
  );
294
- return `---\n${frontmatter.trimEnd()}\n---${adjustedBody}`;
315
+ if (
316
+ adjustedBody.includes(PACKAGE_VERSION_PLACEHOLDER) &&
317
+ (packageVersion === undefined || packageVersion.trim() === "")
318
+ ) {
319
+ throw new Error(
320
+ "Cannot install an Agent SDK skill without a package version."
321
+ );
322
+ }
323
+ const versionBoundBody =
324
+ packageVersion === undefined
325
+ ? adjustedBody
326
+ : adjustedBody.replaceAll(PACKAGE_VERSION_PLACEHOLDER, packageVersion);
327
+ return `---\n${frontmatter.trimEnd()}\n---${versionBoundBody}`;
295
328
  }
296
329
 
297
330
  function stripPathsFromFrontmatter(frontmatter: string): string {
@@ -0,0 +1,59 @@
1
+ import {
2
+ type AgentServeDeployClient,
3
+ DeployApiError,
4
+ } from "./deploy-client.js";
5
+
6
+ /**
7
+ * Classify a hosted slug by probing the v2 control plane.
8
+ *
9
+ * Only HTTP 404 means “not v2.” Auth, 5xx, and transport errors fail closed
10
+ * so a v2 slug cannot fall through to `/internal/agent-serve`. That probe
11
+ * shares the factory microlith path used by secrets; a factory outage will
12
+ * also block legacy `--prod` until it recovers.
13
+ */
14
+ export async function deploymentArchitecture(args: {
15
+ client: AgentServeDeployClient;
16
+ teamId: number;
17
+ slug: string;
18
+ }): Promise<"v1" | "v2"> {
19
+ try {
20
+ await args.client.getAgentkitDeploy({
21
+ teamId: args.teamId,
22
+ slug: args.slug,
23
+ });
24
+ return "v2";
25
+ } catch (error) {
26
+ if (error instanceof DeployApiError && error.status === 404) {
27
+ return "v1";
28
+ }
29
+ throw error;
30
+ }
31
+ }
32
+
33
+ export function unsupportedV2LegacyCommandError(slug: string): DeployApiError {
34
+ return new DeployApiError(
35
+ `This command is not supported for architecture v2 deployment "${slug}". The command stopped before calling the legacy v1 deployment API.`,
36
+ 409
37
+ );
38
+ }
39
+
40
+ export function isUnsupportedV2LegacyCommandError(
41
+ error: unknown
42
+ ): error is DeployApiError {
43
+ return (
44
+ error instanceof DeployApiError &&
45
+ error.status === 409 &&
46
+ error.message.includes("not supported for architecture v2")
47
+ );
48
+ }
49
+
50
+ export async function rejectV2ForLegacyCommand(args: {
51
+ client: AgentServeDeployClient;
52
+ teamId: number;
53
+ slug: string;
54
+ }): Promise<void> {
55
+ const architecture = await deploymentArchitecture(args);
56
+ if (architecture === "v2") {
57
+ throw unsupportedV2LegacyCommandError(args.slug);
58
+ }
59
+ }