@sixb/core 0.1.20 → 0.1.21

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 (681) hide show
  1. package/dist/actions/execution.d.ts.map +1 -1
  2. package/dist/actions/index.js +54 -47
  3. package/dist/actions/index.js.map +1 -1
  4. package/dist/actions/request.d.ts.map +1 -1
  5. package/dist/actions/run-authorization.d.ts +9 -0
  6. package/dist/actions/run-authorization.d.ts.map +1 -1
  7. package/dist/activity/connection.d.ts +62 -0
  8. package/dist/activity/connection.d.ts.map +1 -0
  9. package/dist/activity/device.d.ts +8 -0
  10. package/dist/activity/device.d.ts.map +1 -0
  11. package/dist/activity/execution.d.ts +48 -0
  12. package/dist/activity/execution.d.ts.map +1 -0
  13. package/dist/activity/service.d.ts +79 -0
  14. package/dist/activity/service.d.ts.map +1 -0
  15. package/dist/activity/shares.d.ts +24 -0
  16. package/dist/activity/shares.d.ts.map +1 -0
  17. package/dist/activity/timeline.d.ts +96 -0
  18. package/dist/activity/timeline.d.ts.map +1 -0
  19. package/dist/agents/index.d.ts +2 -1
  20. package/dist/agents/index.d.ts.map +1 -1
  21. package/dist/agents/index.js +63 -50
  22. package/dist/agents/index.js.map +1 -1
  23. package/dist/agents/request.d.ts.map +1 -1
  24. package/dist/agents/skills.d.ts.map +1 -1
  25. package/dist/agents/streams/index.js +3 -3
  26. package/dist/agents/streams/internal.js +3 -3
  27. package/dist/agents/types.d.ts +8 -8
  28. package/dist/agents/types.d.ts.map +1 -1
  29. package/dist/agents/validation.d.ts +1 -1
  30. package/dist/agents/validation.d.ts.map +1 -1
  31. package/dist/artifacts/address.d.ts +48 -0
  32. package/dist/artifacts/address.d.ts.map +1 -0
  33. package/dist/artifacts/csv.d.ts +22 -0
  34. package/dist/artifacts/csv.d.ts.map +1 -0
  35. package/dist/artifacts/errors.d.ts +11 -0
  36. package/dist/artifacts/errors.d.ts.map +1 -0
  37. package/dist/artifacts/execution.d.ts +43 -0
  38. package/dist/artifacts/execution.d.ts.map +1 -0
  39. package/dist/artifacts/frames/assets.d.ts +28 -0
  40. package/dist/artifacts/frames/assets.d.ts.map +1 -0
  41. package/dist/artifacts/frames/grants.d.ts +37 -0
  42. package/dist/artifacts/frames/grants.d.ts.map +1 -0
  43. package/dist/artifacts/frames/index.d.ts +10 -0
  44. package/dist/artifacts/frames/index.d.ts.map +1 -0
  45. package/dist/artifacts/frames/index.js +892 -0
  46. package/dist/artifacts/frames/index.js.map +14 -0
  47. package/dist/artifacts/frames/kit.d.ts +66 -0
  48. package/dist/artifacts/frames/kit.d.ts.map +1 -0
  49. package/dist/artifacts/frames/probe.d.ts +41 -0
  50. package/dist/artifacts/frames/probe.d.ts.map +1 -0
  51. package/dist/artifacts/frames/protocol.d.ts +98 -0
  52. package/dist/artifacts/frames/protocol.d.ts.map +1 -0
  53. package/dist/artifacts/frames/runtime.d.ts +13 -0
  54. package/dist/artifacts/frames/runtime.d.ts.map +1 -0
  55. package/dist/artifacts/html.d.ts +6 -0
  56. package/dist/artifacts/html.d.ts.map +1 -0
  57. package/dist/artifacts/ids.d.ts +5 -0
  58. package/dist/artifacts/ids.d.ts.map +1 -0
  59. package/dist/artifacts/index.d.ts +16 -0
  60. package/dist/artifacts/index.d.ts.map +1 -0
  61. package/dist/artifacts/index.js +125 -0
  62. package/dist/artifacts/index.js.map +10 -0
  63. package/dist/artifacts/kinds.d.ts +5 -0
  64. package/dist/artifacts/kinds.d.ts.map +1 -0
  65. package/dist/artifacts/limits.d.ts +28 -0
  66. package/dist/artifacts/limits.d.ts.map +1 -0
  67. package/dist/artifacts/outline.d.ts +44 -0
  68. package/dist/artifacts/outline.d.ts.map +1 -0
  69. package/dist/artifacts/publish/files.d.ts +15 -0
  70. package/dist/artifacts/publish/files.d.ts.map +1 -0
  71. package/dist/artifacts/publish/index.d.ts +5 -0
  72. package/dist/artifacts/publish/index.d.ts.map +1 -0
  73. package/dist/artifacts/publish/index.js +36 -0
  74. package/dist/artifacts/publish/index.js.map +9 -0
  75. package/dist/artifacts/publish/publish.d.ts +52 -0
  76. package/dist/artifacts/publish/publish.d.ts.map +1 -0
  77. package/dist/artifacts/publish/references.d.ts +27 -0
  78. package/dist/artifacts/publish/references.d.ts.map +1 -0
  79. package/dist/artifacts/publish/validate/document.d.ts +17 -0
  80. package/dist/artifacts/publish/validate/document.d.ts.map +1 -0
  81. package/dist/artifacts/publish/validate/file.d.ts +8 -0
  82. package/dist/artifacts/publish/validate/file.d.ts.map +1 -0
  83. package/dist/artifacts/publish/validate/sheet.d.ts +15 -0
  84. package/dist/artifacts/publish/validate/sheet.d.ts.map +1 -0
  85. package/dist/artifacts/publish/validate/slides.d.ts +21 -0
  86. package/dist/artifacts/publish/validate/slides.d.ts.map +1 -0
  87. package/dist/artifacts/references.d.ts +12 -0
  88. package/dist/artifacts/references.d.ts.map +1 -0
  89. package/dist/artifacts/resolve.d.ts +41 -0
  90. package/dist/artifacts/resolve.d.ts.map +1 -0
  91. package/dist/artifacts/theme.d.ts +19 -0
  92. package/dist/artifacts/theme.d.ts.map +1 -0
  93. package/dist/artifacts/warnings.d.ts +11 -0
  94. package/dist/artifacts/warnings.d.ts.map +1 -0
  95. package/dist/artifacts/workbook.d.ts +64 -0
  96. package/dist/artifacts/workbook.d.ts.map +1 -0
  97. package/dist/auth/index.js +10 -10
  98. package/dist/authorization/decision.d.ts +2 -0
  99. package/dist/authorization/decision.d.ts.map +1 -1
  100. package/dist/authorization/grant-kinds.d.ts +2 -2
  101. package/dist/authorization/grant-kinds.d.ts.map +1 -1
  102. package/dist/authorization/index.js +6 -6
  103. package/dist/blob-storage/browser.js +1 -1
  104. package/dist/blob-storage/index.js +2 -2
  105. package/dist/blob-storage/internal.d.ts +1 -1
  106. package/dist/blob-storage/internal.d.ts.map +1 -1
  107. package/dist/blob-storage/internal.js +11 -5
  108. package/dist/blob-storage/internal.js.map +1 -1
  109. package/dist/blob-storage/media-type.d.ts +12 -0
  110. package/dist/blob-storage/media-type.d.ts.map +1 -1
  111. package/dist/bootstrap/index.js +53 -47
  112. package/dist/bootstrap/index.js.map +2 -2
  113. package/dist/{chunk-xfs8x8m9.js → chunk-0bphap9y.js} +5 -5
  114. package/dist/{chunk-1zq2p6g0.js → chunk-1cc1xaf3.js} +3 -3
  115. package/dist/chunk-3jms7je7.js +14 -0
  116. package/dist/chunk-3jms7je7.js.map +10 -0
  117. package/dist/{chunk-s54c868q.js → chunk-3qct2mdc.js} +3 -13
  118. package/dist/chunk-3qct2mdc.js.map +12 -0
  119. package/dist/{chunk-t7x8dmn0.js → chunk-431pyp2c.js} +3 -3
  120. package/dist/{chunk-c85m1hyj.js → chunk-447a5c0p.js} +2 -2
  121. package/dist/chunk-48qjhh6v.js +185 -0
  122. package/dist/chunk-48qjhh6v.js.map +13 -0
  123. package/dist/{chunk-ren4kg2j.js → chunk-561r0yc9.js} +8 -8
  124. package/dist/{chunk-5e43w60z.js → chunk-5948n82c.js} +2 -2
  125. package/dist/{chunk-yzwja0mj.js → chunk-5hx48dnn.js} +2 -2
  126. package/dist/{chunk-x6m907x7.js → chunk-5vems3nx.js} +5 -6
  127. package/dist/{chunk-x6m907x7.js.map → chunk-5vems3nx.js.map} +3 -3
  128. package/dist/{chunk-0rbyz4qy.js → chunk-61y5xs4p.js} +560 -164
  129. package/dist/{chunk-0rbyz4qy.js.map → chunk-61y5xs4p.js.map} +12 -9
  130. package/dist/chunk-65abf64x.js +13 -0
  131. package/dist/chunk-65abf64x.js.map +10 -0
  132. package/dist/{chunk-z3y5kg1x.js → chunk-6eqsgvxk.js} +3 -3
  133. package/dist/{chunk-z3y5kg1x.js.map → chunk-6eqsgvxk.js.map} +2 -2
  134. package/dist/chunk-6rqgmkde.js +2028 -0
  135. package/dist/chunk-6rqgmkde.js.map +29 -0
  136. package/dist/{chunk-d0bqz29d.js → chunk-6vb4st8k.js} +8 -4
  137. package/dist/{chunk-d0bqz29d.js.map → chunk-6vb4st8k.js.map} +3 -3
  138. package/dist/chunk-7q8t23v4.js +467 -0
  139. package/dist/chunk-7q8t23v4.js.map +14 -0
  140. package/dist/{chunk-5j58wjct.js → chunk-858emn8m.js} +6 -6
  141. package/dist/{chunk-hvsb78a1.js → chunk-8frc8a4j.js} +26 -26
  142. package/dist/{chunk-hvsb78a1.js.map → chunk-8frc8a4j.js.map} +2 -2
  143. package/dist/{chunk-3zxk45er.js → chunk-8ncg20rd.js} +3 -68
  144. package/dist/{chunk-3zxk45er.js.map → chunk-8ncg20rd.js.map} +4 -5
  145. package/dist/{chunk-n33z5bjw.js → chunk-918wwnaa.js} +490 -24
  146. package/dist/{chunk-n33z5bjw.js.map → chunk-918wwnaa.js.map} +13 -11
  147. package/dist/{chunk-rrzt8jdy.js → chunk-9j4jw7as.js} +103 -110
  148. package/dist/chunk-9j4jw7as.js.map +14 -0
  149. package/dist/chunk-9kgkfg6v.js +502 -0
  150. package/dist/chunk-9kgkfg6v.js.map +14 -0
  151. package/dist/chunk-a3faa34j.js +74 -0
  152. package/dist/chunk-a3faa34j.js.map +10 -0
  153. package/dist/{chunk-6c6sn0bh.js → chunk-akzryx9h.js} +335 -1167
  154. package/dist/{chunk-6c6sn0bh.js.map → chunk-akzryx9h.js.map} +18 -24
  155. package/dist/chunk-arns890k.js +10 -0
  156. package/dist/chunk-arns890k.js.map +10 -0
  157. package/dist/{chunk-hjzdd750.js → chunk-bk9svbcq.js} +11 -11
  158. package/dist/{chunk-hjzdd750.js.map → chunk-bk9svbcq.js.map} +2 -2
  159. package/dist/{chunk-hkc3jct7.js → chunk-c06hmxyy.js} +2 -10
  160. package/dist/chunk-c06hmxyy.js.map +10 -0
  161. package/dist/{chunk-6p49a5cq.js → chunk-c1rxbz5y.js} +3 -3
  162. package/dist/chunk-cfj9dfbb.js +288 -0
  163. package/dist/chunk-cfj9dfbb.js.map +12 -0
  164. package/dist/{chunk-bx9q3cwv.js → chunk-cn0fwwhy.js} +7 -7
  165. package/dist/{chunk-bx9q3cwv.js.map → chunk-cn0fwwhy.js.map} +1 -1
  166. package/dist/{chunk-gc4ntf7d.js → chunk-cwdzcv37.js} +1 -1
  167. package/dist/{chunk-fa02jy15.js → chunk-cy4mbddw.js} +1 -1
  168. package/dist/{chunk-9w055r5b.js → chunk-d09e3rax.js} +1 -1
  169. package/dist/chunk-d5rjr8c0.js +176 -0
  170. package/dist/chunk-d5rjr8c0.js.map +12 -0
  171. package/dist/{chunk-dk8tkk5f.js → chunk-d7dnxdep.js} +3 -3
  172. package/dist/{chunk-b38szspf.js → chunk-dhcv7yxc.js} +1 -1
  173. package/dist/{chunk-b38szspf.js.map → chunk-dhcv7yxc.js.map} +1 -1
  174. package/dist/{chunk-gsjm1wms.js → chunk-dhdha526.js} +8 -2
  175. package/dist/chunk-dhdha526.js.map +10 -0
  176. package/dist/{chunk-8mx7qw3y.js → chunk-dvd2fp9q.js} +2 -2
  177. package/dist/{chunk-8mx7qw3y.js.map → chunk-dvd2fp9q.js.map} +3 -3
  178. package/dist/{chunk-way52z4h.js → chunk-e17zdm62.js} +6 -12
  179. package/dist/{chunk-way52z4h.js.map → chunk-e17zdm62.js.map} +3 -4
  180. package/dist/{chunk-tpn40322.js → chunk-e6k4thh5.js} +11 -10
  181. package/dist/{chunk-tpn40322.js.map → chunk-e6k4thh5.js.map} +3 -3
  182. package/dist/{chunk-tw03bsmb.js → chunk-eptrvnby.js} +224 -3
  183. package/dist/chunk-eptrvnby.js.map +12 -0
  184. package/dist/{chunk-es1gxsbf.js → chunk-f4pamkt9.js} +8 -10
  185. package/dist/chunk-f4pamkt9.js.map +12 -0
  186. package/dist/chunk-ff5xkv0p.js +211 -0
  187. package/dist/chunk-ff5xkv0p.js.map +10 -0
  188. package/dist/{chunk-d09tj99x.js → chunk-g257jwnc.js} +10 -4
  189. package/dist/{chunk-d09tj99x.js.map → chunk-g257jwnc.js.map} +3 -3
  190. package/dist/chunk-g5bvzyyr.js +32 -0
  191. package/dist/chunk-g5bvzyyr.js.map +10 -0
  192. package/dist/chunk-hke9aeen.js +9 -0
  193. package/dist/chunk-hke9aeen.js.map +10 -0
  194. package/dist/{chunk-1sr8ryzk.js → chunk-hwksyjks.js} +122 -1
  195. package/dist/{chunk-1sr8ryzk.js.map → chunk-hwksyjks.js.map} +3 -3
  196. package/dist/chunk-jcfw4h7m.js +9 -0
  197. package/dist/chunk-jcfw4h7m.js.map +10 -0
  198. package/dist/{chunk-k6q3n2sc.js → chunk-k43ct2ke.js} +20 -11
  199. package/dist/chunk-k43ct2ke.js.map +12 -0
  200. package/dist/{chunk-3t2hgbgd.js → chunk-kge7k6ey.js} +40 -8
  201. package/dist/chunk-kge7k6ey.js.map +15 -0
  202. package/dist/{chunk-tg2cw67r.js → chunk-ky3j490c.js} +2 -2
  203. package/dist/chunk-mjddfa7k.js +129 -0
  204. package/dist/chunk-mjddfa7k.js.map +12 -0
  205. package/dist/{chunk-vpq4shxz.js → chunk-nn5xnx3s.js} +45 -10
  206. package/dist/{chunk-vpq4shxz.js.map → chunk-nn5xnx3s.js.map} +7 -6
  207. package/dist/{chunk-0yh890a4.js → chunk-q5e5tv4b.js} +35 -7
  208. package/dist/{chunk-0yh890a4.js.map → chunk-q5e5tv4b.js.map} +3 -3
  209. package/dist/{chunk-vyf9kfqf.js → chunk-q7gn29y3.js} +1 -1
  210. package/dist/{chunk-yevzdx4y.js → chunk-rmakanzx.js} +10 -12
  211. package/dist/{chunk-yevzdx4y.js.map → chunk-rmakanzx.js.map} +3 -4
  212. package/dist/{chunk-v9xd5wzd.js → chunk-s7jg7pmn.js} +1 -1
  213. package/dist/chunk-tbc1ngpd.js +642 -0
  214. package/dist/chunk-tbc1ngpd.js.map +18 -0
  215. package/dist/chunk-twe4dx8p.js +676 -0
  216. package/dist/chunk-twe4dx8p.js.map +15 -0
  217. package/dist/{chunk-9dmt152s.js → chunk-vf57cr4t.js} +2 -2
  218. package/dist/{chunk-9ybhtmg4.js → chunk-vvxtn22d.js} +1 -1
  219. package/dist/{chunk-jhm3zsa7.js → chunk-wkv3h3q7.js} +64 -2
  220. package/dist/{chunk-jhm3zsa7.js.map → chunk-wkv3h3q7.js.map} +3 -3
  221. package/dist/chunk-x0v3jd47.js +124 -0
  222. package/dist/chunk-x0v3jd47.js.map +10 -0
  223. package/dist/{chunk-7t429e3f.js → chunk-xvsc5m8n.js} +1 -1
  224. package/dist/{chunk-z4m0yz8c.js → chunk-y5tah2kf.js} +1 -1
  225. package/dist/{chunk-fkgc1wt8.js → chunk-z58tm0hm.js} +2 -2
  226. package/dist/datasets/builders.d.ts +15 -2
  227. package/dist/datasets/builders.d.ts.map +1 -1
  228. package/dist/datasets/column-index.d.ts +7 -0
  229. package/dist/datasets/column-index.d.ts.map +1 -0
  230. package/dist/datasets/execution.d.ts +3 -2
  231. package/dist/datasets/execution.d.ts.map +1 -1
  232. package/dist/datasets/write.js +8 -8
  233. package/dist/error-reporting/internal.js +4 -4
  234. package/dist/errors/internal.d.ts +1 -0
  235. package/dist/errors/internal.d.ts.map +1 -1
  236. package/dist/errors/internal.js +7 -4
  237. package/dist/errors/internal.js.map +1 -1
  238. package/dist/events/execution.d.ts +12 -2
  239. package/dist/events/execution.d.ts.map +1 -1
  240. package/dist/events/index.js +4 -4
  241. package/dist/execution/agent.js +56 -49
  242. package/dist/execution/agent.js.map +1 -1
  243. package/dist/execution/authorized-object-reader.d.ts +52 -11
  244. package/dist/execution/authorized-object-reader.d.ts.map +1 -1
  245. package/dist/execution/object-reader-clearance.d.ts +41 -0
  246. package/dist/execution/object-reader-clearance.d.ts.map +1 -0
  247. package/dist/execution/object-reader-ontology.d.ts +12 -0
  248. package/dist/execution/object-reader-ontology.d.ts.map +1 -0
  249. package/dist/execution/object-reader-security.d.ts +45 -0
  250. package/dist/execution/object-reader-security.d.ts.map +1 -0
  251. package/dist/execution/primitive.js +54 -47
  252. package/dist/execution/primitive.js.map +1 -1
  253. package/dist/execution/request.js +48 -41
  254. package/dist/execution/request.js.map +2 -2
  255. package/dist/http/api-routes.d.ts.map +1 -1
  256. package/dist/http/index.js +1 -1
  257. package/dist/index.d.ts +20 -4
  258. package/dist/index.d.ts.map +1 -1
  259. package/dist/index.js +112 -97
  260. package/dist/index.js.map +1 -1
  261. package/dist/lake-storage/in-memory.d.ts +1 -0
  262. package/dist/lake-storage/in-memory.d.ts.map +1 -1
  263. package/dist/lake-storage/index.d.ts +6 -3
  264. package/dist/lake-storage/index.d.ts.map +1 -1
  265. package/dist/lake-storage/index.js +21 -13
  266. package/dist/lake-storage/index.js.map +1 -1
  267. package/dist/lake-storage/lineage.d.ts +94 -0
  268. package/dist/lake-storage/lineage.d.ts.map +1 -0
  269. package/dist/lake-storage/sql-transforms.d.ts +45 -0
  270. package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
  271. package/dist/lake-storage/types.d.ts +55 -1
  272. package/dist/lake-storage/types.d.ts.map +1 -1
  273. package/dist/lake-storage/version-inputs.d.ts +14 -3
  274. package/dist/lake-storage/version-inputs.d.ts.map +1 -1
  275. package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
  276. package/dist/materializer/index.js +31 -30
  277. package/dist/materializer/index.js.map +1 -1
  278. package/dist/models/execution/index.js +25 -24
  279. package/dist/models/execution/index.js.map +1 -1
  280. package/dist/objects/clearance-redaction.d.ts +27 -0
  281. package/dist/objects/clearance-redaction.d.ts.map +1 -0
  282. package/dist/objects/index.js +54 -47
  283. package/dist/objects/index.js.map +1 -1
  284. package/dist/objects/link/authorization.d.ts +8 -5
  285. package/dist/objects/link/authorization.d.ts.map +1 -1
  286. package/dist/objects/link/upsert-batch.d.ts.map +1 -1
  287. package/dist/objects/object/delete.d.ts.map +1 -1
  288. package/dist/objects/object/upsert-batch.d.ts.map +1 -1
  289. package/dist/objects/object/upsert.d.ts.map +1 -1
  290. package/dist/objects/property-clearance.d.ts +47 -24
  291. package/dist/objects/property-clearance.d.ts.map +1 -1
  292. package/dist/objects/query/clearance-admission.d.ts +10 -0
  293. package/dist/objects/query/clearance-admission.d.ts.map +1 -0
  294. package/dist/objects/query/index.js +29 -28
  295. package/dist/objects/query/index.js.map +1 -1
  296. package/dist/objects/query/link-query-clearance.d.ts +21 -0
  297. package/dist/objects/query/link-query-clearance.d.ts.map +1 -0
  298. package/dist/ontology/builders.d.ts.map +1 -1
  299. package/dist/ontology/docs-markdown.d.ts +1 -1
  300. package/dist/ontology/docs-markdown.d.ts.map +1 -1
  301. package/dist/ontology/index.js +7 -7
  302. package/dist/ontology/internal.js +4 -4
  303. package/dist/ontology/internal.js.map +1 -1
  304. package/dist/pipelines/index.d.ts +2 -0
  305. package/dist/pipelines/index.d.ts.map +1 -1
  306. package/dist/pipelines/index.js +47 -35
  307. package/dist/pipelines/index.js.map +1 -1
  308. package/dist/pipelines/lineage.d.ts +17 -0
  309. package/dist/pipelines/lineage.d.ts.map +1 -0
  310. package/dist/projections/internal.d.ts +2 -2
  311. package/dist/projections/internal.js +30 -29
  312. package/dist/projections/internal.js.map +1 -1
  313. package/dist/runtime/create.d.ts +3 -0
  314. package/dist/runtime/create.d.ts.map +1 -1
  315. package/dist/runtime/host.d.ts +6 -0
  316. package/dist/runtime/host.d.ts.map +1 -1
  317. package/dist/runtime/internal.d.ts +2 -0
  318. package/dist/runtime/internal.d.ts.map +1 -1
  319. package/dist/runtime/internal.js +46 -42
  320. package/dist/runtime/internal.js.map +1 -1
  321. package/dist/runtime/ontology-mutations.d.ts +2 -0
  322. package/dist/runtime/ontology-mutations.d.ts.map +1 -1
  323. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  324. package/dist/runtime/sixb.d.ts +8 -0
  325. package/dist/runtime/sixb.d.ts.map +1 -1
  326. package/dist/sandboxes/auth.d.ts +16 -0
  327. package/dist/sandboxes/auth.d.ts.map +1 -1
  328. package/dist/sandboxes/config.d.ts.map +1 -1
  329. package/dist/sandboxes/configuration.d.ts +26 -0
  330. package/dist/sandboxes/configuration.d.ts.map +1 -1
  331. package/dist/sandboxes/index.d.ts +1 -1
  332. package/dist/sandboxes/index.d.ts.map +1 -1
  333. package/dist/sandboxes/index.js +14 -13
  334. package/dist/sandboxes/index.js.map +1 -1
  335. package/dist/sandboxes/sandbox.d.ts +28 -5
  336. package/dist/sandboxes/sandbox.d.ts.map +1 -1
  337. package/dist/security/applied-markings-contribution.d.ts +58 -0
  338. package/dist/security/applied-markings-contribution.d.ts.map +1 -0
  339. package/dist/security/applied-markings-host.d.ts +10 -0
  340. package/dist/security/applied-markings-host.d.ts.map +1 -0
  341. package/dist/security/applied-markings-snapshot.d.ts +67 -0
  342. package/dist/security/applied-markings-snapshot.d.ts.map +1 -0
  343. package/dist/security/applied-markings.d.ts +73 -0
  344. package/dist/security/applied-markings.d.ts.map +1 -0
  345. package/dist/security/dataset-version-markings.d.ts +47 -0
  346. package/dist/security/dataset-version-markings.d.ts.map +1 -0
  347. package/dist/security/grants.d.ts +3 -2
  348. package/dist/security/grants.d.ts.map +1 -1
  349. package/dist/security/index.d.ts +2 -1
  350. package/dist/security/index.d.ts.map +1 -1
  351. package/dist/security/internal.d.ts +15 -0
  352. package/dist/security/internal.d.ts.map +1 -0
  353. package/dist/security/internal.js +135 -0
  354. package/dist/security/internal.js.map +10 -0
  355. package/dist/security/marking-propagation.d.ts +62 -0
  356. package/dist/security/marking-propagation.d.ts.map +1 -0
  357. package/dist/security/marking-sets.d.ts +14 -0
  358. package/dist/security/marking-sets.d.ts.map +1 -0
  359. package/dist/security/markings.d.ts +6 -3
  360. package/dist/security/markings.d.ts.map +1 -1
  361. package/dist/security/pipeline-markings.d.ts +20 -0
  362. package/dist/security/pipeline-markings.d.ts.map +1 -0
  363. package/dist/security/project.d.ts +4 -0
  364. package/dist/security/project.d.ts.map +1 -0
  365. package/dist/security/projection-markings.d.ts +71 -0
  366. package/dist/security/projection-markings.d.ts.map +1 -0
  367. package/dist/security/public.js +2 -2
  368. package/dist/security/redactions.d.ts +4 -1
  369. package/dist/security/redactions.d.ts.map +1 -1
  370. package/dist/security/types.d.ts +22 -2
  371. package/dist/security/types.d.ts.map +1 -1
  372. package/dist/security/validation.d.ts.map +1 -1
  373. package/dist/shares/internal.js +24 -23
  374. package/dist/shares/internal.js.map +2 -2
  375. package/dist/storage/action-runs/failure.js +3 -3
  376. package/dist/storage/action-runs/in-memory.d.ts +4 -0
  377. package/dist/storage/action-runs/in-memory.d.ts.map +1 -1
  378. package/dist/storage/action-runs/types.d.ts +8 -0
  379. package/dist/storage/action-runs/types.d.ts.map +1 -1
  380. package/dist/storage/activity/in-memory.d.ts +55 -0
  381. package/dist/storage/activity/in-memory.d.ts.map +1 -0
  382. package/dist/storage/activity/index.d.ts +3 -0
  383. package/dist/storage/activity/index.d.ts.map +1 -0
  384. package/dist/storage/activity/policy.d.ts +96 -0
  385. package/dist/storage/activity/policy.d.ts.map +1 -0
  386. package/dist/storage/activity/types.d.ts +191 -0
  387. package/dist/storage/activity/types.d.ts.map +1 -0
  388. package/dist/storage/agents/in-memory.d.ts +4 -0
  389. package/dist/storage/agents/in-memory.d.ts.map +1 -1
  390. package/dist/storage/agents/provider.d.ts.map +1 -1
  391. package/dist/storage/agents/provider.js +2 -5
  392. package/dist/storage/agents/provider.js.map +1 -1
  393. package/dist/storage/agents/types.d.ts +9 -8
  394. package/dist/storage/agents/types.d.ts.map +1 -1
  395. package/dist/storage/ai-limits/enforcement.js +3 -3
  396. package/dist/storage/artifacts/errors.d.ts +8 -0
  397. package/dist/storage/artifacts/errors.d.ts.map +1 -0
  398. package/dist/storage/artifacts/in-memory.d.ts +34 -0
  399. package/dist/storage/artifacts/in-memory.d.ts.map +1 -0
  400. package/dist/storage/artifacts/index.d.ts +5 -0
  401. package/dist/storage/artifacts/index.d.ts.map +1 -0
  402. package/dist/storage/artifacts/record.d.ts +17 -0
  403. package/dist/storage/artifacts/record.d.ts.map +1 -0
  404. package/dist/storage/artifacts/types.d.ts +184 -0
  405. package/dist/storage/artifacts/types.d.ts.map +1 -0
  406. package/dist/storage/auth/in-memory/sessions.d.ts +2 -1
  407. package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
  408. package/dist/storage/auth/index.d.ts +1 -1
  409. package/dist/storage/auth/index.d.ts.map +1 -1
  410. package/dist/storage/auth/types.d.ts +19 -0
  411. package/dist/storage/auth/types.d.ts.map +1 -1
  412. package/dist/storage/connector-connections/provider.js +2 -2
  413. package/dist/storage/executions/in-memory.d.ts +2 -1
  414. package/dist/storage/executions/in-memory.d.ts.map +1 -1
  415. package/dist/storage/executions/index.d.ts +1 -1
  416. package/dist/storage/executions/index.d.ts.map +1 -1
  417. package/dist/storage/executions/provider.d.ts +2 -0
  418. package/dist/storage/executions/provider.d.ts.map +1 -1
  419. package/dist/storage/executions/provider.js +9 -223
  420. package/dist/storage/executions/provider.js.map +3 -4
  421. package/dist/storage/executions/types.d.ts +31 -0
  422. package/dist/storage/executions/types.d.ts.map +1 -1
  423. package/dist/storage/file-upload-sessions/provider.js +11 -11
  424. package/dist/storage/in-memory/index.d.ts +8 -0
  425. package/dist/storage/in-memory/index.d.ts.map +1 -1
  426. package/dist/storage/index.d.ts +6 -4
  427. package/dist/storage/index.d.ts.map +1 -1
  428. package/dist/storage/index.js +54 -53
  429. package/dist/storage/index.js.map +1 -1
  430. package/dist/storage/internal.d.ts +3 -0
  431. package/dist/storage/internal.d.ts.map +1 -1
  432. package/dist/storage/internal.js +66 -16
  433. package/dist/storage/internal.js.map +1 -1
  434. package/dist/storage/ontology/in-memory/sources.d.ts +2 -1
  435. package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
  436. package/dist/storage/ontology/index.d.ts +1 -1
  437. package/dist/storage/ontology/index.d.ts.map +1 -1
  438. package/dist/storage/ontology/sources.d.ts +15 -0
  439. package/dist/storage/ontology/sources.d.ts.map +1 -1
  440. package/dist/storage/projection-runs/provider.js +3 -3
  441. package/dist/storage/share-grants/in-memory.d.ts +2 -1
  442. package/dist/storage/share-grants/in-memory.d.ts.map +1 -1
  443. package/dist/storage/share-grants/index.d.ts +1 -1
  444. package/dist/storage/share-grants/index.d.ts.map +1 -1
  445. package/dist/storage/share-grants/types.d.ts +6 -0
  446. package/dist/storage/share-grants/types.d.ts.map +1 -1
  447. package/dist/storage/types.d.ts +4 -0
  448. package/dist/storage/types.d.ts.map +1 -1
  449. package/dist/storage/workflow-runs/in-memory.d.ts +4 -0
  450. package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -1
  451. package/dist/storage/workflow-runs/provider.js +13 -12
  452. package/dist/storage/workflow-runs/provider.js.map +1 -1
  453. package/dist/storage/workflow-runs/types.d.ts +5 -0
  454. package/dist/storage/workflow-runs/types.d.ts.map +1 -1
  455. package/dist/syncs/index.js +35 -34
  456. package/dist/syncs/index.js.map +1 -1
  457. package/dist/testing/action-run-storage-contract.d.ts.map +1 -1
  458. package/dist/testing/activity-storage-contract.d.ts +14 -0
  459. package/dist/testing/activity-storage-contract.d.ts.map +1 -0
  460. package/dist/testing/agent-storage-contract.d.ts.map +1 -1
  461. package/dist/testing/artifact-storage-contract.d.ts +13 -0
  462. package/dist/testing/artifact-storage-contract.d.ts.map +1 -0
  463. package/dist/testing/auth-storage-contract.d.ts.map +1 -1
  464. package/dist/testing/execution-storage-contract.d.ts.map +1 -1
  465. package/dist/testing/index.d.ts +2 -0
  466. package/dist/testing/index.d.ts.map +1 -1
  467. package/dist/testing/index.js +4488 -3137
  468. package/dist/testing/index.js.map +14 -12
  469. package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
  470. package/dist/testing/lake-storage-contract.d.ts +2 -0
  471. package/dist/testing/lake-storage-contract.d.ts.map +1 -1
  472. package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
  473. package/dist/testing/share-grant-storage-contract.d.ts.map +1 -1
  474. package/dist/webhooks/internal.js +27 -26
  475. package/dist/webhooks/internal.js.map +2 -2
  476. package/dist/workers/index.js +2 -2
  477. package/dist/workflows/builders.d.ts.map +1 -1
  478. package/dist/workflows/index.js +57 -51
  479. package/dist/workflows/index.js.map +1 -1
  480. package/dist/workflows/types.d.ts +9 -0
  481. package/dist/workflows/types.d.ts.map +1 -1
  482. package/dist/workflows/validation.d.ts +7 -0
  483. package/dist/workflows/validation.d.ts.map +1 -1
  484. package/package.json +25 -1
  485. package/src/actions/execution.ts +18 -13
  486. package/src/actions/request.ts +18 -3
  487. package/src/actions/run-authorization.ts +23 -0
  488. package/src/activity/README.md +155 -0
  489. package/src/activity/connection.ts +217 -0
  490. package/src/activity/device.ts +41 -0
  491. package/src/activity/execution.ts +210 -0
  492. package/src/activity/service.ts +274 -0
  493. package/src/activity/shares.ts +62 -0
  494. package/src/activity/timeline.ts +424 -0
  495. package/src/agents/index.ts +8 -3
  496. package/src/agents/request.ts +5 -0
  497. package/src/agents/skills.ts +6 -0
  498. package/src/agents/types.ts +8 -8
  499. package/src/agents/validation.ts +2 -0
  500. package/src/artifacts/address.ts +132 -0
  501. package/src/artifacts/csv.ts +108 -0
  502. package/src/artifacts/errors.ts +21 -0
  503. package/src/artifacts/execution.ts +153 -0
  504. package/src/artifacts/frames/assets.ts +88 -0
  505. package/src/artifacts/frames/grants.ts +124 -0
  506. package/src/artifacts/frames/index.ts +15 -0
  507. package/src/artifacts/frames/kit.ts +392 -0
  508. package/src/artifacts/frames/probe.ts +309 -0
  509. package/src/artifacts/frames/protocol.ts +174 -0
  510. package/src/artifacts/frames/runtime.ts +213 -0
  511. package/src/artifacts/html.ts +25 -0
  512. package/src/artifacts/ids.ts +18 -0
  513. package/src/artifacts/index.ts +61 -0
  514. package/src/artifacts/kinds.ts +8 -0
  515. package/src/artifacts/limits.ts +27 -0
  516. package/src/artifacts/outline.ts +62 -0
  517. package/src/artifacts/publish/files.ts +87 -0
  518. package/src/artifacts/publish/index.ts +12 -0
  519. package/src/artifacts/publish/publish.ts +250 -0
  520. package/src/artifacts/publish/references.ts +130 -0
  521. package/src/artifacts/publish/validate/document.ts +114 -0
  522. package/src/artifacts/publish/validate/file.ts +19 -0
  523. package/src/artifacts/publish/validate/sheet.ts +251 -0
  524. package/src/artifacts/publish/validate/slides.ts +134 -0
  525. package/src/artifacts/references.ts +11 -0
  526. package/src/artifacts/resolve.ts +97 -0
  527. package/src/artifacts/theme.ts +116 -0
  528. package/src/artifacts/warnings.ts +10 -0
  529. package/src/artifacts/workbook.ts +315 -0
  530. package/src/authorization/decision.ts +5 -0
  531. package/src/authorization/grant-kinds.ts +14 -2
  532. package/src/blob-storage/internal.ts +1 -1
  533. package/src/blob-storage/media-type.ts +69 -0
  534. package/src/datasets/builders.ts +66 -2
  535. package/src/datasets/column-index.ts +19 -0
  536. package/src/datasets/execution.ts +23 -9
  537. package/src/errors/internal.ts +1 -0
  538. package/src/events/execution.ts +134 -21
  539. package/src/execution/authorized-object-reader.ts +270 -256
  540. package/src/execution/object-reader-clearance.ts +91 -0
  541. package/src/execution/object-reader-ontology.ts +63 -0
  542. package/src/execution/object-reader-security.ts +146 -0
  543. package/src/http/api-routes.ts +125 -0
  544. package/src/index.ts +71 -3
  545. package/src/lake-storage/in-memory.ts +26 -3
  546. package/src/lake-storage/index.ts +13 -1
  547. package/src/lake-storage/lineage.ts +385 -0
  548. package/src/lake-storage/sql-transforms.ts +45 -0
  549. package/src/lake-storage/types.ts +59 -1
  550. package/src/lake-storage/version-inputs.ts +35 -6
  551. package/src/maintenance/ontology-maintenance.ts +15 -0
  552. package/src/objects/clearance-redaction.ts +138 -0
  553. package/src/objects/link/authorization.ts +27 -7
  554. package/src/objects/link/remove.ts +2 -2
  555. package/src/objects/link/upsert-batch.ts +7 -5
  556. package/src/objects/link/upsert.ts +2 -2
  557. package/src/objects/object/delete.ts +2 -0
  558. package/src/objects/object/upsert-batch.ts +2 -4
  559. package/src/objects/object/upsert.ts +2 -3
  560. package/src/objects/property-clearance.ts +171 -152
  561. package/src/objects/query/clearance-admission.ts +112 -0
  562. package/src/objects/query/link-query-clearance.ts +73 -0
  563. package/src/ontology/builders.ts +12 -1
  564. package/src/ontology/docs-markdown.ts +1 -1
  565. package/src/pipelines/index.ts +2 -0
  566. package/src/pipelines/lineage.ts +45 -0
  567. package/src/projections/internal.ts +2 -2
  568. package/src/runtime/create.ts +4 -0
  569. package/src/runtime/host.ts +55 -0
  570. package/src/runtime/internal.ts +2 -0
  571. package/src/runtime/ontology-mutations.ts +19 -4
  572. package/src/runtime/resolve-definitions.ts +66 -3
  573. package/src/runtime/sixb.ts +18 -1
  574. package/src/sandboxes/README.md +29 -7
  575. package/src/sandboxes/auth.ts +16 -0
  576. package/src/sandboxes/config.ts +2 -7
  577. package/src/sandboxes/configuration.ts +61 -7
  578. package/src/sandboxes/index.ts +1 -0
  579. package/src/sandboxes/sandbox.ts +27 -5
  580. package/src/security/applied-markings-contribution.ts +277 -0
  581. package/src/security/applied-markings-host.ts +41 -0
  582. package/src/security/applied-markings-snapshot.ts +235 -0
  583. package/src/security/applied-markings.ts +405 -0
  584. package/src/security/dataset-version-markings.ts +163 -0
  585. package/src/security/grants.ts +39 -4
  586. package/src/security/index.ts +3 -0
  587. package/src/security/internal.ts +18 -0
  588. package/src/security/marking-propagation.ts +255 -0
  589. package/src/security/marking-sets.ts +42 -0
  590. package/src/security/markings.ts +29 -178
  591. package/src/security/pipeline-markings.ts +175 -0
  592. package/src/security/project.ts +8 -0
  593. package/src/security/projection-markings.ts +421 -0
  594. package/src/security/redactions.ts +7 -2
  595. package/src/security/types.ts +20 -2
  596. package/src/security/validation.ts +11 -4
  597. package/src/storage/action-runs/in-memory.ts +18 -0
  598. package/src/storage/action-runs/types.ts +8 -0
  599. package/src/storage/activity/in-memory.ts +374 -0
  600. package/src/storage/activity/index.ts +27 -0
  601. package/src/storage/activity/policy.ts +430 -0
  602. package/src/storage/activity/types.ts +211 -0
  603. package/src/storage/agents/in-memory.ts +10 -0
  604. package/src/storage/agents/provider.ts +2 -13
  605. package/src/storage/agents/types.ts +9 -16
  606. package/src/storage/artifacts/errors.ts +16 -0
  607. package/src/storage/artifacts/in-memory.ts +240 -0
  608. package/src/storage/artifacts/index.ts +30 -0
  609. package/src/storage/artifacts/record.ts +200 -0
  610. package/src/storage/artifacts/types.ts +209 -0
  611. package/src/storage/auth/in-memory/sessions.ts +21 -0
  612. package/src/storage/auth/index.ts +2 -0
  613. package/src/storage/auth/types.ts +18 -0
  614. package/src/storage/executions/in-memory.ts +61 -1
  615. package/src/storage/executions/index.ts +3 -0
  616. package/src/storage/executions/provider.ts +12 -0
  617. package/src/storage/executions/types.ts +30 -0
  618. package/src/storage/in-memory/index.ts +16 -0
  619. package/src/storage/index.ts +63 -0
  620. package/src/storage/internal.ts +30 -0
  621. package/src/storage/ontology/in-memory/sources.ts +23 -0
  622. package/src/storage/ontology/index.ts +2 -0
  623. package/src/storage/ontology/sources.ts +17 -0
  624. package/src/storage/share-grants/in-memory.ts +8 -0
  625. package/src/storage/share-grants/index.ts +1 -0
  626. package/src/storage/share-grants/types.ts +8 -0
  627. package/src/storage/types.ts +4 -0
  628. package/src/storage/workflow-runs/in-memory.ts +16 -0
  629. package/src/storage/workflow-runs/types.ts +5 -0
  630. package/src/testing/action-run-storage-contract.ts +25 -0
  631. package/src/testing/activity-storage-contract.ts +840 -0
  632. package/src/testing/agent-storage-contract.ts +22 -21
  633. package/src/testing/artifact-storage-contract.ts +517 -0
  634. package/src/testing/auth-storage-contract.ts +47 -0
  635. package/src/testing/execution-storage-contract.ts +147 -1
  636. package/src/testing/index.ts +9 -0
  637. package/src/testing/lake-merge-storage-contract.ts +38 -0
  638. package/src/testing/lake-storage-contract.ts +247 -2
  639. package/src/testing/materializer-storage-contract.ts +1 -0
  640. package/src/testing/ontology-storage-contract.ts +57 -2
  641. package/src/testing/share-grant-storage-contract.ts +15 -0
  642. package/src/workflows/builders.ts +14 -0
  643. package/src/workflows/types.ts +9 -0
  644. package/src/workflows/validation.ts +72 -0
  645. package/dist/chunk-1k89ecfr.js +0 -85
  646. package/dist/chunk-1k89ecfr.js.map +0 -10
  647. package/dist/chunk-3t2hgbgd.js.map +0 -15
  648. package/dist/chunk-4vyr1j8f.js +0 -128
  649. package/dist/chunk-4vyr1j8f.js.map +0 -11
  650. package/dist/chunk-9gyp8hg1.js +0 -363
  651. package/dist/chunk-9gyp8hg1.js.map +0 -14
  652. package/dist/chunk-es1gxsbf.js.map +0 -13
  653. package/dist/chunk-gsjm1wms.js.map +0 -10
  654. package/dist/chunk-hkc3jct7.js.map +0 -10
  655. package/dist/chunk-k6q3n2sc.js.map +0 -12
  656. package/dist/chunk-rrzt8jdy.js.map +0 -14
  657. package/dist/chunk-s16apyk9.js +0 -256
  658. package/dist/chunk-s16apyk9.js.map +0 -16
  659. package/dist/chunk-s54c868q.js.map +0 -12
  660. package/dist/chunk-tw03bsmb.js.map +0 -11
  661. /package/dist/{chunk-xfs8x8m9.js.map → chunk-0bphap9y.js.map} +0 -0
  662. /package/dist/{chunk-1zq2p6g0.js.map → chunk-1cc1xaf3.js.map} +0 -0
  663. /package/dist/{chunk-t7x8dmn0.js.map → chunk-431pyp2c.js.map} +0 -0
  664. /package/dist/{chunk-c85m1hyj.js.map → chunk-447a5c0p.js.map} +0 -0
  665. /package/dist/{chunk-ren4kg2j.js.map → chunk-561r0yc9.js.map} +0 -0
  666. /package/dist/{chunk-5e43w60z.js.map → chunk-5948n82c.js.map} +0 -0
  667. /package/dist/{chunk-yzwja0mj.js.map → chunk-5hx48dnn.js.map} +0 -0
  668. /package/dist/{chunk-5j58wjct.js.map → chunk-858emn8m.js.map} +0 -0
  669. /package/dist/{chunk-6p49a5cq.js.map → chunk-c1rxbz5y.js.map} +0 -0
  670. /package/dist/{chunk-gc4ntf7d.js.map → chunk-cwdzcv37.js.map} +0 -0
  671. /package/dist/{chunk-fa02jy15.js.map → chunk-cy4mbddw.js.map} +0 -0
  672. /package/dist/{chunk-9w055r5b.js.map → chunk-d09e3rax.js.map} +0 -0
  673. /package/dist/{chunk-dk8tkk5f.js.map → chunk-d7dnxdep.js.map} +0 -0
  674. /package/dist/{chunk-tg2cw67r.js.map → chunk-ky3j490c.js.map} +0 -0
  675. /package/dist/{chunk-vyf9kfqf.js.map → chunk-q7gn29y3.js.map} +0 -0
  676. /package/dist/{chunk-v9xd5wzd.js.map → chunk-s7jg7pmn.js.map} +0 -0
  677. /package/dist/{chunk-9dmt152s.js.map → chunk-vf57cr4t.js.map} +0 -0
  678. /package/dist/{chunk-9ybhtmg4.js.map → chunk-vvxtn22d.js.map} +0 -0
  679. /package/dist/{chunk-7t429e3f.js.map → chunk-xvsc5m8n.js.map} +0 -0
  680. /package/dist/{chunk-z4m0yz8c.js.map → chunk-y5tah2kf.js.map} +0 -0
  681. /package/dist/{chunk-fkgc1wt8.js.map → chunk-z58tm0hm.js.map} +0 -0
