@cursor/july 0.1.105 → 0.1.108

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 (395) hide show
  1. package/README.md +10 -5
  2. package/dist/bin/agent-serve.js +31 -16
  3. package/dist/channels/bitbucket/types.d.ts +2 -4
  4. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  5. package/dist/channels/deployments/types.d.ts +5 -8
  6. package/dist/channels/deployments/types.d.ts.map +1 -1
  7. package/dist/channels/github/github-channel.js +8 -5
  8. package/dist/channels/github/types.d.ts +7 -5
  9. package/dist/channels/github/types.d.ts.map +1 -1
  10. package/dist/channels/gitlab/types.d.ts +2 -5
  11. package/dist/channels/gitlab/types.d.ts.map +1 -1
  12. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  13. package/dist/channels/origin/origin-channel.js +27 -13
  14. package/dist/channels/origin/types.d.ts +7 -4
  15. package/dist/channels/origin/types.d.ts.map +1 -1
  16. package/dist/channels/slack/defaults.d.ts.map +1 -1
  17. package/dist/channels/slack/defaults.js +3 -0
  18. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  19. package/dist/channels/slack/dispatch.js +1 -1
  20. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  21. package/dist/channels/slack/live-delivery.js +48 -11
  22. package/dist/channels/slack/types.d.ts +4 -3
  23. package/dist/channels/slack/types.d.ts.map +1 -1
  24. package/dist/channels.d.ts +45 -0
  25. package/dist/channels.d.ts.map +1 -1
  26. package/dist/channels.js +106 -7
  27. package/dist/connections.d.ts +2 -1
  28. package/dist/connections.d.ts.map +1 -1
  29. package/dist/connections.js +2 -1
  30. package/dist/docs/404.html +3 -3
  31. package/dist/docs/ab.html +6 -6
  32. package/dist/docs/assets/{app.BVwaffdK.js → app.BASKM3M4.js} +1 -1
  33. package/dist/docs/assets/chunks/@localSearchIndexroot.BHZYsNVi.js +1 -0
  34. package/dist/docs/assets/chunks/{VPLocalSearchBox.WuWTZ1x8.js → VPLocalSearchBox.BOKxlYGP.js} +2 -2
  35. package/dist/docs/assets/chunks/{theme.BYdI_6sF.js → theme.DbDZW-zb.js} +2 -2
  36. package/dist/docs/assets/{deployment.md.MFPKqsqI.js → deployment.md.JenwuCCB.js} +4 -4
  37. package/dist/docs/assets/{deployment.md.MFPKqsqI.lean.js → deployment.md.JenwuCCB.lean.js} +1 -1
  38. package/dist/docs/assets/{evals.md.CbMoebP1.js → evals.md.C1ekS3k2.js} +1 -1
  39. package/dist/docs/assets/guides_cloud-agents.md.BsloyHdY.js +9 -0
  40. package/dist/docs/assets/{guides_cloud-agents.md.DS8RIjwx.lean.js → guides_cloud-agents.md.BsloyHdY.lean.js} +1 -1
  41. package/dist/docs/assets/{guides_github.md.c0gdGJ-D.js → guides_github.md.BH33UEBJ.js} +1 -1
  42. package/dist/docs/assets/{guides_grokbot-agents.md.DVqdhBKb.js → guides_grokbot-agents.md.DyV-WArv.js} +1 -1
  43. package/dist/docs/assets/guides_improve.md.BGVk32bK.js +14 -0
  44. package/dist/docs/assets/guides_improve.md.BGVk32bK.lean.js +1 -0
  45. package/dist/docs/assets/{guides_opentelemetry.md.COh9jFVg.js → guides_opentelemetry.md.SCRMskno.js} +3 -3
  46. package/dist/docs/assets/{guides_opentelemetry.md.COh9jFVg.lean.js → guides_opentelemetry.md.SCRMskno.lean.js} +1 -1
  47. package/dist/docs/assets/{guides_slack.md.9oHPye9o.js → guides_slack.md.D4RVMM4G.js} +3 -3
  48. package/dist/docs/assets/{guides_slack.md.9oHPye9o.lean.js → guides_slack.md.D4RVMM4G.lean.js} +1 -1
  49. package/dist/docs/assets/index.md.BjH1w2ZW.js +5 -0
  50. package/dist/docs/assets/{reference_agent-config.md.CHNpiyp4.js → reference_agent-config.md.CvoL6pof.js} +1 -1
  51. package/dist/docs/assets/{reference_channels.md.DBGcaB7m.js → reference_channels.md.D-qTqwcq.js} +2 -2
  52. package/dist/docs/assets/{reference_channels.md.DBGcaB7m.lean.js → reference_channels.md.D-qTqwcq.lean.js} +1 -1
  53. package/dist/docs/assets/{reference_cli.md.C6Lo8SEd.js → reference_cli.md.Ca26u0Es.js} +6 -6
  54. package/dist/docs/assets/{reference_cli.md.C6Lo8SEd.lean.js → reference_cli.md.Ca26u0Es.lean.js} +1 -1
  55. package/dist/docs/assets/{reference_connections.md.Di6jJAXF.js → reference_connections.md.BojkC6c5.js} +1 -1
  56. package/dist/docs/assets/{reference_extensions.md.CGmMLblt.js → reference_extensions.md.CPWt00ds.js} +1 -1
  57. package/dist/docs/assets/{scaffolding-agents.md.em43xlY1.js → scaffolding-agents.md.Kctn3OVb.js} +1 -1
  58. package/dist/docs/assets/{skills_create-agent.md.BVoWPcan.js → skills_create-agent.md.Q3h6Je-e.js} +1 -1
  59. package/dist/docs/assets/{skills_debug.md.CDbPhHfg.js → skills_debug.md.CVjCXMFF.js} +1 -1
  60. package/dist/docs/assets/{skills_debug.md.CDbPhHfg.lean.js → skills_debug.md.CVjCXMFF.lean.js} +1 -1
  61. package/dist/docs/assets/{skills_evals.md.723kpUmA.js → skills_evals.md.BhovOvrl.js} +1 -1
  62. package/dist/docs/assets/skills_framework-map.md.D-tFZhFS.js +1 -0
  63. package/dist/docs/assets/{skills_framework-map.md.haibFyoB.lean.js → skills_framework-map.md.D-tFZhFS.lean.js} +1 -1
  64. package/dist/docs/assets/{skills_github.md.D0JahM8c.js → skills_github.md.hgFX_oKY.js} +1 -1
  65. package/dist/docs/assets/{skills_otel.md.CqhobH3B.js → skills_otel.md.B5Ddv1xH.js} +1 -1
  66. package/dist/docs/assets/{style.BRuM8477.css → style.DCD_zyg3.css} +1 -1
  67. package/dist/docs/assets/troubleshooting.md.CYEAO9bM.js +1 -0
  68. package/dist/docs/building-with-agents.html +6 -6
  69. package/dist/docs/concepts.html +5 -5
  70. package/dist/docs/deployment.html +9 -9
  71. package/dist/docs/deployment.md +7 -2
  72. package/dist/docs/evals.html +8 -8
  73. package/dist/docs/evals.md +3 -2
  74. package/dist/docs/guides/agent-to-agent.html +6 -6
  75. package/dist/docs/guides/cloud-agents.html +7 -7
  76. package/dist/docs/guides/cloud-agents.md +4 -3
  77. package/dist/docs/guides/convert-automation.html +6 -6
  78. package/dist/docs/guides/github.html +7 -7
  79. package/dist/docs/guides/github.md +2 -1
  80. package/dist/docs/guides/grokbot-agents.html +7 -7
  81. package/dist/docs/guides/grokbot-agents.md +2 -2
  82. package/dist/docs/guides/human-in-the-loop.html +6 -6
  83. package/dist/docs/guides/improve.html +40 -0
  84. package/dist/docs/guides/improve.md +91 -0
  85. package/dist/docs/guides/mcp-oauth.html +6 -6
  86. package/dist/docs/guides/opentelemetry.html +8 -8
  87. package/dist/docs/guides/opentelemetry.md +3 -4
  88. package/dist/docs/guides/slack.html +8 -8
  89. package/dist/docs/guides/slack.md +2 -1
  90. package/dist/docs/guides/webhooks.html +6 -6
  91. package/dist/docs/hashmap.json +1 -1
  92. package/dist/docs/hillclimbing.html +6 -6
  93. package/dist/docs/index.html +8 -8
  94. package/dist/docs/index.md +4 -0
  95. package/dist/docs/llms-full.txt +180 -61
  96. package/dist/docs/llms.txt +1 -0
  97. package/dist/docs/quickstart.html +6 -6
  98. package/dist/docs/reference/agent-config.html +7 -7
  99. package/dist/docs/reference/agent-config.md +5 -2
  100. package/dist/docs/reference/artifacts.html +6 -6
  101. package/dist/docs/reference/channels.html +7 -7
  102. package/dist/docs/reference/channels.md +11 -19
  103. package/dist/docs/reference/cli.html +11 -11
  104. package/dist/docs/reference/cli.md +23 -13
  105. package/dist/docs/reference/connections.html +8 -8
  106. package/dist/docs/reference/connections.md +2 -1
  107. package/dist/docs/reference/extensions.html +7 -7
  108. package/dist/docs/reference/extensions.md +2 -0
  109. package/dist/docs/reference/hooks.html +6 -6
  110. package/dist/docs/reference/http-api.html +6 -6
  111. package/dist/docs/reference/instructions.html +6 -6
  112. package/dist/docs/reference/playground.html +5 -5
  113. package/dist/docs/reference/project-layout.html +6 -6
  114. package/dist/docs/reference/prompt.html +6 -6
  115. package/dist/docs/reference/result.html +6 -6
  116. package/dist/docs/reference/schedules.html +6 -6
  117. package/dist/docs/reference/sessions.html +5 -5
  118. package/dist/docs/reference/skills.html +6 -6
  119. package/dist/docs/reference/subagents.html +6 -6
  120. package/dist/docs/reference/tools.html +6 -6
  121. package/dist/docs/scaffolding-agents.html +6 -6
  122. package/dist/docs/scaffolding-agents.md +2 -1
  123. package/dist/docs/skills/ab.html +6 -6
  124. package/dist/docs/skills/create-agent.html +8 -8
  125. package/dist/docs/skills/create-agent.md +1 -1
  126. package/dist/docs/skills/debug.html +6 -6
  127. package/dist/docs/skills/debug.md +1 -1
  128. package/dist/docs/skills/evals.html +8 -8
  129. package/dist/docs/skills/evals.md +1 -1
  130. package/dist/docs/skills/framework-map.html +6 -6
  131. package/dist/docs/skills/framework-map.md +4 -2
  132. package/dist/docs/skills/github.html +8 -8
  133. package/dist/docs/skills/github.md +1 -1
  134. package/dist/docs/skills/hillclimb.html +6 -6
  135. package/dist/docs/skills/index.html +5 -5
  136. package/dist/docs/skills/mcp-auth.html +6 -6
  137. package/dist/docs/skills/otel.html +8 -8
  138. package/dist/docs/skills/otel.md +3 -3
  139. package/dist/docs/skills/setup-slack.html +6 -6
  140. package/dist/docs/storage.html +6 -6
  141. package/dist/docs/templates/agentic-owners.html +6 -6
  142. package/dist/docs/templates/agents-md.html +6 -6
  143. package/dist/docs/templates/code-wiki.html +6 -6
  144. package/dist/docs/templates/demo.html +6 -6
  145. package/dist/docs/templates/grokbot-agents.html +6 -6
  146. package/dist/docs/templates/pr-autofixer.html +6 -6
  147. package/dist/docs/templates/security-help.html +6 -6
  148. package/dist/docs/templates/security-reviewer.html +6 -6
  149. package/dist/docs/templates/triage.html +6 -6
  150. package/dist/docs/troubleshooting.html +6 -6
  151. package/dist/docs/troubleshooting.md +1 -1
  152. package/dist/extensions/improve/extension.d.ts +46 -0
  153. package/dist/extensions/improve/extension.d.ts.map +1 -0
  154. package/dist/extensions/improve/extension.js +41 -0
  155. package/dist/extensions/improve/skills/yourself.d.ts +4 -0
  156. package/dist/extensions/improve/skills/yourself.d.ts.map +1 -0
  157. package/dist/extensions/improve/skills/yourself.js +43 -0
  158. package/dist/index.d.ts +4 -5
  159. package/dist/index.d.ts.map +1 -1
  160. package/dist/index.js +3 -4
  161. package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -1
  162. package/dist/internal/builtin-tools/artifacts.js +2 -3
  163. package/dist/internal/channel-route-dispatch.d.ts +13 -0
  164. package/dist/internal/channel-route-dispatch.d.ts.map +1 -0
  165. package/dist/internal/channel-route-dispatch.js +62 -0
  166. package/dist/internal/channel-state.d.ts +17 -0
  167. package/dist/internal/channel-state.d.ts.map +1 -0
  168. package/dist/internal/channel-state.js +78 -0
  169. package/dist/internal/cli-ax.d.ts +7 -0
  170. package/dist/internal/cli-ax.d.ts.map +1 -1
  171. package/dist/internal/cli-ax.js +99 -1
  172. package/dist/internal/cli-cursor.d.ts.map +1 -1
  173. package/dist/internal/cli-cursor.js +2 -0
  174. package/dist/internal/cli-deploy.d.ts.map +1 -1
  175. package/dist/internal/cli-deploy.js +61 -25
  176. package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
  177. package/dist/internal/cli-mcp-oauth.js +15 -0
  178. package/dist/internal/cli-mcp.d.ts.map +1 -1
  179. package/dist/internal/cli-mcp.js +12 -0
  180. package/dist/internal/cli-slack.d.ts.map +1 -1
  181. package/dist/internal/cli-slack.js +8 -2
  182. package/dist/internal/cursor/backend-client.d.ts +25 -0
  183. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  184. package/dist/internal/cursor/backend-client.js +57 -2
  185. package/dist/internal/cursor/credentials.d.ts +8 -2
  186. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  187. package/dist/internal/cursor/credentials.js +27 -5
  188. package/dist/internal/deploy-client.d.ts +35 -0
  189. package/dist/internal/deploy-client.d.ts.map +1 -1
  190. package/dist/internal/deploy-client.js +46 -0
  191. package/dist/internal/deploy-manifest.d.ts +26 -0
  192. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  193. package/dist/internal/deploy-manifest.js +99 -13
  194. package/dist/internal/describe-error.d.ts +1 -0
  195. package/dist/internal/describe-error.d.ts.map +1 -1
  196. package/dist/internal/describe-error.js +25 -0
  197. package/dist/internal/discovery/agent.d.ts.map +1 -1
  198. package/dist/internal/discovery/agent.js +1 -0
  199. package/dist/internal/discovery/info.d.ts.map +1 -1
  200. package/dist/internal/discovery/info.js +7 -3
  201. package/dist/internal/discovery/modules.d.ts +1 -1
  202. package/dist/internal/discovery/modules.d.ts.map +1 -1
  203. package/dist/internal/discovery/modules.js +1 -0
  204. package/dist/internal/discovery/project.d.ts.map +1 -1
  205. package/dist/internal/discovery/project.js +3 -0
  206. package/dist/internal/discovery/reminders.d.ts +7 -0
  207. package/dist/internal/discovery/reminders.d.ts.map +1 -0
  208. package/dist/internal/discovery/reminders.js +65 -0
  209. package/dist/internal/discovery/subagent.js +1 -0
  210. package/dist/internal/distribution.d.ts +5 -0
  211. package/dist/internal/distribution.d.ts.map +1 -1
  212. package/dist/internal/distribution.js +17 -0
  213. package/dist/internal/framework-storage-selection.d.ts +14 -3
  214. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  215. package/dist/internal/framework-storage-selection.js +36 -6
  216. package/dist/internal/guest-network.d.ts +4 -10
  217. package/dist/internal/guest-network.d.ts.map +1 -1
  218. package/dist/internal/guest-network.js +44 -26
  219. package/dist/internal/hosted-admission-adapter.d.ts +2 -0
  220. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  221. package/dist/internal/hosted-catch-protocol.d.ts +51 -0
  222. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -0
  223. package/dist/internal/hosted-catch-protocol.js +103 -0
  224. package/dist/internal/hosted-catch.d.ts +40 -0
  225. package/dist/internal/hosted-catch.d.ts.map +1 -0
  226. package/dist/internal/hosted-catch.js +149 -0
  227. package/dist/internal/hosted-delivery-protocol.d.ts +89 -0
  228. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  229. package/dist/internal/hosted-delivery-protocol.js +309 -0
  230. package/dist/internal/hosted-delivery.d.ts +20 -1
  231. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  232. package/dist/internal/hosted-delivery.js +179 -36
  233. package/dist/internal/hosted-execution-diag.d.ts +4 -1
  234. package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
  235. package/dist/internal/hosted-execution-diag.js +13 -4
  236. package/dist/internal/hosted-execution-flush.d.ts +3 -0
  237. package/dist/internal/hosted-execution-flush.d.ts.map +1 -1
  238. package/dist/internal/hosted-execution-flush.js +2 -4
  239. package/dist/internal/http-control-plane-session.d.ts +30 -0
  240. package/dist/internal/http-control-plane-session.d.ts.map +1 -0
  241. package/dist/internal/http-control-plane-session.js +83 -0
  242. package/dist/internal/legacy-command-guard.d.ts +22 -0
  243. package/dist/internal/legacy-command-guard.d.ts.map +1 -0
  244. package/dist/internal/legacy-command-guard.js +51 -0
  245. package/dist/internal/local-control-plane.d.ts +18 -2
  246. package/dist/internal/local-control-plane.d.ts.map +1 -1
  247. package/dist/internal/local-control-plane.js +199 -17
  248. package/dist/internal/platform-timers.d.ts +7 -0
  249. package/dist/internal/platform-timers.d.ts.map +1 -1
  250. package/dist/internal/platform-timers.js +139 -0
  251. package/dist/internal/reminder-control-plane-protocol.d.ts +189 -0
  252. package/dist/internal/reminder-control-plane-protocol.d.ts.map +1 -0
  253. package/dist/internal/reminder-control-plane-protocol.js +251 -0
  254. package/dist/internal/reminder-runner.d.ts +56 -6
  255. package/dist/internal/reminder-runner.d.ts.map +1 -1
  256. package/dist/internal/reminder-runner.js +372 -57
  257. package/dist/internal/reminder-schedule.d.ts +5 -2
  258. package/dist/internal/reminder-schedule.d.ts.map +1 -1
  259. package/dist/internal/reminder-schedule.js +8 -6
  260. package/dist/internal/reminder-store.d.ts +24 -7
  261. package/dist/internal/reminder-store.d.ts.map +1 -1
  262. package/dist/internal/reminder-store.js +6 -5
  263. package/dist/internal/request-error-status.d.ts +2 -0
  264. package/dist/internal/request-error-status.d.ts.map +1 -1
  265. package/dist/internal/request-error-status.js +22 -3
  266. package/dist/internal/resolve-prod-target.d.ts +2 -0
  267. package/dist/internal/resolve-prod-target.d.ts.map +1 -1
  268. package/dist/internal/resolve-prod-target.js +13 -0
  269. package/dist/internal/scm/pr-url.d.ts +40 -0
  270. package/dist/internal/scm/pr-url.d.ts.map +1 -1
  271. package/dist/internal/scm/pr-url.js +93 -14
  272. package/dist/internal/sdk-runner.d.ts.map +1 -1
  273. package/dist/internal/sdk-runner.js +4 -3
  274. package/dist/internal/server.d.ts.map +1 -1
  275. package/dist/internal/server.js +118 -77
  276. package/dist/internal/session-engine.d.ts +6 -6
  277. package/dist/internal/session-engine.d.ts.map +1 -1
  278. package/dist/internal/session-engine.js +100 -67
  279. package/dist/playground/assets/{index-BaQzjaNK.js → index-BMDqAeXu.js} +34 -34
  280. package/dist/playground/assets/index-LUgJoWdL.css +1 -0
  281. package/dist/playground/index.html +2 -2
  282. package/dist/reminders.d.ts +24 -5
  283. package/dist/reminders.d.ts.map +1 -1
  284. package/dist/reminders.js +28 -5
  285. package/dist/storage-backends/cursor-hosted.d.ts +6 -0
  286. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  287. package/dist/storage-backends/cursor-hosted.js +29 -1
  288. package/dist/types.d.ts +122 -25
  289. package/dist/types.d.ts.map +1 -1
  290. package/docs/README.md +4 -0
  291. package/docs/deployment.md +7 -2
  292. package/docs/evals.md +3 -2
  293. package/docs/guides/cloud-agents.md +4 -3
  294. package/docs/guides/github.md +2 -1
  295. package/docs/guides/grokbot-agents.md +2 -2
  296. package/docs/guides/improve.md +96 -0
  297. package/docs/guides/opentelemetry.md +3 -4
  298. package/docs/guides/slack.md +2 -1
  299. package/docs/reference/agent-config.md +5 -2
  300. package/docs/reference/channels.md +11 -19
  301. package/docs/reference/cli.md +23 -13
  302. package/docs/reference/connections.md +2 -1
  303. package/docs/reference/extensions.md +2 -0
  304. package/docs/scaffolding-agents.md +2 -1
  305. package/docs/troubleshooting.md +1 -1
  306. package/package.json +10 -3
  307. package/skills/create-agent/SKILL.md +1 -1
  308. package/skills/debug/SKILL.md +1 -1
  309. package/skills/evals/SKILL.md +1 -1
  310. package/skills/framework-map/SKILL.md +4 -2
  311. package/skills/github/SKILL.md +1 -1
  312. package/skills/otel/SKILL.md +3 -3
  313. package/src/bin/agent-serve.ts +28 -11
  314. package/src/channels/bitbucket/types.ts +2 -4
  315. package/src/channels/deployments/types.ts +5 -8
  316. package/src/channels/github/github-channel.ts +8 -8
  317. package/src/channels/github/types.ts +7 -4
  318. package/src/channels/gitlab/types.ts +2 -5
  319. package/src/channels/origin/origin-channel.ts +29 -13
  320. package/src/channels/origin/types.ts +7 -3
  321. package/src/channels/slack/defaults.ts +3 -0
  322. package/src/channels/slack/dispatch.ts +1 -0
  323. package/src/channels/slack/live-delivery.ts +53 -12
  324. package/src/channels/slack/types.ts +4 -3
  325. package/src/channels.ts +157 -10
  326. package/src/connections.ts +2 -1
  327. package/src/extensions/improve/extension.ts +70 -0
  328. package/src/extensions/improve/skills/yourself.ts +50 -0
  329. package/src/index.ts +6 -3
  330. package/src/internal/builtin-tools/artifacts.ts +2 -3
  331. package/src/internal/channel-route-dispatch.ts +66 -0
  332. package/src/internal/channel-state.ts +96 -0
  333. package/src/internal/cli-ax.ts +110 -1
  334. package/src/internal/cli-cursor.ts +4 -1
  335. package/src/internal/cli-deploy.ts +80 -22
  336. package/src/internal/cli-mcp-oauth.ts +18 -0
  337. package/src/internal/cli-mcp.ts +11 -0
  338. package/src/internal/cli-slack.ts +15 -2
  339. package/src/internal/cursor/backend-client.ts +90 -2
  340. package/src/internal/cursor/credentials.ts +35 -7
  341. package/src/internal/deploy-client.ts +70 -0
  342. package/src/internal/deploy-manifest.ts +131 -12
  343. package/src/internal/describe-error.ts +28 -0
  344. package/src/internal/discovery/agent.ts +1 -0
  345. package/src/internal/discovery/info.ts +6 -0
  346. package/src/internal/discovery/modules.ts +2 -4
  347. package/src/internal/discovery/project.ts +3 -0
  348. package/src/internal/discovery/reminders.ts +65 -0
  349. package/src/internal/discovery/subagent.ts +1 -0
  350. package/src/internal/distribution.ts +20 -0
  351. package/src/internal/framework-storage-selection.ts +43 -6
  352. package/src/internal/guest-network.ts +46 -29
  353. package/src/internal/hosted-admission-adapter.ts +2 -0
  354. package/src/internal/hosted-catch-protocol.ts +130 -0
  355. package/src/internal/hosted-catch.ts +192 -0
  356. package/src/internal/hosted-delivery-protocol.ts +483 -0
  357. package/src/internal/hosted-delivery.ts +303 -43
  358. package/src/internal/hosted-execution-diag.ts +21 -3
  359. package/src/internal/hosted-execution-flush.ts +6 -3
  360. package/src/internal/http-control-plane-session.ts +104 -0
  361. package/src/internal/legacy-command-guard.ts +59 -0
  362. package/src/internal/local-control-plane.ts +281 -22
  363. package/src/internal/platform-timers.ts +191 -0
  364. package/src/internal/reminder-control-plane-protocol.ts +512 -0
  365. package/src/internal/reminder-runner.ts +481 -57
  366. package/src/internal/reminder-schedule.ts +11 -6
  367. package/src/internal/reminder-store.ts +27 -7
  368. package/src/internal/request-error-status.ts +27 -3
  369. package/src/internal/resolve-prod-target.ts +15 -0
  370. package/src/internal/scm/pr-url.ts +167 -20
  371. package/src/internal/sdk-runner.ts +2 -1
  372. package/src/internal/server.ts +151 -88
  373. package/src/internal/session-engine.ts +146 -83
  374. package/src/reminders.ts +35 -4
  375. package/src/storage-backends/cursor-hosted.ts +40 -1
  376. package/src/types.ts +134 -26
  377. package/dist/docs/assets/chunks/@localSearchIndexroot.CJxMklAy.js +0 -1
  378. package/dist/docs/assets/guides_cloud-agents.md.DS8RIjwx.js +0 -9
  379. package/dist/docs/assets/index.md.BW_6tOgR.js +0 -5
  380. package/dist/docs/assets/skills_framework-map.md.haibFyoB.js +0 -1
  381. package/dist/docs/assets/troubleshooting.md.Cus_YZga.js +0 -1
  382. package/dist/playground/assets/index-CceqnLTX.css +0 -1
  383. /package/dist/docs/assets/{evals.md.CbMoebP1.lean.js → evals.md.C1ekS3k2.lean.js} +0 -0
  384. /package/dist/docs/assets/{guides_github.md.c0gdGJ-D.lean.js → guides_github.md.BH33UEBJ.lean.js} +0 -0
  385. /package/dist/docs/assets/{guides_grokbot-agents.md.DVqdhBKb.lean.js → guides_grokbot-agents.md.DyV-WArv.lean.js} +0 -0
  386. /package/dist/docs/assets/{index.md.BW_6tOgR.lean.js → index.md.BjH1w2ZW.lean.js} +0 -0
  387. /package/dist/docs/assets/{reference_agent-config.md.CHNpiyp4.lean.js → reference_agent-config.md.CvoL6pof.lean.js} +0 -0
  388. /package/dist/docs/assets/{reference_connections.md.Di6jJAXF.lean.js → reference_connections.md.BojkC6c5.lean.js} +0 -0
  389. /package/dist/docs/assets/{reference_extensions.md.CGmMLblt.lean.js → reference_extensions.md.CPWt00ds.lean.js} +0 -0
  390. /package/dist/docs/assets/{scaffolding-agents.md.em43xlY1.lean.js → scaffolding-agents.md.Kctn3OVb.lean.js} +0 -0
  391. /package/dist/docs/assets/{skills_create-agent.md.BVoWPcan.lean.js → skills_create-agent.md.Q3h6Je-e.lean.js} +0 -0
  392. /package/dist/docs/assets/{skills_evals.md.723kpUmA.lean.js → skills_evals.md.BhovOvrl.lean.js} +0 -0
  393. /package/dist/docs/assets/{skills_github.md.D0JahM8c.lean.js → skills_github.md.hgFX_oKY.lean.js} +0 -0
  394. /package/dist/docs/assets/{skills_otel.md.CqhobH3B.lean.js → skills_otel.md.B5Ddv1xH.lean.js} +0 -0
  395. /package/dist/docs/assets/{troubleshooting.md.Cus_YZga.lean.js → troubleshooting.md.CYEAO9bM.lean.js} +0 -0
