@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
@@ -0,0 +1,51 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { DeployApiError, } from "./deploy-client.js";
11
+ /**
12
+ * Classify a hosted slug by probing the v2 control plane.
13
+ *
14
+ * Only HTTP 404 means “not v2.” Auth, 5xx, and transport errors fail closed
15
+ * so a v2 slug cannot fall through to `/internal/agent-serve`. That probe
16
+ * shares the factory microlith path used by secrets; a factory outage will
17
+ * also block legacy `--prod` until it recovers.
18
+ */
19
+ export function deploymentArchitecture(args) {
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ try {
22
+ yield args.client.getAgentkitDeploy({
23
+ teamId: args.teamId,
24
+ slug: args.slug,
25
+ });
26
+ return "v2";
27
+ }
28
+ catch (error) {
29
+ if (error instanceof DeployApiError && error.status === 404) {
30
+ return "v1";
31
+ }
32
+ throw error;
33
+ }
34
+ });
35
+ }
36
+ export function unsupportedV2LegacyCommandError(slug) {
37
+ return new DeployApiError(`This command is not supported for architecture v2 deployment "${slug}". The command stopped before calling the legacy v1 deployment API.`, 409);
38
+ }
39
+ export function isUnsupportedV2LegacyCommandError(error) {
40
+ return (error instanceof DeployApiError &&
41
+ error.status === 409 &&
42
+ error.message.includes("not supported for architecture v2"));
43
+ }
44
+ export function rejectV2ForLegacyCommand(args) {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ const architecture = yield deploymentArchitecture(args);
47
+ if (architecture === "v2") {
48
+ throw unsupportedV2LegacyCommandError(args.slug);
49
+ }
50
+ });
51
+ }
@@ -3,6 +3,12 @@
3
3
  * and reminder documents + clocks, then fires into the kit the same way the
4
4
  * Cursor backend does over HTTP when `--no-control-plane` is set.
5
5
  *
6
+ * Reminder lifecycle (protocol v1): CP assigns id, arms timers, claims a due
7
+ * fire once, invokes a guest executor with an immutable descriptor, and
8
+ * applies the outcome with generation/fireCount CAS. Cancel/rekey racing an
9
+ * in-flight execution bumps generation so a stale outcome cannot resurrect
10
+ * the reminder. Legacy `fireReminder(id, fireCount)` remains for v1 runners.
11
+ *
6
12
  * v2 ingest lives here: `routeContinuation` stamps the mailbox (July twin
7
13
  * of hosted `routeVerifiedIngressContinuation`), and `attachScmEvents`
8
14
  * owns the `/v0/scm-events` long poll. v1 keeps engine-side scm-events.
@@ -10,7 +16,8 @@
10
16
  */
11
17
  import { type LocalIngressContinuation, type RouteLocalIngressContinuationInput } from "./local-ingress.js";
12
18
  import type { PlatformTimers } from "./platform-timers.js";
