@cursor/july 0.1.102 → 0.1.103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (715) hide show
  1. package/AGENTS.md +34 -32
  2. package/README.md +10 -12
  3. package/dist/ab.d.ts +1 -1
  4. package/dist/ab.js +1 -1
  5. package/dist/bin/agent-serve.d.ts +12 -12
  6. package/dist/bin/agent-serve.js +114 -36
  7. package/dist/channels/bitbucket/api.d.ts +176 -0
  8. package/dist/channels/bitbucket/api.d.ts.map +1 -0
  9. package/dist/channels/bitbucket/api.js +419 -0
  10. package/dist/channels/bitbucket/binding.d.ts +71 -0
  11. package/dist/channels/bitbucket/binding.d.ts.map +1 -0
  12. package/dist/channels/bitbucket/binding.js +269 -0
  13. package/dist/channels/bitbucket/bitbucket-channel.d.ts +33 -0
  14. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -0
  15. package/dist/channels/bitbucket/bitbucket-channel.js +120 -0
  16. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +61 -0
  17. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -0
  18. package/dist/channels/bitbucket/bitbucket-webhook.js +394 -0
  19. package/dist/channels/bitbucket/checks.d.ts +67 -0
  20. package/dist/channels/bitbucket/checks.d.ts.map +1 -0
  21. package/dist/channels/bitbucket/checks.js +102 -0
  22. package/dist/channels/bitbucket/cursor-account.d.ts +37 -0
  23. package/dist/channels/bitbucket/cursor-account.d.ts.map +1 -0
  24. package/dist/channels/bitbucket/cursor-account.js +65 -0
  25. package/dist/channels/bitbucket/defaults.d.ts +26 -0
  26. package/dist/channels/bitbucket/defaults.d.ts.map +1 -0
  27. package/dist/channels/bitbucket/defaults.js +73 -0
  28. package/dist/channels/bitbucket/events.d.ts +22 -0
  29. package/dist/channels/bitbucket/events.d.ts.map +1 -0
  30. package/dist/channels/bitbucket/events.js +64 -0
  31. package/dist/channels/bitbucket/index.d.ts +34 -0
  32. package/dist/channels/bitbucket/index.d.ts.map +1 -0
  33. package/dist/channels/bitbucket/index.js +33 -0
  34. package/dist/channels/bitbucket/replay.d.ts +63 -0
  35. package/dist/channels/bitbucket/replay.d.ts.map +1 -0
  36. package/dist/channels/bitbucket/replay.js +304 -0
  37. package/dist/channels/bitbucket/state.d.ts +35 -0
  38. package/dist/channels/bitbucket/state.d.ts.map +1 -0
  39. package/dist/channels/bitbucket/state.js +21 -0
  40. package/dist/channels/bitbucket/types.d.ts +229 -0
  41. package/dist/channels/bitbucket/types.d.ts.map +1 -0
  42. package/dist/channels/bitbucket/types.js +1 -0
  43. package/dist/channels/deployments/deployments-channel.d.ts +22 -14
  44. package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
  45. package/dist/channels/deployments/deployments-channel.js +25 -27
  46. package/dist/channels/deployments/types.d.ts +12 -6
  47. package/dist/channels/deployments/types.d.ts.map +1 -1
  48. package/dist/channels/github/binding.d.ts +6 -0
  49. package/dist/channels/github/binding.d.ts.map +1 -1
  50. package/dist/channels/github/binding.js +3 -3
  51. package/dist/channels/github/cursor-account.d.ts +7 -3
  52. package/dist/channels/github/cursor-account.d.ts.map +1 -1
  53. package/dist/channels/github/cursor-account.js +10 -6
  54. package/dist/channels/github/events.d.ts +1 -1
  55. package/dist/channels/github/events.js +1 -1
  56. package/dist/channels/github/forward.d.ts +1 -1
  57. package/dist/channels/github/forward.d.ts.map +1 -1
  58. package/dist/channels/github/forward.js +3 -2
  59. package/dist/channels/github/github-channel.d.ts +29 -39
  60. package/dist/channels/github/github-channel.d.ts.map +1 -1
  61. package/dist/channels/github/github-channel.js +68 -101
  62. package/dist/channels/github/replay.d.ts +1 -1
  63. package/dist/channels/github/replay.js +1 -1
  64. package/dist/channels/github/state.d.ts +2 -0
  65. package/dist/channels/github/state.d.ts.map +1 -1
  66. package/dist/channels/github/state.js +14 -11
  67. package/dist/channels/github/types.d.ts +2 -4
  68. package/dist/channels/github/types.d.ts.map +1 -1
  69. package/dist/channels/gitlab/api.d.ts +91 -0
  70. package/dist/channels/gitlab/api.d.ts.map +1 -0
  71. package/dist/channels/gitlab/api.js +150 -0
  72. package/dist/channels/gitlab/binding.d.ts +58 -0
  73. package/dist/channels/gitlab/binding.d.ts.map +1 -0
  74. package/dist/channels/gitlab/binding.js +139 -0
  75. package/dist/channels/gitlab/checks.d.ts +110 -0
  76. package/dist/channels/gitlab/checks.d.ts.map +1 -0
  77. package/dist/channels/gitlab/checks.js +126 -0
  78. package/dist/channels/gitlab/cursor-account.d.ts +36 -0
  79. package/dist/channels/gitlab/cursor-account.d.ts.map +1 -0
  80. package/dist/channels/gitlab/cursor-account.js +65 -0
  81. package/dist/channels/gitlab/defaults.d.ts +25 -0
  82. package/dist/channels/gitlab/defaults.d.ts.map +1 -0
  83. package/dist/channels/gitlab/defaults.js +60 -0
  84. package/dist/channels/gitlab/events.d.ts +12 -0
  85. package/dist/channels/gitlab/events.d.ts.map +1 -0
  86. package/dist/channels/gitlab/events.js +28 -0
  87. package/dist/channels/gitlab/gitlab-channel.d.ts +33 -0
  88. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -0
  89. package/dist/channels/gitlab/gitlab-channel.js +120 -0
  90. package/dist/channels/gitlab/gitlab-webhook.d.ts +45 -0
  91. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -0
  92. package/dist/channels/gitlab/gitlab-webhook.js +397 -0
  93. package/dist/channels/gitlab/index.d.ts +31 -0
  94. package/dist/channels/gitlab/index.d.ts.map +1 -0
  95. package/dist/channels/gitlab/index.js +30 -0
  96. package/dist/channels/gitlab/replay.d.ts +105 -0
  97. package/dist/channels/gitlab/replay.d.ts.map +1 -0
  98. package/dist/channels/gitlab/replay.js +206 -0
  99. package/dist/channels/gitlab/state.d.ts +33 -0
  100. package/dist/channels/gitlab/state.d.ts.map +1 -0
  101. package/dist/channels/gitlab/state.js +23 -0
  102. package/dist/channels/gitlab/types.d.ts +214 -0
  103. package/dist/channels/gitlab/types.d.ts.map +1 -0
  104. package/dist/channels/gitlab/types.js +1 -0
  105. package/dist/channels/origin/api.d.ts.map +1 -1
  106. package/dist/channels/origin/api.js +4 -2
  107. package/dist/channels/origin/origin-channel.d.ts +4 -9
  108. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  109. package/dist/channels/origin/origin-channel.js +8 -48
  110. package/dist/channels/origin/types.d.ts +20 -2
  111. package/dist/channels/origin/types.d.ts.map +1 -1
  112. package/dist/channels/slack/eval-directive.d.ts.map +1 -1
  113. package/dist/channels/slack/eval-directive.js +1 -7
  114. package/dist/channels/slack/init.d.ts.map +1 -1
  115. package/dist/channels/slack/init.js +3 -3
  116. package/dist/channels/slack/setup.d.ts +1 -1
  117. package/dist/channels/slack/setup.d.ts.map +1 -1
  118. package/dist/channels/slack/setup.js +6 -13
  119. package/dist/channels/slack/types.d.ts +1 -1
  120. package/dist/channels/slack/types.d.ts.map +1 -1
  121. package/dist/channels.d.ts +1 -1
  122. package/dist/channels.d.ts.map +1 -1
  123. package/dist/client.d.ts +1 -1
  124. package/dist/client.js +1 -1
  125. package/dist/connections.d.ts +1 -1
  126. package/dist/connections.js +1 -1
  127. package/dist/docs/404.html +2 -2
  128. package/dist/docs/ab.html +4 -4
  129. package/dist/docs/assets/{app.CLA03RCz.js → app.DW9pXkpL.js} +1 -1
  130. package/dist/docs/assets/chunks/@localSearchIndexroot.nrl1ifBq.js +1 -0
  131. package/dist/docs/assets/chunks/{VPLocalSearchBox.ifxv-cJV.js → VPLocalSearchBox.CdEIUwDg.js} +1 -1
  132. package/dist/docs/assets/chunks/{theme.DWCwM6p-.js → theme.YZMHgPgg.js} +2 -2
  133. package/dist/docs/assets/concepts.md.DgEcZOfT.js +1 -0
  134. package/dist/docs/assets/{concepts.md.rPzW2HZN.lean.js → concepts.md.DgEcZOfT.lean.js} +1 -1
  135. package/dist/docs/assets/{evals.md.CPzDAwoH.js → evals.md.CbMoebP1.js} +1 -1
  136. package/dist/docs/assets/guides_cloud-agents.md.DS8RIjwx.js +9 -0
  137. package/dist/docs/assets/{guides_github.md.BtPr9GaP.js → guides_github.md.DKYiT9do.js} +1 -1
  138. package/dist/docs/assets/{guides_opentelemetry.md.BVTXDCRg.js → guides_opentelemetry.md.COh9jFVg.js} +7 -8
  139. package/dist/docs/assets/{guides_opentelemetry.md.BVTXDCRg.lean.js → guides_opentelemetry.md.COh9jFVg.lean.js} +1 -1
  140. package/dist/docs/assets/{index.md.Kiht7ell.js → index.md.D75GWhPl.js} +1 -1
  141. package/dist/docs/assets/{reference_agent-config.md.BHeYMgme.js → reference_agent-config.md.CHNpiyp4.js} +3 -3
  142. package/dist/docs/assets/{reference_channels.md.Cd2f2iyV.js → reference_channels.md.Dz8Cnudp.js} +2 -2
  143. package/dist/docs/assets/{reference_channels.md.Cd2f2iyV.lean.js → reference_channels.md.Dz8Cnudp.lean.js} +1 -1
  144. package/dist/docs/assets/{reference_cli.md.DfoeyvL0.js → reference_cli.md.CJNc_xYK.js} +1 -1
  145. package/dist/docs/assets/{reference_extensions.md.9WQMZe1l.js → reference_extensions.md.DykHW3qL.js} +11 -5
  146. package/dist/docs/assets/reference_extensions.md.DykHW3qL.lean.js +1 -0
  147. package/dist/docs/assets/reference_hooks.md.Ddt5DdgJ.js +73 -0
  148. package/dist/docs/assets/{reference_hooks.md.a8BJxMR5.lean.js → reference_hooks.md.Ddt5DdgJ.lean.js} +1 -1
  149. package/dist/docs/assets/{reference_playground.md.DnX5nL-B.js → reference_playground.md.4myJPxrf.js} +1 -1
  150. package/dist/docs/assets/{reference_project-layout.md.CA6QP6Lw.js → reference_project-layout.md.DuBu9a96.js} +2 -2
  151. package/dist/docs/assets/reference_result.md.BK5SxDrf.js +19 -0
  152. package/dist/docs/assets/reference_result.md.BK5SxDrf.lean.js +1 -0
  153. package/dist/docs/assets/{reference_sessions.md.NxFP_CAC.js → reference_sessions.md.CueyOHSL.js} +1 -1
  154. package/dist/docs/assets/{reference_sessions.md.NxFP_CAC.lean.js → reference_sessions.md.CueyOHSL.lean.js} +1 -1
  155. package/dist/docs/assets/{reference_tools.md.B1up2r9W.js → reference_tools.md.aGrn99hP.js} +1 -1
  156. package/dist/docs/assets/skills_framework-map.md.haibFyoB.js +1 -0
  157. package/dist/docs/assets/{skills_otel.md.CgiZryR3.js → skills_otel.md.CqhobH3B.js} +3 -3
  158. package/dist/docs/assets/{skills_otel.md.CgiZryR3.lean.js → skills_otel.md.CqhobH3B.lean.js} +1 -1
  159. package/dist/docs/assets/{templates_pr-autofixer.md.x5zl6-GT.js → templates_pr-autofixer.md.Bds_XWcV.js} +2 -2
  160. package/dist/docs/assets/{templates_pr-autofixer.md.x5zl6-GT.lean.js → templates_pr-autofixer.md.Bds_XWcV.lean.js} +1 -1
  161. package/dist/docs/building-with-agents.html +4 -4
  162. package/dist/docs/concepts.html +5 -5
  163. package/dist/docs/concepts.md +2 -4
  164. package/dist/docs/deployment.html +4 -4
  165. package/dist/docs/design/runtime-abstraction.md +2 -3
  166. package/dist/docs/evals.html +6 -6
  167. package/dist/docs/evals.md +9 -7
  168. package/dist/docs/guides/agent-to-agent.html +4 -4
  169. package/dist/docs/guides/cloud-agents.html +6 -6
  170. package/dist/docs/guides/cloud-agents.md +4 -6
  171. package/dist/docs/guides/convert-automation.html +4 -4
  172. package/dist/docs/guides/github.html +6 -6
  173. package/dist/docs/guides/github.md +0 -1
  174. package/dist/docs/guides/human-in-the-loop.html +4 -4
  175. package/dist/docs/guides/mcp-oauth.html +5 -5
  176. package/dist/docs/guides/opentelemetry.html +10 -11
  177. package/dist/docs/guides/opentelemetry.md +41 -17
  178. package/dist/docs/guides/slack.html +4 -4
  179. package/dist/docs/guides/webhooks.html +4 -4
  180. package/dist/docs/hashmap.json +1 -1
  181. package/dist/docs/hillclimbing.html +4 -4
  182. package/dist/docs/index.html +6 -6
  183. package/dist/docs/index.md +2 -2
  184. package/dist/docs/llms-full.txt +501 -262
  185. package/dist/docs/llms.txt +2 -2
  186. package/dist/docs/quickstart.html +4 -4
  187. package/dist/docs/reference/agent-config.html +8 -8
  188. package/dist/docs/reference/agent-config.md +6 -10
  189. package/dist/docs/reference/artifacts.html +5 -5
  190. package/dist/docs/reference/channels.html +6 -6
  191. package/dist/docs/reference/channels.md +18 -8
  192. package/dist/docs/reference/cli.html +5 -5
  193. package/dist/docs/reference/cli.md +3 -4
  194. package/dist/docs/reference/connections.html +4 -4
  195. package/dist/docs/reference/extensions.html +16 -10
  196. package/dist/docs/reference/extensions.md +86 -22
  197. package/dist/docs/reference/hooks.html +69 -10
  198. package/dist/docs/reference/hooks.md +215 -46
  199. package/dist/docs/reference/http-api.html +4 -4
  200. package/dist/docs/reference/instructions.html +4 -4
  201. package/dist/docs/reference/playground.html +5 -5
  202. package/dist/docs/reference/playground.md +3 -0
  203. package/dist/docs/reference/project-layout.html +6 -6
  204. package/dist/docs/reference/project-layout.md +2 -1
  205. package/dist/docs/reference/prompt.html +4 -4
  206. package/dist/docs/reference/result.html +45 -0
  207. package/dist/docs/reference/result.md +89 -0
  208. package/dist/docs/reference/schedules.html +4 -4
  209. package/dist/docs/reference/sessions.html +5 -5
  210. package/dist/docs/reference/sessions.md +3 -1
  211. package/dist/docs/reference/skills.html +4 -4
  212. package/dist/docs/reference/subagents.html +4 -4
  213. package/dist/docs/reference/tools.html +5 -5
  214. package/dist/docs/reference/tools.md +1 -2
  215. package/dist/docs/scaffolding-agents.html +4 -4
  216. package/dist/docs/skills/ab.html +4 -4
  217. package/dist/docs/skills/create-agent.html +4 -4
  218. package/dist/docs/skills/debug.html +4 -4
  219. package/dist/docs/skills/evals.html +4 -4
  220. package/dist/docs/skills/framework-map.html +5 -5
  221. package/dist/docs/skills/framework-map.md +3 -1
  222. package/dist/docs/skills/github.html +4 -4
  223. package/dist/docs/skills/hillclimb.html +4 -4
  224. package/dist/docs/skills/index.html +4 -4
  225. package/dist/docs/skills/mcp-auth.html +4 -4
  226. package/dist/docs/skills/otel.html +7 -7
  227. package/dist/docs/skills/otel.md +8 -3
  228. package/dist/docs/skills/setup-slack.html +4 -4
  229. package/dist/docs/storage.html +4 -4
  230. package/dist/docs/templates/agentic-owners.html +4 -4
  231. package/dist/docs/templates/agents-md.html +4 -4
  232. package/dist/docs/templates/code-wiki.html +4 -4
  233. package/dist/docs/templates/demo.html +4 -4
  234. package/dist/docs/templates/pr-autofixer.html +6 -6
  235. package/dist/docs/templates/pr-autofixer.md +0 -3
  236. package/dist/docs/templates/security-help.html +4 -4
  237. package/dist/docs/templates/security-reviewer.html +4 -4
  238. package/dist/docs/templates/triage.html +4 -4
  239. package/dist/docs/troubleshooting.html +4 -4
  240. package/dist/evals.d.ts +1 -1
  241. package/dist/evals.d.ts.map +1 -1
  242. package/dist/extensions.d.ts +20 -7
  243. package/dist/extensions.d.ts.map +1 -1
  244. package/dist/extensions.js +36 -5
  245. package/dist/files.d.ts +16 -3
  246. package/dist/files.d.ts.map +1 -1
  247. package/dist/files.js +16 -3
  248. package/dist/index.d.ts +4 -4
  249. package/dist/index.d.ts.map +1 -1
  250. package/dist/index.js +3 -3
  251. package/dist/internal/ab-snapshot.d.ts.map +1 -1
  252. package/dist/internal/ab-snapshot.js +0 -1
  253. package/dist/internal/advertise-tools.d.ts.map +1 -1
  254. package/dist/internal/advertise-tools.js +1 -3
  255. package/dist/internal/authored-alias-hooks.d.ts +4 -13
  256. package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
  257. package/dist/internal/authored-alias-hooks.js +4 -20
  258. package/dist/internal/authored-loaders.d.ts +2 -3
  259. package/dist/internal/authored-loaders.d.ts.map +1 -1
  260. package/dist/internal/authored-loaders.js +6 -20
  261. package/dist/internal/channel-dispatch.d.ts +43 -0
  262. package/dist/internal/channel-dispatch.d.ts.map +1 -0
  263. package/dist/internal/channel-dispatch.js +77 -0
  264. package/dist/internal/chat-client.d.ts +1 -1
  265. package/dist/internal/chat-client.js +1 -1
  266. package/dist/internal/cli-ax.d.ts +5 -5
  267. package/dist/internal/cli-ax.d.ts.map +1 -1
  268. package/dist/internal/cli-ax.js +5 -5
  269. package/dist/internal/cli-bitbucket.d.ts +33 -0
  270. package/dist/internal/cli-bitbucket.d.ts.map +1 -0
  271. package/dist/internal/cli-bitbucket.js +359 -0
  272. package/dist/internal/cli-convert-automation.d.ts +1 -1
  273. package/dist/internal/cli-convert-automation.js +2 -2
  274. package/dist/internal/cli-cursor.d.ts +1 -1
  275. package/dist/internal/cli-cursor.d.ts.map +1 -1
  276. package/dist/internal/cli-cursor.js +2 -4
  277. package/dist/internal/cli-deploy.d.ts.map +1 -1
  278. package/dist/internal/cli-deploy.js +2 -6
  279. package/dist/internal/cli-github.d.ts +1 -1
  280. package/dist/internal/cli-github.js +3 -3
  281. package/dist/internal/cli-gitlab.d.ts +37 -0
  282. package/dist/internal/cli-gitlab.d.ts.map +1 -0
  283. package/dist/internal/cli-gitlab.js +380 -0
  284. package/dist/internal/cli-mcp.d.ts.map +1 -1
  285. package/dist/internal/cli-mcp.js +2 -6
  286. package/dist/internal/cli-slack.d.ts +1 -1
  287. package/dist/internal/cli-slack.d.ts.map +1 -1
  288. package/dist/internal/cli-slack.js +2 -4
  289. package/dist/internal/continuation-channel.d.ts +14 -0
  290. package/dist/internal/continuation-channel.d.ts.map +1 -1
  291. package/dist/internal/continuation-channel.js +56 -3
  292. package/dist/internal/continuation-identity.d.ts +14 -15
  293. package/dist/internal/continuation-identity.d.ts.map +1 -1
  294. package/dist/internal/continuation-identity.js +182 -7
  295. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  296. package/dist/internal/conversation-mirror.js +4 -3
  297. package/dist/internal/convert-automation/types.d.ts +1 -1
  298. package/dist/internal/convert-automation/types.js +1 -1
  299. package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
  300. package/dist/internal/cursor/account-mcp.js +1 -3
  301. package/dist/internal/cursor/backend-client.d.ts +5 -4
  302. package/dist/internal/cursor/backend-client.d.ts.map +1 -1
  303. package/dist/internal/cursor/backend-client.js +5 -6
  304. package/dist/internal/cursor/bound-secret-file.d.ts +56 -0
  305. package/dist/internal/cursor/bound-secret-file.d.ts.map +1 -0
  306. package/dist/internal/cursor/bound-secret-file.js +88 -0
  307. package/dist/internal/cursor/credentials.d.ts +39 -5
  308. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  309. package/dist/internal/cursor/credentials.js +58 -8
  310. package/dist/internal/cursor/hosted-bound-secrets.d.ts +41 -0
  311. package/dist/internal/cursor/hosted-bound-secrets.d.ts.map +1 -0
  312. package/dist/internal/cursor/hosted-bound-secrets.js +54 -0
  313. package/dist/internal/cursor/hosted-deployment-secrets.d.ts +19 -5
  314. package/dist/internal/cursor/hosted-deployment-secrets.d.ts.map +1 -1
  315. package/dist/internal/cursor/hosted-deployment-secrets.js +29 -9
  316. package/dist/internal/cursor/hosted-store-secrets.d.ts +1 -1
  317. package/dist/internal/cursor/hosted-store-secrets.js +1 -1
  318. package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
  319. package/dist/internal/cursor-account-mcp-auth.js +2 -4
  320. package/dist/internal/cursor-deployment-relay.d.ts +6 -2
  321. package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
  322. package/dist/internal/cursor-deployment-relay.js +13 -9
  323. package/dist/internal/deploy-manifest.d.ts +1 -1
  324. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  325. package/dist/internal/deploy-manifest.js +1 -1
  326. package/dist/internal/discovery/ab.d.ts +1 -1
  327. package/dist/internal/discovery/ab.d.ts.map +1 -1
  328. package/dist/internal/discovery/ab.js +21 -9
  329. package/dist/internal/discovery/agent.d.ts +6 -1
  330. package/dist/internal/discovery/agent.d.ts.map +1 -1
  331. package/dist/internal/discovery/agent.js +65 -116
  332. package/dist/internal/discovery/channels.d.ts +1 -1
  333. package/dist/internal/discovery/channels.d.ts.map +1 -1
  334. package/dist/internal/discovery/channels.js +14 -14
  335. package/dist/internal/discovery/connections.d.ts +1 -5
  336. package/dist/internal/discovery/connections.d.ts.map +1 -1
  337. package/dist/internal/discovery/connections.js +30 -44
  338. package/dist/internal/discovery/cursor-plugin.d.ts.map +1 -1
  339. package/dist/internal/discovery/cursor-plugin.js +1 -3
  340. package/dist/internal/discovery/extension-overlay.d.ts +32 -0
  341. package/dist/internal/discovery/extension-overlay.d.ts.map +1 -0
  342. package/dist/internal/discovery/extension-overlay.js +191 -0
  343. package/dist/internal/discovery/extensions.d.ts +11 -2
  344. package/dist/internal/discovery/extensions.d.ts.map +1 -1
  345. package/dist/internal/discovery/extensions.js +211 -74
  346. package/dist/internal/discovery/hooks.d.ts +1 -1
  347. package/dist/internal/discovery/hooks.d.ts.map +1 -1
  348. package/dist/internal/discovery/hooks.js +15 -2
  349. package/dist/internal/discovery/info.d.ts.map +1 -1
  350. package/dist/internal/discovery/info.js +7 -1
  351. package/dist/internal/discovery/modules.d.ts.map +1 -1
  352. package/dist/internal/discovery/modules.js +8 -2
  353. package/dist/internal/discovery/names.d.ts +1 -1
  354. package/dist/internal/discovery/names.d.ts.map +1 -1
  355. package/dist/internal/discovery/names.js +1 -0
  356. package/dist/internal/discovery/project.d.ts +0 -2
  357. package/dist/internal/discovery/project.d.ts.map +1 -1
  358. package/dist/internal/discovery/project.js +64 -10
  359. package/dist/internal/discovery/runtime.d.ts.map +1 -1
  360. package/dist/internal/discovery/runtime.js +1 -2
  361. package/dist/internal/discovery/schedules.d.ts +1 -1
  362. package/dist/internal/discovery/schedules.d.ts.map +1 -1
  363. package/dist/internal/discovery/schedules.js +23 -2
  364. package/dist/internal/discovery/services.d.ts +6 -2
  365. package/dist/internal/discovery/services.d.ts.map +1 -1
  366. package/dist/internal/discovery/services.js +31 -1
  367. package/dist/internal/discovery/skills.d.ts +1 -6
  368. package/dist/internal/discovery/skills.d.ts.map +1 -1
  369. package/dist/internal/discovery/skills.js +8 -3
  370. package/dist/internal/discovery/subagent.d.ts +3 -0
  371. package/dist/internal/discovery/subagent.d.ts.map +1 -1
  372. package/dist/internal/discovery/subagent.js +109 -0
  373. package/dist/internal/discovery.d.ts +1 -2
  374. package/dist/internal/discovery.d.ts.map +1 -1
  375. package/dist/internal/discovery.js +1 -2
  376. package/dist/internal/distribution.d.ts +10 -27
  377. package/dist/internal/distribution.d.ts.map +1 -1
  378. package/dist/internal/distribution.js +25 -73
  379. package/dist/internal/docs-site.js +1 -1
  380. package/dist/internal/eval-run-store.d.ts +0 -1
  381. package/dist/internal/eval-run-store.d.ts.map +1 -1
  382. package/dist/internal/eval-runner.d.ts.map +1 -1
  383. package/dist/internal/framework-file-storage.d.ts +8 -0
  384. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  385. package/dist/internal/framework-file-storage.js +8 -8
  386. package/dist/internal/github-fanout.d.ts +1 -1
  387. package/dist/internal/github-fanout.js +1 -1
  388. package/dist/internal/guest-network.d.ts +101 -0
  389. package/dist/internal/guest-network.d.ts.map +1 -0
  390. package/dist/internal/guest-network.js +304 -0
  391. package/dist/internal/host-otel.d.ts +3 -3
  392. package/dist/internal/host-otel.d.ts.map +1 -1
  393. package/dist/internal/host-otel.js +8 -4
  394. package/dist/internal/hosted-admission-adapter.d.ts +8 -7
  395. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  396. package/dist/internal/hosted-delivery-protocol.d.ts +6 -0
  397. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  398. package/dist/internal/hosted-delivery-protocol.js +18 -5
  399. package/dist/internal/hosted-delivery.d.ts +18 -0
  400. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  401. package/dist/internal/hosted-delivery.js +248 -118
  402. package/dist/internal/http-channel.d.ts.map +1 -1
  403. package/dist/internal/http-channel.js +1 -3
  404. package/dist/internal/init-interview.d.ts.map +1 -1
  405. package/dist/internal/init-interview.js +1 -3
  406. package/dist/internal/init-project.d.ts +2 -2
  407. package/dist/internal/init-project.js +2 -2
  408. package/dist/internal/inline-stdio-define-stub.d.ts +1 -1
  409. package/dist/internal/inline-stdio-define-stub.d.ts.map +1 -1
  410. package/dist/internal/inline-stdio-define-stub.js +1 -1
  411. package/dist/internal/is-record.d.ts +2 -0
  412. package/dist/internal/is-record.d.ts.map +1 -0
  413. package/dist/internal/is-record.js +3 -0
  414. package/dist/internal/json-schema.d.ts.map +1 -1
  415. package/dist/internal/json-schema.js +18 -10
  416. package/dist/internal/local-control-plane.d.ts +1 -2
  417. package/dist/internal/local-control-plane.d.ts.map +1 -1
  418. package/dist/internal/local-control-plane.js +3 -20
  419. package/dist/internal/mcp-endpoint.d.ts.map +1 -1
  420. package/dist/internal/mcp-endpoint.js +1 -3
  421. package/dist/internal/otel/collector.d.ts +12 -3
  422. package/dist/internal/otel/collector.d.ts.map +1 -1
  423. package/dist/internal/otel/collector.js +77 -125
  424. package/dist/internal/otel/config.d.ts +0 -2
  425. package/dist/internal/otel/config.d.ts.map +1 -1
  426. package/dist/internal/otel/config.js +17 -20
  427. package/dist/internal/otel/http.d.ts +2 -0
  428. package/dist/internal/otel/http.d.ts.map +1 -1
  429. package/dist/internal/otel/http.js +7 -1
  430. package/dist/internal/otel/mcp.d.ts.map +1 -1
  431. package/dist/internal/otel/mcp.js +3 -16
  432. package/dist/internal/otel/runtime.d.ts +26 -1
  433. package/dist/internal/otel/runtime.d.ts.map +1 -1
  434. package/dist/internal/otel/runtime.js +164 -15
  435. package/dist/internal/package-inline-stdio.d.ts.map +1 -1
  436. package/dist/internal/package-inline-stdio.js +3 -11
  437. package/dist/internal/playground/toolchain.d.ts +1 -1
  438. package/dist/internal/playground/toolchain.d.ts.map +1 -1
  439. package/dist/internal/playground/toolchain.js +1 -1
  440. package/dist/internal/request-error-status.d.ts +12 -0
  441. package/dist/internal/request-error-status.d.ts.map +1 -0
  442. package/dist/internal/request-error-status.js +52 -0
  443. package/dist/internal/resolve-prod-target.d.ts +1 -1
  444. package/dist/internal/resolve-prod-target.d.ts.map +1 -1
  445. package/dist/internal/resolve-prod-target.js +3 -7
  446. package/dist/internal/result-output.d.ts +18 -0
  447. package/dist/internal/result-output.d.ts.map +1 -0
  448. package/dist/internal/result-output.js +33 -0
  449. package/dist/internal/run-client.d.ts +2 -2
  450. package/dist/internal/run-client.js +2 -2
  451. package/dist/internal/runtime-dispatch-runner.d.ts +1 -11
  452. package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
  453. package/dist/internal/runtime-dispatch-runner.js +2 -15
  454. package/dist/internal/sdk-runner.d.ts.map +1 -1
  455. package/dist/internal/sdk-runner.js +3 -6
  456. package/dist/internal/server.d.ts.map +1 -1
  457. package/dist/internal/server.js +110 -35
  458. package/dist/internal/session-cost.d.ts +3 -3
  459. package/dist/internal/session-cost.d.ts.map +1 -1
  460. package/dist/internal/session-cost.js +3 -3
  461. package/dist/internal/session-engine.d.ts +26 -11
  462. package/dist/internal/session-engine.d.ts.map +1 -1
  463. package/dist/internal/session-engine.js +146 -76
  464. package/dist/internal/session-run-log.d.ts.map +1 -1
  465. package/dist/internal/session-run-log.js +1 -3
  466. package/dist/internal/skills-sync.d.ts +1 -4
  467. package/dist/internal/skills-sync.d.ts.map +1 -1
  468. package/dist/internal/skills-sync.js +10 -50
  469. package/dist/internal/sleep.d.ts +2 -0
  470. package/dist/internal/sleep.d.ts.map +1 -0
  471. package/dist/internal/sleep.js +3 -0
  472. package/dist/internal/store-mirror.d.ts +29 -0
  473. package/dist/internal/store-mirror.d.ts.map +1 -0
  474. package/dist/internal/store-mirror.js +70 -0
  475. package/dist/internal/tenant-slack/relay.d.ts +73 -0
  476. package/dist/internal/tenant-slack/relay.d.ts.map +1 -0
  477. package/dist/internal/tenant-slack/relay.js +138 -0
  478. package/dist/internal/testing/scm-continuation-fixtures.d.ts +33 -0
  479. package/dist/internal/testing/scm-continuation-fixtures.d.ts.map +1 -0
  480. package/dist/internal/testing/scm-continuation-fixtures.js +253 -0
  481. package/dist/internal/workspace-sync.d.ts +22 -0
  482. package/dist/internal/workspace-sync.d.ts.map +1 -0
  483. package/dist/internal/workspace-sync.js +49 -0
  484. package/dist/internal/workspace.d.ts +7 -0
  485. package/dist/internal/workspace.d.ts.map +1 -1
  486. package/dist/internal/workspace.js +13 -0
  487. package/dist/otel.d.ts +23 -1
  488. package/dist/otel.d.ts.map +1 -1
  489. package/dist/otel.js +93 -2
  490. package/dist/playground/assets/index-59KvgREd.js +67 -0
  491. package/dist/playground/assets/index-MbMxXg-y.css +1 -0
  492. package/dist/playground/index.html +2 -2
  493. package/dist/result.d.ts +24 -0
  494. package/dist/result.d.ts.map +1 -0
  495. package/dist/result.js +27 -0
  496. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  497. package/dist/storage-backends/cursor-hosted.js +7 -4
  498. package/dist/storage-protocol.d.ts.map +1 -1
  499. package/dist/storage-protocol.js +1 -3
  500. package/dist/types.d.ts +90 -23
  501. package/dist/types.d.ts.map +1 -1
  502. package/docs/README.md +2 -2
  503. package/docs/concepts.md +2 -4
  504. package/docs/design/runtime-abstraction.md +2 -3
  505. package/docs/evals.md +9 -7
  506. package/docs/guides/cloud-agents.md +4 -6
  507. package/docs/guides/github.md +0 -1
  508. package/docs/guides/opentelemetry.md +41 -17
  509. package/docs/reference/agent-config.md +6 -10
  510. package/docs/reference/channels.md +18 -8
  511. package/docs/reference/cli.md +3 -4
  512. package/docs/reference/extensions.md +87 -23
  513. package/docs/reference/hooks.md +215 -46
  514. package/docs/reference/playground.md +3 -0
  515. package/docs/reference/project-layout.md +2 -1
  516. package/docs/reference/result.md +94 -0
  517. package/docs/reference/sessions.md +3 -1
  518. package/docs/reference/tools.md +1 -2
  519. package/docs/templates/pr-autofixer.md +0 -3
  520. package/package.json +29 -10
  521. package/skills/framework-map/SKILL.md +3 -1
  522. package/skills/otel/SKILL.md +8 -3
  523. package/src/ab.ts +1 -1
  524. package/src/bin/agent-serve.ts +121 -21
  525. package/src/channels/bitbucket/api.ts +623 -0
  526. package/src/channels/bitbucket/binding.ts +414 -0
  527. package/src/channels/bitbucket/bitbucket-channel.ts +182 -0
  528. package/src/channels/bitbucket/bitbucket-webhook.ts +576 -0
  529. package/src/channels/bitbucket/checks.ts +154 -0
  530. package/src/channels/bitbucket/cursor-account.ts +117 -0
  531. package/src/channels/bitbucket/defaults.ts +110 -0
  532. package/src/channels/bitbucket/events.ts +84 -0
  533. package/src/channels/bitbucket/index.ts +49 -0
  534. package/src/channels/bitbucket/replay.ts +439 -0
  535. package/src/channels/bitbucket/state.ts +59 -0
  536. package/src/channels/bitbucket/types.ts +266 -0
  537. package/src/channels/deployments/deployments-channel.ts +25 -43
  538. package/src/channels/deployments/types.ts +12 -6
  539. package/src/channels/github/binding.ts +8 -1
  540. package/src/channels/github/cursor-account.ts +17 -6
  541. package/src/channels/github/events.ts +1 -1
  542. package/src/channels/github/forward.ts +3 -2
  543. package/src/channels/github/github-channel.ts +74 -221
  544. package/src/channels/github/replay.ts +1 -1
  545. package/src/channels/github/state.ts +6 -0
  546. package/src/channels/github/types.ts +2 -5
  547. package/src/channels/gitlab/api.ts +228 -0
  548. package/src/channels/gitlab/binding.ts +233 -0
  549. package/src/channels/gitlab/checks.ts +243 -0
  550. package/src/channels/gitlab/cursor-account.ts +114 -0
  551. package/src/channels/gitlab/defaults.ts +93 -0
  552. package/src/channels/gitlab/events.ts +44 -0
  553. package/src/channels/gitlab/gitlab-channel.ts +176 -0
  554. package/src/channels/gitlab/gitlab-webhook.ts +555 -0
  555. package/src/channels/gitlab/index.ts +43 -0
  556. package/src/channels/gitlab/replay.ts +347 -0
  557. package/src/channels/gitlab/state.ts +55 -0
  558. package/src/channels/gitlab/types.ts +263 -0
  559. package/src/channels/origin/api.ts +4 -2
  560. package/src/channels/origin/origin-channel.ts +19 -94
  561. package/src/channels/origin/types.ts +23 -2
  562. package/src/channels/slack/eval-directive.ts +1 -6
  563. package/src/channels/slack/init.ts +6 -3
  564. package/src/channels/slack/setup.ts +7 -6
  565. package/src/channels/slack/types.ts +1 -1
  566. package/src/channels.ts +0 -1
  567. package/src/client.ts +1 -1
  568. package/src/connections.ts +1 -1
  569. package/src/evals.ts +1 -1
  570. package/src/extensions.ts +47 -5
  571. package/src/files.ts +21 -3
  572. package/src/index.ts +20 -28
  573. package/src/internal/ab-snapshot.ts +0 -3
  574. package/src/internal/advertise-tools.ts +1 -4
  575. package/src/internal/authored-alias-hooks.ts +4 -21
  576. package/src/internal/authored-loaders.ts +6 -23
  577. package/src/internal/channel-dispatch.ts +160 -0
  578. package/src/internal/chat-client.ts +1 -1
  579. package/src/internal/cli-ax.ts +5 -5
  580. package/src/internal/cli-bitbucket.ts +477 -0
  581. package/src/internal/cli-convert-automation.ts +7 -7
  582. package/src/internal/cli-cursor.ts +2 -5
  583. package/src/internal/cli-deploy.ts +2 -8
  584. package/src/internal/cli-github.ts +3 -3
  585. package/src/internal/cli-gitlab.ts +485 -0
  586. package/src/internal/cli-mcp.ts +2 -7
  587. package/src/internal/cli-slack.ts +2 -5
  588. package/src/internal/continuation-channel.ts +82 -1
  589. package/src/internal/continuation-identity.ts +229 -11
  590. package/src/internal/conversation-mirror.ts +4 -3
  591. package/src/internal/convert-automation/types.ts +1 -1
  592. package/src/internal/cursor/account-mcp.ts +1 -4
  593. package/src/internal/cursor/backend-client.ts +9 -10
  594. package/src/internal/cursor/bound-secret-file.ts +108 -0
  595. package/src/internal/cursor/credentials.ts +75 -10
  596. package/src/internal/cursor/hosted-bound-secrets.ts +75 -0
  597. package/src/internal/cursor/hosted-deployment-secrets.ts +42 -11
  598. package/src/internal/cursor/hosted-store-secrets.ts +1 -1
  599. package/src/internal/cursor-account-mcp-auth.ts +2 -5
  600. package/src/internal/cursor-deployment-relay.ts +11 -7
  601. package/src/internal/deploy-manifest.ts +4 -2
  602. package/src/internal/discovery/ab.ts +29 -9
  603. package/src/internal/discovery/agent.ts +94 -135
  604. package/src/internal/discovery/channels.ts +15 -13
  605. package/src/internal/discovery/connections.ts +55 -50
  606. package/src/internal/discovery/cursor-plugin.ts +1 -4
  607. package/src/internal/discovery/extension-overlay.ts +274 -0
  608. package/src/internal/discovery/extensions.ts +330 -105
  609. package/src/internal/discovery/hooks.ts +20 -2
  610. package/src/internal/discovery/info.ts +7 -0
  611. package/src/internal/discovery/modules.ts +8 -2
  612. package/src/internal/discovery/names.ts +2 -1
  613. package/src/internal/discovery/project.ts +80 -9
  614. package/src/internal/discovery/runtime.ts +1 -2
  615. package/src/internal/discovery/schedules.ts +28 -2
  616. package/src/internal/discovery/services.ts +37 -1
  617. package/src/internal/discovery/skills.ts +13 -3
  618. package/src/internal/discovery/subagent.ts +107 -0
  619. package/src/internal/discovery.ts +0 -2
  620. package/src/internal/distribution.ts +35 -83
  621. package/src/internal/docs-site.ts +1 -1
  622. package/src/internal/eval-run-store.ts +0 -7
  623. package/src/internal/eval-runner.ts +0 -1
  624. package/src/internal/framework-file-storage.ts +8 -8
  625. package/src/internal/github-fanout.ts +1 -1
  626. package/src/internal/guest-network.ts +383 -0
  627. package/src/internal/host-otel.ts +8 -4
  628. package/src/internal/hosted-admission-adapter.ts +8 -8
  629. package/src/internal/hosted-delivery-protocol.ts +26 -1
  630. package/src/internal/hosted-delivery.ts +376 -192
  631. package/src/internal/http-channel.ts +1 -4
  632. package/src/internal/init-interview.ts +1 -4
  633. package/src/internal/init-project.ts +2 -2
  634. package/src/internal/inline-stdio-define-stub.ts +1 -1
  635. package/src/internal/is-record.ts +3 -0
  636. package/src/internal/json-schema.ts +19 -10
  637. package/src/internal/local-control-plane.ts +5 -24
  638. package/src/internal/mcp-endpoint.ts +1 -4
  639. package/src/internal/otel/collector.ts +94 -159
  640. package/src/internal/otel/config.ts +10 -14
  641. package/src/internal/otel/http.ts +14 -1
  642. package/src/internal/otel/mcp.ts +3 -16
  643. package/src/internal/otel/runtime.ts +240 -25
  644. package/src/internal/package-inline-stdio.ts +3 -12
  645. package/src/internal/playground/toolchain.ts +1 -1
  646. package/src/internal/request-error-status.ts +72 -0
  647. package/src/internal/resolve-prod-target.ts +3 -8
  648. package/src/internal/result-output.ts +34 -0
  649. package/src/internal/run-client.ts +2 -2
  650. package/src/internal/runtime-dispatch-runner.ts +3 -21
  651. package/src/internal/sdk-runner.ts +3 -7
  652. package/src/internal/server.ts +153 -44
  653. package/src/internal/session-cost.ts +3 -3
  654. package/src/internal/session-engine.ts +182 -74
  655. package/src/internal/session-run-log.ts +1 -4
  656. package/src/internal/skills-sync.ts +13 -63
  657. package/src/internal/sleep.ts +3 -0
  658. package/src/internal/store-mirror.ts +86 -0
  659. package/src/internal/tenant-slack/relay.ts +179 -0
  660. package/src/internal/testing/scm-continuation-fixtures.ts +286 -0
  661. package/src/internal/workspace-sync.ts +55 -0
  662. package/src/internal/workspace.ts +14 -0
  663. package/src/otel.ts +143 -3
  664. package/src/result.ts +36 -0
  665. package/src/storage-backends/cursor-hosted.ts +7 -4
  666. package/src/storage-protocol.ts +1 -4
  667. package/src/types.ts +105 -34
  668. package/templates/triage/agent/lib/types.ts +0 -2
  669. package/dist/continuation.d.ts +0 -20
  670. package/dist/continuation.d.ts.map +0 -1
  671. package/dist/continuation.js +0 -18
  672. package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +0 -1
  673. package/dist/docs/assets/concepts.md.rPzW2HZN.js +0 -1
  674. package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.js +0 -9
  675. package/dist/docs/assets/guides_cloud-runtime.md.BRirbRAN.js +0 -9
  676. package/dist/docs/assets/guides_cloud-runtime.md.BRirbRAN.lean.js +0 -1
  677. package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +0 -1
  678. package/dist/docs/assets/reference_hooks.md.a8BJxMR5.js +0 -14
  679. package/dist/docs/assets/skills_framework-map.md.DDa4MeEW.js +0 -1
  680. package/dist/docs/guides/cloud-runtime.html +0 -35
  681. package/dist/docs/guides/cloud-runtime.md +0 -117
  682. package/dist/internal/convert-automation/index.d.ts +0 -3
  683. package/dist/internal/convert-automation/index.d.ts.map +0 -1
  684. package/dist/internal/convert-automation/index.js +0 -1
  685. package/dist/internal/grokbot/runner.d.ts +0 -64
  686. package/dist/internal/grokbot/runner.d.ts.map +0 -1
  687. package/dist/internal/grokbot/runner.js +0 -282
  688. package/dist/internal/managed-delivery.d.ts +0 -80
  689. package/dist/internal/managed-delivery.d.ts.map +0 -1
  690. package/dist/internal/managed-delivery.js +0 -86
  691. package/dist/internal/review-comments.d.ts +0 -370
  692. package/dist/internal/review-comments.d.ts.map +0 -1
  693. package/dist/internal/review-comments.js +0 -921
  694. package/dist/internal/shallow-clone.d.ts +0 -176
  695. package/dist/internal/shallow-clone.d.ts.map +0 -1
  696. package/dist/internal/shallow-clone.js +0 -419
  697. package/dist/playground/assets/index-B6C9S9nG.css +0 -1
  698. package/dist/playground/assets/index-ZqNoT8Ie.js +0 -69
  699. package/docs/guides/cloud-runtime.md +0 -122
  700. package/src/continuation.ts +0 -49
  701. package/src/internal/convert-automation/index.ts +0 -10
  702. package/src/internal/grokbot/runner.ts +0 -370
  703. package/src/internal/managed-delivery.ts +0 -125
  704. package/src/internal/review-comments.ts +0 -1363
  705. package/src/internal/shallow-clone.ts +0 -609
  706. /package/dist/docs/assets/{evals.md.CPzDAwoH.lean.js → evals.md.CbMoebP1.lean.js} +0 -0
  707. /package/dist/docs/assets/{guides_cloud-agents.md.DumwWXba.lean.js → guides_cloud-agents.md.DS8RIjwx.lean.js} +0 -0
  708. /package/dist/docs/assets/{guides_github.md.BtPr9GaP.lean.js → guides_github.md.DKYiT9do.lean.js} +0 -0
  709. /package/dist/docs/assets/{index.md.Kiht7ell.lean.js → index.md.D75GWhPl.lean.js} +0 -0
  710. /package/dist/docs/assets/{reference_agent-config.md.BHeYMgme.lean.js → reference_agent-config.md.CHNpiyp4.lean.js} +0 -0
  711. /package/dist/docs/assets/{reference_cli.md.DfoeyvL0.lean.js → reference_cli.md.CJNc_xYK.lean.js} +0 -0
  712. /package/dist/docs/assets/{reference_playground.md.DnX5nL-B.lean.js → reference_playground.md.4myJPxrf.lean.js} +0 -0
  713. /package/dist/docs/assets/{reference_project-layout.md.CA6QP6Lw.lean.js → reference_project-layout.md.DuBu9a96.lean.js} +0 -0
  714. /package/dist/docs/assets/{reference_tools.md.B1up2r9W.lean.js → reference_tools.md.aGrn99hP.lean.js} +0 -0
  715. /package/dist/docs/assets/{skills_framework-map.md.DDa4MeEW.lean.js → skills_framework-map.md.haibFyoB.lean.js} +0 -0
