@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
@@ -114,6 +114,10 @@ import {
114
114
  sessionClock,
115
115
  } from "./as-of.js";
116
116
  import { SessionAuthError, samePrincipal } from "./auth.js";
117
+ import {
118
+ mergeChannelStateMutation,
119
+ mergeChannelStateSkipNull,
120
+ } from "./channel-state.js";
117
121
  import { mergeCloudOptions, resolveSessionRuntime } from "./cloud-merge.js";
118
122
  import {
119
123
  applyCloudUsageToEvents,
@@ -132,7 +136,7 @@ import {
132
136
  resolveV2Key,
133
137
  V2EngineError,
134
138
  } from "./continuation-identity.js";
135
- import { describeError } from "./describe-error.js";
139
+ import { describeError, describeErrorCode } from "./describe-error.js";
136
140
  import { isDevMode } from "./dev-mode.js";
137
141
  import { type EventLogMemoryStats, EventLogStore } from "./event-log.js";
138
142
  import { TurnEventMapper } from "./event-mapper.js";
@@ -160,6 +164,7 @@ import {
160
164
  HostedAdmissionLocalSendError,
161
165
  isDuringHostedAdmission,
162
166
  } from "./hosted-admission-context.js";
167
+ import { hostedSessionResumeKey } from "./hosted-catch-protocol.js";
163
168
  import {
164
169
  formatContinuationToken,
165
170
  newContinuationKey,
@@ -217,11 +222,17 @@ import {
217
222
  } from "./workspace-sync.js";
218
223
 
219
224
  export const HTTP_CHANNEL_ID = "http";
225
+ export { mergeChannelStateSkipNull } from "./channel-state.js";
220
226
  export { SCHEDULE_CHANNEL_PREFIX } from "./prompt-context.js";
221
227
 
222
228
  /** Authored surfaces mirrored onto the Agent Store before a first cloud prompt. */
223
229
  type CloudSyncSurface = "skills" | "workspace";
224
230
 
231
+ interface EventDispatchContext {
232
+ channelState: JsonValue;
233
+ session: SessionInfo;
234
+ }
235
+
225
236
  /** The Agent Store cloud turns read authored files from, and where the VM mounts it. */
226
237
  interface CloudStoreTarget {
227
238
  sink: FileSink;
@@ -1019,6 +1030,18 @@ export class SessionEngine {
1019
1030
  sendOptions.continuationToken
1020
1031
  );
1021
1032
  }
1033
+ if (
1034
+ existing === undefined &&
1035
+ sendOptions.hostedSessionId !== undefined &&
1036
+ sendOptions.mailboxContinuation?.key ===
1037
+ hostedSessionResumeKey(sendOptions.hostedSessionId)
1038
+ ) {
1039
+ // Explicit control-plane resume of an existing session: the CP named
1040
+ // the session by its own id and stamped the matching resume key. The
1041
+ // session keeps its original continuation key (a PR lane must stay
1042
+ // addressable by its webhooks); this is a follow-up turn by id.
1043
+ existing = await this.getOrRestoreSession(sendOptions.hostedSessionId);
1044
+ }
1022
1045
 
1023
1046
  if (existing !== undefined) {
1024
1047
  if (
@@ -1668,10 +1691,16 @@ export class SessionEngine {
1668
1691
  isFirstTurn,
1669
1692
  abort.signal
1670
1693
  );
1694
+ if (outcome.status === "cancelled") {
1695
+ outcome.cancellationReason = abort.signal.aborted
1696
+ ? "signal"
1697
+ : "runner";
1698
+ }
1671
1699
  } catch (error) {
1672
1700
  outcome = {
1673
1701
  status: "error",
1674
1702
  errorMessage: describeError(error),
1703
+ errorCode: describeErrorCode(error),
1675
1704
  };
1676
1705
  } finally {
1677
1706
  clearInterval(poll);
@@ -2192,6 +2221,11 @@ export class SessionEngine {
2192
2221
  const sessionId = record.sessionId;
2193
2222
  const workspaceDir = this.scaffoldDir(record);
2194
2223
  const harnessCwd = this.harnessCwd(record);
2224
+ const turnChannelState = structuredClone(record.channelState ?? null);
2225
+ const eventContext: EventDispatchContext = {
2226
+ channelState: structuredClone(turnChannelState),
2227
+ session: this.sessionInfo(record),
2228
+ };
2195
2229
  // Hold the open log so tool events append synchronously. Fire-and-forget
2196
2230
  // `appendEvent` races parallel tool completions and delays the live stream
2197
2231
  // until the next await tick — often after *all* parallel tools finish.
@@ -2199,7 +2233,7 @@ export class SessionEngine {
2199
2233
  const emit = (payload: SessionEventPayload): void => {
2200
2234
  try {
2201
2235
  const event = log.append({ ...payload, turnId });
2202
- this.queueDispatch(sessionId, event);
2236
+ this.queueDispatch(sessionId, event, eventContext);
2203
2237
  } catch (error) {
2204
2238
  this.logger(
2205
2239
  `[agent-sdk] failed to record event for ${sessionId}: ${describeError(error)}`
@@ -2311,6 +2345,7 @@ export class SessionEngine {
2311
2345
  isFirstTurn,
2312
2346
  instructionsInvisibleToHarness,
2313
2347
  emit,
2348
+ eventContext,
2314
2349
  async (update) => {
2315
2350
  const turn = this.turnRoots.get(sessionId);
2316
2351
  if (turn !== undefined) {
@@ -2352,7 +2387,11 @@ export class SessionEngine {
2352
2387
  } catch (error) {
2353
2388
  this.approvals.cancelSession(sessionId, "deny");
2354
2389
  this.auths.cancelSession(sessionId, "deny");
2355
- outcome = { status: "error", errorMessage: describeError(error) };
2390
+ outcome = {
2391
+ status: "error",
2392
+ errorMessage: describeError(error),
2393
+ errorCode: describeErrorCode(error),
2394
+ };
2356
2395
  } finally {
2357
2396
  permit.release();
2358
2397
  this.dropTurnFileSystem(sessionId);
@@ -2371,6 +2410,7 @@ export class SessionEngine {
2371
2410
  if (mapper.title !== undefined) {
2372
2411
  const title = mapper.title;
2373
2412
  await this.updateRecord(sessionId, (current) => ({ ...current, title }));
2413
+ eventContext.session = { ...eventContext.session, title };
2374
2414
  }
2375
2415
 
2376
2416
  const finalResult = outcome.result ?? mapper.finalText;
@@ -2395,7 +2435,8 @@ export class SessionEngine {
2395
2435
  text: finalResult,
2396
2436
  dryRun: record.dryRun === true,
2397
2437
  ctx: {
2398
- session: this.sessionInfo(record),
2438
+ session: eventContext.session,
2439
+ channelState: turnChannelState,
2399
2440
  host: this.hostForSession(sessionId),
2400
2441
  artifacts: this.artifactsApi({ sessionId, turnId }),
2401
2442
  stateRoot: this.stateRoot,
@@ -2414,29 +2455,38 @@ export class SessionEngine {
2414
2455
  }
2415
2456
 
2416
2457
  if (outcome.status === "finished") {
2417
- await this.appendEvent(sessionId, {
2418
- type: "turn.completed",
2419
- turnId,
2420
- data: {
2421
- result: finalResult,
2422
- usage: finalUsage,
2423
- cost: finalCost,
2458
+ await this.appendEvent(
2459
+ sessionId,
2460
+ {
2461
+ type: "turn.completed",
2462
+ turnId,
2463
+ data: {
2464
+ result: finalResult,
2465
+ usage: finalUsage,
2466
+ cost: finalCost,
2467
+ },
2424
2468
  },
2425
- });
2469
+ eventContext
2470
+ );
2426
2471
  } else {
2427
2472
  const interrupted = signal.aborted && outcome.status === "cancelled";
2428
- await this.appendEvent(sessionId, {
2429
- type: "turn.failed",
2430
- turnId,
2431
- data: {
2432
- message: interrupted
2433
- ? "turn interrupted"
2434
- : (outcome.errorMessage ??
2435
- (outcome.status === "cancelled"
2436
- ? "turn cancelled"
2437
- : "turn failed")),
2473
+ await this.appendEvent(
2474
+ sessionId,
2475
+ {
2476
+ type: "turn.failed",
2477
+ turnId,
2478
+ data: {
2479
+ status: outcome.status,
2480
+ message: interrupted
2481
+ ? "turn interrupted"
2482
+ : (outcome.errorMessage ??
2483
+ (outcome.status === "cancelled"
2484
+ ? "turn cancelled"
2485
+ : "turn failed")),
2486
+ },
2438
2487
  },
2439
- });
2488
+ eventContext
2489
+ );
2440
2490
  }
2441
2491
 
2442
2492
  const current = await this.sessions.get(sessionId);
@@ -2450,15 +2500,20 @@ export class SessionEngine {
2450
2500
  type: "session.failed",
2451
2501
  turnId,
2452
2502
  data: { message: outcome.errorMessage ?? "task failed" },
2453
- }
2503
+ },
2504
+ eventContext
2454
2505
  );
2455
2506
  await this.wipeCloudSessionWorkspace(sessionId);
2456
2507
  } else {
2457
- await this.appendEvent(sessionId, {
2458
- type: "session.waiting",
2459
- turnId,
2460
- data: {},
2461
- });
2508
+ await this.appendEvent(
2509
+ sessionId,
2510
+ {
2511
+ type: "session.waiting",
2512
+ turnId,
2513
+ data: {},
2514
+ },
2515
+ eventContext
2516
+ );
2462
2517
  }
2463
2518
 
2464
2519
  return {
@@ -2664,6 +2719,7 @@ export class SessionEngine {
2664
2719
  isFirstTurn: boolean,
2665
2720
  instructionsInvisibleToHarness: boolean,
2666
2721
  emit: (payload: SessionEventPayload) => void,
2722
+ eventContext: EventDispatchContext,
2667
2723
  onUpdate: RunnerTurnRequest["onUpdate"],
2668
2724
  signal: AbortSignal,
2669
2725
  images?: Array<{ data: string; mimeType: string }>
@@ -2944,16 +3000,21 @@ export class SessionEngine {
2944
3000
  sdkAgentId,
2945
3001
  }));
2946
3002
  record.sdkAgentId = sdkAgentId;
2947
- await this.appendEvent(record.sessionId, {
2948
- type: "agent.bound",
2949
- turnId,
2950
- data: {
2951
- sdkAgentId,
2952
- ...(sdkAgentId.startsWith("bc-")
2953
- ? { url: `https://cursor.com/agents/${sdkAgentId}` }
2954
- : {}),
3003
+ eventContext.session = { ...eventContext.session, sdkAgentId };
3004
+ await this.appendEvent(
3005
+ record.sessionId,
3006
+ {
3007
+ type: "agent.bound",
3008
+ turnId,
3009
+ data: {
3010
+ sdkAgentId,
3011
+ ...(sdkAgentId.startsWith("bc-")
3012
+ ? { url: `https://cursor.com/agents/${sdkAgentId}` }
3013
+ : {}),
3014
+ },
2955
3015
  },
2956
- });
3016
+ eventContext
3017
+ );
2957
3018
  },
2958
3019
  };
2959
3020
  }
@@ -4606,21 +4667,26 @@ export class SessionEngine {
4606
4667
 
4607
4668
  private async appendEvent(
4608
4669
  sessionId: string,
4609
- payload: SessionEventPayload & { turnId?: string }
4670
+ payload: SessionEventPayload & { turnId?: string },
4671
+ context?: EventDispatchContext
4610
4672
  ): Promise<SessionEvent> {
4611
4673
  const log = await this.logs.get(sessionId);
4612
4674
  const event = log.append(payload);
4613
- this.queueDispatch(sessionId, event);
4675
+ this.queueDispatch(sessionId, event, context);
4614
4676
  return event;
4615
4677
  }
4616
4678
 
4617
- private queueDispatch(sessionId: string, event: SessionEvent): void {
4679
+ private queueDispatch(
4680
+ sessionId: string,
4681
+ event: SessionEvent,
4682
+ context?: EventDispatchContext
4683
+ ): void {
4618
4684
  // Single funnel for both append paths (appendEvent + the held-log emit),
4619
4685
  // so the storage sink sees every durable event exactly once.
4620
4686
  this.storage?.event(event);
4621
4687
  const chain = this.dispatchChains.get(sessionId) ?? Promise.resolve();
4622
4688
  const next = chain
4623
- .then(() => this.dispatchEvent(sessionId, event))
4689
+ .then(() => this.dispatchEvent(sessionId, event, context))
4624
4690
  .catch((error) => {
4625
4691
  this.logger(
4626
4692
  `[agent-sdk] event dispatch failed for ${sessionId}: ${describeError(error)}`
@@ -4637,16 +4703,27 @@ export class SessionEngine {
4637
4703
 
4638
4704
  private async dispatchEvent(
4639
4705
  sessionId: string,
4640
- event: SessionEvent
4706
+ event: SessionEvent,
4707
+ context?: EventDispatchContext
4641
4708
  ): Promise<void> {
4642
4709
  const record = await this.sessions.get(sessionId);
4643
4710
  if (record === undefined) {
4644
4711
  return;
4645
4712
  }
4713
+ const channelState =
4714
+ context === undefined
4715
+ ? (record.channelState ?? null)
4716
+ : context.channelState;
4717
+ const channelStateBefore =
4718
+ context === undefined ? undefined : structuredClone(channelState);
4646
4719
 
4647
4720
  const sessionCtx: SessionContext = {
4648
- session: this.sessionInfo(record),
4721
+ session: context?.session ?? this.sessionInfo(record),
4649
4722
  host: this.hostForSession(record.sessionId),
4723
+ artifacts: this.artifactsApi({
4724
+ sessionId: record.sessionId,
4725
+ turnId: event.turnId,
4726
+ }),
4650
4727
  };
4651
4728
  const channelEvents = this.channelEventHandlersFor(record.channelId);
4652
4729
  if (channelEvents !== undefined) {
@@ -4658,7 +4735,7 @@ export class SessionEngine {
4658
4735
  ];
4659
4736
  const channelCtx = {
4660
4737
  channelId: record.channelId,
4661
- state: (record.channelState ?? null) as JsonValue,
4738
+ state: channelState,
4662
4739
  continuationToken: record.continuationKey,
4663
4740
  setContinuationToken: (token: string | null) =>
4664
4741
  this.setContinuationToken(sessionId, token),
@@ -4675,8 +4752,21 @@ export class SessionEngine {
4675
4752
  );
4676
4753
  }
4677
4754
  }
4678
- // Handlers mutate channel state in place; persist after each batch.
4679
- await this.updateRecord(sessionId, (current) => ({ ...current }));
4755
+ if (context === undefined || channelStateBefore === undefined) {
4756
+ // Handlers mutate live channel state in place; save the current record.
4757
+ await this.updateRecord(sessionId, (current) => ({ ...current }));
4758
+ } else {
4759
+ const updatedState = channelCtx.state as JsonValue;
4760
+ context.channelState = updatedState;
4761
+ await this.updateRecord(sessionId, (current) => ({
4762
+ ...current,
4763
+ channelState: mergeChannelStateMutation({
4764
+ current: current.channelState,
4765
+ before: channelStateBefore,
4766
+ after: updatedState,
4767
+ }),
4768
+ }));
4769
+ }
4680
4770
  }
4681
4771
 
4682
4772
  for (const hook of this.project.hooks) {
@@ -4697,10 +4787,6 @@ export class SessionEngine {
4697
4787
  continuationToken: record.continuationKey,
4698
4788
  },
4699
4789
  stateRoot: this.stateRoot,
4700
- artifacts: this.artifactsApi({
4701
- sessionId: record.sessionId,
4702
- turnId: event.turnId,
4703
- }),
4704
4790
  });
4705
4791
  } catch (error) {
4706
4792
  this.logger(
@@ -4744,6 +4830,10 @@ export class SessionEngine {
4744
4830
  * conversation whose blobs persisted but whose record (which selects the
4745
4831
  * conversation to hydrate) never reached the sink. No-op without a
4746
4832
  * storage mirror.
4833
+ *
4834
+ * Under a debounced event policy the turn-end flush is a timer, not the
4835
+ * chain's tail, so flush explicitly before waiting on the queue; a no-op
4836
+ * when the chain already flushed.
4747
4837
  */
4748
4838
  async drainSessionDurability(sessionId: string): Promise<void> {
4749
4839
  if (this.storage === undefined) {
@@ -4753,6 +4843,7 @@ export class SessionEngine {
4753
4843
  if (chain !== undefined) {
4754
4844
  await chain.catch(() => {});
4755
4845
  }
4846
+ this.storage.flushSession(sessionId);
4756
4847
  await this.storage.whenIdle();
4757
4848
  }
4758
4849
 
@@ -4771,6 +4862,10 @@ export class SessionEngine {
4771
4862
  await active;
4772
4863
  continue;
4773
4864
  }
4865
+ const dispatch = this.dispatchChains.get(sessionId);
4866
+ if (dispatch !== undefined) {
4867
+ await dispatch.catch(() => {});
4868
+ }
4774
4869
  return this.lastOutcomes.get(sessionId) ?? { status: "finished" };
4775
4870
  }
4776
4871
  }
@@ -5765,38 +5860,6 @@ function mergePendingWorkspaceFiles(
5765
5860
  return { ...current, ...incoming };
5766
5861
  }
5767
5862
 
5768
- /**
5769
- * Shallow-merge a wake patch into durable channel state. Null / undefined
5770
- * patch values leave the existing key alone so sticky fields survive.
5771
- */
5772
- export function mergeChannelStateSkipNull(
5773
- current: JsonValue | undefined,
5774
- patch: JsonValue | undefined
5775
- ): JsonValue | undefined {
5776
- if (patch === undefined) {
5777
- return current;
5778
- }
5779
- if (
5780
- typeof patch !== "object" ||
5781
- patch === null ||
5782
- Array.isArray(patch) ||
5783
- typeof current !== "object" ||
5784
- current === null ||
5785
- Array.isArray(current)
5786
- ) {
5787
- return structuredClone(patch);
5788
- }
5789
- const merged: Record<string, JsonValue> = {
5790
- ...(current as Record<string, JsonValue>),
5791
- };
5792
- for (const [key, value] of Object.entries(patch)) {
5793
- if (value !== null && value !== undefined) {
5794
- merged[key] = value as JsonValue;
5795
- }
5796
- }
5797
- return merged;
5798
- }
5799
-
5800
5863
  function eventsNdjson(events: SessionEvent[]): string | undefined {
5801
5864
  if (events.length === 0) {
5802
5865
  return undefined;
package/src/reminders.ts CHANGED
@@ -1,30 +1,48 @@
1
1
  /**
2
- * Runtime reminders — per-session durable wakes.
2
+ * Runtime reminders — per-session durable wakes — and named handlers
3
+ * authored at `agent/reminders/<name>.ts`.
3
4
  *
4
5
  * ```ts
6
+ * import { defineReminder } from "@cursor/july/reminders";
5
7
  * import type { ReminderCreateInput } from "@cursor/july/reminders";
6
8
  *
9
+ * // agent/reminders/verdict_recheck.ts
10
+ * export default defineReminder({
11
+ * async run({ args, followup }) {
12
+ * await followup({ message: `Recheck ${String(args.headSha)}` });
13
+ * return { action: "delivered" };
14
+ * },
15
+ * });
16
+ *
17
+ * import verdictRecheck from "./reminders/verdict_recheck.js";
18
+ *
7
19
  * // Recurring ≈ setInterval; one-shot ≈ setTimeout.
8
20
  * await host.reminders?.create({
9
21
  * purpose: "ci_recheck",
10
22
  * channelId: session.channelId,
11
23
  * continuationToken: session.continuationKey!,
12
24
  * delay: "2h",
13
- * prompt: "Re-check CI. Only act if still failing.",
25
+ * handler: verdictRecheck,
26
+ * args: { headSha: "abc" },
14
27
  * });
15
28
  * ```
16
29
  *
17
30
  * Distinct from `defineSchedule` (deploy-time global cron under
18
31
  * `agent/schedules/`). Reminders are created at runtime and bound to a
19
- * channel continuation. Prefer `run` + function `until` for host policy
20
- * (silent ticks); agents use prompt-form create via tools.
32
+ * channel continuation. Prefer named `handler` + serializable `args` for
33
+ * hosted v2 durability; anonymous `run` remains on local and hosted v1.
21
34
  */
22
35
 
36
+ import { brandDefinition } from "./internal/brand.js";
37
+ import type { ReminderDefinition, ReminderHandlerConfig } from "./types.js";
38
+
23
39
  export type {
24
40
  ReminderBusyPolicy,
25
41
  ReminderCreateInput,
42
+ ReminderDefinition,
26
43
  ReminderFireContext,
27
44
  ReminderFireResult,
45
+ ReminderHandlerConfig,
28
46
  ReminderHostApi,
29
47
  ReminderInfo,
30
48
  ReminderReschedule,
@@ -33,3 +51,16 @@ export type {
33
51
  ReminderTarget,
34
52
  ReminderUntilContext,
35
53
  } from "./types.js";
54
+
55
+ /**
56
+ * Brand a named reminder handler for `agent/reminders/<name>.ts`.
57
+ * The registry name is the module stem (not a field on the definition).
58
+ */
59
+ export function defineReminder(
60
+ config: ReminderHandlerConfig
61
+ ): ReminderDefinition {
62
+ if (typeof config.run !== "function") {
63
+ throw new Error("defineReminder requires a `run` function");
64
+ }
65
+ return brandDefinition("reminder", config);
66
+ }
@@ -169,6 +169,30 @@ export interface KvListKeysResponse {
169
169
  truncated?: boolean;
170
170
  }
171
171
 
172
+ const STORAGE_RPC_ERROR_CODES = new Set([
173
+ "agentsdk_kv_credential_missing",
174
+ "agentsdk_kv_cursor_invalid",
175
+ "agentsdk_kv_deployment_unbound",
176
+ "agentsdk_kv_key_invalid",
177
+ "agentsdk_kv_request_invalid",
178
+ "agentsdk_kv_storage_not_allowed",
179
+ "agentsdk_kv_value_invalid",
180
+ "agentsdk_kv_version_invalid",
181
+ ]);
182
+
183
+ export class StorageRpcError extends Error {
184
+ readonly code = "agent_dependency_failed";
185
+ readonly reasonCode: string;
186
+ readonly status: number;
187
+
188
+ constructor(message: string, reasonCode: string, status: number) {
189
+ super(message);
190
+ this.name = "StorageRpcError";
191
+ this.reasonCode = reasonCode;
192
+ this.status = status;
193
+ }
194
+ }
195
+
172
196
  function toCasResult(response: KvCasResponse): KvCasResult {
173
197
  if (response.ok) {
174
198
  if (response.version === null) {
@@ -251,7 +275,22 @@ export async function storageRpc<T>(
251
275
  typeof (parsed as { error: unknown }).error === "string"
252
276
  ? (parsed as { error: string }).error
253
277
  : `HTTP ${response.status}`;
254
- throw new Error(`cursorHostedStorage ${path}: ${error}`);
278
+ const candidate =
279
+ parsed !== null &&
280
+ typeof parsed === "object" &&
281
+ "code" in parsed &&
282
+ typeof (parsed as { code: unknown }).code === "string"
283
+ ? (parsed as { code: string }).code
284
+ : undefined;
285
+ const code =
286
+ candidate !== undefined && STORAGE_RPC_ERROR_CODES.has(candidate)
287
+ ? candidate
288
+ : "agentsdk_storage_http_error";
289
+ throw new StorageRpcError(
290
+ `cursorHostedStorage ${path}: ${error}`,
291
+ code,
292
+ response.status
293
+ );
255
294
  }
256
295
  return parsed as T;
257
296
  }