@@ -565,6 +565,20 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
565
565
  })
566
566
  })
567
567
 
568
+ test("reads several threads at once, in the order asked", async () => {
569
+ await withStorage(async (storage) => {
570
+ const first = await storage.threads.create(threadInput())
571
+ const second = await storage.threads.create(threadInput({ id: "thr_2" }))
572
+ await storage.threads.create(threadInput({ id: "thr_3", projectId: otherProjectId }))
573
+
574
+ await expect(
575
+ storage.threads.getByIds({ projectId, ids: ["thr_2", "missing", "thr_1", "thr_2"] })
576
+ ).resolves.toEqual([second, first])
577
+ await expect(storage.threads.getByIds({ projectId, ids: ["thr_3"] })).resolves.toEqual([])
578
+ await expect(storage.threads.getByIds({ projectId, ids: [] })).resolves.toEqual([])
579
+ })
580
+ })
581
+
568
582
  test("lists threads with filters, ordering, and pagination", async () => {
569
583
  await withStorage(async (storage) => {
570
584
  await storage.threads.create(
@@ -861,23 +875,12 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
861
875
  id: "child_1",
862
876
  executionToken: "child_token",
863
877
  status: "succeeded",
864
- result: {},
878
+ result: { text: " " },
865
879
  }),
866
880
  "invalid_input"
867
881
  )
868
882
 
869
- const result = {
870
- text: "Three open orders.",
871
- files: [
872
- {
873
- blobId: `blob_${"a".repeat(64)}`,
874
- digest: `sha256:${"a".repeat(64)}` as const,
875
- fileName: "orders.csv",
876
- mediaType: "text/csv",
877
- sizeBytes: 42,
878
- },
879
- ],
880
- }
883
+ const result = { text: "Three open orders." }
881
884
  const completed = await storage.runs.finish({
882
885
  projectId,
883
886
  id: "child_1",
@@ -1087,11 +1090,10 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
1087
1090
  finishReason: "stop",
1088
1091
  diagnostics: [
1089
1092
  {
1090
- code: "output_file_too_large",
1093
+ code: "step_limit_reached",
1091
1094
  severity: "warning",
1092
- scope: "output",
1093
- path: "reports/full.csv",
1094
- message: "This generated file was skipped.",
1095
+ scope: "run",
1096
+ message: "The Agent reached its 100-step limit before producing a final answer.",
1095
1097
  },
1096
1098
  ],
1097
1099
  completedAt: at("2026-06-23T10:07:00.000Z"),
@@ -1103,11 +1105,10 @@ export function runAgentStorageContractSuite<TStorage extends AgentStorageContra
1103
1105
  })
1104
1106
  expect(finished.diagnostics).toEqual([
1105
1107
  {
1106
- code: "output_file_too_large",
1108
+ code: "step_limit_reached",
1107
1109
  severity: "warning",
1108
- scope: "output",
1109
- path: "reports/full.csv",
1110
- message: "This generated file was skipped.",
1110
+ scope: "run",
1111
+ message: "The Agent reached its 100-step limit before producing a final answer.",
1111
1112
  },
1112
1113
  ])
1113
1114
  await expect(
@@ -0,0 +1,517 @@
1
+ import { describe, expect, test } from "bun:test"
2
+ import type { Principal } from "../auth"
3
+ import type { FileRef } from "../blob-storage"
4
+ import {
5
+ type ArtifactFrameGrantRecord,
6
+ type ArtifactStorage,
7
+ ArtifactStorageError,
8
+ type ArtifactStorageErrorCode,
9
+ type ArtifactVersionInput,
10
+ type CreateArtifactInput,
11
+ } from "../storage/artifacts"
12
+ import type { Storage } from "../storage/types"
13
+
14
+ export interface ArtifactStorageContractStorage extends Pick<Storage, "transaction"> {
15
+ readonly artifacts: ArtifactStorage
16
+ }
17
+
18
+ export interface ArtifactStorageContractSuiteOptions<
19
+ TStorage extends ArtifactStorageContractStorage = ArtifactStorageContractStorage,
20
+ > {
21
+ /** Returns a fresh, empty storage bundle for every test. */
22
+ readonly createStorage: () => TStorage | Promise<TStorage>
23
+ readonly teardown?: (storage: TStorage) => void | Promise<void>
24
+ }
25
+
26
+ const projectId = "artifact-contract"
27
+ const otherProjectId = "artifact-contract-other"
28
+ const owner: Principal = { type: "user", id: "usr_owner" }
29
+ const otherOwner: Principal = { type: "user", id: "usr_other" }
30
+ const agentRun = { threadId: "thr_1", runId: "run_1" }
31
+ const t0 = new Date("2026-10-17T10:00:00.000Z")
32
+ const minute = 60 * 1000
33
+
34
+ /** Provider-neutral persistence contract for artifacts and their versions. */
35
+ export function runArtifactStorageContractSuite<TStorage extends ArtifactStorageContractStorage>(
36
+ label: string,
37
+ options: ArtifactStorageContractSuiteOptions<TStorage>
38
+ ): void {
39
+ const withStorage = async (
40
+ run: (artifacts: ArtifactStorage, storage: TStorage) => Promise<void>
41
+ ): Promise<void> => {
42
+ const storage = await options.createStorage()
43
+ try {
44
+ await run(storage.artifacts, storage)
45
+ } finally {
46
+ await options.teardown?.(storage)
47
+ }
48
+ }
49
+
50
+ describe(label, () => {
51
+ test("creates an artifact with its first version and reads both back", async () => {
52
+ await withStorage(async (artifacts) => {
53
+ const created = await artifacts.create(createInput())
54
+
55
+ expect(created.artifact).toEqual({
56
+ projectId,
57
+ id: "art_report",
58
+ kind: "document",
59
+ title: "Q3 report",
60
+ owner,
61
+ latestVersion: 1,
62
+ createdAt: t0,
63
+ updatedAt: t0,
64
+ })
65
+ expect(created.version).toEqual({
66
+ projectId,
67
+ artifactId: "art_report",
68
+ version: 1,
69
+ ...versionInput(),
70
+ })
71
+ expect(await artifacts.get({ projectId, id: "art_report" })).toEqual(created.artifact)
72
+ expect(
73
+ await artifacts.getVersion({ projectId, artifactId: "art_report", version: 1 })
74
+ ).toEqual(created.version)
75
+ })
76
+ })
77
+
78
+ test("rejects a second artifact with the same id in the same project", async () => {
79
+ await withStorage(async (artifacts) => {
80
+ await artifacts.create(createInput())
81
+
82
+ await expectArtifactError(artifacts.create(createInput()), "artifact_exists")
83
+ await artifacts.create(createInput({ projectId: otherProjectId }))
84
+ })
85
+ })
86
+
87
+ test("numbers versions in order and makes the newest the latest", async () => {
88
+ await withStorage(async (artifacts) => {
89
+ await artifacts.create(createInput())
90
+ const second = await artifacts.publish(
91
+ publishInput({ title: "Q3 report, revised", createdAt: at(1) })
92
+ )
93
+ const third = await artifacts.publish(publishInput({ createdAt: at(2) }))
94
+
95
+ expect(second.version.version).toBe(2)
96
+ expect(third.version.version).toBe(3)
97
+ expect(third.artifact).toMatchObject({ latestVersion: 3, updatedAt: at(2), createdAt: t0 })
98
+ expect(second.artifact.title).toBe("Q3 report, revised")
99
+ expect((await artifacts.get({ projectId, id: "art_report" }))?.title).toBe("Q3 report")
100
+ })
101
+ })
102
+
103
+ test("keeps the kind fixed and refuses versions for a missing artifact", async () => {
104
+ await withStorage(async (artifacts) => {
105
+ await artifacts.create(createInput())
106
+
107
+ await expectArtifactError(
108
+ artifacts.publish({ ...publishInput(), kind: "slides" }),
109
+ "artifact_kind_mismatch"
110
+ )
111
+ await expectArtifactError(
112
+ artifacts.publish({ ...publishInput(), artifactId: "art_missing" }),
113
+ "artifact_not_found"
114
+ )
115
+ await expectArtifactError(
116
+ artifacts.publish({ ...publishInput(), projectId: otherProjectId }),
117
+ "artifact_not_found"
118
+ )
119
+ expect((await artifacts.get({ projectId, id: "art_report" }))?.latestVersion).toBe(1)
120
+ })
121
+ })
122
+
123
+ test("stores a version's files, outline, references, and origin exactly", async () => {
124
+ await withStorage(async (artifacts) => {
125
+ const version = versionInput({
126
+ entry: "index.html",
127
+ files: [
128
+ { path: "index.html", file: fileRef("a", "text/html") },
129
+ { path: "img/fleet one.jpg", file: fileRef("b", "image/jpeg") },
130
+ ],
131
+ outline: { kind: "slides", slides: [{ title: "Q3 review" }, {}] },
132
+ references: [
133
+ {
134
+ address: "artifact:art_numbers#chart=revenue",
135
+ as: "embed",
136
+ at: "3",
137
+ resolvedVersion: 2,
138
+ },
139
+ { address: "artifact:art_report#methodology", as: "link", at: "5", resolvedVersion: 1 },
140
+ ],
141
+ origin: undefined,
142
+ })
143
+ const created = await artifacts.create(createInput({ kind: "slides", version }))
144
+
145
+ expect(created.version).not.toHaveProperty("origin")
146
+ expect(
147
+ await artifacts.getVersion({ projectId, artifactId: "art_report", version: 1 })
148
+ ).toEqual({ projectId, artifactId: "art_report", version: 1, ...version })
149
+ })
150
+ })
151
+
152
+ test("lists the latest versions that refer to an artifact, at any version, file, or part", async () => {
153
+ await withStorage(async (artifacts) => {
154
+ const refer = (address: string) => ({
155
+ address,
156
+ as: "embed" as const,
157
+ at: "",
158
+ resolvedVersion: 1,
159
+ })
160
+ const create = (id: string, addresses: string[], project = projectId) =>
161
+ artifacts.create(
162
+ createInput({
163
+ projectId: project,
164
+ id,
165
+ version: versionInput({ references: addresses.map(refer) }),
166
+ })
167
+ )
168
+ await create("art_numbers", [])
169
+ await create("art_whole", ["artifact:art_numbers"])
170
+ await create("art_pinned", ["artifact:art_numbers@1/figures/a.svg"])
171
+ await create("art_chart", ["artifact:art_numbers#chart=revenue"])
172
+ // A longer id that starts with the same letters is another artifact.
173
+ await create("art_longer", ["artifact:art_numbersx#chart=revenue"])
174
+ await create("art_elsewhere", ["artifact:art_numbers"], otherProjectId)
175
+ // Only the latest version counts: this one dropped its reference.
176
+ await create("art_dropped", ["artifact:art_numbers#Summary"])
177
+ await artifacts.publish(publishInput({ createdAt: at(1) }, "art_dropped"))
178
+
179
+ const referencing = await artifacts.listReferencingVersions({
180
+ projectId,
181
+ artifactId: "art_numbers",
182
+ })
183
+ // In artifact id order, whatever order they were published in. To see this fail, drop the
184
+ // sort in `InMemoryArtifactStorage.listReferencingVersions`.
185
+ expect(referencing.map((version) => version.artifactId)).toEqual([
186
+ "art_chart",
187
+ "art_pinned",
188
+ "art_whole",
189
+ ])
190
+ expect(
191
+ referencing.find((version) => version.artifactId === "art_chart")?.references
192
+ ).toEqual([refer("artifact:art_numbers#chart=revenue")])
193
+ })
194
+ })
195
+
196
+ test("stores frame grants by token hash, expires them in batches, and drops them with the artifact", async () => {
197
+ await withStorage(async (artifacts) => {
198
+ await artifacts.create(createInput())
199
+ const grant = (seed: string, expiresInMinutes: number) =>
200
+ frameGrant(seed, { expiresAt: at(expiresInMinutes) })
201
+ await artifacts.createFrameGrant(grant("a", 60))
202
+ await artifacts.createFrameGrant(grant("b", 5))
203
+ await artifacts.createFrameGrant(grant("c", 10))
204
+
205
+ expect(await artifacts.findFrameGrant({ projectId, tokenHash: "a".repeat(64) })).toEqual(
206
+ grant("a", 60)
207
+ )
208
+ expect(
209
+ await artifacts.findFrameGrant({ projectId: otherProjectId, tokenHash: "a".repeat(64) })
210
+ ).toBeNull()
211
+ await expectArtifactError(
212
+ artifacts.createFrameGrant({ ...grant("d", 60), artifactId: "art_missing" }),
213
+ "artifact_not_found"
214
+ )
215
+
216
+ // Expired before minute 30: b and c, one at a time.
217
+ const expiredBefore = at(30)
218
+ expect(
219
+ await artifacts.deleteExpiredFrameGrants({ projectId, expiredBefore, limit: 1 })
220
+ ).toBe(1)
221
+ expect(
222
+ await artifacts.deleteExpiredFrameGrants({ projectId, expiredBefore, limit: 10 })
223
+ ).toBe(1)
224
+ expect(await artifacts.findFrameGrant({ projectId, tokenHash: "b".repeat(64) })).toBeNull()
225
+ expect(
226
+ await artifacts.findFrameGrant({ projectId, tokenHash: "a".repeat(64) })
227
+ ).not.toBeNull()
228
+
229
+ await artifacts.delete({ projectId, id: "art_report" })
230
+ expect(await artifacts.findFrameGrant({ projectId, tokenHash: "a".repeat(64) })).toBeNull()
231
+ })
232
+ })
233
+
234
+ test("lists the latest of each artifact, most recently updated first", async () => {
235
+ await withStorage(async (artifacts) => {
236
+ await artifacts.create(createInput({ id: "art_a" }))
237
+ await artifacts.create(
238
+ createInput({ id: "art_b", version: versionInput({ createdAt: at(1) }) })
239
+ )
240
+ await artifacts.create(
241
+ createInput({ id: "art_c", version: versionInput({ createdAt: at(2) }) })
242
+ )
243
+ await artifacts.publish(publishInput({ createdAt: at(3) }, "art_a"))
244
+
245
+ const all = await artifacts.list({ projectId })
246
+ expect(all.artifacts.map((artifact) => artifact.id)).toEqual(["art_a", "art_c", "art_b"])
247
+ expect(all).toMatchObject({ total: 3, hasMore: false })
248
+
249
+ const page = await artifacts.list({ projectId, limit: 2, offset: 1 })
250
+ expect(page.artifacts.map((artifact) => artifact.id)).toEqual(["art_c", "art_b"])
251
+ expect(page).toMatchObject({ total: 3, hasMore: false })
252
+ expect((await artifacts.list({ projectId, limit: 1 })).hasMore).toBe(true)
253
+ })
254
+ })
255
+
256
+ test("lists one kind, counting only that kind", async () => {
257
+ await withStorage(async (artifacts) => {
258
+ await artifacts.create(createInput({ id: "art_doc" }))
259
+ await artifacts.create(createInput({ id: "art_deck_a", kind: "slides" }))
260
+ await artifacts.create(
261
+ createInput({
262
+ id: "art_deck_b",
263
+ kind: "slides",
264
+ version: versionInput({ createdAt: at(1) }),
265
+ })
266
+ )
267
+ const decks = await artifacts.list({ projectId, kind: "slides", limit: 1 })
268
+ expect(decks.artifacts.map((artifact) => artifact.id)).toEqual(["art_deck_b"])
269
+ expect(decks).toMatchObject({ total: 2, hasMore: true })
270
+ expect((await artifacts.list({ projectId, kind: "sheet" })).total).toBe(0)
271
+ })
272
+ })
273
+
274
+ test("lists by owner, by the thread a version came from, and only within the project", async () => {
275
+ await withStorage(async (artifacts) => {
276
+ await artifacts.create(createInput({ id: "art_mine" }))
277
+ await artifacts.create(
278
+ createInput({
279
+ id: "art_theirs",
280
+ owner: otherOwner,
281
+ version: versionInput({
282
+ author: otherOwner,
283
+ origin: { threadId: "thr_2", runId: "run_2" },
284
+ }),
285
+ })
286
+ )
287
+ await artifacts.create(
288
+ createInput({ id: "art_api", version: versionInput({ origin: undefined }) })
289
+ )
290
+ await artifacts.publish(
291
+ publishInput(
292
+ { origin: { threadId: "thr_3", runId: "run_3" }, createdAt: at(1) },
293
+ "art_api"
294
+ )
295
+ )
296
+ await artifacts.create(createInput({ projectId: otherProjectId, id: "art_elsewhere" }))
297
+
298
+ const ids = async (input: Parameters<ArtifactStorage["list"]>[0]) =>
299
+ (await artifacts.list(input)).artifacts.map((artifact) => artifact.id).sort()
300
+
301
+ expect(await ids({ projectId, owner })).toEqual(["art_api", "art_mine"])
302
+ expect(await ids({ projectId, owner: otherOwner })).toEqual(["art_theirs"])
303
+ expect(await ids({ projectId, originThreadId: "thr_1" })).toEqual(["art_mine"])
304
+ expect(await ids({ projectId, originThreadId: "thr_3" })).toEqual(["art_api"])
305
+ expect(await ids({ projectId, owner, originThreadId: "thr_2" })).toEqual([])
306
+ expect(await ids({ projectId: otherProjectId })).toEqual(["art_elsewhere"])
307
+ })
308
+ })
309
+
310
+ test("lists versions newest first, a page at a time", async () => {
311
+ await withStorage(async (artifacts) => {
312
+ await artifacts.create(createInput())
313
+ await artifacts.publish(publishInput({ createdAt: at(1) }))
314
+ await artifacts.publish(publishInput({ createdAt: at(2) }))
315
+
316
+ const all = await artifacts.listVersions({ projectId, artifactId: "art_report" })
317
+ expect(all.versions.map((version) => version.version)).toEqual([3, 2, 1])
318
+ expect(all).toMatchObject({ total: 3, hasMore: false })
319
+
320
+ const page = await artifacts.listVersions({
321
+ projectId,
322
+ artifactId: "art_report",
323
+ limit: 1,
324
+ offset: 1,
325
+ })
326
+ expect(page.versions.map((version) => version.version)).toEqual([2])
327
+ expect(page).toMatchObject({ total: 3, hasMore: true })
328
+ expect(await artifacts.listVersions({ projectId, artifactId: "art_missing" })).toEqual({
329
+ versions: [],
330
+ hasMore: false,
331
+ total: 0,
332
+ })
333
+ })
334
+ })
335
+
336
+ test("deletes an artifact with every version", async () => {
337
+ await withStorage(async (artifacts) => {
338
+ await artifacts.create(createInput())
339
+ await artifacts.publish(publishInput({ createdAt: at(1) }))
340
+
341
+ expect(await artifacts.delete({ projectId: otherProjectId, id: "art_report" })).toBe(false)
342
+ expect(await artifacts.delete({ projectId, id: "art_report" })).toBe(true)
343
+ expect(await artifacts.get({ projectId, id: "art_report" })).toBeNull()
344
+ expect(
345
+ await artifacts.getVersion({ projectId, artifactId: "art_report", version: 1 })
346
+ ).toBeNull()
347
+ expect(await artifacts.delete({ projectId, id: "art_report" })).toBe(false)
348
+
349
+ // The id is free again, and numbering starts over for the new artifact.
350
+ expect((await artifacts.create(createInput())).version.version).toBe(1)
351
+ })
352
+ })
353
+
354
+ test("deletes a run's versions, repoints latest, and never reuses a number", async () => {
355
+ await withStorage(async (artifacts) => {
356
+ await artifacts.create(
357
+ createInput({ version: versionInput({ origin: { threadId: "thr_1", runId: "run_0" } }) })
358
+ )
359
+ await artifacts.publish(
360
+ publishInput({
361
+ title: "Kept",
362
+ createdAt: at(1),
363
+ origin: { threadId: "thr_1", runId: "run_0" },
364
+ })
365
+ )
366
+ await artifacts.publish(publishInput({ title: "Retried", createdAt: at(2) }))
367
+ await artifacts.create(
368
+ createInput({ id: "art_new_in_run", version: versionInput({ createdAt: at(2) }) })
369
+ )
370
+ await artifacts.create(
371
+ createInput({
372
+ id: "art_other_run",
373
+ version: versionInput({ origin: { threadId: "thr_1", runId: "run_9" } }),
374
+ })
375
+ )
376
+ await artifacts.createFrameGrant(frameGrant("a"))
377
+ await artifacts.createFrameGrant(frameGrant("b", { artifactId: "art_new_in_run" }))
378
+
379
+ expect(
380
+ await artifacts.deleteVersionsByOrigin({ projectId: otherProjectId, runId: "run_1" })
381
+ ).toBe(0)
382
+ expect(await artifacts.deleteVersionsByOrigin({ projectId, runId: "run_1" })).toBe(2)
383
+
384
+ expect(await artifacts.get({ projectId, id: "art_report" })).toMatchObject({
385
+ title: "Kept",
386
+ latestVersion: 2,
387
+ updatedAt: at(1),
388
+ })
389
+ expect(
390
+ await artifacts.getVersion({ projectId, artifactId: "art_report", version: 3 })
391
+ ).toBeNull()
392
+ expect(await artifacts.get({ projectId, id: "art_new_in_run" })).toBeNull()
393
+ expect(await artifacts.get({ projectId, id: "art_other_run" })).not.toBeNull()
394
+ // A deleted artifact's frame grants go with it; a kept one's stay. To see this fail, delete
395
+ // the artifact from the map alone in `InMemoryArtifactStorage.deleteVersionsByOrigin`.
396
+ expect(await artifacts.findFrameGrant({ projectId, tokenHash: "b".repeat(64) })).toBeNull()
397
+ expect(
398
+ await artifacts.findFrameGrant({ projectId, tokenHash: "a".repeat(64) })
399
+ ).not.toBeNull()
400
+
401
+ // Version 3 belonged to the retried run; the next one is 4, so an address pinned to @3
402
+ // can never land on different content.
403
+ expect((await artifacts.publish(publishInput({ createdAt: at(3) }))).version.version).toBe(
404
+ 4
405
+ )
406
+ })
407
+ })
408
+
409
+ test("rolls back with its containing storage transaction", async () => {
410
+ await withStorage(async (artifacts, storage) => {
411
+ await artifacts.create(createInput())
412
+ const rollback = new Error("rollback artifact publish")
413
+
414
+ await expect(
415
+ storage.transaction(async (tx) => {
416
+ if (!tx.artifacts) throw new Error("Expected artifact storage in the transaction.")
417
+ await tx.artifacts.publish(publishInput({ createdAt: at(1) }))
418
+ await tx.artifacts.create(createInput({ id: "art_rolled_back" }))
419
+ await tx.artifacts.createFrameGrant(frameGrant("a"))
420
+ expect((await tx.artifacts.get({ projectId, id: "art_report" }))?.latestVersion).toBe(2)
421
+ throw rollback
422
+ })
423
+ ).rejects.toBe(rollback)
424
+
425
+ expect((await artifacts.get({ projectId, id: "art_report" }))?.latestVersion).toBe(1)
426
+ expect(await artifacts.get({ projectId, id: "art_rolled_back" })).toBeNull()
427
+ // To see this fail, leave frame grants out of `InMemoryArtifactStorage.restore`.
428
+ expect(await artifacts.findFrameGrant({ projectId, tokenHash: "a".repeat(64) })).toBeNull()
429
+ expect((await artifacts.publish(publishInput({ createdAt: at(2) }))).version.version).toBe(
430
+ 2
431
+ )
432
+ })
433
+ })
434
+ })
435
+ }
436
+
437
+ async function expectArtifactError(
438
+ promise: Promise<unknown>,
439
+ code: ArtifactStorageErrorCode
440
+ ): Promise<void> {
441
+ const error = await promise.then(
442
+ () => null,
443
+ (caught: unknown) => caught
444
+ )
445
+ expect(error).toBeInstanceOf(ArtifactStorageError)
446
+ expect((error as ArtifactStorageError).code).toBe(code)
447
+ }
448
+
449
+ function createInput(overrides: Partial<CreateArtifactInput> = {}): CreateArtifactInput {
450
+ return {
451
+ projectId,
452
+ id: "art_report",
453
+ kind: "document",
454
+ owner,
455
+ version: versionInput(),
456
+ ...overrides,
457
+ }
458
+ }
459
+
460
+ function publishInput(overrides: Partial<ArtifactVersionInput> = {}, artifactId = "art_report") {
461
+ return {
462
+ projectId,
463
+ artifactId,
464
+ kind: "document" as const,
465
+ version: versionInput({ origin: agentRun, ...overrides }),
466
+ }
467
+ }
468
+
469
+ function versionInput(overrides: Partial<ArtifactVersionInput> = {}): ArtifactVersionInput {
470
+ const input: ArtifactVersionInput = {
471
+ title: "Q3 report",
472
+ entry: "document.md",
473
+ files: [{ path: "document.md", file: fileRef("d", "text/markdown") }],
474
+ outline: { kind: "document", headings: [{ depth: 2, text: "Revenue", slug: "revenue" }] },
475
+ references: [],
476
+ author: owner,
477
+ origin: agentRun,
478
+ createdAt: t0,
479
+ ...overrides,
480
+ }
481
+ if (input.origin) return input
482
+ const { origin: _origin, ...withoutOrigin } = input
483
+ return withoutOrigin
484
+ }
485
+
486
+ function frameGrant(
487
+ seed: string,
488
+ overrides: Partial<ArtifactFrameGrantRecord> = {}
489
+ ): ArtifactFrameGrantRecord {
490
+ return {
491
+ projectId,
492
+ tokenHash: seed.repeat(64).slice(0, 64),
493
+ artifactId: "art_report",
494
+ version: 1,
495
+ targets: [
496
+ { address: "artifact:art_other/figures/revenue.svg", artifactId: "art_other", version: 3 },
497
+ ],
498
+ createdAt: t0,
499
+ expiresAt: at(60),
500
+ ...overrides,
501
+ }
502
+ }
503
+
504
+ function fileRef(seed: string, mediaType: string): FileRef {
505
+ const hex = seed.repeat(64).slice(0, 64)
506
+ return {
507
+ blobId: `blob_${hex}`,
508
+ digest: `sha256:${hex}`,
509
+ sizeBytes: 42,
510
+ fileName: `${seed}.bin`,
511
+ mediaType,
512
+ }
513
+ }
514
+
515
+ function at(minutes: number): Date {
516
+ return new Date(t0.getTime() + minutes * minute)
517
+ }
@@ -292,6 +292,53 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
292
292
  })
293
293
  })