@@ -28,6 +28,9 @@ import { resolveDedicatedSlackHostBinding } from "../channels/slack/slack-channe
28
28
  import {
29
29
  AGENT_SERVE_USER_STORE_FILES_SOURCE_ID,
30
30
  agentStoreKeys,
31
+ DEPLOYMENT_STORE_MOUNT_PATH,
32
+ type FileSink,
33
+ USER_STORE_MOUNT_PATH,
31
34
  } from "../files.js";
32
35
  import {
33
36
  cursorHostedFiles,
@@ -70,6 +73,7 @@ import {
70
73
  type RunnerTurnRequest,
71
74
  type SendMessageFn,
72
75
  type SendMessageOptions,
76
+ type SessionContext,
73
77
  type SessionEvent,
74
78
  type SessionEventPayload,
75
79
  type SessionInfo,
@@ -116,6 +120,7 @@ import {
116
120
  resolveV2Key,
117
121
  V2EngineError,
118
122
  } from "./continuation-identity.js";
123
+ import { describeError } from "./describe-error.js";
119
124
  import { isDevMode } from "./dev-mode.js";
120
125
  import { type EventLogMemoryStats, EventLogStore } from "./event-log.js";
121
126
  import { TurnEventMapper } from "./event-mapper.js";
@@ -152,6 +157,7 @@ import {
152
157
  SCHEDULE_CHANNEL_PREFIX,
153
158
  } from "./prompt-context.js";
154
159
  import { assertCloudCanHonorAccountServersFilters } from "./resolved-connections.js";
160
+ import { applyAuthoredResult } from "./result-output.js";
155
161
  import type { AgentRunner, SteerAckOutcome } from "./sdk-runner.js";
156
162
  import { sessionExternalLinks } from "./session-links.js";
157
163
  import { SessionStore } from "./session-store.js";
@@ -173,16 +179,30 @@ import { resolveAgentV2Hosting } from "./v2-hosting.js";
173
179
  import {
174
180
  buildAgentsMdContent,
175
181
  buildCloudMemorySection,
182
+ buildCloudWorkspaceSection,
176
183
  ensureOwnGitRoot,
177
184
  isNestedInGitRepo,
178
185
  materializeWorkspace,
179
186
  SERVER_TOOLS_MCP_SERVER_NAME,
180
187
  writeWorkspaceFiles,
181
188
  } from "./workspace.js";
189
+ import { syncWorkspaceToStore } from "./workspace-sync.js";
182
190
 
183
191
  export const HTTP_CHANNEL_ID = "http";
184
192
  export { SCHEDULE_CHANNEL_PREFIX } from "./prompt-context.js";
185
193
 
194
+ /** Authored surfaces mirrored onto the Agent Store before a first cloud prompt. */
195
+ type CloudSyncSurface = "skills" | "workspace";
196
+
197
+ /** The Agent Store cloud turns read authored files from, and where the VM mounts it. */
198
+ interface CloudStoreTarget {
199
+ sink: FileSink;
200
+ mountPath: string;
201
+ skillsPrefix: string;
202
+ workspacePrefix: string;
203
+ label: string;
204
+ }
205
+
186
206
  export class SessionBusyError extends Error {
187
207
  constructor(sessionId: string) {
188
208
  super(
@@ -406,8 +426,8 @@ export class SessionEngine {
406
426
  >();
407
427
  /** Once-per-process cache for the A/B snapshot backfill (see abSnapshot). */
408
428
  private restoredAbSnapshot: Promise<ABSnapshot | undefined> | undefined;
409
- /** In-flight skills → Agent Store sync (see ensureCloudSkillsSynced). */
410
- private cloudSkillsSync: Promise<boolean> | undefined;
429
+ /** In-flight authored files → Agent Store syncs (see syncToCloudStore). */
430
+ private readonly cloudSyncs = new Map<CloudSyncSurface, Promise<boolean>>();
411
431
 
412
432
  private readonly runner: AgentRunner;
413
433
  private readonly logger: (line: string) => void;
@@ -678,9 +698,9 @@ export class SessionEngine {
678
698
  }
679
699
 
680
700
  /**
681
- * Host services with `files` bound to one session, so a relative path in a
682
- * tool or hook resolves to that session's scope and can never be read as
683
- * another session's. Unbound (no session) keeps `host.files` usable for
701
+ * Host services with `files` and `otel` bound to one session, so a relative
702
+ * path resolves to that session's scope and can never read another
703
+ * session's. Unbound (no session) keeps `host.files` usable for
684
704
  * `{ scope: "deployment" }` and fails loudly on session-scoped calls.
685
705
  */
686
706
  private hostForSession(sessionId: string | undefined): HostContext {
@@ -2006,7 +2026,9 @@ export class SessionEngine {
2006
2026
  this.activeToolContexts.set(sessionId, { record, turnId, emit });
2007
2027
  this.stubbedCallIds.set(sessionId, stubbed);
2008
2028
  try {
2009
- outcome = await this.runner.runTurn(request);
2029
+ outcome = await this.runTurnExecute(record, turnId, () =>
2030
+ this.runner.runTurn(request)
2031
+ );
2010
2032
  } finally {
2011
2033
  this.activeToolContexts.delete(sessionId);
2012
2034
  this.stubbedCallIds.delete(sessionId);
@@ -2049,14 +2071,39 @@ export class SessionEngine {
2049
2071
  outcome = { ...outcome, cost: finalCost };
2050
2072
  }
2051
2073
 
2074
+ const authored = this.project.result;
2075
+ if (outcome.status === "finished" && authored !== undefined) {
2076
+ const settled = await applyAuthoredResult({
2077
+ definition: authored,
2078
+ text: finalResult,
2079
+ dryRun: record.dryRun === true,
2080
+ ctx: {
2081
+ session: this.sessionInfo(record),
2082
+ host: this.hostForSession(sessionId),
2083
+ artifacts: this.artifactsApi({ sessionId, turnId }),
2084
+ stateRoot: this.stateRoot,
2085
+ workspaceDir: harnessCwd,
2086
+ },
2087
+ });
2088
+ if (!settled.ok) {
2089
+ outcome = {
2090
+ status: "error",
2091
+ result: finalResult,
2092
+ errorMessage: `turn output failed: ${settled.message}`,
2093
+ usage: finalUsage,
2094
+ cost: finalCost,
2095
+ };
2096
+ }
2097
+ }
2098
+
2052
2099
  if (outcome.status === "finished") {
2053
2100
  await this.appendEvent(sessionId, {
2054
2101
  type: "turn.completed",
2055
2102
  turnId,
2056
2103
  data: {
2057
- ...(finalResult === undefined ? {} : { result: finalResult }),
2058
- ...(finalUsage === undefined ? {} : { usage: finalUsage }),
2059
- ...(finalCost === undefined ? {} : { cost: finalCost }),
2104
+ result: finalResult,
2105
+ usage: finalUsage,
2106
+ cost: finalCost,
2060
2107
  },
2061
2108
  });
2062
2109
  } else {
@@ -2098,8 +2145,8 @@ export class SessionEngine {
2098
2145
 
2099
2146
  return {
2100
2147
  ...outcome,
2101
- ...(finalResult === undefined ? {} : { result: finalResult }),
2102
- ...(finalUsage === undefined ? {} : { usage: finalUsage }),
2148
+ result: finalResult,
2149
+ usage: finalUsage,
2103
2150
  };
2104
2151
  }
2105
2152
 
@@ -2110,48 +2157,75 @@ export class SessionEngine {
2110
2157
  * first-turn S3 scan can discover them. False when the sync fails: the
2111
2158
  * turn then runs without store skills rather than pointing discovery at
2112
2159
  * paths that do not exist.
2113
- *
2114
- * With skills authored, every first cloud turn re-copies the authored
2160
+ */
2161
+ private ensureCloudSkillsSynced(store: CloudStoreTarget): Promise<boolean> {
2162
+ const skills = this.project.agent.skills;
2163
+ return this.syncToCloudStore("skills", store, skills.length > 0, () =>
2164
+ syncSkillsToStore({
2165
+ sink: store.sink,
2166
+ agentName: this.project.name,
2167
+ skills,
2168
+ skillsPrefix: store.skillsPrefix,
2169
+ })
2170
+ );
2171
+ }
2172
+
2173
+ /**
2174
+ * Sync `agent/sandbox/workspace/**` seeds onto the Agent Store at
2175
+ * `workspace/…` (hosted) or `agent-serve/<agent>/workspace/…`
2176
+ * (personal-key local+cloud) before the first cloud prompt, which names
2177
+ * the mounted directory (see buildCloudWorkspaceSection).
2178
+ */
2179
+ private ensureCloudWorkspaceSynced(
2180
+ store: CloudStoreTarget
2181
+ ): Promise<boolean> {
2182
+ const seedFiles = this.project.agent.seedFiles;
2183
+ return this.syncToCloudStore("workspace", store, seedFiles.length > 0, () =>
2184
+ syncWorkspaceToStore({
2185
+ sink: store.sink,
2186
+ seedFiles,
2187
+ workspacePrefix: store.workspacePrefix,
2188
+ })
2189
+ );
2190
+ }
2191
+
2192
+ /**
2193
+ * With files authored, every first cloud turn re-copies the authored
2115
2194
  * bytes and the memo only dedupes concurrent first turns. The mount is
2116
2195
  * writable from cloud sessions, so a once-per-process copy would let one
2117
2196
  * session's edits masquerade as agent definition for every later session
2118
2197
  * until the engine restarts; re-syncing keeps the store true to discovery
2119
2198
  * the same way local materialization always rewrites skills. Without
2120
- * skills the sync is best-effort stale cleanup and one attempt per
2121
- * process is enough, success or not — a deployment without the files
2199
+ * authored files the sync is best-effort stale cleanup and one attempt
2200
+ * per process is enough, success or not — a deployment without the files
2122
2201
  * surface must not fail and log on every new session for a feature it
2123
2202
  * does not use.
2124
2203
  */
2125
- private ensureCloudSkillsSynced(): Promise<boolean> {
2126
- if (this.cloudSkillsSync !== undefined) {
2127
- return this.cloudSkillsSync;
2128
- }
2129
- const target = this.cloudSkillsStore();
2130
- if (target === undefined) {
2131
- this.cloudSkillsSync = Promise.resolve(false);
2132
- return this.cloudSkillsSync;
2204
+ private syncToCloudStore(
2205
+ surface: CloudSyncSurface,
2206
+ store: CloudStoreTarget,
2207
+ authored: boolean,
2208
+ run: () => Promise<void>
2209
+ ): Promise<boolean> {
2210
+ const inFlight = this.cloudSyncs.get(surface);
2211
+ if (inFlight !== undefined) {
2212
+ return inFlight;
2133
2213
  }
2134
- const skills = this.project.agent.skills;
2135
- let sync = syncSkillsToStore({
2136
- sink: target.sink,
2137
- agentName: this.project.name,
2138
- skills,
2139
- skillsPrefix: target.skillsPrefix,
2140
- }).then(
2214
+ let sync = run().then(
2141
2215
  () => true,
2142
2216
  (error) => {
2143
2217
  this.logger(
2144
- `[skills] ${target.label} sync failed: ${error instanceof Error ? error.message : String(error)}`
2218
+ `[${surface}] ${store.label} sync failed: ${error instanceof Error ? error.message : String(error)}`
2145
2219
  );
2146
2220
  return false;
2147
2221
  }
2148
2222
  );
2149
- if (skills.length > 0) {
2223
+ if (authored) {
2150
2224
  sync = sync.finally(() => {
2151
- this.cloudSkillsSync = undefined;
2225
+ this.cloudSyncs.delete(surface);
2152
2226
  });
2153
2227
  }
2154
- this.cloudSkillsSync = sync;
2228
+ this.cloudSyncs.set(surface, sync);
2155
2229
  return sync;
2156
2230
  }
2157
2231
 
@@ -2159,39 +2233,36 @@ export class SessionEngine {
2159
2233
  * Hosted deployments own the deployment store. Local `serve`/`run` with
2160
2234
  * a personal API key writes into the USER store under `agent-serve/`.
2161
2235
  */
2162
- private cloudSkillsStore():
2163
- | {
2164
- sink: ReturnType<typeof cursorHostedFiles>;
2165
- skillsPrefix: string;
2166
- label: string;
2167
- }
2168
- | undefined {
2236
+ private cloudStore(): CloudStoreTarget | undefined {
2169
2237
  const v2Hosting = resolveAgentV2Hosting({
2170
2238
  architecture: this.project.agent.architecture,
2171
2239
  });
2240
+ const deployment = {
2241
+ mountPath: DEPLOYMENT_STORE_MOUNT_PATH,
2242
+ skillsPrefix: agentStoreKeys.skillsPrefix(),
2243
+ workspacePrefix: agentStoreKeys.workspacePrefix(),
2244
+ label: "deployment store",
2245
+ };
2172
2246
  if (v2Hosting.kind === "cursor-managed") {
2173
2247
  return {
2174
2248
  sink: cursorHostedFiles({
2175
2249
  resolveStoreSourceId: () =>
2176
2250
  v2Hosting.resolveStoreIds().deploymentStoreSourceId,
2177
2251
  }),
2178
- skillsPrefix: agentStoreKeys.skillsPrefix(),
2179
- label: "deployment store",
2252
+ ...deployment,
2180
2253
  };
2181
2254
  }
2182
2255
  if (v2Hosting.kind === "not-v2" && isCursorHostedFilesAvailable()) {
2183
- return {
2184
- sink: cursorHostedFiles(),
2185
- skillsPrefix: agentStoreKeys.skillsPrefix(),
2186
- label: "deployment store",
2187
- };
2256
+ return { sink: cursorHostedFiles(), ...deployment };
2188
2257
  }
2189
2258
  if (isCursorUserStoreFilesAvailable()) {
2190
2259
  return {
2191
2260
  sink: cursorHostedFiles({
2192
2261
  storeSourceId: AGENT_SERVE_USER_STORE_FILES_SOURCE_ID,
2193
2262
  }),
2263
+ mountPath: USER_STORE_MOUNT_PATH,
2194
2264
  skillsPrefix: agentStoreKeys.userSkillsPrefix(this.project.name),
2265
+ workspacePrefix: agentStoreKeys.userWorkspacePrefix(this.project.name),
2195
2266
  label: "user store",
2196
2267
  };
2197
2268
  }
@@ -2263,13 +2334,14 @@ export class SessionEngine {
2263
2334
  if (isFirstTurn) {
2264
2335
  if (runtime === "cloud") {
2265
2336
  // Cloud VMs have no materialized workspace: ship the full context,
2266
- // including agent tool script bodies. On hosted deployments authored
2267
- // skills land on the store mount for native discovery, and the
2268
- // shared memory journal is on that mount too say where. When the
2269
- // turn carries the session-bound server-tool MCP endpoint, the
2270
- // preamble catalogs server tools under that MCP server name *before*
2271
- // the agent-tool "write the script if missing" recipe, so a model
2272
- // told to "use <server tool>" calls MCP instead of inventing a .sh.
2337
+ // including agent tool script bodies. Authored skills and workspace
2338
+ // seeds land on the store mount (skills for native discovery, seeds
2339
+ // for the model's file tools), and on hosted deployments the shared
2340
+ // memory journal is on that mount too — say where. When the turn
2341
+ // carries the session-bound server-tool MCP endpoint, the preamble
2342
+ // catalogs server tools under that MCP server name *before* the
2343
+ // agent-tool "write the script if missing" recipe, so a model told
2344
+ // to "use <server tool>" calls MCP instead of inventing a .sh.
2273
2345
  const preamble = buildAgentsMdContent(agent, {
2274
2346
  includeScripts: true,
2275
2347
  serverToolsMcpName:
@@ -2278,17 +2350,30 @@ export class SessionEngine {
2278
2350
  : SERVER_TOOLS_MCP_SERVER_NAME,
2279
2351
  });
2280
2352
  const hosted = isCursorHostedFilesAvailable();
2281
- // Synced whenever a store is reachable, not just when skills exist:
2282
- // removing the last skill has to delete its store copies too.
2283
- // Discovery is native (`--agent-store-skills-dir`); this only has
2284
- // to land the bytes.
2285
- if (hosted || isCursorUserStoreFilesAvailable()) {
2286
- await this.ensureCloudSkillsSynced();
2353
+ // Synced whenever a store is reachable, not just when skills or
2354
+ // seeds exist: removing the last one has to delete its store copies
2355
+ // too.
2356
+ const store =
2357
+ hosted || isCursorUserStoreFilesAvailable()
2358
+ ? this.cloudStore()
2359
+ : undefined;
2360
+ let sections = "";
2361
+ if (store !== undefined) {
2362
+ const [, seedsSynced] = await Promise.all([
2363
+ this.ensureCloudSkillsSynced(store),
2364
+ this.ensureCloudWorkspaceSynced(store),
2365
+ ]);
2366
+ // Only name the mount when the bytes landed; a failed sync must
2367
+ // not send the model looking for files that are not there.
2368
+ if (seedsSynced && agent.seedFiles.length > 0) {
2369
+ const dir = `${store.mountPath}/${store.workspacePrefix}`;
2370
+ sections += `\n\n${buildCloudWorkspaceSection(dir)}`;
2371
+ }
2287
2372
  }
2288
- const memorySection = hosted
2289
- ? `\n\n${buildCloudMemorySection(this.project.name)}`
2290
- : "";
2291
- turnPrompt = `${preamble}${memorySection}\n\n${turnPrompt}`;
2373
+ if (hosted) {
2374
+ sections += `\n\n${buildCloudMemorySection(this.project.name)}`;
2375
+ }
2376
+ turnPrompt = `${preamble}${sections}\n\n${turnPrompt}`;
2292
2377
  } else if (runtime === "local" && instructionsInvisibleToHarness) {
2293
2378
  // Local workspace whose AGENTS.md the harness will not load. With a
2294
2379
  // borrowed harness cwd, agent tool scripts live only in the durable
@@ -2880,6 +2965,31 @@ export class SessionEngine {
2880
2965
  }
2881
2966
  }
2882
2967
 
2968
+ /**
2969
+ * Bind outbound inject (Factory / Cursor API `traceparent`) to the
2970
+ * turn span for the whole harness run. Host files / VFS RPCs happen
2971
+ * here, not under `runInCall`. No-op when OTel is off.
2972
+ */
2973
+ private runTurnExecute<T>(
2974
+ record: SessionRecord,
2975
+ turnId: string,
2976
+ fn: () => T | Promise<T>
2977
+ ): Promise<T> {
2978
+ const otel = this.otel;
2979
+ const run = (): Promise<T> => Promise.resolve(fn());
2980
+ if (otel === undefined) {
2981
+ return run();
2982
+ }
2983
+ return otel.runInTurn(
2984
+ {
2985
+ sessionId: record.sessionId,
2986
+ session: this.sessionInfo(record),
2987
+ turnId,
2988
+ },
2989
+ run
2990
+ );
2991
+ }
2992
+
2883
2993
  /**
2884
2994
  * Bind outbound inject (Factory / Cursor API `traceparent`) to the
2885
2995
  * tool span. No-op when OTel is off.
@@ -4011,7 +4121,10 @@ export class SessionEngine {
4011
4121
  return;
4012
4122
  }
4013
4123
 
4014
- const sessionCtx = { session: this.sessionInfo(record) };
4124
+ const sessionCtx: SessionContext = {
4125
+ session: this.sessionInfo(record),
4126
+ host: this.hostForSession(record.sessionId),
4127
+ };
4015
4128
  const channelEvents = this.channelEventHandlersFor(record.channelId);
4016
4129
  if (channelEvents !== undefined) {
4017
4130
  // Handlers are declared against the narrowed event for their key; the
@@ -4054,14 +4167,13 @@ export class SessionEngine {
4054
4167
  }
4055
4168
  try {
4056
4169
  await handler(event, {
4170
+ ...sessionCtx,
4057
4171
  agent: { name: this.project.name },
4058
4172
  channel: {
4059
4173
  id: record.channelId,
4060
4174
  continuationToken: record.continuationKey,
4061
4175
  },
4062
- session: this.sessionInfo(record),
4063
4176
  stateRoot: this.stateRoot,
4064
- host: this.hostForSession(record.sessionId),
4065
4177
  artifacts: this.artifactsApi({
4066
4178
  sessionId: record.sessionId,
4067
4179
  turnId: event.turnId,
@@ -4078,12 +4190,12 @@ export class SessionEngine {
4078
4190
  if (this.abCollector.enabled) {
4079
4191
  await this.abCollector.onEvent(
4080
4192
  event,
4081
- this.sessionInfo(record),
4193
+ sessionCtx.session,
4082
4194
  this.project.name
4083
4195
  );
4084
4196
  }
4085
4197
 
4086
- this.otel?.onEvent(event, this.sessionInfo(record));
4198
+ this.otel?.onEvent(event, sessionCtx.session);
4087
4199
  }
4088
4200
 
4089
4201
  private channelEventHandlersFor(
@@ -5191,10 +5303,6 @@ function buildRunnerSubagents(agent: ResolvedAgent): RunnerSubagent[] {
5191
5303
  }));
5192
5304
  }
5193
5305
 
5194
- function describeError(error: unknown): string {
5195
- return error instanceof Error ? error.message : String(error);
5196
- }
5197
-
5198
5306
  function toolErrorResult(message: string): SDKCustomToolResult {
5199
5307
  return {
5200
5308
  content: [{ type: "text", text: message }],
@@ -26,6 +26,7 @@ import type { AgentProject } from "../types.js";
26
26
  import { resolveApiKeySync } from "./cursor/credentials.js";
27
27
  import { describeError } from "./describe-error.js";
28
28
  import type { HostedExecutionDiagAbortReason } from "./hosted-execution-diag.js";
29
+ import { isRecord } from "./is-record.js";
29
30
  import type { LogRingEntry } from "./log-ring.js";
30
31
  import { resolveAgentV2Hosting } from "./v2-hosting.js";
31
32
 
@@ -193,10 +194,6 @@ export function snapshotSessionRunLogs(
193
194
  }));
194
195
  }
195
196
 
196
- function isRecord(value: unknown): value is Record<string, unknown> {
197
- return typeof value === "object" && value !== null && !Array.isArray(value);
198
- }
199
-
200
197
  function decodeSinkBody(body: Uint8Array | { body: Uint8Array }): Uint8Array {
201
198
  return body instanceof Uint8Array ? body : body.body;
202
199
  }
@@ -7,10 +7,10 @@
7
7
  */
8
8
 
9
9
  import { readFile } from "node:fs/promises";
10
- import { posix } from "node:path";
11
- import { agentStoreKeys, FileConflictError, type FileSink } from "../files.js";
10
+ import { agentStoreKeys, type FileSink } from "../files.js";
12
11
  import { STORAGE_KEY_ROOT } from "../storage.js";
13
12
  import type { DiscoveredSkill, SkillFileSource } from "../types.js";
13
+ import { mirrorToStore, storeRelPath } from "./store-mirror.js";
14
14
  import { buildSkillMd } from "./workspace.js";
15
15
 
16
16
  /** Pre-native layout. Deleted on every sync so a rolled-forward deploy does not leave undiscoverable copies. */
@@ -22,10 +22,7 @@ function legacySkillsPrefix(agent: string): string {
22
22
  * Mirror the agent's skills onto the store: write every SKILL.md (with the
23
23
  * same generated frontmatter local materialization uses) plus sibling files,
24
24
  * and delete keys no authored skill claims so redeploys drop removed skills.
25
- *
26
- * Everything loads and validates before the store is touched, and writes
27
- * land before stale deletes, so a failed sync never leaves a gap a
28
- * concurrent cloud reader could see.
25
+ * Everything loads and validates before the store is touched.
29
26
  */
30
27
  export async function syncSkillsToStore(args: {
31
28
  sink: FileSink;
@@ -42,65 +39,18 @@ export async function syncSkillsToStore(args: {
42
39
  agentStoreKeys.skillFile(skill.name, relPath, skillsPrefix);
43
40
  desired.set(key("SKILL.md"), Buffer.from(buildSkillMd(skill), "utf8"));
44
41
  for (const [relPath, source] of Object.entries(skill.files)) {
45
- desired.set(key(storeRelPath(relPath)), await sourceBytes(source));
42
+ desired.set(
43
+ key(storeRelPath(relPath, "skill file")),
44
+ await sourceBytes(source)
45
+ );
46
46
  }
47
47
  }
48
- await Promise.all(
49
- [...desired].map(([key, body]) => putLastWriterWins(args.sink, key, body))
50
- );
51
- const [existing, leftover] = await Promise.all([
52
- args.sink.list(skillsPrefix),
53
- args.sink.list(legacySkillsPrefix(args.agentName)),
54
- ]);
55
- await Promise.all(
56
- [...existing.filter((entry) => !desired.has(entry.key)), ...leftover].map(
57
- (entry) => args.sink.delete(entry.key)
58
- )
59
- );
60
- }
61
-
62
- /**
63
- * Same refusals as local materialization's `resolveInside`: a rel that
64
- * escapes the skill directory or would not round-trip through the FUSE
65
- * mount (`..`, `.`, `//`, absolute) fails the sync, exactly as it fails a
66
- * local turn's workspace write. Backslashes are refused too — the store
67
- * normalizes `\` to `/` on write, so the stored key would differ from the
68
- * desired one and the stale pass would delete the file it just wrote.
69
- */
70
- function storeRelPath(relPath: string): string {
71
- if (
72
- relPath.includes("\0") ||
73
- relPath.includes("\\") ||
74
- posix.isAbsolute(relPath) ||
75
- relPath.endsWith("/") ||
76
- relPath.split("/").some((seg) => seg === ".." || seg === ".") ||
77
- posix.normalize(relPath) !== relPath
78
- ) {
79
- throw new Error(
80
- `Refusing skill file path "${relPath}" (must be a normalized relative path)`
81
- );
82
- }
83
- return relPath;
84
- }
85
-
86
- /**
87
- * Last writer wins. A raced conditional put (dual engine pods during a
88
- * deploy rollover) clears the sink's cached etag, so one retry re-learns
89
- * the current version and lands.
90
- */
91
- async function putLastWriterWins(
92
- sink: FileSink,
93
- key: string,
94
- body: Uint8Array
95
- ): Promise<void> {
96
- try {
97
- await sink.put(key, body);
98
- } catch (error) {
99
- if (!(error instanceof FileConflictError)) {
100
- throw error;
101
- }
102
- await sink.put(key, body);
103
- }
48
+ await mirrorToStore({
49
+ sink: args.sink,
50
+ prefix: skillsPrefix,
51
+ desired,
52
+ legacyPrefixes: [legacySkillsPrefix(args.agentName)],
53
+ });
104
54
  }
105
55
 
106
56
  async function sourceBytes(source: SkillFileSource): Promise<Uint8Array> {
@@ -0,0 +1,3 @@
1
+ export function sleep(ms: number): Promise<void> {
2
+ return new Promise((resolve) => setTimeout(resolve, ms));
3
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Mirror an authored file tree onto an Agent Store prefix. Shared by the
3
+ * skills and workspace seed syncs so both keep the same write-then-sweep
4
+ * discipline and the same path refusals.
5
+ */
6
+
7
+ import { posix } from "node:path";
8
+ import { FileConflictError, type FileSink } from "../files.js";
9
+
10
+ /**
11
+ * Write every `desired` key, then delete keys under `prefix` (and the
12
+ * `legacyPrefixes`) that nothing claims, so a redeploy drops removed files.
13
+ * Writes land before stale deletes, so a failed sync never leaves a gap a
14
+ * concurrent cloud reader could see.
15
+ */
16
+ export async function mirrorToStore(args: {
17
+ sink: FileSink;
18
+ prefix: string;
19
+ desired: ReadonlyMap<string, Uint8Array>;
20
+ /** Pre-native layouts emptied on every sync so a rolled-forward deploy does not leave undiscoverable copies. */
21
+ legacyPrefixes?: readonly string[];
22
+ }): Promise<void> {
23
+ await Promise.all(
24
+ [...args.desired].map(([key, body]) =>
25
+ putLastWriterWins(args.sink, key, body)
26
+ )
27
+ );
28
+ const listed = await Promise.all(
29
+ [args.prefix, ...(args.legacyPrefixes ?? [])].map((prefix) =>
30
+ args.sink.list(prefix)
31
+ )
32
+ );
33
+ await Promise.all(
34
+ listed
35
+ .flat()
36
+ .filter((entry) => !args.desired.has(entry.key))
37
+ .map((entry) => args.sink.delete(entry.key))
38
+ );
39
+ }
40
+
41
+ /**
42
+ * Same refusals as local materialization's `resolveInside`: a rel that
43
+ * escapes its directory or would not round-trip through the FUSE mount
44
+ * (`..`, `.`, `//`, absolute) fails the sync, exactly as it fails a local
45
+ * turn's workspace write. Backslashes are refused too — the store
46
+ * normalizes `\` to `/` on write, so the stored key would differ from the
47
+ * desired one and the stale pass would delete the file it just wrote.
48
+ */
49
+ export function storeRelPath(
50
+ relPath: string,
51
+ what: "skill file" | "workspace file"
52
+ ): string {
53
+ if (
54
+ relPath.includes("\0") ||
55
+ relPath.includes("\\") ||
56
+ posix.isAbsolute(relPath) ||
57
+ relPath.endsWith("/") ||
58
+ relPath.split("/").some((seg) => seg === ".." || seg === ".") ||
59
+ posix.normalize(relPath) !== relPath
60
+ ) {
61
+ throw new Error(
62
+ `Refusing ${what} path "${relPath}" (must be a normalized relative path)`
63
+ );
64
+ }
65
+ return relPath;
66
+ }
67
+
68
+ /**
69
+ * Last writer wins. A raced conditional put (dual engine pods during a
70
+ * deploy rollover) clears the sink's cached etag, so one retry re-learns
71
+ * the current version and lands.
72
+ */
73
+ async function putLastWriterWins(
74
+ sink: FileSink,
75
+ key: string,
76
+ body: Uint8Array
77
+ ): Promise<void> {
78
+ try {
79
+ await sink.put(key, body);
80
+ } catch (error) {
81
+ if (!(error instanceof FileConflictError)) {
82
+ throw error;
83
+ }
84
+ await sink.put(key, body);
85
+ }
86
+ }