@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
@@ -1,7 +1,8 @@
1
- import { describe, expect, test } from "bun:test"
1
+ import { describe, expect, setSystemTime, test } from "bun:test"
2
2
  import type { AuthStorage } from "../storage/auth"
3
3
  import type {
4
4
  CreateExecutionInput,
5
+ ExecutionRecord,
5
6
  ExecutionStorage,
6
7
  TrustedPrimitiveKind,
7
8
  } from "../storage/executions"
@@ -338,6 +339,126 @@ export function runExecutionStorageContractSuite<TStorage extends ExecutionStora
338
339
  })
339
340
  })
340
341
 
342
+ test("lists a session's roots in a window and everything they caused", async () => {
343
+ // Removal proof: drop `parent_execution_id IS NULL` from a provider's root read; the Agent
344
+ // execution, which copies the session, is listed twice.
345
+ await withStorage(async (storage) => {
346
+ await seedAuth(storage.auth)
347
+ await seedSharedSession(storage)
348
+
349
+ const userRequest = (id: string) =>
350
+ principalRequest({ id, credential: { type: "session", id: "session-user" } })
351
+
352
+ await createAt(storage, -60_000, userRequest("before"))
353
+ const root = await createAt(storage, 0, userRequest("root"))
354
+ await createAt(storage, 1_000, childOf(root, trustedPrimitive("root-action")))
355
+ await createAt(
356
+ storage,
357
+ 2_000,
358
+ principalRequest({
359
+ id: "other-user",
360
+ principal: { type: "user", id: "user-other" },
361
+ credential: { type: "session", id: "session-other" },
362
+ })
363
+ )
364
+ await createAt(storage, 3_000, delegatedRequest("shared"))
365
+ await createAt(storage, 4_000, {
366
+ ...childOf(root, agentExecution("root-agent")),
367
+ authorizationRef: root.authorizationRef,
368
+ })
369
+ await createAt(storage, 10 * 60_000, userRequest("after"))
370
+ // A descendant counts whenever it was created, after the window too.
371
+ await createAt(
372
+ storage,
373
+ 11 * 60_000,
374
+ childOf(
375
+ { id: "root-action", correlationId: root.correlationId },
376
+ trustedPrimitive("late-workflow", {}, "workflow")
377
+ )
378
+ )
379
+
380
+ const window = {
381
+ projectId,
382
+ from: new Date(createdAt.getTime() - 1_000),
383
+ to: new Date(createdAt.getTime() + 5 * 60_000),
384
+ limit: 10,
385
+ }
386
+
387
+ const user = await storage.executions.listBySession({
388
+ ...window,
389
+ session: { type: "user", id: "session-user" },
390
+ })
391
+ expect(user.truncated).toBe(false)
392
+ expect(user.executions.map((execution) => execution.id)).toEqual([
393
+ "root",
394
+ "root-action",
395
+ "root-agent",
396
+ "late-workflow",
397
+ ])
398
+ expect(user.executions[0]).toEqual(root)
399
+
400
+ const shared = await storage.executions.listBySession({
401
+ ...window,
402
+ session: { type: "share", id: "share-session-one" },
403
+ })
404
+ expect(shared.executions.map((execution) => execution.id)).toEqual(["shared"])
405
+
406
+ // The session id is not a credential of any other kind.
407
+ await expect(
408
+ storage.executions.listBySession({
409
+ ...window,
410
+ session: { type: "share", id: "session-user" },
411
+ })
412
+ ).resolves.toEqual({ executions: [], truncated: false })
413
+ })
414
+ })
415
+
416
+ test("bounds a session's executions, keeping roots and the earliest first", async () => {
417
+ await withStorage(async (storage) => {
418
+ await seedAuth(storage.auth)
419
+
420
+ for (const [index, id] of ["first", "second", "third"].entries()) {
421
+ const root = await createAt(
422
+ storage,
423
+ index * 1_000,
424
+ principalRequest({ id, credential: { type: "session", id: "session-user" } })
425
+ )
426
+ await createAt(storage, index * 1_000 + 500, childOf(root, trustedPrimitive(`${id}-run`)))
427
+ }
428
+
429
+ const list = (limit: number) =>
430
+ storage.executions.listBySession({
431
+ projectId,
432
+ session: { type: "user", id: "session-user" },
433
+ from: createdAt,
434
+ to: new Date(createdAt.getTime() + 60_000),
435
+ limit,
436
+ })
437
+
438
+ const roots = await list(2)
439
+ expect(roots.truncated).toBe(true)
440
+ expect(roots.executions.map((execution) => execution.id)).toEqual(["first", "second"])
441
+
442
+ const partial = await list(4)
443
+ expect(partial.truncated).toBe(true)
444
+ expect(partial.executions).toHaveLength(4)
445
+ expect(partial.executions.map((execution) => execution.id)).toEqual(
446
+ expect.arrayContaining(["first", "second", "third"])
447
+ )
448
+
449
+ const all = await list(6)
450
+ expect(all.truncated).toBe(false)
451
+ expect(all.executions.map((execution) => execution.id)).toEqual([
452
+ "first",
453
+ "first-run",
454
+ "second",
455
+ "second-run",
456
+ "third",
457
+ "third-run",
458
+ ])
459
+ })
460
+ })
461
+
341
462
  test("participates in storage transactions and rollback", async () => {
342
463
  await withStorage(async (storage) => {
343
464
  await expect(
@@ -355,6 +476,31 @@ export function runExecutionStorageContractSuite<TStorage extends ExecutionStora
355
476
  })
356
477
  }
357
478
 
479
+ /** Creates an execution at `offsetMs` after the fixtures' creation time: storage stamps it. */
480
+ async function createAt(
481
+ storage: ExecutionStorageContractStorage,
482
+ offsetMs: number,
483
+ input: CreateExecutionInput
484
+ ): Promise<ExecutionRecord> {
485
+ setSystemTime(new Date(createdAt.getTime() + offsetMs))
486
+ try {
487
+ return await storage.executions.create(input)
488
+ } finally {
489
+ setSystemTime()
490
+ }
491
+ }
492
+
493
+ function childOf(
494
+ parent: Pick<ExecutionRecord, "id" | "correlationId">,
495
+ input: CreateExecutionInput
496
+ ): CreateExecutionInput {
497
+ return {
498
+ ...input,
499
+ source: { type: "execution", executionId: parent.id },
500
+ correlationId: parent.correlationId,
501
+ }
502
+ }
503
+
358
504
  async function seedAuth(auth: AuthStorage): Promise<void> {
359
505
  await auth.users.create({
360
506
  id: "user-one",
@@ -9,6 +9,10 @@ export {
9
9
  type ActionRunStorageContractSuiteOptions,
10
10
  runActionRunStorageContractSuite,
11
11
  } from "./action-run-storage-contract"
12
+ export {
13
+ type ActivityStorageContractSuiteOptions,
14
+ runActivityStorageContractSuite,
15
+ } from "./activity-storage-contract"
12
16
  export { createTestAgentExecution } from "./agent-execution"
13
17
  export {
14
18
  type AgentStorageContractSuiteOptions,
@@ -34,6 +38,11 @@ export {
34
38
  runAiUsageStorageContractSuite,
35
39
  seedAiUsageStorageContractExecutions,
36
40
  } from "./ai-usage-storage-contract"
41
+ export {
42
+ type ArtifactStorageContractStorage,
43
+ type ArtifactStorageContractSuiteOptions,
44
+ runArtifactStorageContractSuite,
45
+ } from "./artifact-storage-contract"
37
46
  export {
38
47
  type AuthStorageContractSuiteOptions,
39
48
  runAuthStorageContractSuite,
@@ -285,6 +285,44 @@ export function runLakeMergeStorageContractSuite<TStorage extends LakeStorage>(
285
285
  expect(await storage.listVersions(invoices.id)).toHaveLength(1)
286
286
  })
287
287
  })
288
+
289
+ test("a merge keeps its parent's lineage", async () => {
290
+ await withStorage(async (storage) => {
291
+ await storage.createDataset(invoices)
292
+
293
+ const source = (column: string) => ({ datasetId: "contract.source", column })
294
+ const lineage = {
295
+ rows: [source("tenant")],
296
+ columns: { id: [source("id")], note: [source("amount")], status: [source("state")] },
297
+ }
298
+
299
+ const pipeline = { kind: "pipeline", id: "contract-pipeline" } as const
300
+ const seed = await storage.beginWrite({ dataset: invoices, producer: pipeline, lineage })
301
+ await seed.writeRows([{ id: "inv_1", status: "open", note: "120.00" }])
302
+ await seed.commit()
303
+
304
+ const sync = { kind: "sync", id: "sync-invoices" } as const
305
+ const merge = await storage.beginMerge({ dataset: invoices, producer: sync })
306
+ await merge.writeChanges([change.upsert({ id: "inv_2", status: "paid", note: null })])
307
+ const merged = expectCreated(await merge.commit())
308
+
309
+ // Its own rows depend on its own columns only; the rows it keeps, on what they did.
310
+ expect(merged.lineage).toEqual(lineage)
311
+ expect((await storage.getVersion(invoices.id, merged.versionId))?.lineage).toEqual(lineage)
312
+
313
+ // A parent that records no lineage could hold anything, and so could the merge.
314
+ const unanalyzed = await storage.beginWrite({ dataset: invoices, producer: pipeline })
315
+ await unanalyzed.writeRows([{ id: "inv_1", status: "open", note: "120.00" }])
316
+ const legacy = await unanalyzed.commit()
317
+
318
+ const next = await storage.beginMerge({ dataset: invoices, producer: sync })
319
+ await next.writeChanges([change.upsert({ id: "inv_3", status: "open", note: null })])
320
+
321
+ expect(expectCreated(await next.commit()).lineage).toEqual({
322
+ unknown: `version '${legacy.versionId}' of '${invoices.id}' recorded no column lineage`,
323
+ })
324
+ })
325
+ })
288
326
  })
289
327
  }
290
328
 
@@ -2,7 +2,14 @@ import { describe, expect, test } from "bun:test"
2
2
  import type { FileRef } from "../blob-storage"
3
3
  import { col, type DatasetDefinition, defineDataset } from "../datasets"
4
4
  import { LakeStorageError } from "../lake-storage/errors"
5
- import type { DatasetRow, LakeStorage } from "../lake-storage/types"
5
+ import type {
6
+ BeginDatasetWriteInput,
7
+ DatasetColumnRef,
8
+ DatasetProducer,
9
+ DatasetRow,
10
+ DatasetWriteCommitResult,
11
+ LakeStorage,
12
+ } from "../lake-storage/types"
6
13
 
7
14
  export type LakeStorageSchemaEvolutionCapability = "strict" | "addNullableColumns"
8
15
 
@@ -16,6 +23,8 @@ export interface LakeStorageContractSuiteOptions<TStorage extends LakeStorage =
16
23
  * `strict`, which allows metadata-only merges but rejects schema evolution.
17
24
  */
18
25
  readonly schemaEvolution?: LakeStorageSchemaEvolutionCapability
26
+ /** Open the same lake again, to check what a provider persists. */
27
+ readonly reopen?: (storage: TStorage) => TStorage | Promise<TStorage>
19
28
  /**
20
29
  * Version id that is syntactically valid for the provider but should not
21
30
  * exist. Defaults to a generic id accepted by providers without format
@@ -65,6 +74,30 @@ const invoiceRef: FileRef = {
65
74
  logicalPath: "invoices/invoice.txt",
66
75
  }
67
76
 
77
+ const pipeline: DatasetProducer = { kind: "pipeline", id: "contract-pipeline", stepId: "copy" }
78
+ const source = (column: string): DatasetColumnRef => ({ datasetId: "contract.source", column })
79
+
80
+ /** A step that copies `contract.source` columns, as resolved lineage. */
81
+ const copied = {
82
+ rows: [],
83
+ columns: { customerName: [source("name")], orderId: [source("id")] },
84
+ }
85
+ /** The same step, before a fix: it wrote amounts into `customerName`. */
86
+ const fromAmount = {
87
+ rows: [],
88
+ columns: { customerName: [source("amount")], orderId: [source("id")] },
89
+ }
90
+
91
+ async function write(
92
+ storage: LakeStorage,
93
+ input: Pick<BeginDatasetWriteInput, "producer" | "lineage" | "mode">,
94
+ rows: readonly DatasetRow[]
95
+ ): Promise<DatasetWriteCommitResult> {
96
+ const session = await storage.beginWrite({ dataset: writeDataset, ...input })
97
+ await session.writeRows(rows)
98
+ return session.commit()
99
+ }
100
+
68
101
  /**
69
102
  * Runs the shared `LakeStorage` contract against any provider.
70
103
  *
@@ -612,7 +645,7 @@ export function runLakeStorageContractSuite<TStorage extends LakeStorage>(
612
645
 
613
646
  test("versions changed input lineage even when output rows are identical", () =>
614
647
  withStorage(async (storage) => {
615
- // Regression proof: omit hasDatasetInputChanges in the provider's no-op branch.
648
+ // Regression proof: omit hasDatasetProvenanceChanges in the provider's no-op branch.
616
649
  // The updated input reference is lost and the stale writer is no longer fenced.
617
650
  await storage.createDataset(writeDataset)
618
651
  await storage.createDataset(definitionDataset)
@@ -644,6 +677,68 @@ export function runLakeStorageContractSuite<TStorage extends LakeStorage>(
644
677
  expect(await collectRows(storage.readRows({ datasetId: writeDataset.id }))).toEqual(rows)
645
678
  }))
646
679
 
680
+ test("versions changed column lineage even when output rows are identical", () =>
681
+ withStorage(async (storage) => {
682
+ // Regression proof: compare only inputs in the provider's no-op branch. The rerun
683
+ // reuses the version without lineage, and its rows stay classified with every marking.
684
+ await storage.createDataset(writeDataset)
685
+ const rows = [{ orderId: "ord_1", customerName: "Ada" }]
686
+ const commit = async (
687
+ write: Pick<BeginDatasetWriteInput, "producer" | "lineage" | "mode">,
688
+ expectedLatestVersionId: string | null,
689
+ written: readonly DatasetRow[] = rows
690
+ ) => {
691
+ const session = await storage.beginWrite({ dataset: writeDataset, ...write })
692
+ await session.writeRows(written)
693
+ return session.commit({ expectedLatestVersionId })
694
+ }
695
+
696
+ const initial = await commit({ producer: pipeline }, null)
697
+ expect(initial.lineage).toBeUndefined()
698
+
699
+ const analyzed = await commit({ producer: pipeline, lineage: copied }, initial.versionId)
700
+ expect(analyzed).toMatchObject({ outcome: "created", lineage: copied })
701
+
702
+ // Order and repetition do not change a lineage.
703
+ const reordered = {
704
+ rows: [],
705
+ columns: {
706
+ orderId: [...copied.columns.orderId, ...copied.columns.orderId],
707
+ customerName: copied.columns.customerName,
708
+ },
709
+ }
710
+ expect(
711
+ await commit({ producer: pipeline, lineage: reordered }, analyzed.versionId)
712
+ ).toMatchObject({ outcome: "unchanged", versionId: analyzed.versionId })
713
+
714
+ // A run that recorded no lineage is a change too: reusing the analyzed version would
715
+ // classify its rows by a lineage the run did not record.
716
+ const unanalyzed = await commit({ producer: pipeline }, analyzed.versionId)
717
+ expect(unanalyzed).toMatchObject({ outcome: "created" })
718
+ expect(
719
+ (await storage.getVersion(writeDataset.id, unanalyzed.versionId))?.lineage
720
+ ).toBeUndefined()
721
+
722
+ // An empty append compares what it would store, after merging its parent's lineage.
723
+ const analyzedAgain = await commit(
724
+ { producer: pipeline, lineage: copied },
725
+ unanalyzed.versionId
726
+ )
727
+
728
+ const append = { producer: pipeline, mode: "append" } as const
729
+ const narrower = { rows: [], columns: { ...copied.columns, customerName: [] } }
730
+ expect(
731
+ await commit({ ...append, lineage: narrower }, analyzedAgain.versionId, [])
732
+ ).toMatchObject({ outcome: "unchanged", versionId: analyzedAgain.versionId })
733
+
734
+ const wider = { rows: [source("tenant")], columns: copied.columns }
735
+ const widened = await commit({ ...append, lineage: wider }, analyzedAgain.versionId, [])
736
+ expect(widened).toMatchObject({
737
+ outcome: "created",
738
+ lineage: { rows: [source("tenant")], columns: copied.columns },
739
+ })
740
+ }))
741
+
647
742
  test("creates an initial empty append version", async () => {
648
743
  await withStorage(async (storage) => {
649
744
  await storage.createDataset(writeDataset)
@@ -939,6 +1034,156 @@ export function runLakeStorageContractSuite<TStorage extends LakeStorage>(
939
1034
  })
940
1035
  })
941
1036
  })
1037
+
1038
+ describe("resolved column lineage", () => {
1039
+ test("stores the lineage of every version, in a canonical form, across reopening", async () => {
1040
+ let storage = await options.createStorage()
1041
+ try {
1042
+ // A provider that stores lineage says so: Sixb then reads a version without lineage as
1043
+ // one committed before the provider recorded it, not as one whose lineage was dropped.
1044
+ expect(storage.recordsLineage).toBe(true)
1045
+
1046
+ await storage.createDataset(writeDataset)
1047
+ const synced = await write(storage, { producer: { kind: "sync", id: "contract-sync" } }, [
1048
+ { orderId: "ord_1", customerName: "Ada" },
1049
+ ])
1050
+
1051
+ // Outside pipelines, a version depends on its own columns only.
1052
+ expect(synced.lineage).toEqual({ rows: [], columns: { customerName: [], orderId: [] } })
1053
+
1054
+ const repeated = {
1055
+ rows: [source("tenant"), source("tenant")],
1056
+ columns: {
1057
+ orderId: [source("id")],
1058
+ customerName: [source("name"), source("amount"), source("name")],
1059
+ dropped: [source("id")],
1060
+ },
1061
+ }
1062
+ const computed = await write(storage, { producer: pipeline, lineage: repeated }, [
1063
+ { orderId: "ord_1", customerName: "Ada" },
1064
+ ])
1065
+
1066
+ const canonical = {
1067
+ rows: [source("tenant")],
1068
+ columns: {
1069
+ customerName: [source("amount"), source("name")],
1070
+ orderId: [source("id")],
1071
+ },
1072
+ }
1073
+ expect(computed.lineage).toEqual(canonical)
1074
+
1075
+ if (options.reopen) storage = await options.reopen(storage)
1076
+
1077
+ expect((await storage.getVersion(writeDataset.id, computed.versionId))?.lineage).toEqual(
1078
+ canonical
1079
+ )
1080
+ expect((await storage.getLatestVersion(writeDataset.id))?.lineage).toEqual(canonical)
1081
+
1082
+ const listed = await storage.listVersions(writeDataset.id)
1083
+ expect(Object.fromEntries(listed.map((v) => [v.versionId, v.lineage]))).toEqual({
1084
+ [computed.versionId]: canonical,
1085
+ [synced.versionId]: synced.lineage,
1086
+ })
1087
+ } finally {
1088
+ await options.teardown?.(storage)
1089
+ }
1090
+ })
1091
+
1092
+ test("an append keeps its parent's lineage and a snapshot replaces it", () =>
1093
+ withStorage(async (storage) => {
1094
+ await storage.createDataset(writeDataset)
1095
+ await write(storage, { producer: pipeline, lineage: fromAmount }, [
1096
+ { orderId: "ord_1", customerName: "120.00" },
1097
+ ])
1098
+
1099
+ const appended = await write(
1100
+ storage,
1101
+ { producer: pipeline, lineage: copied, mode: "append" },
1102
+ [{ orderId: "ord_2", customerName: "Grace" }]
1103
+ )
1104
+
1105
+ expect(appended.lineage).toEqual({
1106
+ rows: [],
1107
+ columns: {
1108
+ customerName: [source("amount"), source("name")],
1109
+ orderId: [source("id")],
1110
+ },
1111
+ })
1112
+
1113
+ const replaced = await write(storage, { producer: pipeline, lineage: copied }, [
1114
+ { orderId: "ord_2", customerName: "Grace" },
1115
+ ])
1116
+ expect(replaced.lineage).toEqual(copied)
1117
+ }))
1118
+
1119
+ test("a version that keeps rows of an unknown history records it as unknown", () =>
1120
+ withStorage(async (storage) => {
1121
+ await storage.createDataset(writeDataset)
1122
+ const unanalyzed = await write(storage, { producer: pipeline }, [
1123
+ { orderId: "ord_1", customerName: "Ada" },
1124
+ ])
1125
+ expect(unanalyzed.lineage).toBeUndefined()
1126
+
1127
+ const unknown = {
1128
+ unknown: `version '${unanalyzed.versionId}' of '${writeDataset.id}' recorded no column lineage`,
1129
+ }
1130
+
1131
+ const synced = await write(
1132
+ storage,
1133
+ { producer: { kind: "sync", id: "contract-sync" }, mode: "append" },
1134
+ [{ orderId: "ord_2", customerName: "Grace" }]
1135
+ )
1136
+ expect(synced.lineage).toEqual(unknown)
1137
+
1138
+ // The reason keeps naming where the lineage was lost.
1139
+ const computed = await write(
1140
+ storage,
1141
+ { producer: pipeline, lineage: copied, mode: "append" },
1142
+ [{ orderId: "ord_3", customerName: "Katherine" }]
1143
+ )
1144
+
1145
+ expect(computed.lineage).toEqual(unknown)
1146
+ expect((await storage.getVersion(writeDataset.id, computed.versionId))?.lineage).toEqual(
1147
+ unknown
1148
+ )
1149
+
1150
+ const replaced = await write(storage, { producer: pipeline, lineage: copied }, [
1151
+ { orderId: "ord_3", customerName: "Katherine" },
1152
+ ])
1153
+ expect(replaced.lineage).toEqual(copied)
1154
+ }))
1155
+
1156
+ test("a schema change keeps its parent's lineage", () =>
1157
+ withStorage(async (storage) => {
1158
+ if (schemaEvolution === "strict") return
1159
+
1160
+ const initial = defineDataset("contract.lineage.schema_evolution", {
1161
+ schema: [col("invoiceId", "string")],
1162
+ })
1163
+ const widened = defineDataset("contract.lineage.schema_evolution", {
1164
+ schema: [col("invoiceId", "string"), col("currency", "string", { nullable: true })],
1165
+ })
1166
+
1167
+ await storage.createDataset(initial)
1168
+ const session = await storage.beginWrite({
1169
+ dataset: initial,
1170
+ producer: pipeline,
1171
+ lineage: { rows: [source("tenant")], columns: { invoiceId: [source("id")] } },
1172
+ })
1173
+ await session.writeRows([{ invoiceId: "inv_1" }])
1174
+ await session.commit()
1175
+
1176
+ await storage.createDataset(widened)
1177
+ const [schemaVersion] = await storage.listVersions(initial.id, 1)
1178
+ expect(schemaVersion?.mode).toBe("schema")
1179
+
1180
+ // Its rows hold no currency yet.
1181
+ expect(schemaVersion?.lineage).toEqual({
1182
+ rows: [source("tenant")],
1183
+ columns: { currency: [], invoiceId: [source("id")] },
1184
+ })
1185
+ }))
1186
+ })
942
1187
  })
943
1188
  }
944
1189
 
@@ -2128,6 +2128,7 @@ function observeActionRunRecords(storage: ContractStorage) {
2128
2128
  },
2129
2129
  recordEffects: (input) => actionRuns.recordEffects(input),
2130
2130
  getById: (input) => actionRuns.getById(input),
2131
+ getByExecutionIds: (input) => actionRuns.getByExecutionIds(input),
2131
2132
  list: (input) => actionRuns.list(input),
2132
2133
  }
2133
2134
  return run(
@@ -721,6 +721,60 @@ export function runOntologyStorageContractSuite<TStorage extends OntologyStorage
721
721
  })
722
722
  })
723
723
 
724
+ test("lists the dataset version each active source applied, in one read", async () => {
725
+ await withStorage(async (storage) => {
726
+ expect(
727
+ await storage.ontology.sources.listActive({ projectId: "contract-project" })
728
+ ).toEqual([])
729
+
730
+ const devices = await createReadyEmptyCandidate(storage, "run-a", "candidate-a", "01")
731
+ await activateEmptyCandidate(storage, devices, null, "commit-a", "2026-01-03T00:00:00.000Z")
732
+
733
+ const others = await createReadyEmptyCandidate(
734
+ storage,
735
+ "run-b",
736
+ "candidate-b",
737
+ "02",
738
+ "contract.others"
739
+ )
740
+ await activateEmptyCandidate(storage, others, null, "commit-b", "2026-01-04T00:00:00.000Z")
741
+
742
+ // A newer version supersedes the first one; a ready candidate is not active yet.
743
+ const newer = await createReadyEmptyCandidate(storage, "run-c", "candidate-c", "05")
744
+ const activeDevices = await storage.ontology.sources.getActive({
745
+ projectId: "contract-project",
746
+ source: devices.source,
747
+ })
748
+ await activateEmptyCandidate(
749
+ storage,
750
+ newer,
751
+ activeDevices,
752
+ "commit-c",
753
+ "2026-01-06T00:00:00.000Z"
754
+ )
755
+ await createReadyEmptyCandidate(storage, "run-d", "candidate-d", "07", "contract.pending")
756
+
757
+ const active = await storage.ontology.sources.listActive({ projectId: "contract-project" })
758
+ expect(
759
+ [...active].sort((a, b) => a.source.projectionId.localeCompare(b.source.projectionId))
760
+ ).toEqual([
761
+ {
762
+ source: { projectionId: "contract.devices" },
763
+ datasetVersion: newer.identity.datasetVersion,
764
+ projectionRevision: "projection-contract-revision",
765
+ },
766
+ {
767
+ source: { projectionId: "contract.others" },
768
+ datasetVersion: others.identity.datasetVersion,
769
+ projectionRevision: "projection-contract-revision",
770
+ },
771
+ ])
772
+ expect(await storage.ontology.sources.listActive({ projectId: "other-project" })).toEqual(
773
+ []
774
+ )
775
+ })
776
+ })
777
+
724
778
  test("rolls back exact rows, commits, and outbox writes through one transaction facade", async () => {
725
779
  await withStorage(async (storage) => {
726
780
  await expect(
@@ -1025,9 +1079,10 @@ async function createReadyEmptyCandidate(
1025
1079
  storage: OntologyStorageContractStorage,
1026
1080
  runId: string,
1027
1081
  materializationId: string,
1028
- versionId: string
1082
+ versionId: string,
1083
+ projectionId?: string
1029
1084
  ): Promise<ReadyCandidate> {
1030
- const identity = replacementIdentity(versionId)
1085
+ const identity = replacementIdentity(versionId, projectionId)
1031
1086
  const run = await startTestProjectionRun(storage, {
1032
1087
  id: runId,
1033
1088
  projectId: "contract-project",
@@ -80,6 +80,21 @@ export function runShareGrantStorageContractSuite<TStorage extends ShareGrantSto
80
80
  })
81
81
  })
82
82
 
83
+ test("reads several grants at once, in the order asked", async () => {
84
+ await withStorage(async (storage) => {
85
+ const first = await storage.create(grantInput())
86
+ const second = await storage.create(
87
+ grantInput({ id: "shr_2", tokenHash: "b".repeat(64), definitionId: "invoice" })
88
+ )
89
+ await storage.create(grantInput({ id: "shr_3", projectId: "other-project" }))
90
+
91
+ await expect(
92
+ storage.getByIds({ projectId, ids: ["shr_2", "missing", "shr_1", "shr_2", "shr_3"] })
93
+ ).resolves.toEqual([second, first])
94
+ await expect(storage.getByIds({ projectId, ids: [] })).resolves.toEqual([])
95
+ })
96
+ })
97
+
83
98
  test("lists a bounded deterministic page with total and hasMore", async () => {
84
99
  await withStorage(async (storage) => {
85
100
  await storage.create(grantInput({ id: "shr_a", tokenHash: "b".repeat(64) }))
@@ -3,6 +3,7 @@ import { isActionDefinition } from "../actions"
3
3
  import { AGENT_REASONING_LEVELS, isAgentToolDefinition } from "../agents"
4
4
  import { isModelReasoning } from "../models/language-model"
5
5
  import type { SchemaOrRef } from "../ontology"
6
+ import type { SandboxFactory } from "../sandboxes"
6
7
  import type { ScheduleDefinition, ScheduleDefinitionForEvent } from "../schedules"
7
8
  import { isScheduleDefinition } from "../schedules"
8
9
  import { isGroupDefinition } from "../security"
@@ -25,6 +26,7 @@ import type {
25
26
  WorkflowTriggerDefinition,
26
27
  } from "./types"
27
28
  import {
29
+ assertAgentStepSandbox,
28
30
  assertNonEmpty,
29
31
  isAgentStepDefinition,
30
32
  isInterventionDefinition,
@@ -137,6 +139,7 @@ export function defineAgentStep<const TId extends string>(
137
139
  const groupIds = groupIdsFromAgentStepConfig(id, config)
138
140
  const toolNames = toolNamesFromAgentStepConfig(id, config)
139
141
  const skillNames = skillNamesFromAgentStepConfig(id, config)
142
+ const sandbox = sandboxFromAgentStepConfig(id, config)
140
143
 
141
144
  return {
142
145
  input(input: RuntimeWorkflowInput): unknown {
@@ -156,6 +159,7 @@ export function defineAgentStep<const TId extends string>(
156
159
  groupIds,
157
160
  toolNames,
158
161
  skillNames,
162
+ ...(sandbox === undefined ? {} : { sandbox }),
159
163
  input,
160
164
  output,
161
165
  prompt,
@@ -231,6 +235,16 @@ function skillNamesFromAgentStepConfig(
231
235
  return Object.freeze(skillNames)
232
236
  }
233
237
 
238
+ function sandboxFromAgentStepConfig(
239
+ stepId: string,
240
+ config: DefineAgentStepConfig
241
+ ): SandboxFactory | undefined {
242
+ if (config.sandbox === undefined) return undefined
243
+
244
+ assertAgentStepSandbox(config.sandbox, `Agent step "${stepId}"`)
245
+ return config.sandbox
246
+ }
247
+
234
248
  function assertUniqueAgentStepValues(
235
249
  stepId: string,
236
250
  kind: "group" | "tool" | "skill",