294
294
 
295
+ test("lists all of a user's sessions, revoked and expired ones too, newest first", async () => {
296
+ await withStorage(async (storage) => {
297
+ await createUser(storage)
298
+ await createUser(storage, { id: "usr_2", email: "ben@acme.com" })
299
+
300
+ const session = (id: string, createdAt: string, userId = "usr_1") =>
301
+ storage.sessions.create({
302
+ id,
303
+ projectId,
304
+ userId,
305
+ strategyId: "magic-link",
306
+ tokenHash: `hash-${id}`,
307
+ createdAt: at(createdAt),
308
+ expiresAt: at("2026-05-15T10:00:00.000Z"),
309
+ })
310
+
311
+ await session("ses_oldest", "2026-05-14T10:00:00.000Z")
312
+ await session("ses_revoked", "2026-05-14T10:01:00.000Z")
313
+ // Created at the same instant as the one above: the cursor skips within the tie.
314
+ await session("ses_also", "2026-05-14T10:01:00.000Z")
315
+ await session("ses_newest", "2026-05-14T10:02:00.000Z")
316
+ await session("ses_other", "2026-05-14T10:03:00.000Z", "usr_2")
317
+ await storage.sessions.revoke({
318
+ projectId,
319
+ id: "ses_revoked",
320
+ revokedAt: at("2026-05-14T10:05:00.000Z"),
321
+ })
322
+
323
+ const first = await storage.sessions.listByUserId({ projectId, userId: "usr_1", limit: 2 })
324
+ expect(first.hasMore).toBe(true)
325
+ expect(first.sessions.map((entry) => entry.id)).toEqual(["ses_newest", "ses_revoked"])
326
+ expect(first.sessions[1]?.revokedAt?.toISOString()).toBe("2026-05-14T10:05:00.000Z")
327
+
328
+ const rest = await storage.sessions.listByUserId({
329
+ projectId,
330
+ userId: "usr_1",
331
+ limit: 2,
332
+ before: { createdAt: at("2026-05-14T10:01:00.000Z"), skip: 1 },
333
+ })
334
+ expect(rest.hasMore).toBe(false)
335
+ expect(rest.sessions.map((entry) => entry.id)).toEqual(["ses_also", "ses_oldest"])
336
+ await expect(
337
+ storage.sessions.listByUserId({ projectId: otherProjectId, userId: "usr_1", limit: 2 })
338
+ ).resolves.toEqual({ sessions: [], hasMore: false })
339
+ })
340
+ })
341
+
295
342
  test("persists and enforces an optional absolute session deadline", async () => {
296
343
  await withStorage(async (storage) => {
297
344
  await createUser(storage)