13
- export interface LocalControlPlane extends PlatformTimers {
19
+ import { type ReminderControlPlane, type ReminderGuestExecutor } from "./reminder-control-plane-protocol.js";
20
+ export interface LocalControlPlane extends PlatformTimers, ReminderControlPlane {
14
21
  /**
15
22
  * Stamp a v2 mailbox from the channel selector + live payload. Same
16
23
  * contract as hosted verified ingress. `/v1` is a no-op.
@@ -30,7 +37,16 @@ export interface LocalControlPlane extends PlatformTimers {
30
37
  }
31
38
  export declare function createLocalControlPlane(opts: {
32
39
  fireSchedule: (name: string) => Promise<unknown>;
33
- fireReminder: (id: string, fireCount: number) => Promise<unknown>;
40
+ /**
41
+ * Legacy v1 path: CP calls this with (id, fireCount) and the runner mutates
42
+ * authoritative state. Prefer {@link executeReminder} for architecture v2.
43
+ */
44
+ fireReminder?: (id: string, fireCount: number) => Promise<unknown>;
45
+ /**
46
+ * Protocol guest executor. When set, due timers claim once, invoke this
47
+ * with an immutable descriptor, and apply the returned outcome via CAS.
48
+ */
49
+ executeReminder?: ReminderGuestExecutor;
34
50
  /**
35
51
  * Persist reminder documents under `<stateDir>/reminders`. Local serve
36
52
  * passes `<stateRoot>/control-plane`.
@@ -1 +1 @@
1
- {"version":3,"file":"local-control-plane.d.ts","sourceRoot":"","sources":["../../src/internal/local-control-plane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EAExC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD;;;OAGG;IACH,iBAAiB,CACf,KAAK,EAAE,kCAAkC,GACxC,wBAAwB,CAAC;IAC5B;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE;QAAE,KAAK,IAAI,IAAI,CAAC;QAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IACvE,yEAAyE;IACzE,WAAW,IAAI,IAAI,CAAC;IACpB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsJ7B"}
1
+ {"version":3,"file":"local-control-plane.d.ts","sourceRoot":"","sources":["../../src/internal/local-control-plane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EAExC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAKL,KAAK,oBAAoB,EAIzB,KAAK,qBAAqB,EAI3B,MAAM,sCAAsC,CAAC;AAI9C,MAAM,WAAW,iBACf,SAAQ,cAAc,EACpB,oBAAoB;IACtB;;;OAGG;IACH,iBAAiB,CACf,KAAK,EAAE,kCAAkC,GACxC,wBAAwB,CAAC;IAC5B;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE;QAAE,KAAK,IAAI,IAAI,CAAC;QAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IACvE,yEAAyE;IACzE,WAAW,IAAI,IAAI,CAAC;IACpB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAClD,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE;;;OAGG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0X7B"}
@@ -3,6 +3,12 @@
3
3
  * and reminder documents + clocks, then fires into the kit the same way the
4
4
  * Cursor backend does over HTTP when `--no-control-plane` is set.
5
5
  *
6
+ * Reminder lifecycle (protocol v1): CP assigns id, arms timers, claims a due
7
+ * fire once, invokes a guest executor with an immutable descriptor, and
8
+ * applies the outcome with generation/fireCount CAS. Cancel/rekey racing an
9
+ * in-flight execution bumps generation so a stale outcome cannot resurrect
10
+ * the reminder. Legacy `fireReminder(id, fireCount)` remains for v1 runners.
11
+ *
6
12
  * v2 ingest lives here: `routeContinuation` stamps the mailbox (July twin
7
13
  * of hosted `routeVerifiedIngressContinuation`), and `attachScmEvents`
8
14
  * owns the `/v0/scm-events` long poll. v1 keeps engine-side scm-events.
@@ -20,11 +26,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
20
26
  import { join } from "node:path";
21
27
  import { parseCron } from "./cron.js";
22
28
  import { routeLocalIngressContinuation, } from "./local-ingress.js";
29
+ import { applyOutcomeToRecord, claimFromDescriptor, intentToNewRecord, REMINDER_CP_PROTOCOL_VERSION, recordGeneration, toFireDescriptor, } from "./reminder-control-plane-protocol.js";
23
30
  import { MAX_TIMER_MS } from "./reminder-schedule.js";
24
31
  import { ReminderStore } from "./reminder-store.js";
25
32
  export function createLocalControlPlane(opts) {
26
33
  return __awaiter(this, void 0, void 0, function* () {
27
34
  var _a, _b;
35
+ if (opts.fireReminder === undefined && opts.executeReminder === undefined) {
36
+ throw new Error("createLocalControlPlane requires fireReminder and/or executeReminder");
37
+ }
28
38
  const logger = (_a = opts.logger) !== null && _a !== void 0 ? _a : (() => { });
29
39
  const armReminderClocks = opts.armReminderClocks !== false;
30
40
  const store = opts.stateDir === undefined
@@ -32,10 +42,21 @@ export function createLocalControlPlane(opts) {
32
42
  : new ReminderStore(join(opts.stateDir, "reminders"));
33
43
  const schedules = new Map();
34
44
  const reminderTimers = new Map();
35
- const reminders = new Map(((_b = (yield store === null || store === void 0 ? void 0 : store.list())) !== null && _b !== void 0 ? _b : []).map((record) => [record.id, record]));
45
+ const reminders = new Map(((_b = (yield store === null || store === void 0 ? void 0 : store.list())) !== null && _b !== void 0 ? _b : []).map((record) => { var _a; return [
46
+ record.id,
47
+ Object.assign(Object.assign({}, record), { generation: (_a = record.generation) !== null && _a !== void 0 ? _a : 0 }),
48
+ ]; }));
49
+ /** In-flight claims keyed by reminder id (single-flight per id). */
50
+ const inflight = new Map();
36
51
  let scheduleTimer;
37
52
  let lastFiredMinute = -1;
38
53
  let scmRelay;
54
+ function persist(record) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ reminders.set(record.id, record);
57
+ yield store === null || store === void 0 ? void 0 : store.save(record);
58
+ });
59
+ }
39
60
  function armScheduleTicker() {
40
61
  var _a;
41
62
  if (scheduleTimer !== undefined || schedules.size === 0) {
@@ -80,10 +101,96 @@ export function createLocalControlPlane(opts) {
80
101
  function armReminder(record) {
81
102
  var _a;
82
103
  clearReminderTimer(record.id);
104
+ if (record.status !== "armed") {
105
+ return;
106
+ }
83
107
  const delay = Math.min(MAX_TIMER_MS, Math.max(0, record.nextFireAtMs - Date.now()));
84
108
  const timer = setTimeout(() => {
85
109
  reminderTimers.delete(record.id);
86
- const current = reminders.get(record.id);
110
+ void onReminderDue(record.id).catch((error) => {
111
+ logger(`[agent-sdk] reminder "${record.id}" dispatch failed: ${error instanceof Error ? error.message : String(error)}`);
112
+ });
113
+ }, delay);
114
+ (_a = timer.unref) === null || _a === void 0 ? void 0 : _a.call(timer);
115
+ reminderTimers.set(record.id, timer);
116
+ }
117
+ function claimDue(id) {
118
+ return __awaiter(this, void 0, void 0, function* () {
119
+ const current = reminders.get(id);
120
+ if (current === undefined || current.status !== "armed") {
121
+ return undefined;
122
+ }
123
+ if (current.nextFireAtMs > Date.now() + 50) {
124
+ armReminder(current);
125
+ return undefined;
126
+ }
127
+ if (inflight.has(id)) {
128
+ return undefined;
129
+ }
130
+ const claimed = Object.assign(Object.assign({}, current), { status: "firing", generation: recordGeneration(current), updatedAt: new Date().toISOString() });
131
+ yield persist(claimed);
132
+ inflight.set(id, {
133
+ id: claimed.id,
134
+ fireCount: claimed.fireCount,
135
+ generation: recordGeneration(claimed),
136
+ });
137
+ return claimed;
138
+ });
139
+ }
140
+ function applyReminderOutcome(claim, outcome) {
141
+ return __awaiter(this, void 0, void 0, function* () {
142
+ const current = reminders.get(claim.id);
143
+ if (current === undefined) {
144
+ inflight.delete(claim.id);
145
+ return { applied: false, reason: "missing" };
146
+ }
147
+ const result = applyOutcomeToRecord(current, claim, outcome);
148
+ inflight.delete(claim.id);
149
+ if (!result.applied) {
150
+ if (current.status === "armed" && armReminderClocks) {
151
+ armReminder(current);
152
+ }
153
+ return result;
154
+ }
155
+ yield persist(result.record);
156
+ if (armReminderClocks && result.record.status === "armed") {
157
+ armReminder(result.record);
158
+ }
159
+ else {
160
+ clearReminderTimer(result.record.id);
161
+ }
162
+ return result;
163
+ });
164
+ }
165
+ function onReminderDue(id) {
166
+ return __awaiter(this, void 0, void 0, function* () {
167
+ // Protocol path: claim → guest execute → CAS apply.
168
+ if (opts.executeReminder !== undefined) {
169
+ const claimed = yield claimDue(id);
170
+ if (claimed === undefined) {
171
+ return;
172
+ }
173
+ const descriptor = toFireDescriptor(claimed, Date.now());
174
+ let outcome;
175
+ try {
176
+ outcome = yield opts.executeReminder(descriptor);
177
+ }
178
+ catch (error) {
179
+ logger(`[agent-sdk] reminder "${id}" guest execution failed: ${error instanceof Error ? error.message : String(error)}`);
180
+ outcome = {
181
+ kind: "retry",
182
+ delayMs: 1000,
183
+ reason: "guest_error",
184
+ };
185
+ }
186
+ const result = yield applyReminderOutcome(claimFromDescriptor(descriptor), outcome);
187
+ if (!result.applied) {
188
+ logger(`[agent-sdk] reminder "${id}" outcome not applied: ${result.reason}`);
189
+ }
190
+ return;
191
+ }
192
+ // Legacy v1: do not claim/firing — runner mutates via putReminder after fire.
193
+ const current = reminders.get(id);
87
194
  if (current === undefined || current.status !== "armed") {
88
195
  return;
89
196
  }
@@ -91,14 +198,16 @@ export function createLocalControlPlane(opts) {
91
198
  armReminder(current);
92
199
  return;
93
200
  }
94
- void opts.fireReminder(current.id, current.fireCount).catch((error) => {
95
- logger(`[agent-sdk] reminder "${current.id}" dispatch failed: ${error instanceof Error ? error.message : String(error)}`);
96
- });
97
- }, delay);
98
- (_a = timer.unref) === null || _a === void 0 ? void 0 : _a.call(timer);
99
- reminderTimers.set(record.id, timer);
201
+ try {
202
+ yield opts.fireReminder(current.id, current.fireCount);
203
+ }
204
+ catch (error) {
205
+ logger(`[agent-sdk] reminder "${id}" dispatch failed: ${error instanceof Error ? error.message : String(error)}`);
206
+ }
207
+ });
100
208
  }
101
209
  return {
210
+ protocolVersion: REMINDER_CP_PROTOCOL_VERSION,
102
211
  routeContinuation: routeLocalIngressContinuation,
103
212
  attachScmEvents(relay) {
104
213
  scmRelay = relay;
@@ -121,13 +230,17 @@ export function createLocalControlPlane(opts) {
121
230
  },
122
231
  putReminder(record) {
123
232
  return __awaiter(this, void 0, void 0, function* () {
124
- reminders.set(record.id, record);
125
- yield store === null || store === void 0 ? void 0 : store.save(record);
126
- if (armReminderClocks && record.status === "armed") {
127
- armReminder(record);
233
+ var _a;
234
+ const normalized = Object.assign(Object.assign({}, record), { generation: (_a = record.generation) !== null && _a !== void 0 ? _a : 0 });
235
+ yield persist(normalized);
236
+ if (armReminderClocks && normalized.status === "armed") {
237
+ armReminder(normalized);
128
238
  return;
129
239
  }
130
- clearReminderTimer(record.id);
240
+ clearReminderTimer(normalized.id);
241
+ if (normalized.status !== "firing") {
242
+ inflight.delete(normalized.id);
243
+ }
131
244
  });
132
245
  },
133
246
  getReminder(id) {
@@ -143,16 +256,84 @@ export function createLocalControlPlane(opts) {
143
256
  deleteReminder(id) {
144
257
  return __awaiter(this, void 0, void 0, function* () {
145
258
  clearReminderTimer(id);
259
+ inflight.delete(id);
146
260
  reminders.delete(id);
147
261
  yield store === null || store === void 0 ? void 0 : store.delete(id);
148
262
  });
149
263
  },
264
+ createReminder(intent) {
265
+ return __awaiter(this, void 0, void 0, function* () {
266
+ if (intent.protocolVersion !== REMINDER_CP_PROTOCOL_VERSION) {
267
+ throw new Error(`Unsupported reminder CP protocol version ${String(intent.protocolVersion)}`);
268
+ }
269
+ const record = intentToNewRecord(intent);
270
+ yield persist(record);
271
+ if (armReminderClocks && record.status === "armed") {
272
+ armReminder(record);
273
+ }
274
+ return record;
275
+ });
276
+ },
277
+ cancelReminder(id_1) {
278
+ return __awaiter(this, arguments, void 0, function* (id, reason = "explicit_cancel") {
279
+ const current = reminders.get(id);
280
+ if (current === undefined) {
281
+ return undefined;
282
+ }
283
+ if (current.status === "completed" ||
284
+ current.status === "cancelled" ||
285
+ current.status === "disarmed") {
286
+ return current;
287
+ }
288
+ clearReminderTimer(id);
289
+ inflight.delete(id);
290
+ const updated = Object.assign(Object.assign({}, current), { status: "cancelled", disarmReason: reason, generation: recordGeneration(current) + 1, updatedAt: new Date().toISOString() });
291
+ yield persist(updated);
292
+ return updated;
293
+ });
294
+ },
295
+ rekeyReminders(channelId, oldToken, newToken) {
296
+ return __awaiter(this, void 0, void 0, function* () {
297
+ let n = 0;
298
+ for (const record of [...reminders.values()]) {
299
+ if (record.channelId !== channelId ||
300
+ record.continuationToken !== oldToken) {
301
+ continue;
302
+ }
303
+ if (record.status !== "armed" && record.status !== "firing") {
304
+ continue;
305
+ }
306
+ const wasInflight = inflight.has(record.id);
307
+ inflight.delete(record.id);
308
+ let updated = Object.assign(Object.assign({}, record), { continuationToken: newToken, status: "armed", generation: recordGeneration(record) + 1, updatedAt: new Date().toISOString() });
309
+ // Interrupted in-flight fire: retry the same fireCount soon.
310
+ if (wasInflight) {
311
+ updated = Object.assign(Object.assign({}, updated), { nextFireAtMs: Math.min(updated.nextFireAtMs, Date.now()) });
312
+ }
313
+ yield persist(updated);
314
+ if (armReminderClocks) {
315
+ armReminder(updated);
316
+ }
317
+ n += 1;
318
+ }
319
+ return n;
320
+ });
321
+ },
322
+ applyReminderOutcome,
150
323
  startClocks() {
151
- if (!armReminderClocks) {
152
- return;
153
- }
154
324
  for (const record of reminders.values()) {
155
- if (record.status === "armed") {
325
+ if (record.status === "firing") {
326
+ // Restart hydration: treat interrupted fires as armed for retry
327
+ // even when clocks are not armed (status must still recover).
328
+ const restored = Object.assign(Object.assign({}, record), { status: "armed", updatedAt: new Date().toISOString() });
329
+ void persist(restored).then(() => {
330
+ if (armReminderClocks) {
331
+ armReminder(restored);
332
+ }
333
+ });
334
+ continue;
335
+ }
336
+ if (armReminderClocks && record.status === "armed") {
156
337
  armReminder(record);
157
338
  }
158
339
  }
@@ -162,6 +343,7 @@ export function createLocalControlPlane(opts) {
162
343
  for (const id of [...reminderTimers.keys()]) {
163
344
  clearReminderTimer(id);
164
345
  }
346
+ inflight.clear();
165
347
  if (scmRelay !== undefined) {
166
348
  void scmRelay.stop();
167
349
  scmRelay = undefined;
@@ -7,6 +7,7 @@
7
7
  * The control plane owns reminder *documents* and clocks. The kit only
8
8
  * executes fires.
9
9
  */
10
+ import { type ReminderControlPlane } from "./reminder-control-plane-protocol.js";
10
11
  import { type ReminderRecord } from "./reminder-store.js";
11
12
  export interface PlatformTimers {
12
13
  upsertSchedule(input: {
@@ -25,4 +26,10 @@ export interface CursorHostedPlatformTimersOptions {
25
26
  fetch?: typeof fetch;
26
27
  }
27
28
  export declare function createCursorHostedPlatformTimers(options?: CursorHostedPlatformTimersOptions): PlatformTimers;
29
+ /**
30
+ * Cursor-hosted HTTP ReminderControlPlane for architecture v2.
31
+ * Speaks factory `/internal/agentsdk/reminders` (ELB → factory ECS).
32
+ * CP owns ids and time. v1 PUT/DELETE reminders stay on timed-work.
33
+ */
34
+ export declare function createCursorHostedReminderControlPlane(options?: CursorHostedPlatformTimersOptions): ReminderControlPlane;
28
35
  //# sourceMappingURL=platform-timers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform-timers.d.ts","sourceRoot":"","sources":["../../src/internal/platform-timers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI5E,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAC7D,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAqED,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,cAAc,CA0EhB"}
1
+ {"version":3,"file":"platform-timers.d.ts","sourceRoot":"","sources":["../../src/internal/platform-timers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAEL,KAAK,oBAAoB,EAK1B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI5E,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAC7D,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,iCAAiC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAqED,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,cAAc,CA0EhB;AA0DD;;;;GAIG;AACH,wBAAgB,sCAAsC,CACpD,OAAO,GAAE,iCAAsC,GAC9C,oBAAoB,CAsHtB"}
@@ -16,6 +16,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
16
16
  step((generator = generator.apply(thisArg, _arguments || [])).next());
17
17
  });
18
18
  };
19
+ import { REMINDER_CP_PROTOCOL_VERSION, } from "./reminder-control-plane-protocol.js";
19
20
  import { isReminderRecord } from "./reminder-store.js";
20
21
  const DEFAULT_CURSOR_EXTERNAL_API_URL = "https://api.cursor.com";
21
22
  function resolveApiKey(options) {
@@ -118,3 +119,141 @@ export function createCursorHostedPlatformTimers(options = {}) {
118
119
  },
119
120
  };
120
121
  }
122
+ /** v2 reminder CP is factory ECS (`/internal/agentsdk/*`), not timed-work. */
123
+ const AGENTSDK_REMINDERS_PREFIX = "/internal/agentsdk";
124
+ /**
125
+ * Bounded retries for idempotent CP outcome writes after the guest handler
126
+ * has already run. Delivery is at-least-once: a transient apply failure may
127
+ * re-enter the handler on the next Temporal admission. Do not claim
128
+ * exactly-once handler execution.
129
+ */
130
+ const APPLY_REMINDER_OUTCOME_MAX_ATTEMPTS = 3;
131
+ const APPLY_REMINDER_OUTCOME_RETRY_DELAY_MS = 50;
132
+ function sleepMs(ms) {
133
+ return __awaiter(this, void 0, void 0, function* () {
134
+ yield new Promise((resolve) => setTimeout(resolve, ms));
135
+ });
136
+ }
137
+ function withBoundedApplyRetries(run) {
138
+ return __awaiter(this, void 0, void 0, function* () {
139
+ let lastError;
140
+ for (let attempt = 1; attempt <= APPLY_REMINDER_OUTCOME_MAX_ATTEMPTS; attempt++) {
141
+ try {
142
+ return yield run();
143
+ }
144
+ catch (error) {
145
+ lastError = error;
146
+ if (attempt >= APPLY_REMINDER_OUTCOME_MAX_ATTEMPTS) {
147
+ break;
148
+ }
149
+ yield sleepMs(APPLY_REMINDER_OUTCOME_RETRY_DELAY_MS * attempt);
150
+ }
151
+ }
152
+ throw lastError;
153
+ });
154
+ }
155
+ function timedWorkJsonFetch(options, method, path, body) {
156
+ return __awaiter(this, void 0, void 0, function* () {
157
+ var _a;
158
+ const fetchImpl = (_a = options.fetch) !== null && _a !== void 0 ? _a : globalThis.fetch;
159
+ if (typeof fetchImpl !== "function") {
160
+ throw new Error("reminder control plane requires fetch");
161
+ }
162
+ return fetchImpl(`${resolveBaseUrl(options)}${path}`, Object.assign({ method, headers: Object.assign({ Authorization: `Bearer ${resolveApiKey(options)}` }, (body === undefined ? {} : { "Content-Type": "application/json" })) }, (body === undefined ? {} : { body: JSON.stringify(body) })));
163
+ });
164
+ }
165
+ /**
166
+ * Cursor-hosted HTTP ReminderControlPlane for architecture v2.
167
+ * Speaks factory `/internal/agentsdk/reminders` (ELB → factory ECS).
168
+ * CP owns ids and time. v1 PUT/DELETE reminders stay on timed-work.
169
+ */
170
+ export function createCursorHostedReminderControlPlane(options = {}) {
171
+ return {
172
+ protocolVersion: REMINDER_CP_PROTOCOL_VERSION,
173
+ createReminder(intent) {
174
+ return __awaiter(this, void 0, void 0, function* () {
175
+ const response = yield timedWorkJsonFetch(options, "POST", `${AGENTSDK_REMINDERS_PREFIX}/reminders`, intent);
176
+ if (!response.ok) {
177
+ const text = yield response.text();
178
+ throw new Error(`reminder CP create failed: HTTP ${response.status} ${text}`);
179
+ }
180
+ const parsed = yield response.json();
181
+ if (!isReminderRecord(parsed)) {
182
+ throw new Error("reminder CP create returned invalid record");
183
+ }
184
+ return parsed;
185
+ });
186
+ },
187
+ getReminder(id) {
188
+ return __awaiter(this, void 0, void 0, function* () {
189
+ const response = yield timedWorkJsonFetch(options, "GET", `${AGENTSDK_REMINDERS_PREFIX}/reminders/${encodeURIComponent(id)}`);
190
+ if (response.status === 404) {
191
+ return undefined;
192
+ }
193
+ if (!response.ok) {
194
+ throw new Error(`reminder CP get failed: HTTP ${response.status}`);
195
+ }
196
+ const parsed = yield response.json();
197
+ return isReminderRecord(parsed) ? parsed : undefined;
198
+ });
199
+ },
200
+ listReminders() {
201
+ return __awaiter(this, void 0, void 0, function* () {
202
+ const response = yield timedWorkJsonFetch(options, "GET", `${AGENTSDK_REMINDERS_PREFIX}/reminders`);
203
+ if (!response.ok) {
204
+ throw new Error(`reminder CP list failed: HTTP ${response.status}`);
205
+ }
206
+ const parsed = yield response.json();
207
+ if (parsed === null ||
208
+ typeof parsed !== "object" ||
209
+ !("reminders" in parsed) ||
210
+ !Array.isArray(parsed.reminders)) {
211
+ return [];
212
+ }
213
+ return parsed.reminders.filter(isReminderRecord);
214
+ });
215
+ },
216
+ cancelReminder(id, reason) {
217
+ return __awaiter(this, void 0, void 0, function* () {
218
+ const response = yield timedWorkJsonFetch(options, "POST", `${AGENTSDK_REMINDERS_PREFIX}/reminders/${encodeURIComponent(id)}/cancel`, reason === undefined ? {} : { reason });
219
+ if (response.status === 404) {
220
+ return undefined;
221
+ }
222
+ if (!response.ok) {
223
+ throw new Error(`reminder CP cancel failed: HTTP ${response.status}`);
224
+ }
225
+ const parsed = yield response.json();
226
+ return isReminderRecord(parsed) ? parsed : undefined;
227
+ });
228
+ },
229
+ rekeyReminders(channelId, oldToken, newToken) {
230
+ return __awaiter(this, void 0, void 0, function* () {
231
+ const response = yield timedWorkJsonFetch(options, "POST", `${AGENTSDK_REMINDERS_PREFIX}/reminders/rekey`, { channelId, oldToken, newToken });
232
+ if (!response.ok) {
233
+ throw new Error(`reminder CP rekey failed: HTTP ${response.status}`);
234
+ }
235
+ const parsed = yield response.json();
236
+ if (parsed === null ||
237
+ typeof parsed !== "object" ||
238
+ typeof parsed.count !== "number") {
239
+ throw new Error("reminder CP rekey returned invalid body");
240
+ }
241
+ return parsed.count;
242
+ });
243
+ },
244
+ applyReminderOutcome(claim, outcome) {
245
+ return __awaiter(this, void 0, void 0, function* () {
246
+ // Handler side effects may already have run; retry only the idempotent
247
+ // CP write. Exhausted failures stay thrown so Temporal can re-admit
248
+ // (at-least-once — not exactly-once).
249
+ return yield withBoundedApplyRetries(() => __awaiter(this, void 0, void 0, function* () {
250
+ const response = yield timedWorkJsonFetch(options, "POST", `${AGENTSDK_REMINDERS_PREFIX}/reminders/outcome`, { claim, outcome });
251
+ if (!response.ok) {
252
+ throw new Error(`reminder CP outcome apply failed: HTTP ${response.status}`);
253
+ }
254
+ return (yield response.json());
255
+ }));
256
+ });
257
+ },
258
+ };
259
+ }