@@ -23,8 +23,14 @@ export interface ResolvedSchedule {
23
23
  nextFireAtMs: number;
24
24
  }
25
25
 
26
- /** Resolve create-input schedule fields into a concrete next-fire plan. */
27
- export function resolveSchedule(input: ReminderCreateInput): ResolvedSchedule {
26
+ /**
27
+ * Resolve create-input schedule fields into a concrete next-fire plan.
28
+ * Pass `nowMs` for deterministic CP / test resolution; CP owns this call.
29
+ */
30
+ export function resolveSchedule(
31
+ input: Pick<ReminderCreateInput, "every" | "cron" | "delay" | "at">,
32
+ nowMs: number = Date.now()
33
+ ): ResolvedSchedule {
28
34
  const shapes = [
29
35
  input.every !== undefined,
30
36
  input.cron !== undefined,
@@ -37,7 +43,6 @@ export function resolveSchedule(input: ReminderCreateInput): ResolvedSchedule {
37
43
  );
38
44
  }
39
45
 
40
- const now = Date.now();
41
46
  if (input.every !== undefined) {
42
47
  const intervalMs = parseDuration(input.every);
43
48
  if (intervalMs <= 0) {
@@ -49,7 +54,7 @@ export function resolveSchedule(input: ReminderCreateInput): ResolvedSchedule {
49
54
  kind: "every",
50
55
  value: String(input.every),
51
56
  intervalMs,
52
- nextFireAtMs: now + intervalMs,
57
+ nextFireAtMs: nowMs + intervalMs,
53
58
  };
54
59
  }
55
60
  if (input.cron !== undefined) {
@@ -57,7 +62,7 @@ export function resolveSchedule(input: ReminderCreateInput): ResolvedSchedule {
57
62
  return {
58
63
  kind: "cron",
59
64
  value: input.cron,
60
- nextFireAtMs: nextCronFireMs(input.cron, now),
65
+ nextFireAtMs: nextCronFireMs(input.cron, nowMs),
61
66
  };
62
67
  }
63
68
  if (input.delay !== undefined) {
@@ -65,7 +70,7 @@ export function resolveSchedule(input: ReminderCreateInput): ResolvedSchedule {
65
70
  return {
66
71
  kind: "delay",
67
72
  value: String(input.delay),
68
- nextFireAtMs: now + delayMs,
73
+ nextFireAtMs: nowMs + delayMs,
69
74
  };
70
75
  }
71
76
  const atMs =
@@ -2,10 +2,10 @@
2
2
  * Reminder document store used by the local control plane
3
3
  * (`<stateRoot>/control-plane/reminders/`).
4
4
  *
5
- * Handlers (`run` / function `until`) are not serializable — they live only
6
- * in the in-memory {@link ReminderRunner} registry. The control plane holds
7
- * schedule, prompt, target, and status so prompt-form reminders survive
8
- * restart.
5
+ * Anonymous `run` / function `until` handlers are not serializable — they live
6
+ * only in the in-memory {@link ReminderRunner} registry. Named `handler` +
7
+ * `args` and prompt-form reminders survive restart (handlers resolve from
8
+ * `agent/reminders/` on every fire).
9
9
  */
10
10
 
11
11
  import {
@@ -18,6 +18,7 @@ import {
18
18
  } from "node:fs/promises";
19
19
  import { join } from "node:path";
20
20
  import type {
21
+ JsonObject,
21
22
  ReminderBusyPolicy,
22
23
  ReminderScheduleKind,
23
24
  ReminderStatus,
@@ -31,6 +32,12 @@ export type {
31
32
  ReminderStatus,
32
33
  } from "../types.js";
33
34
 
35
+ /**
36
+ * Internal record status. `firing` is CP claim state and must not appear on
37
+ * public {@link ReminderStatus} / {@link ReminderInfo}.
38
+ */
39
+ export type ReminderRecordStatus = ReminderStatus | "firing";
40
+
34
41
  /** Serializable reminder record (no function bodies). */
35
42
  export interface ReminderRecord {
36
43
  version: typeof REMINDER_SNAPSHOT_VERSION;
@@ -46,8 +53,15 @@ export interface ReminderRecord {
46
53
  /** Raw schedule value: every/delay string, cron expression, or ISO `at`. */
47
54
  scheduleValue: string;
48
55
  intervalMs?: number;
49
- /** Prompt form — mutually exclusive with in-memory `run`. */
56
+ /** Prompt form — mutually exclusive with `handler` and in-memory `run`. */
50
57
  prompt?: string;
58
+ /**
59
+ * Named handler stem (`agent/reminders/<name>.ts`). Mutually exclusive with
60
+ * `prompt` and in-memory `run`.
61
+ */
62
+ handler?: string;
63
+ /** Serializable args for {@link handler}. */
64
+ args?: JsonObject;
51
65
  /**
52
66
  * True when create() registered a `run` handler. Handlers are not
53
67
  * serializable; after restart, armed records with this flag and no live
@@ -59,9 +73,14 @@ export interface ReminderRecord {
59
73
  /** Natural-language until (agent-facing); function until is in-memory only. */
60
74
  untilPrompt?: string;
61
75
  busyPolicy: ReminderBusyPolicy;
62
- status: ReminderStatus;
76
+ status: ReminderRecordStatus;
63
77
  disarmReason?: string;
64
78
  fireCount: number;
79
+ /**
80
+ * CAS generation. Cancel/rekey and successful outcome apply bump this so
81
+ * in-flight outcomes cannot resurrect a superseded reminder.
82
+ */
83
+ generation?: number;
65
84
  nextFireAtMs: number;
66
85
  createdAt: string;
67
86
  updatedAt: string;
@@ -120,7 +139,8 @@ export class ReminderStore {
120
139
 
121
140
  async listArmed(): Promise<ReminderRecord[]> {
122
141
  const all = await this.list();
123
- return all.filter((r) => r.status === "armed");
142
+ // Treat in-flight claims as still armed for restart / listing purposes.
143
+ return all.filter((r) => r.status === "armed" || r.status === "firing");
124
144
  }
125
145
 
126
146
  async get(id: string): Promise<ReminderRecord | undefined> {
@@ -7,12 +7,18 @@ import {
7
7
  hasGuestNetworkErrno,
8
8
  isQuietGuestConnectStall,
9
9
  } from "./guest-network.js";
10
+ import {
11
+ HOSTED_GUEST_RETRY_TERMINAL,
12
+ HOSTED_GUEST_RETRY_TRANSIENT,
13
+ type HostedGuestRetryDisposition,
14
+ } from "./hosted-delivery-protocol.js";
10
15
  import { SessionAuthError, SessionBusyError } from "./session-engine.js";
11
16
 
12
17
  export interface MappedRequestError {
13
18
  status: 400 | 403 | 409 | 503;
14
19
  code: string;
15
20
  message: string;
21
+ retry: HostedGuestRetryDisposition;
16
22
  }
17
23
 
18
24
  /**
@@ -23,23 +29,39 @@ export function mapThrownRequestError(
23
29
  error: unknown
24
30
  ): MappedRequestError | undefined {
25
31
  if (error instanceof SessionBusyError) {
26
- return { status: 409, code: "session_busy", message: error.message };
32
+ return {
33
+ status: 409,
34
+ code: "session_busy",
35
+ message: error.message,
36
+ retry: HOSTED_GUEST_RETRY_TRANSIENT,
37
+ };
27
38
  }
28
39
  if (error instanceof V2EngineError) {
29
40
  return {
30
41
  status: 409,
31
42
  code: "v2_identity_conflict",
32
43
  message: "Control-plane session identity conflicts with existing state.",
44
+ retry: HOSTED_GUEST_RETRY_TERMINAL,
33
45
  };
34
46
  }
35
47
  if (error instanceof SessionAuthError) {
36
- return { status: 403, code: "forbidden", message: error.message };
48
+ return {
49
+ status: 403,
50
+ code: "forbidden",
51
+ message: error.message,
52
+ retry: HOSTED_GUEST_RETRY_TERMINAL,
53
+ };
37
54
  }
38
55
  if (
39
56
  error instanceof InvalidAsOfError ||
40
57
  error instanceof VacuousTimeArgsError
41
58
  ) {
42
- return { status: 400, code: "invalid_request", message: error.message };
59
+ return {
60
+ status: 400,
61
+ code: "invalid_request",
62
+ message: error.message,
63
+ retry: HOSTED_GUEST_RETRY_TERMINAL,
64
+ };
43
65
  }
44
66
  if (
45
67
  error instanceof GuestNetworkUnavailableError ||
@@ -52,6 +74,7 @@ export function mapThrownRequestError(
52
74
  error instanceof Error
53
75
  ? error.message
54
76
  : "Guest network is not ready for outbound requests.",
77
+ retry: HOSTED_GUEST_RETRY_TRANSIENT,
55
78
  };
56
79
  }
57
80
  if (isQuietGuestConnectStall(error)) {
@@ -62,6 +85,7 @@ export function mapThrownRequestError(
62
85
  error instanceof Error
63
86
  ? error.message
64
87
  : "Guest Connect stalled without a network errno.",
88
+ retry: HOSTED_GUEST_RETRY_TRANSIENT,
65
89
  };
66
90
  }
67
91
  return undefined;
@@ -16,6 +16,7 @@ import {
16
16
  validateDeploymentSlug,
17
17
  } from "./deploy-client.js";
18
18
  import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
19
+ import { rejectV2ForLegacyCommand } from "./legacy-command-guard.js";
19
20
  import { sleep as defaultSleep } from "./sleep.js";
20
21
  import { stderrPalette } from "./terminal-style.js";
21
22
 
@@ -38,6 +39,8 @@ export interface ResolveProdTargetOptions {
38
39
  apiKey?: string;
39
40
  fetchImpl?: typeof fetch;
40
41
  err?: (text: string) => void;
42
+ /** Skip when the caller already ran {@link rejectV2ForLegacyCommand}. */
43
+ skipLegacyArchitectureCheck?: boolean;
41
44
  /** Test seam for reachability-retry backoff. */
42
45
  sleep?: (ms: number) => Promise<void>;
43
46
  }
@@ -95,6 +98,13 @@ export async function resolveProdTarget(
95
98
  `Could not resolve Cursor credentials/team for the hosted deployment (see above).`
96
99
  );
97
100
  }
101
+ if (options.skipLegacyArchitectureCheck !== true) {
102
+ await rejectV2ForLegacyCommand({
103
+ client: auth.client,
104
+ teamId: auth.teamId,
105
+ slug,
106
+ });
107
+ }
98
108
 
99
109
  // A hibernated engine can briefly omit engineAccess while getPod fails
100
110
  // during wake. Retry a few times before surfacing "not reachable yet".
@@ -198,6 +208,11 @@ export async function resolveProdAliasPlaygroundUrl(
198
208
  `Could not resolve Cursor credentials/team for the hosted deployment (see above).`
199
209
  );
200
210
  }
211
+ await rejectV2ForLegacyCommand({
212
+ client: auth.client,
213
+ teamId: auth.teamId,
214
+ slug,
215
+ });
201
216
 
202
217
  let detail: DeploymentDetail;
203
218
  try {
@@ -1,10 +1,21 @@
1
1
  /**
2
2
  * Provider-neutral PR URL parse. GitHub.com plus the Origin page shapes
3
3
  * humans paste: cursor.com/codebase, review.cursor.com/pr, origin.cursor.com.
4
+ *
5
+ * {@link parseScmPrUrl} is the wider parse the review seams use: it also
6
+ * recognizes GitLab merge requests (`/-/merge_requests/<iid>` on any host),
7
+ * Bitbucket Cloud / Data Center pull requests, and GitHub Enterprise Server
8
+ * (`/<owner>/<repo>/pull/<n>` on a host that is none of the above). The
9
+ * narrow {@link parsePrUrl} keeps its github.com + Origin contract for the
10
+ * free-text callers (Slack `pr-ref`) where "any host with /pull/N" would be
11
+ * too eager.
4
12
  */
5
13
 
6
14
  export type PrProvider = "github" | "origin";
7
15
 
16
+ /** Every SCM the review seams can address. */
17
+ export type ScmPrProvider = PrProvider | "gitlab" | "bitbucket";
18
+
8
19
  export type ParsedPrUrl = {
9
20
  provider: PrProvider;
10
21
  owner: string;
@@ -13,6 +24,27 @@ export type ParsedPrUrl = {
13
24
  url: string;
14
25
  };
15
26
 
27
+ export type ParsedScmPrUrl = {
28
+ provider: ScmPrProvider;
29
+ /**
30
+ * Namespace half of the repo: GitHub owner, GitLab group path (nested
31
+ * groups joined with `/`), Bitbucket workspace / project key (`~user`
32
+ * for Data Center personal repos).
33
+ */
34
+ owner: string;
35
+ repo: string;
36
+ number: number;
37
+ /** Canonical PR page URL. */
38
+ url: string;
39
+ /**
40
+ * Hostname the PR lives on (lowercase). `github.com` for dotcom, the
41
+ * GHES hostname for GitHub Enterprise, `gitlab.com` or the self-managed
42
+ * host for GitLab, `bitbucket.org` or the Data Center host for Bitbucket.
43
+ * Origin PRs report the Origin page host.
44
+ */
45
+ host: string;
46
+ };
47
+
16
48
  const ORIGIN_PAGE = /^origin(-[a-z0-9]+)?\.cursor\.com$/i;
17
49
 
18
50
  function positiveInt(raw: string | undefined): number | undefined {
@@ -27,19 +59,28 @@ function positiveInt(raw: string | undefined): number | undefined {
27
59
  }
28
60
 
29
61
  function parsed(
30
- provider: PrProvider,
62
+ provider: ScmPrProvider,
63
+ host: string,
31
64
  owner: string | undefined,
32
65
  repo: string | undefined,
33
- number: number | undefined
34
- ): ParsedPrUrl | undefined {
35
- if (owner === undefined || repo === undefined || number === undefined) {
66
+ number: number | undefined,
67
+ url?: string
68
+ ): ParsedScmPrUrl | undefined {
69
+ if (
70
+ owner === undefined ||
71
+ owner === "" ||
72
+ repo === undefined ||
73
+ repo === "" ||
74
+ number === undefined
75
+ ) {
36
76
  return undefined;
37
77
  }
38
- const url =
39
- provider === "origin"
78
+ const canonical =
79
+ url ??
80
+ (provider === "origin"
40
81
  ? `https://cursor.com/codebase/${owner}/${repo}/pull/${number}`
41
- : `https://github.com/${owner}/${repo}/pull/${number}`;
42
- return { provider, owner, repo, number, url };
82
+ : `https://${host}/${owner}/${repo}/pull/${number}`);
83
+ return { provider, owner, repo, number, url: canonical, host };
43
84
  }
44
85
 
45
86
  /** Strip Slack mrkdwn wrappers and trailing punctuation before `URL`. */
@@ -50,27 +91,49 @@ function normalizeRaw(raw: string): string {
50
91
  .replace(/[>\].,;]+$/, "");
51
92
  }
52
93
 
94
+ function isGithubDotCom(host: string): boolean {
95
+ return host === "github.com" || host === "www.github.com";
96
+ }
97
+
98
+ /** github.com and Origin only — the contract free-text PR references use. */
53
99
  export function parsePrUrl(raw: string): ParsedPrUrl | undefined {
100
+ const wide = parseScmPrUrl(raw);
101
+ if (wide === undefined) {
102
+ return undefined;
103
+ }
104
+ if (wide.provider === "origin") {
105
+ return { ...wide, provider: "origin" };
106
+ }
107
+ if (wide.provider === "github" && isGithubDotCom(wide.host)) {
108
+ return { ...wide, provider: "github" };
109
+ }
110
+ return undefined;
111
+ }
112
+
113
+ /**
114
+ * Every provider shape, including GitHub Enterprise Server. The GitLab and
115
+ * Bitbucket path shapes are unambiguous on any host; a plain
116
+ * `/<owner>/<repo>/pull/<n>` on a host that is not github.com, Origin,
117
+ * GitLab, or Bitbucket is taken as GHES (the only remaining forge with that
118
+ * route). Callers that must not accept arbitrary hosts use
119
+ * {@link parsePrUrl}.
120
+ */
121
+ export function parseScmPrUrl(raw: string): ParsedScmPrUrl | undefined {
54
122
  let url: URL;
55
123
  try {
56
124
  url = new URL(normalizeRaw(raw));
57
125
  } catch {
58
126
  return undefined;
59
127
  }
128
+ if (url.protocol !== "https:" && url.protocol !== "http:") {
129
+ return undefined;
130
+ }
60
131
 
61
132
  const parts = url.pathname.split("/").filter(Boolean);
62
133
  const host = url.hostname.toLowerCase();
63
134
 
64
- if (
65
- (host === "github.com" || host === "www.github.com") &&
66
- parts.length >= 4 &&
67
- parts[2] === "pull"
68
- ) {
69
- return parsed("github", parts[0], parts[1], positiveInt(parts[3]));
70
- }
71
-
72
135
  if (ORIGIN_PAGE.test(host) && parts.length >= 4 && parts[2] === "github") {
73
- return parsed("origin", parts[0], parts[1], positiveInt(parts[3]));
136
+ return parsed("origin", host, parts[0], parts[1], positiveInt(parts[3]));
74
137
  }
75
138
 
76
139
  if (
@@ -79,17 +142,101 @@ export function parsePrUrl(raw: string): ParsedPrUrl | undefined {
79
142
  parts.length >= 5 &&
80
143
  parts[3] === "pull"
81
144
  ) {
82
- return parsed("origin", parts[1], parts[2], positiveInt(parts[4]));
145
+ return parsed("origin", host, parts[1], parts[2], positiveInt(parts[4]));
83
146
  }
84
147
 
85
148
  if (host === "review.cursor.com" && parts[0] === "pr") {
86
149
  if (parts.length >= 5 && parts[3] === "github") {
87
- return parsed("origin", parts[1], parts[2], positiveInt(parts[4]));
150
+ return parsed("origin", host, parts[1], parts[2], positiveInt(parts[4]));
88
151
  }
89
152
  if (parts.length >= 4) {
90
- return parsed("origin", parts[1], parts[2], positiveInt(parts[3]));
153
+ return parsed("origin", host, parts[1], parts[2], positiveInt(parts[3]));
91
154
  }
92
155
  }
93
156
 
157
+ // GitLab MR page: /<group>/[<subgroup>/…]<project>/-/merge_requests/<iid>
158
+ const separator = parts.indexOf("-");
159
+ if (
160
+ separator >= 2 &&
161
+ parts[separator + 1] === "merge_requests" &&
162
+ parts.length >= separator + 3
163
+ ) {
164
+ const owner = parts.slice(0, separator - 1).join("/");
165
+ const repo = parts[separator - 1];
166
+ const number = positiveInt(parts[separator + 2]);
167
+ return parsed(
168
+ "gitlab",
169
+ host,
170
+ owner,
171
+ repo,
172
+ number,
173
+ number === undefined
174
+ ? undefined
175
+ : `https://${host}/${owner}/${repo}/-/merge_requests/${number}`
176
+ );
177
+ }
178
+
179
+ // Bitbucket Cloud: bitbucket.org/<workspace>/<slug>/pull-requests/<id>
180
+ if (
181
+ (host === "bitbucket.org" || host === "www.bitbucket.org") &&
182
+ parts.length >= 4 &&
183
+ parts[2] === "pull-requests"
184
+ ) {
185
+ const number = positiveInt(parts[3]);
186
+ return parsed(
187
+ "bitbucket",
188
+ "bitbucket.org",
189
+ parts[0],
190
+ parts[1],
191
+ number,
192
+ number === undefined
193
+ ? undefined
194
+ : `https://bitbucket.org/${parts[0]}/${parts[1]}/pull-requests/${number}`
195
+ );
196
+ }
197
+
198
+ // Bitbucket Data Center: [/<context>]/projects/<KEY>/repos/<slug>/pull-requests/<id>
199
+ // (personal repos: /users/<name>/repos/<slug>/…, full name `~name/slug`).
200
+ const dc = parts.findIndex(
201
+ (part, index) =>
202
+ (part === "projects" || part === "users") &&
203
+ parts[index + 2] === "repos" &&
204
+ parts[index + 4] === "pull-requests"
205
+ );
206
+ if (dc !== -1 && parts.length >= dc + 6) {
207
+ const number = positiveInt(parts[dc + 5]);
208
+ const owner = parts[dc] === "users" ? `~${parts[dc + 1]}` : parts[dc + 1];
209
+ const slug = parts[dc + 3];
210
+ const context = parts.slice(0, dc).join("/");
211
+ return parsed(
212
+ "bitbucket",
213
+ host,
214
+ owner,
215
+ slug,
216
+ number,
217
+ number === undefined
218
+ ? undefined
219
+ : `${url.origin}/${context === "" ? "" : `${context}/`}${parts.slice(dc, dc + 4).join("/")}/pull-requests/${number}`
220
+ );
221
+ }
222
+
223
+ // GitHub (dotcom or Enterprise Server): /<owner>/<repo>/pull/<n>. Checked
224
+ // last so the forge-specific shapes above win on shared hosts.
225
+ if (
226
+ parts.length >= 4 &&
227
+ parts[2] === "pull" &&
228
+ !ORIGIN_PAGE.test(host) &&
229
+ !/(^|\.)cursor\.com$/.test(host)
230
+ ) {
231
+ const githubHost = isGithubDotCom(host) ? "github.com" : host;
232
+ return parsed(
233
+ "github",
234
+ githubHost,
235
+ parts[0],
236
+ parts[1],
237
+ positiveInt(parts[3])
238
+ );
239
+ }
240
+
94
241
  return undefined;
95
242
  }
@@ -518,7 +518,7 @@ export class CursorSdkRunner implements AgentRunner {
518
518
  const resolved = resolveApiKeySync({ apiKey: this.options.apiKey });
519
519
  if (resolved === undefined) {
520
520
  throw new Error(
521
- `The Cursor SDK runner requires a Cursor credential: run \`${CLI} login\`, set CURSOR_API_KEY or CURSOR_API_KEY_FILE, or pass serve({ apiKey }).`
521
+ `The Cursor SDK runner requires a Cursor credential: run \`${CLI} login\`, set CURSOR_API_KEY, CURSOR_SERVICE_ACCOUNT_KEY, or CURSOR_API_KEY_FILE, or pass serve({ apiKey }).`
522
522
  );
523
523
  }
524
524
  return resolved.apiKey;
@@ -805,6 +805,7 @@ function toTurnOutcome(result: RunResult): TurnOutcome {
805
805
  ...(result.status === "error"
806
806
  ? { errorMessage: runErrorMessage(result) }
807
807
  : {}),
808
+ errorCode: result.status === "error" ? result.error?.code : undefined,
808
809
  ...(usage === undefined ? {} : { usage }),
809
810
  };
810
811
  }