@cursor/bdk 0.2.9 → 0.2.11

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 (569) hide show
  1. package/dist/artifacts.js +3 -5
  2. package/dist/bin/agent-serve.js +803 -812
  3. package/dist/channels/bitbucket/api.js +305 -321
  4. package/dist/channels/bitbucket/binding.js +97 -61
  5. package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
  6. package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
  7. package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
  8. package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
  9. package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
  10. package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
  11. package/dist/channels/bitbucket/checks.js +9 -21
  12. package/dist/channels/bitbucket/cursor-account.js +1 -1
  13. package/dist/channels/bitbucket/defaults.js +14 -4
  14. package/dist/channels/bitbucket/events.js +1 -2
  15. package/dist/channels/bitbucket/index.d.ts +6 -2
  16. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  17. package/dist/channels/bitbucket/index.js +6 -2
  18. package/dist/channels/bitbucket/replay.js +80 -56
  19. package/dist/channels/bitbucket/state.js +16 -7
  20. package/dist/channels/bitbucket/types.d.ts +11 -2
  21. package/dist/channels/bitbucket/types.d.ts.map +1 -1
  22. package/dist/channels/checks.js +18 -28
  23. package/dist/channels/deployments/deployments-channel.js +26 -34
  24. package/dist/channels/github/api.js +216 -210
  25. package/dist/channels/github/auth.d.ts +5 -1
  26. package/dist/channels/github/auth.d.ts.map +1 -1
  27. package/dist/channels/github/auth.js +157 -174
  28. package/dist/channels/github/binding.js +48 -39
  29. package/dist/channels/github/checks.js +9 -14
  30. package/dist/channels/github/cursor-account.js +6 -11
  31. package/dist/channels/github/defaults.js +105 -130
  32. package/dist/channels/github/forward.js +13 -17
  33. package/dist/channels/github/github-channel.d.ts +43 -2
  34. package/dist/channels/github/github-channel.d.ts.map +1 -1
  35. package/dist/channels/github/github-channel.js +1228 -958
  36. package/dist/channels/github/progress.js +145 -146
  37. package/dist/channels/github/replay.js +30 -39
  38. package/dist/channels/github/state.js +40 -16
  39. package/dist/channels/github/types.d.ts +30 -6
  40. package/dist/channels/github/types.d.ts.map +1 -1
  41. package/dist/channels/gitlab/api.js +100 -114
  42. package/dist/channels/gitlab/binding.js +52 -33
  43. package/dist/channels/gitlab/checks.js +28 -29
  44. package/dist/channels/gitlab/cursor-account.js +1 -1
  45. package/dist/channels/gitlab/defaults.js +9 -3
  46. package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
  47. package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
  48. package/dist/channels/gitlab/gitlab-channel.js +95 -42
  49. package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
  50. package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
  51. package/dist/channels/gitlab/gitlab-webhook.js +282 -249
  52. package/dist/channels/gitlab/index.d.ts +6 -2
  53. package/dist/channels/gitlab/index.d.ts.map +1 -1
  54. package/dist/channels/gitlab/index.js +6 -2
  55. package/dist/channels/gitlab/replay.js +50 -27
  56. package/dist/channels/gitlab/state.js +14 -6
  57. package/dist/channels/gitlab/types.d.ts +13 -2
  58. package/dist/channels/gitlab/types.d.ts.map +1 -1
  59. package/dist/channels/origin/api.js +100 -116
  60. package/dist/channels/origin/binding.js +15 -16
  61. package/dist/channels/origin/checks.js +30 -28
  62. package/dist/channels/origin/defaults.js +50 -65
  63. package/dist/channels/origin/origin-channel.js +266 -272
  64. package/dist/channels/origin/origin-webhook.js +70 -88
  65. package/dist/channels/origin/reactions.js +9 -21
  66. package/dist/channels/origin/state.js +13 -5
  67. package/dist/channels/slack/agentic-delivery.js +426 -478
  68. package/dist/channels/slack/agentic-posted.js +9 -10
  69. package/dist/channels/slack/agentic-signals.js +2 -3
  70. package/dist/channels/slack/api.js +417 -427
  71. package/dist/channels/slack/approvals.js +1 -1
  72. package/dist/channels/slack/assistant.js +37 -47
  73. package/dist/channels/slack/attachments.js +188 -206
  74. package/dist/channels/slack/auth.js +8 -6
  75. package/dist/channels/slack/bot-mentions.js +31 -45
  76. package/dist/channels/slack/channel-watch.js +42 -48
  77. package/dist/channels/slack/cli-project.js +112 -137
  78. package/dist/channels/slack/code-fences.js +3 -5
  79. package/dist/channels/slack/constants.js +2 -2
  80. package/dist/channels/slack/credentials.js +23 -38
  81. package/dist/channels/slack/defaults.js +292 -331
  82. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  83. package/dist/channels/slack/dispatch.js +533 -460
  84. package/dist/channels/slack/doctor.js +200 -214
  85. package/dist/channels/slack/eval-directive.js +79 -96
  86. package/dist/channels/slack/event-id-dedupe.js +1 -1
  87. package/dist/channels/slack/external-policy.js +26 -39
  88. package/dist/channels/slack/footer.js +28 -41
  89. package/dist/channels/slack/inbound.d.ts +1 -0
  90. package/dist/channels/slack/inbound.d.ts.map +1 -1
  91. package/dist/channels/slack/inbound.js +50 -31
  92. package/dist/channels/slack/init.d.ts +1 -5
  93. package/dist/channels/slack/init.d.ts.map +1 -1
  94. package/dist/channels/slack/init.js +42 -59
  95. package/dist/channels/slack/interactive.d.ts +9 -3
  96. package/dist/channels/slack/interactive.d.ts.map +1 -1
  97. package/dist/channels/slack/interactive.js +160 -162
  98. package/dist/channels/slack/links.js +1 -2
  99. package/dist/channels/slack/live-delivery.js +172 -190
  100. package/dist/channels/slack/manifest.d.ts.map +1 -1
  101. package/dist/channels/slack/manifest.js +44 -23
  102. package/dist/channels/slack/message-body.js +2 -2
  103. package/dist/channels/slack/nudge-carrier.js +30 -42
  104. package/dist/channels/slack/nudge-store.js +164 -191
  105. package/dist/channels/slack/paint-start.js +66 -81
  106. package/dist/channels/slack/placeholder.js +123 -152
  107. package/dist/channels/slack/pr-ref.js +1 -1
  108. package/dist/channels/slack/progress-delivery.js +65 -78
  109. package/dist/channels/slack/reasoning-card.js +36 -49
  110. package/dist/channels/slack/recording-sink.js +12 -24
  111. package/dist/channels/slack/reply-options.js +7 -12
  112. package/dist/channels/slack/self-identity.js +27 -35
  113. package/dist/channels/slack/sender-name.d.ts +12 -3
  114. package/dist/channels/slack/sender-name.d.ts.map +1 -1
  115. package/dist/channels/slack/sender-name.js +57 -61
  116. package/dist/channels/slack/setup.js +2 -4
  117. package/dist/channels/slack/slack-channel.d.ts +6 -4
  118. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  119. package/dist/channels/slack/slack-channel.js +441 -308
  120. package/dist/channels/slack/socket-mode.js +38 -52
  121. package/dist/channels/slack/thread-context.js +143 -160
  122. package/dist/channels/slack/tool-approval-events.js +149 -166
  123. package/dist/channels/slack/tool-cards.js +6 -11
  124. package/dist/channels/slack/tool-chip.js +1 -2
  125. package/dist/channels/slack/types.d.ts +15 -17
  126. package/dist/channels/slack/types.d.ts.map +1 -1
  127. package/dist/channels/slack/upload.js +84 -97
  128. package/dist/channels/slack/user-info.js +27 -41
  129. package/dist/channels.js +9 -20
  130. package/dist/dashboard-session-url.js +3 -4
  131. package/dist/docs/404.html +2 -2
  132. package/dist/docs/assets/{app.BNhEdGa8.js → app.DXI7bwox.js} +4 -4
  133. package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
  134. package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
  135. package/dist/docs/assets/chunks/{VPLocalSearchBox.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
  136. package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
  137. package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
  138. package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
  139. package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
  140. package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
  141. package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
  142. package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
  143. package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
  144. package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
  145. package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
  146. package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
  147. package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
  148. package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
  149. package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
  150. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
  151. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
  152. package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
  153. package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
  154. package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
  155. package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
  156. package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
  157. package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
  158. package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
  159. package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
  160. package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
  161. package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
  162. package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
  163. package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
  164. package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
  165. package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
  166. package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
  167. package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
  168. package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
  169. package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
  170. package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
  171. package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
  172. package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
  173. package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
  174. package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
  175. package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
  176. package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
  177. package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
  178. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
  179. package/dist/docs/assets/chunks/{theme.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
  180. package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
  181. package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
  182. package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
  183. package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
  184. package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
  185. package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
  186. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
  187. package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
  188. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
  189. package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
  190. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
  191. package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
  192. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
  193. package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
  194. package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
  195. package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
  196. package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
  197. package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
  198. package/dist/docs/building-with-agents.html +37 -37
  199. package/dist/docs/building-with-agents.md +2 -0
  200. package/dist/docs/deployment.html +38 -38
  201. package/dist/docs/deployment.md +7 -0
  202. package/dist/docs/evals.html +36 -36
  203. package/dist/docs/guides/agent-to-agent.html +35 -35
  204. package/dist/docs/guides/bitbucket.html +38 -38
  205. package/dist/docs/guides/bitbucket.md +9 -1
  206. package/dist/docs/guides/cloud-agents.html +35 -35
  207. package/dist/docs/guides/convert-automation.html +35 -35
  208. package/dist/docs/guides/github.html +39 -39
  209. package/dist/docs/guides/github.md +20 -4
  210. package/dist/docs/guides/gitlab.html +38 -38
  211. package/dist/docs/guides/gitlab.md +9 -1
  212. package/dist/docs/guides/grokbot-agents.html +35 -35
  213. package/dist/docs/guides/hooks.html +35 -35
  214. package/dist/docs/guides/improve.html +35 -35
  215. package/dist/docs/guides/jev.html +35 -35
  216. package/dist/docs/guides/mcp-oauth.html +35 -35
  217. package/dist/docs/guides/migrate.html +66 -0
  218. package/dist/docs/guides/migrate.md +122 -0
  219. package/dist/docs/guides/opentelemetry.html +35 -35
  220. package/dist/docs/guides/slack.html +35 -35
  221. package/dist/docs/guides/webhooks.html +35 -35
  222. package/dist/docs/hashmap.json +1 -1
  223. package/dist/docs/hillclimbing.html +35 -35
  224. package/dist/docs/index.html +35 -35
  225. package/dist/docs/llms-full.txt +214 -6
  226. package/dist/docs/llms.txt +1 -0
  227. package/dist/docs/quickstart.html +35 -35
  228. package/dist/docs/reference/agent-config.html +35 -35
  229. package/dist/docs/reference/artifacts.html +35 -35
  230. package/dist/docs/reference/channels.html +35 -35
  231. package/dist/docs/reference/cli.html +39 -38
  232. package/dist/docs/reference/cli.md +39 -0
  233. package/dist/docs/reference/connections.html +35 -35
  234. package/dist/docs/reference/evals.html +35 -35
  235. package/dist/docs/reference/extensions.html +35 -35
  236. package/dist/docs/reference/hooks.html +35 -35
  237. package/dist/docs/reference/http-api.html +35 -35
  238. package/dist/docs/reference/instructions.html +35 -35
  239. package/dist/docs/reference/playground.html +35 -35
  240. package/dist/docs/reference/project-layout.html +35 -35
  241. package/dist/docs/reference/prompt.html +35 -35
  242. package/dist/docs/reference/schedules.html +35 -35
  243. package/dist/docs/reference/sessions.html +35 -35
  244. package/dist/docs/reference/skills.html +35 -35
  245. package/dist/docs/reference/subagents.html +35 -35
  246. package/dist/docs/reference/tools.html +35 -35
  247. package/dist/docs/templates/agentic-owners.html +35 -35
  248. package/dist/docs/templates/grokbot-agents.html +35 -35
  249. package/dist/docs/templates/security-reviewer.html +35 -35
  250. package/dist/docs/templates/thermo-quality-review.html +35 -35
  251. package/dist/docs/templates/thermo-review.html +35 -35
  252. package/dist/docs/templates/triage.html +35 -35
  253. package/dist/docs/troubleshooting.html +36 -36
  254. package/dist/docs/troubleshooting.md +1 -0
  255. package/dist/evals/assertions.js +20 -34
  256. package/dist/evals/expect.js +3 -6
  257. package/dist/evals/judge.js +5 -8
  258. package/dist/evals/loaders.js +45 -62
  259. package/dist/evals/matchers.js +2 -3
  260. package/dist/evals/reporters.js +43 -67
  261. package/dist/evals/results.js +1 -1
  262. package/dist/evals/run-facts.js +5 -6
  263. package/dist/evals.js +27 -15
  264. package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
  265. package/dist/extensions/cursor-cloud-agents/lib/backend.js +100 -126
  266. package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
  267. package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
  268. package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
  269. package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
  270. package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
  271. package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
  272. package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
  273. package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
  274. package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
  275. package/dist/extensions/cursor-cloud-agents/tools/list.js +8 -19
  276. package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
  277. package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
  278. package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
  279. package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
  280. package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
  281. package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
  282. package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
  283. package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
  284. package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
  285. package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
  286. package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
  287. package/dist/extensions/jev/extension.js +3 -3
  288. package/dist/extensions/jev/lib/evaluate.js +43 -60
  289. package/dist/extensions/jev/tools/evaluate.js +6 -17
  290. package/dist/extensions/slack-communication/tools/post-file.js +1 -1
  291. package/dist/extensions.js +3 -5
  292. package/dist/files-backends/cursor-hosted.js +504 -523
  293. package/dist/files-backends/local-fs.js +72 -134
  294. package/dist/files.js +3 -3
  295. package/dist/filesystem.js +562 -861
  296. package/dist/index.js +16 -35
  297. package/dist/internal/advertise-tools.js +74 -86
  298. package/dist/internal/artifacts-store.js +298 -361
  299. package/dist/internal/as-of.js +2 -4
  300. package/dist/internal/authored-alias-hooks.js +6 -4
  301. package/dist/internal/authored-loaders.js +37 -52
  302. package/dist/internal/bounded-int.js +1 -2
  303. package/dist/internal/bounded.js +13 -24
  304. package/dist/internal/brand.js +1 -1
  305. package/dist/internal/browser-origin-guard.js +4 -4
  306. package/dist/internal/builtin-tools/artifacts.js +15 -27
  307. package/dist/internal/builtin-tools/index.js +2 -3
  308. package/dist/internal/builtin-tools/reminders.js +33 -52
  309. package/dist/internal/channel-architecture.d.ts +21 -0
  310. package/dist/internal/channel-architecture.d.ts.map +1 -0
  311. package/dist/internal/channel-architecture.js +41 -0
  312. package/dist/internal/channel-dispatch.js +3 -4
  313. package/dist/internal/channel-route-dispatch.js +40 -51
  314. package/dist/internal/channel-state.js +1 -1
  315. package/dist/internal/chat-client.js +319 -340
  316. package/dist/internal/cli-ax.js +1262 -1294
  317. package/dist/internal/cli-bitbucket.js +244 -272
  318. package/dist/internal/cli-convert-automation.js +137 -151
  319. package/dist/internal/cli-cursor.js +126 -147
  320. package/dist/internal/cli-deploy.d.ts.map +1 -1
  321. package/dist/internal/cli-deploy.js +1457 -1507
  322. package/dist/internal/cli-docs.js +130 -147
  323. package/dist/internal/cli-github.js +437 -476
  324. package/dist/internal/cli-gitlab.js +259 -288
  325. package/dist/internal/cli-images.js +266 -334
  326. package/dist/internal/cli-manifest.js +25 -37
  327. package/dist/internal/cli-mcp-oauth.js +228 -247
  328. package/dist/internal/cli-mcp.js +358 -383
  329. package/dist/internal/cli-migrate.js +73 -90
  330. package/dist/internal/cli-skills.js +35 -47
  331. package/dist/internal/cli-slack-manual.d.ts +0 -1
  332. package/dist/internal/cli-slack-manual.d.ts.map +1 -1
  333. package/dist/internal/cli-slack-manual.js +175 -204
  334. package/dist/internal/cli-slack.d.ts +1 -1
  335. package/dist/internal/cli-slack.d.ts.map +1 -1
  336. package/dist/internal/cli-slack.js +416 -456
  337. package/dist/internal/cloud-merge.js +7 -3
  338. package/dist/internal/cloud-turn-cost.js +8 -1
  339. package/dist/internal/connection-env.js +5 -6
  340. package/dist/internal/continuation-channel.js +10 -7
  341. package/dist/internal/continuation-identity.js +85 -67
  342. package/dist/internal/conversation-mirror.js +112 -131
  343. package/dist/internal/convert-automation/convert-workflow.js +21 -31
  344. package/dist/internal/cron.js +3 -3
  345. package/dist/internal/cursor/account-mcp.js +147 -146
  346. package/dist/internal/cursor/backend-client.js +290 -320
  347. package/dist/internal/cursor/bound-secret-file.js +3 -3
  348. package/dist/internal/cursor/credentials.js +127 -142
  349. package/dist/internal/cursor/cursor-api-transport.js +4 -8
  350. package/dist/internal/cursor/github-credentials.js +91 -108
  351. package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
  352. package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
  353. package/dist/internal/cursor/hosted-store-secrets.js +5 -9
  354. package/dist/internal/cursor/session-token.js +36 -48
  355. package/dist/internal/cursor/store-api-client.js +77 -92
  356. package/dist/internal/cursor-account-mcp-auth.js +132 -149
  357. package/dist/internal/cursor-agent-template.js +1 -1
  358. package/dist/internal/cursor-deployment-relay.js +33 -54
  359. package/dist/internal/cursor-event-relay.js +65 -59
  360. package/dist/internal/cursor-relay-core.js +258 -286
  361. package/dist/internal/deferred-channel-session.js +3 -12
  362. package/dist/internal/deploy-client.d.ts.map +1 -1
  363. package/dist/internal/deploy-client.js +413 -475
  364. package/dist/internal/deploy-manifest.d.ts +17 -0
  365. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  366. package/dist/internal/deploy-manifest.js +71 -21
  367. package/dist/internal/deploy-source.js +31 -43
  368. package/dist/internal/discovery/agent-config.js +45 -59
  369. package/dist/internal/discovery/agent.js +276 -280
  370. package/dist/internal/discovery/channels.js +67 -80
  371. package/dist/internal/discovery/connections.js +286 -296
  372. package/dist/internal/discovery/context.js +2 -13
  373. package/dist/internal/discovery/cursor-plugin.js +223 -259
  374. package/dist/internal/discovery/extension-overlay.js +104 -131
  375. package/dist/internal/discovery/extensions.js +276 -281
  376. package/dist/internal/discovery/fs.js +56 -79
  377. package/dist/internal/discovery/hooks.js +39 -50
  378. package/dist/internal/discovery/info.js +17 -19
  379. package/dist/internal/discovery/instructions.js +58 -71
  380. package/dist/internal/discovery/modules.js +45 -58
  381. package/dist/internal/discovery/project.d.ts.map +1 -1
  382. package/dist/internal/discovery/project.js +192 -215
  383. package/dist/internal/discovery/reminders.js +41 -52
  384. package/dist/internal/discovery/runtime.js +1 -1
  385. package/dist/internal/discovery/schedules.js +71 -82
  386. package/dist/internal/discovery/seed-files.js +21 -32
  387. package/dist/internal/discovery/services.js +74 -96
  388. package/dist/internal/discovery/skills.js +77 -94
  389. package/dist/internal/discovery/subagent.js +79 -95
  390. package/dist/internal/discovery/tools.js +12 -23
  391. package/dist/internal/distribution.js +2 -2
  392. package/dist/internal/docs-site.js +30 -45
  393. package/dist/internal/duration.js +1 -1
  394. package/dist/internal/env-file.js +48 -64
  395. package/dist/internal/eval-judge-model.js +17 -28
  396. package/dist/internal/eval-run-store.js +265 -254
  397. package/dist/internal/eval-runner.d.ts +8 -0
  398. package/dist/internal/eval-runner.d.ts.map +1 -1
  399. package/dist/internal/eval-runner.js +406 -408
  400. package/dist/internal/eval-transport.d.ts +24 -0
  401. package/dist/internal/eval-transport.d.ts.map +1 -0
  402. package/dist/internal/eval-transport.js +22 -0
  403. package/dist/internal/evals-client.js +242 -246
  404. package/dist/internal/event-log.js +72 -120
  405. package/dist/internal/event-mapper.js +30 -31
  406. package/dist/internal/factory-resource-channel.js +16 -30
  407. package/dist/internal/filesystem/errors.js +6 -6
  408. package/dist/internal/filesystem/format.js +10 -13
  409. package/dist/internal/filesystem/merge.js +52 -94
  410. package/dist/internal/filesystem/nearest.js +15 -27
  411. package/dist/internal/filesystem/scratch.js +65 -85
  412. package/dist/internal/filesystem/tools.js +221 -241
  413. package/dist/internal/filesystem/walk.js +76 -143
  414. package/dist/internal/framework-file-storage.js +118 -139
  415. package/dist/internal/framework-storage-selection.js +21 -13
  416. package/dist/internal/frontmatter.js +4 -6
  417. package/dist/internal/github-fanout.js +50 -64
  418. package/dist/internal/guest-network.js +96 -109
  419. package/dist/internal/handleAgentServeTrigger.js +121 -126
  420. package/dist/internal/host-files.js +73 -88
  421. package/dist/internal/host-kv.js +21 -36
  422. package/dist/internal/host-otel.js +22 -19
  423. package/dist/internal/host-platforms.js +49 -63
  424. package/dist/internal/hosted-catch-protocol.d.ts +1 -0
  425. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
  426. package/dist/internal/hosted-catch-protocol.js +1 -0
  427. package/dist/internal/hosted-catch.d.ts +5 -3
  428. package/dist/internal/hosted-catch.d.ts.map +1 -1
  429. package/dist/internal/hosted-catch.js +84 -93
  430. package/dist/internal/hosted-delivery-protocol.js +32 -8
  431. package/dist/internal/hosted-delivery.d.ts +13 -1
  432. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  433. package/dist/internal/hosted-delivery.js +614 -584
  434. package/dist/internal/hosted-eval-cases.d.ts +21 -0
  435. package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
  436. package/dist/internal/hosted-eval-cases.js +162 -0
  437. package/dist/internal/hosted-execution-diag.js +38 -30
  438. package/dist/internal/hosted-execution-flush.js +75 -66
  439. package/dist/internal/hosted-execution-latency.js +16 -8
  440. package/dist/internal/hosted-managed-automation.js +2 -2
  441. package/dist/internal/hosting.js +2 -3
  442. package/dist/internal/http-channel-define.js +4 -1
  443. package/dist/internal/http-channel.js +101 -112
  444. package/dist/internal/http-control-plane-session.d.ts +18 -1
  445. package/dist/internal/http-control-plane-session.d.ts.map +1 -1
  446. package/dist/internal/http-control-plane-session.js +66 -32
  447. package/dist/internal/incoming-headers-to-fetch.js +1 -2
  448. package/dist/internal/init-interview.js +73 -93
  449. package/dist/internal/init-project.js +182 -214
  450. package/dist/internal/init-scaffold.js +10 -21
  451. package/dist/internal/inline-stdio-mcp.js +80 -86
  452. package/dist/internal/install-cursor-skills.js +231 -273
  453. package/dist/internal/legacy-command-guard.js +18 -31
  454. package/dist/internal/listen-port.js +34 -45
  455. package/dist/internal/local-control-plane.js +293 -307
  456. package/dist/internal/local-env.js +1 -1
  457. package/dist/internal/local-ingress.js +15 -9
  458. package/dist/internal/log-ring.js +1 -2
  459. package/dist/internal/logs-client.js +207 -227
  460. package/dist/internal/map-pool.js +24 -38
  461. package/dist/internal/mcp-endpoint.js +204 -180
  462. package/dist/internal/mcp-host.js +165 -168
  463. package/dist/internal/mcp-oauth-on-demand.js +170 -207
  464. package/dist/internal/mcp-oauth-persist.js +15 -29
  465. package/dist/internal/mcp-oauth.js +209 -266
  466. package/dist/internal/named-webhook-secret.d.ts +39 -0
  467. package/dist/internal/named-webhook-secret.d.ts.map +1 -0
  468. package/dist/internal/named-webhook-secret.js +47 -0
  469. package/dist/internal/open-browser.js +2 -3
  470. package/dist/internal/otel/collector.js +104 -68
  471. package/dist/internal/otel/config.js +24 -37
  472. package/dist/internal/otel/http.js +5 -7
  473. package/dist/internal/otel/mcp.js +3 -12
  474. package/dist/internal/otel/runtime.js +69 -83
  475. package/dist/internal/package-inline-stdio.js +57 -65
  476. package/dist/internal/peer-connections.js +9 -5
  477. package/dist/internal/platform-schedule-sync.js +39 -54
  478. package/dist/internal/platform-timers.js +176 -210
  479. package/dist/internal/playground/static.js +1 -2
  480. package/dist/internal/playground/toolchain.js +37 -53
  481. package/dist/internal/playground-proxy.js +230 -270
  482. package/dist/internal/process-memory-telemetry.js +33 -51
  483. package/dist/internal/prompt-context.js +3 -6
  484. package/dist/internal/reminder-control-plane-protocol.js +46 -13
  485. package/dist/internal/reminder-runner.js +770 -785
  486. package/dist/internal/reminder-schedule.js +1 -1
  487. package/dist/internal/reminder-store.js +57 -78
  488. package/dist/internal/request-error-status.js +1 -3
  489. package/dist/internal/request-headers.js +2 -2
  490. package/dist/internal/resolve-prod-target.js +119 -135
  491. package/dist/internal/resolved-connections.js +16 -6
  492. package/dist/internal/run-client.js +221 -229
  493. package/dist/internal/runtime-dispatch-runner.js +18 -43
  494. package/dist/internal/schedule-runner.js +49 -58
  495. package/dist/internal/scm/pr-url.js +7 -6
  496. package/dist/internal/sdk-runner.js +388 -363
  497. package/dist/internal/serve-restart.js +26 -39
  498. package/dist/internal/server.d.ts.map +1 -1
  499. package/dist/internal/server.js +1283 -1244
  500. package/dist/internal/session-cost.js +7 -9
  501. package/dist/internal/session-engine.d.ts +3 -1
  502. package/dist/internal/session-engine.d.ts.map +1 -1
  503. package/dist/internal/session-engine.js +2801 -2777
  504. package/dist/internal/session-links.js +12 -16
  505. package/dist/internal/session-run-log.js +134 -82
  506. package/dist/internal/session-store.js +133 -164
  507. package/dist/internal/sessions-client.js +97 -118
  508. package/dist/internal/skill-catalog.js +18 -23
  509. package/dist/internal/skills-sync.js +16 -30
  510. package/dist/internal/slack-provision-client.js +90 -116
  511. package/dist/internal/start-log-store.js +48 -67
  512. package/dist/internal/steering.js +1 -2
  513. package/dist/internal/storage-coordinator.js +160 -196
  514. package/dist/internal/store-mirror.js +16 -30
  515. package/dist/internal/stream-progress.js +6 -8
  516. package/dist/internal/terminal-style.js +3 -4
  517. package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
  518. package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
  519. package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
  520. package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
  521. package/dist/internal/tool-catalog.js +11 -5
  522. package/dist/internal/tool-result.js +1 -1
  523. package/dist/internal/trajectory.js +19 -22
  524. package/dist/internal/turn-cost.js +52 -62
  525. package/dist/internal/turn-governor.js +5 -8
  526. package/dist/internal/turn-lease-store.js +85 -105
  527. package/dist/internal/turn-outbox.js +28 -43
  528. package/dist/internal/update-check.js +231 -259
  529. package/dist/internal/v2-hosting.js +1 -2
  530. package/dist/internal/workspace-sync.js +25 -41
  531. package/dist/internal/workspace.js +111 -139
  532. package/dist/kv/memory-kv.js +27 -51
  533. package/dist/memory.js +106 -148
  534. package/dist/otel.js +5 -8
  535. package/dist/playground/assets/{index-Co4CUVTQ.js → index-Be0-1hw2.js} +45 -45
  536. package/dist/playground/assets/index-Clz6uHj9.css +1 -0
  537. package/dist/playground/index.html +2 -2
  538. package/dist/prompt.js +2 -4
  539. package/dist/storage-backends/cursor-hosted-v2.js +53 -83
  540. package/dist/storage-backends/cursor-hosted.js +105 -145
  541. package/dist/storage-backends/file-kv.js +100 -128
  542. package/dist/storage-protocol.js +3 -5
  543. package/dist/storage.js +17 -26
  544. package/dist/types.d.ts +68 -0
  545. package/dist/types.d.ts.map +1 -1
  546. package/dist/types.js +20 -18
  547. package/docs/building-with-agents.md +2 -0
  548. package/docs/deployment.md +7 -0
  549. package/docs/guides/bitbucket.md +9 -1
  550. package/docs/guides/github.md +20 -4
  551. package/docs/guides/gitlab.md +9 -1
  552. package/docs/guides/migrate.md +127 -0
  553. package/docs/reference/cli.md +39 -0
  554. package/docs/troubleshooting.md +1 -0
  555. package/package.json +1 -1
  556. package/skills/debug/SKILL.md +1 -0
  557. package/skills/github/SKILL.md +23 -0
  558. package/skills/migrate-v2/SKILL.md +51 -10
  559. package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
  560. package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
  561. package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
  562. package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
  563. package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
  564. package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
  565. package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
  566. package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
  567. package/dist/playground/assets/index-C1g_PTTZ.css +0 -1
  568. /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
  569. /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
@@ -5,15 +5,6 @@
5
5
  * Cursor-managed hosting preserves artifacts across deployment replacement.
6
6
  * Self-hosted agents store them under `--state-root/artifacts`.
7
7
  */
8
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
- return new (P || (P = Promise))(function (resolve, reject) {
11
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
- step((generator = generator.apply(thisArg, _arguments || [])).next());
15
- });
16
- };
17
8
  import { createHash, randomUUID } from "node:crypto";
18
9
  import { mkdir, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
19
10
  import { join } from "node:path";
@@ -24,7 +15,7 @@ import { mapBounded } from "./bounded.js";
24
15
  /** Default {@link ArtifactPageOptions.limit}; also `GET /v1/artifacts`. */
25
16
  export const ARTIFACTS_PAGE_DEFAULT_LIMIT = 200;
26
17
  /** Ceiling for {@link ArtifactPageOptions.limit}; larger asks clamp. */
27
- export const ARTIFACTS_PAGE_MAX_LIMIT = 1000;
18
+ export const ARTIFACTS_PAGE_MAX_LIMIT = 1_000;
28
19
  /**
29
20
  * Rows examined per `page()` call, floor. Filters live in row bodies, so a
30
21
  * sparse filter must hydrate rows just to reject them; this stops one call
@@ -62,10 +53,9 @@ export const ARTIFACT_DEFAULT_KIND = "artifact";
62
53
  */
63
54
  export class ArtifactsStore {
64
55
  constructor(options) {
65
- var _a, _b;
66
56
  /** Serializes tags so read-modify-write upserts and eviction don't race. */
67
57
  this.tagChain = Promise.resolve();
68
- const sink = (_a = options.sink) !== null && _a !== void 0 ? _a : (isCursorHostedFilesAvailable() ? cursorHostedFiles() : undefined);
58
+ const sink = options.sink ?? (isCursorHostedFilesAvailable() ? cursorHostedFiles() : undefined);
69
59
  if (sink === undefined) {
70
60
  this.rows = createFilesystemRowStore(options.stateRoot);
71
61
  this.content = createFilesystemContentStore(options.stateRoot);
@@ -76,57 +66,54 @@ export class ArtifactsStore {
76
66
  }
77
67
  this.config = options.config;
78
68
  this.max = resolveArtifactsMax(options.config);
79
- this.enforceCap = (_b = options.enforceCap) !== null && _b !== void 0 ? _b : (() => true);
69
+ this.enforceCap = options.enforceCap ?? (() => true);
80
70
  }
81
71
  tag(input) {
82
72
  const result = this.tagChain.then(() => this.tagSerialized(input));
83
73
  this.tagChain = result.catch(() => { });
84
74
  return result;
85
75
  }
86
- tagSerialized(input) {
87
- return __awaiter(this, void 0, void 0, function* () {
88
- var _a, _b;
89
- const { kind, data } = this.resolveKindAndData(input);
90
- const id = input.key === undefined ? `art_${randomUUID()}` : artifactIdForKey(input.key);
91
- // Fresh random ids can't collide; only keyed tags upsert.
92
- const existing = input.key === undefined ? undefined : yield this.rows.get(id);
93
- const now = new Date().toISOString();
94
- const record = {
95
- id,
96
- kind,
97
- key: input.key,
98
- title: input.title,
99
- data,
100
- sessionId: input.sessionId,
101
- turnId: input.turnId,
102
- source: (_a = input.source) !== null && _a !== void 0 ? _a : "host",
103
- createdAt: (_b = existing === null || existing === void 0 ? void 0 : existing.createdAt) !== null && _b !== void 0 ? _b : now,
104
- updatedAt: now,
76
+ async tagSerialized(input) {
77
+ const { kind, data } = this.resolveKindAndData(input);
78
+ const id = input.key === undefined ? `art_${randomUUID()}` : artifactIdForKey(input.key);
79
+ // Fresh random ids can't collide; only keyed tags upsert.
80
+ const existing = input.key === undefined ? undefined : await this.rows.get(id);
81
+ const now = new Date().toISOString();
82
+ const record = {
83
+ id,
84
+ kind,
85
+ key: input.key,
86
+ title: input.title,
87
+ data,
88
+ sessionId: input.sessionId,
89
+ turnId: input.turnId,
90
+ source: input.source ?? "host",
91
+ createdAt: existing?.createdAt ?? now,
92
+ updatedAt: now,
93
+ };
94
+ if (input.contents !== undefined) {
95
+ const body = typeof input.contents === "string" ? Buffer.from(input.contents, "utf8") : input.contents;
96
+ await this.content.put(id, body);
97
+ record.content = {
98
+ size: body.byteLength,
99
+ contentType: input.contentType,
105
100
  };
106
- if (input.contents !== undefined) {
107
- const body = typeof input.contents === "string" ? Buffer.from(input.contents, "utf8") : input.contents;
108
- yield this.content.put(id, body);
109
- record.content = {
110
- size: body.byteLength,
111
- contentType: input.contentType,
112
- };
113
- }
114
- else if ((existing === null || existing === void 0 ? void 0 : existing.content) !== undefined) {
115
- if (existing.sessionId === record.sessionId) {
116
- record.content = existing.content;
117
- }
118
- else {
119
- // Keys are deployment-global: rebinding a keyed row to another
120
- // session must not carry the prior session's payload with it.
121
- yield this.content.delete(id);
122
- }
101
+ }
102
+ else if (existing?.content !== undefined) {
103
+ if (existing.sessionId === record.sessionId) {
104
+ record.content = existing.content;
123
105
  }
124
- yield this.rows.put(record);
125
- if (existing === undefined && this.enforceCap()) {
126
- yield this.evictPastCap();
106
+ else {
107
+ // Keys are deployment-global: rebinding a keyed row to another
108
+ // session must not carry the prior session's payload with it.
109
+ await this.content.delete(id);
127
110
  }
128
- return record;
129
- });
111
+ }
112
+ await this.rows.put(record);
113
+ if (existing === undefined && this.enforceCap()) {
114
+ await this.evictPastCap();
115
+ }
116
+ return record;
130
117
  }
131
118
  get(id) {
132
119
  return this.rows.get(id);
@@ -140,11 +127,9 @@ export class ArtifactsStore {
140
127
  * {@link ArtifactsApi.list} contract. Walk the full set via
141
128
  * {@link ArtifactsStore.page}.
142
129
  */
143
- list(filter) {
144
- return __awaiter(this, void 0, void 0, function* () {
145
- const page = yield this.page(filter);
146
- return page.records;
147
- });
130
+ async list(filter) {
131
+ const page = await this.page(filter);
132
+ return page.records;
148
133
  }
149
134
  /**
150
135
  * Bounded cursor pagination, newest-updated first. On a store whose
@@ -166,22 +151,19 @@ export class ArtifactsStore {
166
151
  * the caller received, and continues only while more *visible* records
167
152
  * remain, at the bounded cost of hydrating the full set.
168
153
  */
169
- page(options) {
170
- return __awaiter(this, void 0, void 0, function* () {
171
- var _a;
172
- const limit = Math.min(Math.max((_a = options === null || options === void 0 ? void 0 : options.limit) !== null && _a !== void 0 ? _a : ARTIFACTS_PAGE_DEFAULT_LIMIT, 1), ARTIFACTS_PAGE_MAX_LIMIT);
173
- const cursor = (options === null || options === void 0 ? void 0 : options.cursor) === undefined ? undefined : decodeArtifactPageCursor(options.cursor);
174
- const matches = (record) => ((options === null || options === void 0 ? void 0 : options.kind) === undefined || record.kind === options.kind) &&
175
- ((options === null || options === void 0 ? void 0 : options.sessionId) === undefined || record.sessionId === options.sessionId) &&
176
- ((options === null || options === void 0 ? void 0 : options.matches) === undefined || options.matches(record));
177
- if ((options === null || options === void 0 ? void 0 : options.matches) === undefined) {
178
- const metas = yield this.rows.listMeta();
179
- if (metas.some(meta => meta.mtimeMs !== undefined)) {
180
- return this.pageFromMetadata(metas, limit, cursor, matches, (options === null || options === void 0 ? void 0 : options.kind) !== undefined || (options === null || options === void 0 ? void 0 : options.sessionId) !== undefined);
181
- }
154
+ async page(options) {
155
+ const limit = Math.min(Math.max(options?.limit ?? ARTIFACTS_PAGE_DEFAULT_LIMIT, 1), ARTIFACTS_PAGE_MAX_LIMIT);
156
+ const cursor = options?.cursor === undefined ? undefined : decodeArtifactPageCursor(options.cursor);
157
+ const matches = (record) => (options?.kind === undefined || record.kind === options.kind) &&
158
+ (options?.sessionId === undefined || record.sessionId === options.sessionId) &&
159
+ (options?.matches === undefined || options.matches(record));
160
+ if (options?.matches === undefined) {
161
+ const metas = await this.rows.listMeta();
162
+ if (metas.some(meta => meta.mtimeMs !== undefined)) {
163
+ return this.pageFromMetadata(metas, limit, cursor, matches, options?.kind !== undefined || options?.sessionId !== undefined);
182
164
  }
183
- return this.pageFromRecords(limit, cursor, matches);
184
- });
165
+ }
166
+ return this.pageFromRecords(limit, cursor, matches);
185
167
  }
186
168
  /**
187
169
  * Metadata-ordered page: sort metas newest first, resume after the
@@ -189,85 +171,81 @@ export class ArtifactsStore {
189
171
  * budget runs out, or the metas do. The cursor marks the last *examined*
190
172
  * meta, so a budget-limited call still makes progress.
191
173
  */
192
- pageFromMetadata(metas, limit, cursor, matches, filtered) {
193
- return __awaiter(this, void 0, void 0, function* () {
194
- var _a, _b;
195
- var _c, _d, _e;
196
- const newestFirst = metas.sort((a, b) => byOldestModified(b, a));
197
- let start = 0;
198
- if (cursor !== undefined && cursor.kind === "mtime") {
199
- // Resume after (boundary stamp, rows of that cohort already
200
- // examined). Same-stamp rows sit contiguously in the sort, so the
201
- // pair names an exact position without identifying any row.
202
- start = newestFirst.findIndex(meta => { var _a; return ((_a = meta.mtimeMs) !== null && _a !== void 0 ? _a : 0) <= cursor.m; });
203
- if (start === -1) {
204
- return { records: [] };
205
- }
206
- let skipped = 0;
207
- while (start < newestFirst.length &&
208
- ((_c = (_a = newestFirst[start]) === null || _a === void 0 ? void 0 : _a.mtimeMs) !== null && _c !== void 0 ? _c : 0) === cursor.m &&
209
- skipped < cursor.s) {
210
- start += 1;
211
- skipped += 1;
212
- }
213
- if (start >= newestFirst.length) {
214
- return { records: [] };
215
- }
174
+ async pageFromMetadata(metas, limit, cursor, matches, filtered) {
175
+ const newestFirst = metas.sort((a, b) => byOldestModified(b, a));
176
+ let start = 0;
177
+ if (cursor !== undefined && cursor.kind === "mtime") {
178
+ // Resume after (boundary stamp, rows of that cohort already
179
+ // examined). Same-stamp rows sit contiguously in the sort, so the
180
+ // pair names an exact position without identifying any row.
181
+ start = newestFirst.findIndex(meta => (meta.mtimeMs ?? 0) <= cursor.m);
182
+ if (start === -1) {
183
+ return { records: [] };
216
184
  }
217
- // A cursor of the other kind means the store's listing gained mtimes
218
- // between pages (a mode flip, not caller error): restart from the top
219
- // rather than fail the walk.
220
- const budget = Math.max(limit, ARTIFACTS_PAGE_SCAN_MIN);
221
- const records = [];
222
- let examined = 0;
223
- let lastExamined = start - 1;
224
- // A batched row store hydrates a bigger slice per round trip. Without
225
- // one, keep the slice at the per-row fan-out bound. An unfiltered
226
- // page needs exactly the rows it returns — every hydrated row matches —
227
- // so cap its slice at the remaining page instead of over-hydrating a
228
- // full batch for a small `limit`.
229
- const scanBatchSize = this.rows.getMany !== undefined ? ARTIFACTS_SCAN_BATCH_ROWS : ROW_HYDRATION_CONCURRENCY;
230
- scan: while (lastExamined + 1 < newestFirst.length &&
231
- records.length < limit &&
232
- examined < budget) {
233
- const from = lastExamined + 1;
234
- const sliceCap = filtered ? scanBatchSize : Math.min(scanBatchSize, limit - records.length);
235
- const batch = newestFirst.slice(from, from + Math.min(sliceCap, budget - examined));
236
- const bodies = this.rows.getMany !== undefined
237
- ? yield this.rows.getMany(batch.map(meta => meta.id))
238
- : yield mapBounded(batch, ROW_HYDRATION_CONCURRENCY, meta => this.rows.get(meta.id));
239
- for (let i = 0; i < batch.length; i += 1) {
240
- lastExamined = from + i;
241
- examined += 1;
242
- const record = bodies[i];
243
- if (record !== undefined && matches(record)) {
244
- records.push(record);
245
- if (records.length === limit) {
246
- break scan;
247
- }
248
- }
249
- }
185
+ let skipped = 0;
186
+ while (start < newestFirst.length &&
187
+ (newestFirst[start]?.mtimeMs ?? 0) === cursor.m &&
188
+ skipped < cursor.s) {
189
+ start += 1;
190
+ skipped += 1;
250
191
  }
251
- if (lastExamined >= newestFirst.length - 1) {
252
- return { records };
192
+ if (start >= newestFirst.length) {
193
+ return { records: [] };
253
194
  }
254
- const boundary = (_d = newestFirst[lastExamined].mtimeMs) !== null && _d !== void 0 ? _d : 0;
255
- // How deep into the boundary's same-stamp cohort the scan got —
256
- // cohorts are contiguous, so count back from the last examined row.
257
- let cohortExamined = 0;
258
- for (let i = lastExamined; i >= 0 && ((_e = (_b = newestFirst[i]) === null || _b === void 0 ? void 0 : _b.mtimeMs) !== null && _e !== void 0 ? _e : 0) === boundary; i -= 1) {
259
- cohortExamined += 1;
195
+ }
196
+ // A cursor of the other kind means the store's listing gained mtimes
197
+ // between pages (a mode flip, not caller error): restart from the top
198
+ // rather than fail the walk.
199
+ const budget = Math.max(limit, ARTIFACTS_PAGE_SCAN_MIN);
200
+ const records = [];
201
+ let examined = 0;
202
+ let lastExamined = start - 1;
203
+ // A batched row store hydrates a bigger slice per round trip. Without
204
+ // one, keep the slice at the per-row fan-out bound. An unfiltered
205
+ // page needs exactly the rows it returns — every hydrated row matches —
206
+ // so cap its slice at the remaining page instead of over-hydrating a
207
+ // full batch for a small `limit`.
208
+ const scanBatchSize = this.rows.getMany !== undefined ? ARTIFACTS_SCAN_BATCH_ROWS : ROW_HYDRATION_CONCURRENCY;
209
+ scan: while (lastExamined + 1 < newestFirst.length &&
210
+ records.length < limit &&
211
+ examined < budget) {
212
+ const from = lastExamined + 1;
213
+ const sliceCap = filtered ? scanBatchSize : Math.min(scanBatchSize, limit - records.length);
214
+ const batch = newestFirst.slice(from, from + Math.min(sliceCap, budget - examined));
215
+ const bodies = this.rows.getMany !== undefined
216
+ ? await this.rows.getMany(batch.map(meta => meta.id))
217
+ : await mapBounded(batch, ROW_HYDRATION_CONCURRENCY, meta => this.rows.get(meta.id));
218
+ for (let i = 0; i < batch.length; i += 1) {
219
+ lastExamined = from + i;
220
+ examined += 1;
221
+ const record = bodies[i];
222
+ if (record !== undefined && matches(record)) {
223
+ records.push(record);
224
+ if (records.length === limit) {
225
+ break scan;
226
+ }
227
+ }
260
228
  }
261
- return {
262
- records,
263
- nextCursor: encodeArtifactPageCursor({
264
- v: 1,
265
- kind: "mtime",
266
- m: boundary,
267
- s: cohortExamined,
268
- }),
269
- };
270
- });
229
+ }
230
+ if (lastExamined >= newestFirst.length - 1) {
231
+ return { records };
232
+ }
233
+ const boundary = newestFirst[lastExamined].mtimeMs ?? 0;
234
+ // How deep into the boundary's same-stamp cohort the scan got —
235
+ // cohorts are contiguous, so count back from the last examined row.
236
+ let cohortExamined = 0;
237
+ for (let i = lastExamined; i >= 0 && (newestFirst[i]?.mtimeMs ?? 0) === boundary; i -= 1) {
238
+ cohortExamined += 1;
239
+ }
240
+ return {
241
+ records,
242
+ nextCursor: encodeArtifactPageCursor({
243
+ v: 1,
244
+ kind: "mtime",
245
+ m: boundary,
246
+ s: cohortExamined,
247
+ }),
248
+ };
271
249
  }
272
250
  /**
273
251
  * Hydrate-everything page: exact `updatedAt` order, cursor = the last
@@ -276,37 +254,35 @@ export class ArtifactsStore {
276
254
  * {@link ArtifactsStore.page} for why filtered callers must not receive
277
255
  * metadata-lane cursors.
278
256
  */
279
- pageFromRecords(limit, cursor, matches) {
280
- return __awaiter(this, void 0, void 0, function* () {
281
- const records = (yield this.rows.list()).filter(matches).sort(byNewestUpdated);
282
- let start = 0;
283
- if (cursor !== undefined && cursor.kind === "updated") {
284
- const position = {
285
- updatedAt: cursor.u,
286
- createdAt: cursor.c,
287
- id: cursor.id,
288
- };
289
- start = records.findIndex(record => byNewestUpdated(record, position) > 0);
290
- if (start === -1) {
291
- return { records: [] };
292
- }
293
- }
294
- const page = records.slice(start, start + limit);
295
- const last = page[page.length - 1];
296
- if (last === undefined || start + page.length >= records.length) {
297
- return { records: page };
298
- }
299
- return {
300
- records: page,
301
- nextCursor: encodeArtifactPageCursor({
302
- v: 1,
303
- kind: "updated",
304
- u: last.updatedAt,
305
- c: last.createdAt,
306
- id: last.id,
307
- }),
257
+ async pageFromRecords(limit, cursor, matches) {
258
+ const records = (await this.rows.list()).filter(matches).sort(byNewestUpdated);
259
+ let start = 0;
260
+ if (cursor !== undefined && cursor.kind === "updated") {
261
+ const position = {
262
+ updatedAt: cursor.u,
263
+ createdAt: cursor.c,
264
+ id: cursor.id,
308
265
  };
309
- });
266
+ start = records.findIndex(record => byNewestUpdated(record, position) > 0);
267
+ if (start === -1) {
268
+ return { records: [] };
269
+ }
270
+ }
271
+ const page = records.slice(start, start + limit);
272
+ const last = page[page.length - 1];
273
+ if (last === undefined || start + page.length >= records.length) {
274
+ return { records: page };
275
+ }
276
+ return {
277
+ records: page,
278
+ nextCursor: encodeArtifactPageCursor({
279
+ v: 1,
280
+ kind: "updated",
281
+ u: last.updatedAt,
282
+ c: last.createdAt,
283
+ id: last.id,
284
+ }),
285
+ };
310
286
  }
311
287
  /**
312
288
  * Resolve the effective kind (freeform when no kinds are declared) and
@@ -315,13 +291,11 @@ export class ArtifactsStore {
315
291
  * parsed output — defaults and coercions applied — is what gets stored.
316
292
  */
317
293
  resolveKindAndData(input) {
318
- var _a;
319
- var _b;
320
- const kind = (_b = input.kind) !== null && _b !== void 0 ? _b : ARTIFACT_DEFAULT_KIND;
294
+ const kind = input.kind ?? ARTIFACT_DEFAULT_KIND;
321
295
  if (kind.trim() === "") {
322
296
  throw new Error("artifacts.tag: kind must be a non-empty string");
323
297
  }
324
- const kinds = (_a = this.config) === null || _a === void 0 ? void 0 : _a.kinds;
298
+ const kinds = this.config?.kinds;
325
299
  if (kinds === undefined || Object.keys(kinds).length === 0) {
326
300
  return { kind, data: input.data };
327
301
  }
@@ -347,44 +321,40 @@ export class ArtifactsStore {
347
321
  * Deletes are capped per pass so a store far past the cap drains across
348
322
  * inserts instead of delaying one insert for the entire backlog.
349
323
  */
350
- evictPastCap() {
351
- return __awaiter(this, void 0, void 0, function* () {
352
- const metas = yield this.rows.listMeta();
353
- const excess = Math.min(metas.length - this.max, ARTIFACTS_EVICT_MAX_PER_PASS);
354
- if (excess <= 0) {
355
- return;
356
- }
357
- yield mapBounded(yield this.oldestRowIds(metas, excess), ROW_HYDRATION_CONCURRENCY, (id) => __awaiter(this, void 0, void 0, function* () {
358
- yield this.rows.delete(id);
359
- // Without the row body there is no `content` flag to consult;
360
- // delete the payload unconditionally — absent ones are a no-op.
361
- yield this.content.delete(id);
362
- }));
324
+ async evictPastCap() {
325
+ const metas = await this.rows.listMeta();
326
+ const excess = Math.min(metas.length - this.max, ARTIFACTS_EVICT_MAX_PER_PASS);
327
+ if (excess <= 0) {
328
+ return;
329
+ }
330
+ await mapBounded(await this.oldestRowIds(metas, excess), ROW_HYDRATION_CONCURRENCY, async (id) => {
331
+ await this.rows.delete(id);
332
+ // Without the row body there is no `content` flag to consult;
333
+ // delete the payload unconditionally — absent ones are a no-op.
334
+ await this.content.delete(id);
363
335
  });
364
336
  }
365
337
  /** The `excess` oldest row ids, cheapest available ordering first. */
366
- oldestRowIds(metas, excess) {
367
- return __awaiter(this, void 0, void 0, function* () {
368
- if (metas.some(meta => meta.mtimeMs !== undefined)) {
369
- // A store that tracks mtimes must never regress to per-insert
370
- // hydration. An entry missing one sorts oldest via the comparator's
371
- // `?? 0` and is evicted first, avoiding a full hydration on each insert.
372
- return metas
373
- .sort(byOldestModified)
374
- .slice(0, excess)
375
- .map(meta => meta.id);
376
- }
377
- // A store that tracks no modification times at all (the local
378
- // filesystem store, deliberately) leaves only the rows' own
379
- // `updatedAt`: hydrate — bounded — and order exactly. Corrupt rows
380
- // drop out of `list()`, so recompute the excess against the rows that
381
- // actually parsed.
382
- const records = yield this.rows.list();
383
- return records
384
- .sort((a, b) => byNewestUpdated(b, a))
385
- .slice(0, Math.min(excess, Math.max(0, records.length - this.max)))
386
- .map(record => record.id);
387
- });
338
+ async oldestRowIds(metas, excess) {
339
+ if (metas.some(meta => meta.mtimeMs !== undefined)) {
340
+ // A store that tracks mtimes must never regress to per-insert
341
+ // hydration. An entry missing one sorts oldest via the comparator's
342
+ // `?? 0` and is evicted first, avoiding a full hydration on each insert.
343
+ return metas
344
+ .sort(byOldestModified)
345
+ .slice(0, excess)
346
+ .map(meta => meta.id);
347
+ }
348
+ // A store that tracks no modification times at all (the local
349
+ // filesystem store, deliberately) leaves only the rows' own
350
+ // `updatedAt`: hydrate — bounded — and order exactly. Corrupt rows
351
+ // drop out of `list()`, so recompute the excess against the rows that
352
+ // actually parsed.
353
+ const records = await this.rows.list();
354
+ return records
355
+ .sort((a, b) => byNewestUpdated(b, a))
356
+ .slice(0, Math.min(excess, Math.max(0, records.length - this.max)))
357
+ .map(record => record.id);
388
358
  }
389
359
  }
390
360
  /** A syntactically invalid {@link ArtifactPageOptions.cursor}. */
@@ -403,7 +373,7 @@ function decodeArtifactPageCursor(raw) {
403
373
  try {
404
374
  value = JSON.parse(Buffer.from(raw, "base64url").toString("utf8"));
405
375
  }
406
- catch (_a) {
376
+ catch {
407
377
  throw new InvalidArtifactCursorError();
408
378
  }
409
379
  if (typeof value !== "object" || value === null) {
@@ -441,9 +411,8 @@ export function artifactIdForKey(key) {
441
411
  * the retention cap.
442
412
  */
443
413
  function byOldestModified(a, b) {
444
- var _a, _b;
445
414
  if (a.mtimeMs !== b.mtimeMs) {
446
- return ((_a = a.mtimeMs) !== null && _a !== void 0 ? _a : 0) - ((_b = b.mtimeMs) !== null && _b !== void 0 ? _b : 0);
415
+ return (a.mtimeMs ?? 0) - (b.mtimeMs ?? 0);
447
416
  }
448
417
  return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
449
418
  }
@@ -484,7 +453,7 @@ function parseRecordBytes(bytes) {
484
453
  try {
485
454
  value = JSON.parse(Buffer.from(bytes).toString("utf8"));
486
455
  }
487
- catch (_a) {
456
+ catch {
488
457
  // A corrupt row must not poison list().
489
458
  return undefined;
490
459
  }
@@ -500,58 +469,46 @@ function sinkBody(found) {
500
469
  function createSinkRowStore(sink, agentName) {
501
470
  const key = (id) => agentStoreKeys.artifactRow(agentName, id);
502
471
  return {
503
- get(id) {
504
- return __awaiter(this, void 0, void 0, function* () {
505
- return parseRecordBytes(sinkBody(yield sink.get(key(id))));
506
- });
472
+ async get(id) {
473
+ return parseRecordBytes(sinkBody(await sink.get(key(id))));
507
474
  },
508
- put(record) {
509
- return __awaiter(this, void 0, void 0, function* () {
510
- yield sink.put(key(record.id), Buffer.from(JSON.stringify(record), "utf8"));
511
- });
475
+ async put(record) {
476
+ await sink.put(key(record.id), Buffer.from(JSON.stringify(record), "utf8"));
512
477
  },
513
- delete(id) {
514
- return __awaiter(this, void 0, void 0, function* () {
515
- yield sink.delete(key(id));
516
- });
478
+ async delete(id) {
479
+ await sink.delete(key(id));
517
480
  },
518
- getMany(ids) {
519
- return __awaiter(this, void 0, void 0, function* () {
520
- const keys = ids.map(id => key(id));
521
- const bodies = sink.getMany !== undefined
522
- ? yield sink.getMany(keys)
523
- : yield mapBounded(keys, ROW_HYDRATION_CONCURRENCY, rowKey => sink.get(rowKey));
524
- return bodies.map(body => parseRecordBytes(sinkBody(body)));
525
- });
481
+ async getMany(ids) {
482
+ const keys = ids.map(id => key(id));
483
+ const bodies = sink.getMany !== undefined
484
+ ? await sink.getMany(keys)
485
+ : await mapBounded(keys, ROW_HYDRATION_CONCURRENCY, rowKey => sink.get(rowKey));
486
+ return bodies.map(body => parseRecordBytes(sinkBody(body)));
526
487
  },
527
- list() {
528
- return __awaiter(this, void 0, void 0, function* () {
529
- const entries = yield sink.list(agentStoreKeys.artifactRowPrefix(agentName));
530
- const bodies = sink.getMany !== undefined
531
- ? yield sink.getMany(entries.map(entry => entry.key))
532
- : yield mapBounded(entries, ROW_HYDRATION_CONCURRENCY, entry => sink.get(entry.key));
533
- const records = [];
534
- for (const body of bodies) {
535
- const record = parseRecordBytes(sinkBody(body));
536
- if (record !== undefined) {
537
- records.push(record);
538
- }
488
+ async list() {
489
+ const entries = await sink.list(agentStoreKeys.artifactRowPrefix(agentName));
490
+ const bodies = sink.getMany !== undefined
491
+ ? await sink.getMany(entries.map(entry => entry.key))
492
+ : await mapBounded(entries, ROW_HYDRATION_CONCURRENCY, entry => sink.get(entry.key));
493
+ const records = [];
494
+ for (const body of bodies) {
495
+ const record = parseRecordBytes(sinkBody(body));
496
+ if (record !== undefined) {
497
+ records.push(record);
539
498
  }
540
- return records;
541
- });
499
+ }
500
+ return records;
542
501
  },
543
- listMeta() {
544
- return __awaiter(this, void 0, void 0, function* () {
545
- const prefix = agentStoreKeys.artifactRowPrefix(agentName);
546
- const metas = [];
547
- for (const entry of yield sink.list(prefix)) {
548
- const id = rowIdFromName(entry.key.slice(prefix.length));
549
- if (id !== undefined) {
550
- metas.push({ id, mtimeMs: entry.mtimeMs });
551
- }
502
+ async listMeta() {
503
+ const prefix = agentStoreKeys.artifactRowPrefix(agentName);
504
+ const metas = [];
505
+ for (const entry of await sink.list(prefix)) {
506
+ const id = rowIdFromName(entry.key.slice(prefix.length));
507
+ if (id !== undefined) {
508
+ metas.push({ id, mtimeMs: entry.mtimeMs });
552
509
  }
553
- return metas;
554
- });
510
+ }
511
+ return metas;
555
512
  },
556
513
  };
557
514
  }
@@ -573,27 +530,21 @@ function rowIdFromName(name) {
573
530
  const id = decodeURIComponent(encoded);
574
531
  return encodeURIComponent(id) === encoded ? id : undefined;
575
532
  }
576
- catch (_a) {
533
+ catch {
577
534
  return undefined;
578
535
  }
579
536
  }
580
537
  function createSinkContentStore(sink, agentName) {
581
538
  const key = (id) => agentStoreKeys.artifactContent(agentName, id);
582
539
  return {
583
- get(id) {
584
- return __awaiter(this, void 0, void 0, function* () {
585
- return sinkBody(yield sink.get(key(id)));
586
- });
540
+ async get(id) {
541
+ return sinkBody(await sink.get(key(id)));
587
542
  },
588
- put(id, body) {
589
- return __awaiter(this, void 0, void 0, function* () {
590
- yield sink.put(key(id), body);
591
- });
543
+ async put(id, body) {
544
+ await sink.put(key(id), body);
592
545
  },
593
- delete(id) {
594
- return __awaiter(this, void 0, void 0, function* () {
595
- yield sink.delete(key(id));
596
- });
546
+ async delete(id) {
547
+ await sink.delete(key(id));
597
548
  },
598
549
  };
599
550
  }
@@ -602,9 +553,9 @@ function createFilesystemRowStore(stateRoot) {
602
553
  const filePath = (id) => join(dir, `${encodeURIComponent(id)}.json`);
603
554
  // Missing and corrupt rows both read as absent — a truncated/garbled
604
555
  // file must not poison list() (and with it every insert's eviction).
605
- const readRecord = (path) => __awaiter(this, void 0, void 0, function* () {
556
+ const readRecord = async (path) => {
606
557
  try {
607
- const value = JSON.parse(yield readFile(path, "utf8"));
558
+ const value = JSON.parse(await readFile(path, "utf8"));
608
559
  return isArtifactRecord(value) ? value : undefined;
609
560
  }
610
561
  catch (error) {
@@ -613,76 +564,68 @@ function createFilesystemRowStore(stateRoot) {
613
564
  }
614
565
  throw error;
615
566
  }
616
- });
567
+ };
617
568
  return {
618
569
  get(id) {
619
570
  return readRecord(filePath(id));
620
571
  },
621
- put(record) {
622
- return __awaiter(this, void 0, void 0, function* () {
623
- yield mkdir(dir, { recursive: true });
624
- const tmp = join(dir, `.tmp-${randomUUID()}`);
625
- yield writeFile(tmp, JSON.stringify(record), "utf8");
626
- yield rename(tmp, filePath(record.id));
627
- });
572
+ async put(record) {
573
+ await mkdir(dir, { recursive: true });
574
+ const tmp = join(dir, `.tmp-${randomUUID()}`);
575
+ await writeFile(tmp, JSON.stringify(record), "utf8");
576
+ await rename(tmp, filePath(record.id));
628
577
  },
629
- delete(id) {
630
- return __awaiter(this, void 0, void 0, function* () {
631
- yield rm(filePath(id), { force: true });
632
- });
578
+ async delete(id) {
579
+ await rm(filePath(id), { force: true });
633
580
  },
634
- list() {
635
- return __awaiter(this, void 0, void 0, function* () {
636
- let names;
637
- try {
638
- names = yield readdir(dir);
581
+ async list() {
582
+ let names;
583
+ try {
584
+ names = await readdir(dir);
585
+ }
586
+ catch (error) {
587
+ if (error.code === "ENOENT") {
588
+ return [];
639
589
  }
640
- catch (error) {
641
- if (error.code === "ENOENT") {
642
- return [];
643
- }
644
- throw error;
590
+ throw error;
591
+ }
592
+ const records = [];
593
+ for (const name of names.sort()) {
594
+ if (name.startsWith(".") || !name.endsWith(".json")) {
595
+ continue;
645
596
  }
646
- const records = [];
647
- for (const name of names.sort()) {
648
- if (name.startsWith(".") || !name.endsWith(".json")) {
649
- continue;
650
- }
651
- const record = yield readRecord(join(dir, name));
652
- if (record !== undefined) {
653
- records.push(record);
654
- }
597
+ const record = await readRecord(join(dir, name));
598
+ if (record !== undefined) {
599
+ records.push(record);
655
600
  }
656
- return records;
657
- });
601
+ }
602
+ return records;
658
603
  },
659
- listMeta() {
660
- return __awaiter(this, void 0, void 0, function* () {
661
- // No mtimes on purpose: local rows are cheap to hydrate, and the
662
- // rows' own `updatedAt` orders eviction exactly, immune to coarse
663
- // filesystem timestamp granularity.
664
- let names;
665
- try {
666
- names = yield readdir(dir);
604
+ async listMeta() {
605
+ // No mtimes on purpose: local rows are cheap to hydrate, and the
606
+ // rows' own `updatedAt` orders eviction exactly, immune to coarse
607
+ // filesystem timestamp granularity.
608
+ let names;
609
+ try {
610
+ names = await readdir(dir);
611
+ }
612
+ catch (error) {
613
+ if (error.code === "ENOENT") {
614
+ return [];
667
615
  }
668
- catch (error) {
669
- if (error.code === "ENOENT") {
670
- return [];
671
- }
672
- throw error;
616
+ throw error;
617
+ }
618
+ const metas = [];
619
+ for (const name of names) {
620
+ if (name.startsWith(".")) {
621
+ continue;
673
622
  }
674
- const metas = [];
675
- for (const name of names) {
676
- if (name.startsWith(".")) {
677
- continue;
678
- }
679
- const id = rowIdFromName(name);
680
- if (id !== undefined) {
681
- metas.push({ id });
682
- }
623
+ const id = rowIdFromName(name);
624
+ if (id !== undefined) {
625
+ metas.push({ id });
683
626
  }
684
- return metas;
685
- });
627
+ }
628
+ return metas;
686
629
  },
687
630
  };
688
631
  }
@@ -690,31 +633,25 @@ function createFilesystemContentStore(stateRoot) {
690
633
  const dir = join(stateRoot, "artifacts", "content");
691
634
  const filePath = (id) => join(dir, encodeURIComponent(id));
692
635
  return {
693
- get(id) {
694
- return __awaiter(this, void 0, void 0, function* () {
695
- try {
696
- return new Uint8Array(yield readFile(filePath(id)));
697
- }
698
- catch (error) {
699
- if (error.code === "ENOENT") {
700
- return undefined;
701
- }
702
- throw error;
636
+ async get(id) {
637
+ try {
638
+ return new Uint8Array(await readFile(filePath(id)));
639
+ }
640
+ catch (error) {
641
+ if (error.code === "ENOENT") {
642
+ return undefined;
703
643
  }
704
- });
644
+ throw error;
645
+ }
705
646
  },
706
- put(id, body) {
707
- return __awaiter(this, void 0, void 0, function* () {
708
- yield mkdir(dir, { recursive: true });
709
- const tmp = join(dir, `.tmp-${randomUUID()}`);
710
- yield writeFile(tmp, body);
711
- yield rename(tmp, filePath(id));
712
- });
647
+ async put(id, body) {
648
+ await mkdir(dir, { recursive: true });
649
+ const tmp = join(dir, `.tmp-${randomUUID()}`);
650
+ await writeFile(tmp, body);
651
+ await rename(tmp, filePath(id));
713
652
  },
714
- delete(id) {
715
- return __awaiter(this, void 0, void 0, function* () {
716
- yield rm(filePath(id), { force: true });
717
- });
653
+ async delete(id) {
654
+ await rm(filePath(id), { force: true });
718
655
  },
719
656
  };
720
657
  }