@sixb/core 0.1.15 → 0.1.17

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 (585) hide show
  1. package/dist/actions/index.js +25 -25
  2. package/dist/actions/types/context.d.ts +2 -2
  3. package/dist/actions/types/context.d.ts.map +1 -1
  4. package/dist/actions/worker.js +1 -1
  5. package/dist/agents/index.js +41 -40
  6. package/dist/agents/index.js.map +1 -1
  7. package/dist/auth/index.js +5 -5
  8. package/dist/authorization/index.js +2 -2
  9. package/dist/blob-storage/download-urls.d.ts +41 -0
  10. package/dist/blob-storage/download-urls.d.ts.map +1 -0
  11. package/dist/blob-storage/execution.d.ts +9 -1
  12. package/dist/blob-storage/execution.d.ts.map +1 -1
  13. package/dist/blob-storage/index.js +5 -3
  14. package/dist/blob-storage/index.js.map +1 -1
  15. package/dist/blob-storage/internal.d.ts +2 -0
  16. package/dist/blob-storage/internal.d.ts.map +1 -0
  17. package/dist/blob-storage/internal.js +11 -0
  18. package/dist/blob-storage/internal.js.map +9 -0
  19. package/dist/bootstrap/index.js +45 -44
  20. package/dist/bootstrap/index.js.map +1 -1
  21. package/dist/{chunk-wem5vqjw.js → chunk-10styjgk.js} +18 -13
  22. package/dist/{chunk-wem5vqjw.js.map → chunk-10styjgk.js.map} +3 -3
  23. package/dist/{chunk-hgqpcmyr.js → chunk-1hqwggsn.js} +47 -19
  24. package/dist/chunk-1hqwggsn.js.map +12 -0
  25. package/dist/{chunk-q3grgzp1.js → chunk-23xs4qp9.js} +2 -2
  26. package/dist/{chunk-vef6qa14.js → chunk-2am3db31.js} +2 -2
  27. package/dist/{chunk-fj1dvp37.js → chunk-2vhg6ysa.js} +1 -1
  28. package/dist/{chunk-p0nbkys4.js → chunk-33saed7g.js} +1 -1
  29. package/dist/{chunk-mdnw7nj8.js → chunk-3rrezgyc.js} +33 -8
  30. package/dist/chunk-3rrezgyc.js.map +15 -0
  31. package/dist/{chunk-jgwb25gc.js → chunk-4as3wt1c.js} +13 -5
  32. package/dist/chunk-4as3wt1c.js.map +12 -0
  33. package/dist/chunk-4ra628t7.js +88 -0
  34. package/dist/chunk-4ra628t7.js.map +10 -0
  35. package/dist/{chunk-mmac1mp6.js → chunk-52c5zb0z.js} +2 -2
  36. package/dist/{chunk-8fjmqjyx.js → chunk-5be2ath4.js} +1 -1
  37. package/dist/{chunk-2fv8sajb.js → chunk-5thzcb8g.js} +2 -2
  38. package/dist/{chunk-fjw417jf.js → chunk-5yd8cchh.js} +1143 -784
  39. package/dist/chunk-5yd8cchh.js.map +66 -0
  40. package/dist/{chunk-2tz5vnvz.js → chunk-6wbm6ymz.js} +235 -41
  41. package/dist/{chunk-2tz5vnvz.js.map → chunk-6wbm6ymz.js.map} +8 -6
  42. package/dist/{chunk-py2dw8cw.js → chunk-7ecp4v7a.js} +26 -19
  43. package/dist/chunk-7ecp4v7a.js.map +17 -0
  44. package/dist/{chunk-f85hpqnm.js → chunk-99nd4rc1.js} +3 -3
  45. package/dist/{chunk-f85hpqnm.js.map → chunk-99nd4rc1.js.map} +3 -3
  46. package/dist/{chunk-1jvq82rp.js → chunk-9g6jz9kk.js} +5 -5
  47. package/dist/{chunk-39tqv9hz.js → chunk-9se093qz.js} +5 -6
  48. package/dist/{chunk-39tqv9hz.js.map → chunk-9se093qz.js.map} +3 -4
  49. package/dist/{chunk-8w27xf9e.js → chunk-a7er86jd.js} +1 -1
  50. package/dist/{chunk-zdkcdshk.js → chunk-aq39q04r.js} +41 -3
  51. package/dist/{chunk-zdkcdshk.js.map → chunk-aq39q04r.js.map} +4 -3
  52. package/dist/chunk-b9affek3.js +261 -0
  53. package/dist/chunk-b9affek3.js.map +12 -0
  54. package/dist/{chunk-bxx3ms5t.js → chunk-c2rga5cx.js} +2 -2
  55. package/dist/{chunk-dsfw1bdr.js → chunk-cnb5kv05.js} +2 -2
  56. package/dist/chunk-d62kjtbg.js.map +2 -2
  57. package/dist/{chunk-dqkd3kdj.js → chunk-dam456ve.js} +234 -35
  58. package/dist/{chunk-dqkd3kdj.js.map → chunk-dam456ve.js.map} +7 -5
  59. package/dist/{chunk-n5t4mq6z.js → chunk-e67ynxcr.js} +3 -3
  60. package/dist/{chunk-xnx96gfy.js → chunk-ere85b8y.js} +17 -8
  61. package/dist/chunk-ere85b8y.js.map +15 -0
  62. package/dist/{chunk-k4kkp58d.js → chunk-ewqa58h9.js} +12 -2
  63. package/dist/chunk-ewqa58h9.js.map +11 -0
  64. package/dist/{chunk-6q7c68yx.js → chunk-f1xh7a32.js} +3 -3
  65. package/dist/{chunk-z708gemf.js → chunk-fggq3d9k.js} +450 -799
  66. package/dist/chunk-fggq3d9k.js.map +49 -0
  67. package/dist/{chunk-7jc21943.js → chunk-gf7yht60.js} +4 -4
  68. package/dist/chunk-h8teetr0.js +9 -0
  69. package/dist/chunk-h8teetr0.js.map +10 -0
  70. package/dist/chunk-hn2r7z41.js.map +1 -1
  71. package/dist/{chunk-ffwvdgk1.js → chunk-jjrn5v0p.js} +1 -1
  72. package/dist/{chunk-r5sc1d2b.js → chunk-jnfxmr3f.js} +1 -1
  73. package/dist/{chunk-y0zmae99.js → chunk-k4g51s47.js} +3 -3
  74. package/dist/{chunk-a0073121.js → chunk-kpx7jrmn.js} +3 -1
  75. package/dist/chunk-kpx7jrmn.js.map +12 -0
  76. package/dist/{chunk-p1683c0v.js → chunk-kyjcwqz6.js} +5 -2
  77. package/dist/{chunk-p1683c0v.js.map → chunk-kyjcwqz6.js.map} +3 -3
  78. package/dist/{chunk-3c90jvfj.js → chunk-pja9jfz6.js} +742 -583
  79. package/dist/chunk-pja9jfz6.js.map +19 -0
  80. package/dist/chunk-pqajwytd.js.map +1 -1
  81. package/dist/{chunk-mr60an99.js → chunk-qczk96d9.js} +22 -2
  82. package/dist/{chunk-mr60an99.js.map → chunk-qczk96d9.js.map} +3 -3
  83. package/dist/{chunk-s3csryxe.js → chunk-rj69qcrd.js} +8 -2
  84. package/dist/chunk-rj69qcrd.js.map +11 -0
  85. package/dist/{chunk-d8yes9yx.js → chunk-rpxz486p.js} +32 -5
  86. package/dist/{chunk-d8yes9yx.js.map → chunk-rpxz486p.js.map} +4 -4
  87. package/dist/{chunk-drz59ve0.js → chunk-rx7h5fdx.js} +1 -1
  88. package/dist/{chunk-ky7zpbtt.js → chunk-s7ftxrdr.js} +106 -8
  89. package/dist/chunk-s7ftxrdr.js.map +22 -0
  90. package/dist/{chunk-yfppyaty.js → chunk-sk0hcjsz.js} +1 -1
  91. package/dist/{chunk-qne45xqq.js → chunk-svabwqdq.js} +2 -2
  92. package/dist/{chunk-xr7y35yj.js → chunk-t9shqx3w.js} +2 -2
  93. package/dist/{chunk-4jph1t3v.js → chunk-tjjgy3z4.js} +27 -24
  94. package/dist/{chunk-4jph1t3v.js.map → chunk-tjjgy3z4.js.map} +4 -4
  95. package/dist/{chunk-ex8s8wsk.js → chunk-vp3z1ckh.js} +42 -10
  96. package/dist/{chunk-ex8s8wsk.js.map → chunk-vp3z1ckh.js.map} +7 -6
  97. package/dist/{chunk-adbve9zt.js → chunk-vre348sb.js} +2 -2
  98. package/dist/{chunk-a4g5yjm0.js → chunk-w9yycd3t.js} +1 -1
  99. package/dist/{chunk-g4rbm4a6.js → chunk-wt4szfec.js} +379 -331
  100. package/dist/chunk-wt4szfec.js.map +14 -0
  101. package/dist/{chunk-wd34wnsy.js → chunk-xcy5ddha.js} +6 -6
  102. package/dist/{chunk-3nx8vj5a.js → chunk-xyvy73tj.js} +5 -3
  103. package/dist/chunk-xyvy73tj.js.map +12 -0
  104. package/dist/datasets/write.js +1 -1
  105. package/dist/execution/agent.js +38 -37
  106. package/dist/execution/agent.js.map +1 -1
  107. package/dist/execution/authorized-object-reader.d.ts +3 -1
  108. package/dist/execution/authorized-object-reader.d.ts.map +1 -1
  109. package/dist/execution/primitive.js +36 -35
  110. package/dist/execution/primitive.js.map +2 -2
  111. package/dist/execution/request.js +37 -36
  112. package/dist/execution/request.js.map +2 -2
  113. package/dist/index.d.ts +8 -4
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +62 -59
  116. package/dist/index.js.map +1 -1
  117. package/dist/lake-storage/in-memory.d.ts +5 -1
  118. package/dist/lake-storage/in-memory.d.ts.map +1 -1
  119. package/dist/lake-storage/index.d.ts +1 -1
  120. package/dist/lake-storage/index.d.ts.map +1 -1
  121. package/dist/lake-storage/index.js +2 -2
  122. package/dist/lake-storage/types.d.ts +26 -0
  123. package/dist/lake-storage/types.d.ts.map +1 -1
  124. package/dist/maintenance/ontology-maintenance.d.ts +5 -1
  125. package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
  126. package/dist/maintenance/types.d.ts +1 -4
  127. package/dist/maintenance/types.d.ts.map +1 -1
  128. package/dist/materialization/event-envelopes.d.ts +20 -0
  129. package/dist/materialization/event-envelopes.d.ts.map +1 -0
  130. package/dist/materialization/events.d.ts +29 -3
  131. package/dist/materialization/events.d.ts.map +1 -1
  132. package/dist/materialization/index.d.ts +4 -1
  133. package/dist/materialization/index.d.ts.map +1 -1
  134. package/dist/materialization/index.js +9 -3
  135. package/dist/materialization/index.js.map +1 -1
  136. package/dist/materializer/edits/plan.d.ts +2 -10
  137. package/dist/materializer/edits/plan.d.ts.map +1 -1
  138. package/dist/materializer/effective/build-events.d.ts +5 -21
  139. package/dist/materializer/effective/build-events.d.ts.map +1 -1
  140. package/dist/materializer/effective/vector-indexing.d.ts +2 -3
  141. package/dist/materializer/effective/vector-indexing.d.ts.map +1 -1
  142. package/dist/materializer/effective/vectors.d.ts +2 -3
  143. package/dist/materializer/effective/vectors.d.ts.map +1 -1
  144. package/dist/materializer/execution/scope.d.ts +1 -11
  145. package/dist/materializer/execution/scope.d.ts.map +1 -1
  146. package/dist/materializer/execution/work-executor.d.ts +5 -7
  147. package/dist/materializer/execution/work-executor.d.ts.map +1 -1
  148. package/dist/materializer/execution/work-records.d.ts +1 -3
  149. package/dist/materializer/execution/work-records.d.ts.map +1 -1
  150. package/dist/materializer/index.js +31 -32
  151. package/dist/materializer/index.js.map +1 -1
  152. package/dist/materializer/projections/replace.d.ts.map +1 -1
  153. package/dist/materializer/projections/replacement-plan.d.ts +8 -11
  154. package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
  155. package/dist/materializer/shared/batching.d.ts +5 -0
  156. package/dist/materializer/shared/batching.d.ts.map +1 -1
  157. package/dist/materializer/telemetry/plan.d.ts +2 -8
  158. package/dist/materializer/telemetry/plan.d.ts.map +1 -1
  159. package/dist/models/audio/catalog.d.ts +20 -0
  160. package/dist/models/audio/catalog.d.ts.map +1 -0
  161. package/dist/models/audio/errors.d.ts +8 -0
  162. package/dist/models/audio/errors.d.ts.map +1 -0
  163. package/dist/models/audio/file.d.ts +9 -0
  164. package/dist/models/audio/file.d.ts.map +1 -0
  165. package/dist/models/audio/runtime.d.ts +8 -0
  166. package/dist/models/audio/runtime.d.ts.map +1 -0
  167. package/dist/models/audio/types.d.ts +60 -0
  168. package/dist/models/audio/types.d.ts.map +1 -0
  169. package/dist/models/catalog.d.ts +23 -1
  170. package/dist/models/catalog.d.ts.map +1 -1
  171. package/dist/models/definitions.d.ts +1 -1
  172. package/dist/models/definitions.d.ts.map +1 -1
  173. package/dist/models/embedding-model.d.ts +4 -0
  174. package/dist/models/embedding-model.d.ts.map +1 -1
  175. package/dist/models/events.d.ts +3 -0
  176. package/dist/models/events.d.ts.map +1 -1
  177. package/dist/models/execution/index.js +22 -22
  178. package/dist/models/execution/model-call-admission.d.ts +6 -1
  179. package/dist/models/execution/model-call-admission.d.ts.map +1 -1
  180. package/dist/models/execution/model-call-limits.d.ts.map +1 -1
  181. package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
  182. package/dist/models/execution/reranking.d.ts +4 -0
  183. package/dist/models/execution/reranking.d.ts.map +1 -0
  184. package/dist/models/execution/usage.d.ts.map +1 -1
  185. package/dist/models/execution.d.ts +2 -1
  186. package/dist/models/execution.d.ts.map +1 -1
  187. package/dist/models/generation-types.d.ts +2 -0
  188. package/dist/models/generation-types.d.ts.map +1 -1
  189. package/dist/models/index.d.ts +7 -1
  190. package/dist/models/index.d.ts.map +1 -1
  191. package/dist/models/index.js +7 -3
  192. package/dist/models/index.js.map +1 -1
  193. package/dist/models/pricing.d.ts +2 -2
  194. package/dist/models/pricing.d.ts.map +1 -1
  195. package/dist/models/reranking-model.d.ts +49 -0
  196. package/dist/models/reranking-model.d.ts.map +1 -0
  197. package/dist/objects/index.js +25 -25
  198. package/dist/objects/query/executor.d.ts +2 -1
  199. package/dist/objects/query/executor.d.ts.map +1 -1
  200. package/dist/objects/query/index.d.ts +1 -1
  201. package/dist/objects/query/index.d.ts.map +1 -1
  202. package/dist/objects/query/index.js +24 -24
  203. package/dist/objects/query/index.js.map +1 -1
  204. package/dist/objects/query/ir.d.ts +8 -1
  205. package/dist/objects/query/ir.d.ts.map +1 -1
  206. package/dist/objects/query/normalize.d.ts.map +1 -1
  207. package/dist/objects/query/planner.d.ts +1 -1
  208. package/dist/objects/query/planner.d.ts.map +1 -1
  209. package/dist/objects/query/primary-id.d.ts +7 -0
  210. package/dist/objects/query/primary-id.d.ts.map +1 -0
  211. package/dist/objects/query/reranking-executor.d.ts +13 -0
  212. package/dist/objects/query/reranking-executor.d.ts.map +1 -0
  213. package/dist/objects/query/reranking-limits.d.ts +3 -0
  214. package/dist/objects/query/reranking-limits.d.ts.map +1 -0
  215. package/dist/objects/query/reranking-query.d.ts +4 -0
  216. package/dist/objects/query/reranking-query.d.ts.map +1 -0
  217. package/dist/objects/query/validate.d.ts.map +1 -1
  218. package/dist/objects/sdk/query-builder.d.ts +8 -0
  219. package/dist/objects/sdk/query-builder.d.ts.map +1 -1
  220. package/dist/objects/sdk/query-executor.d.ts +2 -2
  221. package/dist/objects/sdk/query-executor.d.ts.map +1 -1
  222. package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
  223. package/dist/objects/vectors/indexing-dispatch.d.ts +21 -0
  224. package/dist/objects/vectors/indexing-dispatch.d.ts.map +1 -0
  225. package/dist/objects/vectors/indexing-generate.d.ts.map +1 -1
  226. package/dist/objects/vectors/profile.d.ts.map +1 -1
  227. package/dist/objects/vectors/query.d.ts +1 -1
  228. package/dist/objects/vectors/query.d.ts.map +1 -1
  229. package/dist/objects/vectors/resolve-query.d.ts.map +1 -1
  230. package/dist/objects/vectors/types.d.ts +1 -1
  231. package/dist/objects/vectors/types.d.ts.map +1 -1
  232. package/dist/ontology/builders.d.ts +13 -4
  233. package/dist/ontology/builders.d.ts.map +1 -1
  234. package/dist/ontology/index.d.ts +1 -1
  235. package/dist/ontology/index.d.ts.map +1 -1
  236. package/dist/ontology/index.js +3 -3
  237. package/dist/ontology/internal.js +2 -2
  238. package/dist/ontology/query-capabilities.d.ts +1 -0
  239. package/dist/ontology/query-capabilities.d.ts.map +1 -1
  240. package/dist/ontology/types.d.ts +20 -0
  241. package/dist/ontology/types.d.ts.map +1 -1
  242. package/dist/ontology/validation/query.d.ts.map +1 -1
  243. package/dist/ontology/vector-profiles.d.ts.map +1 -1
  244. package/dist/pipelines/index.js +23 -23
  245. package/dist/projections/internal.js +22 -22
  246. package/dist/query.d.ts +4 -2
  247. package/dist/query.d.ts.map +1 -1
  248. package/dist/query.js +2 -2
  249. package/dist/queues/in-memory.d.ts +3 -0
  250. package/dist/queues/in-memory.d.ts.map +1 -1
  251. package/dist/queues/index.js +1 -1
  252. package/dist/queues/types.d.ts +4 -0
  253. package/dist/queues/types.d.ts.map +1 -1
  254. package/dist/runtime/host.d.ts +1 -0
  255. package/dist/runtime/host.d.ts.map +1 -1
  256. package/dist/runtime/index.d.ts +1 -1
  257. package/dist/runtime/index.d.ts.map +1 -1
  258. package/dist/runtime/internal.d.ts +1 -0
  259. package/dist/runtime/internal.d.ts.map +1 -1
  260. package/dist/runtime/internal.js +28 -26
  261. package/dist/runtime/internal.js.map +1 -1
  262. package/dist/runtime/public-origin.d.ts +10 -0
  263. package/dist/runtime/public-origin.d.ts.map +1 -0
  264. package/dist/runtime/sixb.d.ts +1 -0
  265. package/dist/runtime/sixb.d.ts.map +1 -1
  266. package/dist/runtime/types.d.ts +12 -2
  267. package/dist/runtime/types.d.ts.map +1 -1
  268. package/dist/sandboxes/index.js +5 -5
  269. package/dist/shares/internal.js +19 -19
  270. package/dist/storage/agents/provider.js +2 -2
  271. package/dist/storage/ai-cost/analytics.d.ts +1 -0
  272. package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
  273. package/dist/storage/ai-cost/provider.js +3 -3
  274. package/dist/storage/ai-cost/types.d.ts +1 -1
  275. package/dist/storage/ai-cost/types.d.ts.map +1 -1
  276. package/dist/storage/ai-cost/validation.d.ts.map +1 -1
  277. package/dist/storage/ai-limits/enforcement.js +2 -2
  278. package/dist/storage/ai-limits/in-memory.d.ts.map +1 -1
  279. package/dist/storage/ai-limits/provider.d.ts +7 -2
  280. package/dist/storage/ai-limits/provider.d.ts.map +1 -1
  281. package/dist/storage/ai-limits/provider.js +4 -2
  282. package/dist/storage/ai-limits/provider.js.map +1 -1
  283. package/dist/storage/ai-limits/types.d.ts +3 -0
  284. package/dist/storage/ai-limits/types.d.ts.map +1 -1
  285. package/dist/storage/ai-usage/record.d.ts.map +1 -1
  286. package/dist/storage/ai-usage/types.d.ts +8 -4
  287. package/dist/storage/ai-usage/types.d.ts.map +1 -1
  288. package/dist/storage/ai-usage/usage.d.ts.map +1 -1
  289. package/dist/storage/file-download-grants/in-memory.d.ts +11 -0
  290. package/dist/storage/file-download-grants/in-memory.d.ts.map +1 -0
  291. package/dist/storage/file-download-grants/index.d.ts +3 -0
  292. package/dist/storage/file-download-grants/index.d.ts.map +1 -0
  293. package/dist/storage/file-download-grants/record.d.ts +11 -0
  294. package/dist/storage/file-download-grants/record.d.ts.map +1 -0
  295. package/dist/storage/file-download-grants/types.d.ts +44 -0
  296. package/dist/storage/file-download-grants/types.d.ts.map +1 -0
  297. package/dist/storage/file-upload-sessions/provider.js +6 -6
  298. package/dist/storage/in-memory/index.d.ts +4 -0
  299. package/dist/storage/in-memory/index.d.ts.map +1 -1
  300. package/dist/storage/index.d.ts +5 -3
  301. package/dist/storage/index.d.ts.map +1 -1
  302. package/dist/storage/index.js +30 -30
  303. package/dist/storage/index.js.map +1 -1
  304. package/dist/storage/internal.d.ts +1 -0
  305. package/dist/storage/internal.d.ts.map +1 -1
  306. package/dist/storage/internal.js +8 -4
  307. package/dist/storage/internal.js.map +1 -1
  308. package/dist/storage/migrations/index.d.ts +1 -1
  309. package/dist/storage/migrations/index.d.ts.map +1 -1
  310. package/dist/storage/migrations/migrate-storage.d.ts +3 -3
  311. package/dist/storage/migrations/migrate-storage.d.ts.map +1 -1
  312. package/dist/storage/migrations/types.d.ts +7 -0
  313. package/dist/storage/migrations/types.d.ts.map +1 -1
  314. package/dist/storage/objects/in-memory/query.d.ts.map +1 -1
  315. package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -1
  316. package/dist/storage/objects/in-memory/storage.d.ts.map +1 -1
  317. package/dist/storage/objects/query-preparation.d.ts +39 -0
  318. package/dist/storage/objects/query-preparation.d.ts.map +1 -0
  319. package/dist/storage/objects/types.d.ts +2 -0
  320. package/dist/storage/objects/types.d.ts.map +1 -1
  321. package/dist/storage/ontology/commits.d.ts +1 -6
  322. package/dist/storage/ontology/commits.d.ts.map +1 -1
  323. package/dist/storage/ontology/in-memory/index.d.ts +4 -2
  324. package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
  325. package/dist/storage/ontology/in-memory/materializations-state.d.ts +0 -2
  326. package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -1
  327. package/dist/storage/ontology/in-memory/materializations-work.d.ts +1 -3
  328. package/dist/storage/ontology/in-memory/materializations-work.d.ts.map +1 -1
  329. package/dist/storage/ontology/in-memory/materializations.d.ts +23 -57
  330. package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
  331. package/dist/storage/ontology/in-memory/outbox.d.ts +3 -2
  332. package/dist/storage/ontology/in-memory/outbox.d.ts.map +1 -1
  333. package/dist/storage/ontology/in-memory/replacement-plans.d.ts +104 -0
  334. package/dist/storage/ontology/in-memory/replacement-plans.d.ts.map +1 -0
  335. package/dist/storage/ontology/in-memory/shared-state.d.ts +17 -2
  336. package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
  337. package/dist/storage/ontology/in-memory/source-roots.d.ts +3 -1
  338. package/dist/storage/ontology/in-memory/source-roots.d.ts.map +1 -1
  339. package/dist/storage/ontology/in-memory/sources.d.ts +1 -2
  340. package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -1
  341. package/dist/storage/ontology/in-memory/state-reader.d.ts +25 -0
  342. package/dist/storage/ontology/in-memory/state-reader.d.ts.map +1 -0
  343. package/dist/storage/ontology/index.d.ts +6 -3
  344. package/dist/storage/ontology/index.d.ts.map +1 -1
  345. package/dist/storage/ontology/materializations.d.ts +40 -59
  346. package/dist/storage/ontology/materializations.d.ts.map +1 -1
  347. package/dist/storage/ontology/outbox.d.ts +4 -6
  348. package/dist/storage/ontology/outbox.d.ts.map +1 -1
  349. package/dist/storage/ontology/provider-work.d.ts +114 -3
  350. package/dist/storage/ontology/provider-work.d.ts.map +1 -1
  351. package/dist/storage/ontology/provider.d.ts +14 -39
  352. package/dist/storage/ontology/provider.d.ts.map +1 -1
  353. package/dist/storage/ontology/provider.js +26 -12
  354. package/dist/storage/ontology/provider.js.map +1 -1
  355. package/dist/storage/ontology/replacement-plans.d.ts +103 -0
  356. package/dist/storage/ontology/replacement-plans.d.ts.map +1 -0
  357. package/dist/storage/ontology/sources.d.ts +0 -8
  358. package/dist/storage/ontology/sources.d.ts.map +1 -1
  359. package/dist/storage/operation-scope.d.ts.map +1 -1
  360. package/dist/storage/operation-scope.js +1 -1
  361. package/dist/storage/projection-runs/in-memory.d.ts.map +1 -1
  362. package/dist/storage/projection-runs/types.d.ts +2 -0
  363. package/dist/storage/projection-runs/types.d.ts.map +1 -1
  364. package/dist/storage/types.d.ts +2 -0
  365. package/dist/storage/types.d.ts.map +1 -1
  366. package/dist/storage/workflow-runs/provider.js +6 -6
  367. package/dist/syncs/index.js +24 -24
  368. package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
  369. package/dist/testing/ai-limit-storage-contract.d.ts.map +1 -1
  370. package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -1
  371. package/dist/testing/file-download-grant-storage-contract.d.ts +9 -0
  372. package/dist/testing/file-download-grant-storage-contract.d.ts.map +1 -0
  373. package/dist/testing/index.d.ts +1 -0
  374. package/dist/testing/index.d.ts.map +1 -1
  375. package/dist/testing/index.js +2548 -1489
  376. package/dist/testing/index.js.map +14 -13
  377. package/dist/testing/lake-storage-contract.d.ts.map +1 -1
  378. package/dist/testing/materializer-storage-contract.d.ts +14 -0
  379. package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
  380. package/dist/testing/object-read-scope-contract.d.ts.map +1 -1
  381. package/dist/testing/ontology-contract-fixture.d.ts +5 -1
  382. package/dist/testing/ontology-contract-fixture.d.ts.map +1 -1
  383. package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
  384. package/dist/testing/projection-run-storage-contract.d.ts.map +1 -1
  385. package/dist/testing/queues-contract.d.ts.map +1 -1
  386. package/dist/webhooks/internal.js +20 -20
  387. package/dist/workers/index.js +15 -17
  388. package/dist/workers/index.js.map +3 -3
  389. package/dist/workers/queue-worker.d.ts +3 -2
  390. package/dist/workers/queue-worker.d.ts.map +1 -1
  391. package/dist/workflows/index.js +42 -41
  392. package/dist/workflows/index.js.map +1 -1
  393. package/package.json +7 -1
  394. package/src/actions/types/context.ts +5 -2
  395. package/src/blob-storage/download-urls.ts +138 -0
  396. package/src/blob-storage/execution.ts +32 -1
  397. package/src/blob-storage/internal.ts +1 -0
  398. package/src/execution/authorized-object-reader.ts +8 -1
  399. package/src/index.ts +25 -0
  400. package/src/lake-storage/in-memory.ts +38 -9
  401. package/src/lake-storage/index.ts +2 -0
  402. package/src/lake-storage/types.ts +30 -0
  403. package/src/maintenance/ontology-maintenance.ts +50 -23
  404. package/src/maintenance/types.ts +1 -4
  405. package/src/materialization/event-envelopes.ts +168 -0
  406. package/src/materialization/events.ts +40 -4
  407. package/src/materialization/index.ts +9 -1
  408. package/src/materializer/README.md +55 -10
  409. package/src/materializer/edits/commit.ts +3 -19
  410. package/src/materializer/edits/plan.ts +20 -71
  411. package/src/materializer/effective/build-events.ts +42 -136
  412. package/src/materializer/effective/vector-indexing.ts +2 -3
  413. package/src/materializer/effective/vectors.ts +2 -3
  414. package/src/materializer/execution/scope.ts +1 -38
  415. package/src/materializer/execution/work-executor.ts +21 -115
  416. package/src/materializer/execution/work-records.ts +0 -15
  417. package/src/materializer/projections/replace.ts +106 -63
  418. package/src/materializer/projections/replacement-plan.ts +73 -218
  419. package/src/materializer/shared/batching.ts +7 -0
  420. package/src/materializer/telemetry/append.ts +2 -14
  421. package/src/materializer/telemetry/plan.ts +6 -43
  422. package/src/models/audio/catalog.ts +90 -0
  423. package/src/models/audio/errors.ts +19 -0
  424. package/src/models/audio/file.ts +78 -0
  425. package/src/models/audio/runtime.ts +182 -0
  426. package/src/models/audio/types.ts +69 -0
  427. package/src/models/catalog.ts +52 -5
  428. package/src/models/definitions.ts +8 -1
  429. package/src/models/embedding-model.ts +12 -0
  430. package/src/models/events.ts +3 -0
  431. package/src/models/execution/README.md +20 -1
  432. package/src/models/execution/embedding.ts +5 -1
  433. package/src/models/execution/model-call-admission.ts +6 -1
  434. package/src/models/execution/model-call-limits.ts +21 -11
  435. package/src/models/execution/model-call-recorder.ts +1 -0
  436. package/src/models/execution/model-call-recovery.ts +1 -0
  437. package/src/models/execution/reranking.ts +137 -0
  438. package/src/models/execution/usage.ts +1 -0
  439. package/src/models/execution.ts +5 -1
  440. package/src/models/generation-types.ts +2 -0
  441. package/src/models/index.ts +32 -0
  442. package/src/models/pricing.ts +2 -1
  443. package/src/models/reranking-model.ts +114 -0
  444. package/src/objects/query/executor.ts +42 -2
  445. package/src/objects/query/explain.ts +8 -0
  446. package/src/objects/query/index.ts +1 -0
  447. package/src/objects/query/ir.ts +10 -0
  448. package/src/objects/query/normalize.ts +2 -0
  449. package/src/objects/query/planner.ts +12 -1
  450. package/src/objects/query/primary-id.ts +56 -0
  451. package/src/objects/query/reranking-executor.ts +91 -0
  452. package/src/objects/query/reranking-limits.ts +3 -0
  453. package/src/objects/query/reranking-query.ts +8 -0
  454. package/src/objects/query/validate.ts +33 -10
  455. package/src/objects/sdk/query-builder.ts +15 -2
  456. package/src/objects/sdk/query-executor.ts +2 -2
  457. package/src/objects/sdk/runtime-query-executor.ts +7 -4
  458. package/src/objects/vectors/README.md +14 -2
  459. package/src/objects/vectors/handle.ts +1 -1
  460. package/src/objects/vectors/indexing-dispatch.ts +83 -0
  461. package/src/objects/vectors/indexing-generate.ts +5 -1
  462. package/src/objects/vectors/profile.ts +2 -0
  463. package/src/objects/vectors/query.ts +21 -4
  464. package/src/objects/vectors/resolve-query.ts +9 -5
  465. package/src/objects/vectors/types.ts +3 -1
  466. package/src/ontology/builders.ts +22 -7
  467. package/src/ontology/index.ts +2 -0
  468. package/src/ontology/query-capabilities.ts +1 -1
  469. package/src/ontology/types.ts +21 -0
  470. package/src/ontology/validation/query.ts +57 -0
  471. package/src/ontology/vector-profiles.ts +1 -0
  472. package/src/query.ts +4 -0
  473. package/src/queues/in-memory.ts +54 -19
  474. package/src/queues/types.ts +4 -0
  475. package/src/runtime/host.ts +28 -1
  476. package/src/runtime/index.ts +1 -0
  477. package/src/runtime/internal.ts +1 -0
  478. package/src/runtime/public-origin.ts +33 -0
  479. package/src/runtime/sixb.ts +13 -2
  480. package/src/runtime/types.ts +12 -2
  481. package/src/storage/ai-cost/analytics.ts +2 -0
  482. package/src/storage/ai-cost/codec.ts +2 -1
  483. package/src/storage/ai-cost/types.ts +1 -0
  484. package/src/storage/ai-cost/validation.ts +21 -8
  485. package/src/storage/ai-limits/in-memory.ts +10 -2
  486. package/src/storage/ai-limits/provider.ts +29 -2
  487. package/src/storage/ai-limits/types.ts +3 -0
  488. package/src/storage/ai-usage/record.ts +9 -0
  489. package/src/storage/ai-usage/types.ts +8 -4
  490. package/src/storage/ai-usage/usage.ts +2 -0
  491. package/src/storage/file-download-grants/in-memory.ts +73 -0
  492. package/src/storage/file-download-grants/index.ts +8 -0
  493. package/src/storage/file-download-grants/record.ts +47 -0
  494. package/src/storage/file-download-grants/types.ts +48 -0
  495. package/src/storage/in-memory/index.ts +13 -2
  496. package/src/storage/index.ts +31 -13
  497. package/src/storage/internal.ts +1 -0
  498. package/src/storage/migrations/index.ts +1 -0
  499. package/src/storage/migrations/migrate-storage.ts +36 -12
  500. package/src/storage/migrations/types.ts +8 -0
  501. package/src/storage/objects/in-memory/query.ts +2 -0
  502. package/src/storage/objects/in-memory/selected-reader.ts +1 -0
  503. package/src/storage/objects/in-memory/storage.ts +1 -0
  504. package/src/storage/objects/query-preparation.ts +77 -0
  505. package/src/storage/objects/types.ts +2 -0
  506. package/src/storage/ontology/commits.ts +1 -6
  507. package/src/storage/ontology/in-memory/index.ts +28 -9
  508. package/src/storage/ontology/in-memory/materializations-finalization.ts +35 -68
  509. package/src/storage/ontology/in-memory/materializations-state.ts +0 -22
  510. package/src/storage/ontology/in-memory/materializations-work.ts +0 -45
  511. package/src/storage/ontology/in-memory/materializations.ts +172 -653
  512. package/src/storage/ontology/in-memory/outbox.ts +37 -29
  513. package/src/storage/ontology/in-memory/replacement-plans.ts +697 -0
  514. package/src/storage/ontology/in-memory/shared-state.ts +24 -2
  515. package/src/storage/ontology/in-memory/source-roots.ts +7 -2
  516. package/src/storage/ontology/in-memory/sources.ts +7 -33
  517. package/src/storage/ontology/in-memory/state-reader.ts +245 -0
  518. package/src/storage/ontology/index.ts +19 -13
  519. package/src/storage/ontology/materializations.ts +45 -74
  520. package/src/storage/ontology/outbox.ts +4 -7
  521. package/src/storage/ontology/provider-header-validation.ts +0 -57
  522. package/src/storage/ontology/provider-work.ts +381 -90
  523. package/src/storage/ontology/provider.ts +74 -171
  524. package/src/storage/ontology/replacement-plans.ts +117 -0
  525. package/src/storage/ontology/sources.ts +0 -12
  526. package/src/storage/operation-scope.ts +33 -1
  527. package/src/storage/projection-runs/in-memory.ts +7 -1
  528. package/src/storage/projection-runs/types.ts +2 -0
  529. package/src/storage/types.ts +2 -0
  530. package/src/testing/ai-cost-storage-contract.ts +1 -0
  531. package/src/testing/ai-limit-storage-contract.ts +62 -0
  532. package/src/testing/ai-usage-storage-contract.ts +31 -0
  533. package/src/testing/file-download-grant-storage-contract.ts +139 -0
  534. package/src/testing/index.ts +4 -0
  535. package/src/testing/lake-storage-contract.ts +87 -1
  536. package/src/testing/materializer-storage-contract.ts +1008 -1
  537. package/src/testing/object-read-scope-contract.ts +1 -0
  538. package/src/testing/ontology-contract-fixture.ts +11 -87
  539. package/src/testing/ontology-storage-contract.ts +70 -39
  540. package/src/testing/projection-run-storage-contract.ts +14 -0
  541. package/src/testing/queues-contract.ts +59 -0
  542. package/src/workers/queue-worker.ts +19 -16
  543. package/dist/chunk-3c90jvfj.js.map +0 -15
  544. package/dist/chunk-3nx8vj5a.js.map +0 -12
  545. package/dist/chunk-7ytf06d3.js +0 -113
  546. package/dist/chunk-7ytf06d3.js.map +0 -10
  547. package/dist/chunk-a0073121.js.map +0 -12
  548. package/dist/chunk-fjw417jf.js.map +0 -62
  549. package/dist/chunk-g4rbm4a6.js.map +0 -15
  550. package/dist/chunk-hgqpcmyr.js.map +0 -12
  551. package/dist/chunk-jgwb25gc.js.map +0 -12
  552. package/dist/chunk-k4kkp58d.js.map +0 -11
  553. package/dist/chunk-ky7zpbtt.js.map +0 -19
  554. package/dist/chunk-mdnw7nj8.js.map +0 -15
  555. package/dist/chunk-py2dw8cw.js.map +0 -17
  556. package/dist/chunk-s3csryxe.js.map +0 -11
  557. package/dist/chunk-xnx96gfy.js.map +0 -15
  558. package/dist/chunk-z708gemf.js.map +0 -50
  559. package/dist/materializer/execution/plan-stream.d.ts +0 -8
  560. package/dist/materializer/execution/plan-stream.d.ts.map +0 -1
  561. package/src/materializer/execution/plan-stream.ts +0 -121
  562. /package/dist/{chunk-q3grgzp1.js.map → chunk-23xs4qp9.js.map} +0 -0
  563. /package/dist/{chunk-vef6qa14.js.map → chunk-2am3db31.js.map} +0 -0
  564. /package/dist/{chunk-fj1dvp37.js.map → chunk-2vhg6ysa.js.map} +0 -0
  565. /package/dist/{chunk-p0nbkys4.js.map → chunk-33saed7g.js.map} +0 -0
  566. /package/dist/{chunk-mmac1mp6.js.map → chunk-52c5zb0z.js.map} +0 -0
  567. /package/dist/{chunk-8fjmqjyx.js.map → chunk-5be2ath4.js.map} +0 -0
  568. /package/dist/{chunk-2fv8sajb.js.map → chunk-5thzcb8g.js.map} +0 -0
  569. /package/dist/{chunk-1jvq82rp.js.map → chunk-9g6jz9kk.js.map} +0 -0
  570. /package/dist/{chunk-8w27xf9e.js.map → chunk-a7er86jd.js.map} +0 -0
  571. /package/dist/{chunk-bxx3ms5t.js.map → chunk-c2rga5cx.js.map} +0 -0
  572. /package/dist/{chunk-dsfw1bdr.js.map → chunk-cnb5kv05.js.map} +0 -0
  573. /package/dist/{chunk-n5t4mq6z.js.map → chunk-e67ynxcr.js.map} +0 -0
  574. /package/dist/{chunk-6q7c68yx.js.map → chunk-f1xh7a32.js.map} +0 -0
  575. /package/dist/{chunk-7jc21943.js.map → chunk-gf7yht60.js.map} +0 -0
  576. /package/dist/{chunk-ffwvdgk1.js.map → chunk-jjrn5v0p.js.map} +0 -0
  577. /package/dist/{chunk-r5sc1d2b.js.map → chunk-jnfxmr3f.js.map} +0 -0
  578. /package/dist/{chunk-y0zmae99.js.map → chunk-k4g51s47.js.map} +0 -0
  579. /package/dist/{chunk-drz59ve0.js.map → chunk-rx7h5fdx.js.map} +0 -0
  580. /package/dist/{chunk-yfppyaty.js.map → chunk-sk0hcjsz.js.map} +0 -0
  581. /package/dist/{chunk-qne45xqq.js.map → chunk-svabwqdq.js.map} +0 -0
  582. /package/dist/{chunk-xr7y35yj.js.map → chunk-t9shqx3w.js.map} +0 -0
  583. /package/dist/{chunk-adbve9zt.js.map → chunk-vre348sb.js.map} +0 -0
  584. /package/dist/{chunk-a4g5yjm0.js.map → chunk-w9yycd3t.js.map} +0 -0
  585. /package/dist/{chunk-wd34wnsy.js.map → chunk-xcy5ddha.js.map} +0 -0
@@ -9,6 +9,7 @@ import type {
9
9
  AiUsageStorage,
10
10
  AuthStorage,
11
11
  ExecutionStorage,
12
+ RecordAiModelCallInput,
12
13
  ReserveAiModelCallInput,
13
14
  Storage,
14
15
  } from "../storage"
@@ -536,6 +537,65 @@ export function runAiLimitStorageContractSuite<TStorage extends AiLimitStorageCo
536
537
  })
537
538
  })
538
539
 
540
+ // Removal proof: drop aiLimitMeterApplies from a provider's reserve loop (admission reports
541
+ // missingEstimate) or from resolveAiLimitActual (the meter becomes unavailable).
542
+ test("token limits neither admit nor count transcription and reranking", async () => {
543
+ await withStorage(async (storage) => {
544
+ const status = async () =>
545
+ (
546
+ await storage.aiLimits.listPolicyStatuses({
547
+ projectId,
548
+ at: at("2026-08-15T12:00:01.000Z"),
549
+ })
550
+ )[0]
551
+ await recordUsageInput(storage.aiUsage, {
552
+ id: "usage-transcription",
553
+ callId: "transcription",
554
+ modelKind: "transcription",
555
+ usage: { audioDurationMs: 1250 },
556
+ })
557
+ await recordUsage(storage.aiUsage, "usage-language", "language", 4)
558
+ await storage.aiLimits.createPolicy({
559
+ id: "tokens",
560
+ projectId,
561
+ subject: project,
562
+ limit: { meter: "tokens.total", amount: 10 },
563
+ })
564
+ expect(await status()).toMatchObject({
565
+ accountingStatus: "complete",
566
+ consumption: { actual: { amount: 4 } },
567
+ })
568
+
569
+ const cost: AiLimitQuantity = {
570
+ meter: "cost.catalogEstimated",
571
+ amount: { currency: "USD", amountNanos: "100" },
572
+ }
573
+ await expect(
574
+ storage.aiLimits.reserveModelCall(
575
+ reservation("reranking", 0, { estimates: [cost], modelKind: "reranking" })
576
+ )
577
+ ).resolves.toEqual({ status: "notRequired" })
578
+ await expect(
579
+ storage.aiLimits.reserveModelCall(reservation("language", 0, { estimates: [cost] }))
580
+ ).resolves.toMatchObject({ status: "unavailable", reasons: ["missingEstimate"] })
581
+
582
+ await recordUsageInput(storage.aiUsage, {
583
+ id: "usage-reranking",
584
+ callId: "reranking",
585
+ modelKind: "reranking",
586
+ usage: {},
587
+ })
588
+ await storage.aiLimits.recordModelCallActuals({
589
+ projectId,
590
+ usageRecordId: "usage-reranking",
591
+ })
592
+ expect(await status()).toMatchObject({
593
+ accountingStatus: "complete",
594
+ consumption: { actual: { amount: 4 } },
595
+ })
596
+ })
597
+ })
598
+
539
599
  test("charges actuals to the ledger occurrence month", async () => {
540
600
  await withStorage(async (storage) => {
541
601
  await storage.aiLimits.createPolicy({
@@ -1062,6 +1122,7 @@ async function recordUsageInput(
1062
1122
  readonly executionId?: string
1063
1123
  readonly requesterGroupIds?: readonly string[]
1064
1124
  readonly occurredAt?: Date
1125
+ readonly modelKind?: RecordAiModelCallInput["modelKind"]
1065
1126
  readonly usage: AiModelCallUsageInput
1066
1127
  }
1067
1128
  ): Promise<void> {
@@ -1074,6 +1135,7 @@ async function recordUsageInput(
1074
1135
  requesterGroupIds: input.requesterGroupIds ?? ["support"],
1075
1136
  providerId: "test",
1076
1137
  requestedModelId: "test/model",
1138
+ ...(input.modelKind === undefined ? {} : { modelKind: input.modelKind }),
1077
1139
  responseId: `response:${input.callId}`,
1078
1140
  usage: input.usage,
1079
1141
  occurredAt: input.occurredAt ?? at("2026-08-15T12:00:00.500Z"),
@@ -69,6 +69,37 @@ export function runAiUsageStorageContractSuite<TStorage extends AiUsageStorage>(
69
69
  }
70
70
 
71
71
  describe(label, () => {
72
+ // Removal proof: omit audioDurationMs from a row codec; this round trip fails.
73
+ test("persists transcription usage and kind without invented token totals", async () => {
74
+ await withStorage(async (storage) => {
75
+ const input = modelCallInput({
76
+ modelKind: "transcription",
77
+ usage: { audioDurationMs: 1250 },
78
+ })
79
+ await storage.recordModelCall(input)
80
+ const latest = await storage.getLatestForExecution({
81
+ projectId,
82
+ executionId: agentExecutionId,
83
+ })
84
+ expect(latest?.modelKind).toBe("transcription")
85
+ expect(latest?.usage).toEqual({ audioDurationMs: 1250, reportingStatus: "partial" })
86
+ expect((await storage.recordModelCall(input)).created).toBe(false)
87
+ expect(
88
+ await storage.summarizeExecution({ projectId, executionId: agentExecutionId })
89
+ ).toMatchObject({ modelCallCount: 1, usage: { audioDurationMs: 1250 } })
90
+ })
91
+ })
92
+ // Removal proof: omit 'reranking' from a storage migration's model_kind check; the write fails.
93
+ test("persists reranking usage kind", async () => {
94
+ await withStorage(async (storage) => {
95
+ await storage.recordModelCall(modelCallInput({ modelKind: "reranking", usage: {} }))
96
+ const latest = await storage.getLatestForExecution({
97
+ projectId,
98
+ executionId: agentExecutionId,
99
+ })
100
+ expect(latest?.modelKind).toBe("reranking")
101
+ })
102
+ })
72
103
  test("retains native provider IDs across reads and replay", async () => {
73
104
  // Regression proof: omit providerIds in normalization or a storage row codec.
74
105
  await withStorage(async (storage) => {
@@ -0,0 +1,139 @@
1
+ import { describe, expect, test } from "bun:test"
2
+ import type {
3
+ FileDownloadGrantRecord,
4
+ FileDownloadGrantStorage,
5
+ } from "../storage/file-download-grants"
6
+
7
+ export interface FileDownloadGrantStorageContractSuiteOptions<
8
+ TStorage extends FileDownloadGrantStorage = FileDownloadGrantStorage,
9
+ > {
10
+ /** Returns an isolated provider capability for every test. */
11
+ readonly createStorage: () => TStorage | Promise<TStorage>
12
+ readonly cleanup?: (storage: TStorage) => void | Promise<void>
13
+ }
14
+
15
+ const projectId = "file-download-grant-contract"
16
+ const createdAt = new Date("2026-10-05T12:00:00.000Z")
17
+ const hour = 60 * 60 * 1000
18
+
19
+ /** Provider-neutral persistence contract for file download grants. */
20
+ export function runFileDownloadGrantStorageContractSuite<TStorage extends FileDownloadGrantStorage>(
21
+ label: string,
22
+ options: FileDownloadGrantStorageContractSuiteOptions<TStorage>
23
+ ): void {
24
+ const withStorage = async (run: (storage: TStorage) => Promise<void>): Promise<void> => {
25
+ const storage = await options.createStorage()
26
+ try {
27
+ await run(storage)
28
+ } finally {
29
+ await options.cleanup?.(storage)
30
+ }
31
+ }
32
+
33
+ describe(label, () => {
34
+ test("finds a grant by its project and token hash", async () => {
35
+ await withStorage(async (storage) => {
36
+ const grant = grantRecord()
37
+ await storage.create(grant)
38
+
39
+ expect(await storage.findByTokenHash({ projectId, tokenHash: grant.tokenHash })).toEqual(
40
+ grant
41
+ )
42
+ expect(
43
+ await storage.findByTokenHash({ projectId: "other-project", tokenHash: grant.tokenHash })
44
+ ).toBeNull()
45
+ expect(await storage.findByTokenHash({ projectId, tokenHash: "f".repeat(64) })).toBeNull()
46
+ })
47
+ })
48
+
49
+ test("rejects a second grant with the same id or token hash", async () => {
50
+ await withStorage(async (storage) => {
51
+ await storage.create(grantRecord())
52
+
53
+ await expect(storage.create(grantRecord({ tokenHash: "b".repeat(64) }))).rejects.toThrow()
54
+ await expect(storage.create(grantRecord({ id: "filedownload_2" }))).rejects.toThrow()
55
+ await storage.create(grantRecord({ projectId: "other-project" }))
56
+ })
57
+ })
58
+
59
+ test("keeps the first revocation", async () => {
60
+ await withStorage(async (storage) => {
61
+ await storage.create(grantRecord())
62
+ const first = new Date(createdAt.getTime() + 1_000)
63
+
64
+ const revoked = await storage.revoke({ projectId, id: "filedownload_1", revokedAt: first })
65
+ const again = await storage.revoke({
66
+ projectId,
67
+ id: "filedownload_1",
68
+ revokedAt: new Date(first.getTime() + 1_000),
69
+ })
70
+
71
+ expect(revoked?.revokedAt).toEqual(first)
72
+ expect(again?.revokedAt).toEqual(first)
73
+ expect(
74
+ (await storage.findByTokenHash({ projectId, tokenHash: "a".repeat(64) }))?.revokedAt
75
+ ).toEqual(first)
76
+ expect(
77
+ await storage.revoke({
78
+ projectId: "other-project",
79
+ id: "filedownload_1",
80
+ revokedAt: first,
81
+ })
82
+ ).toBeNull()
83
+ })
84
+ })
85
+
86
+ test("deletes only the project's grants that expired before the cutoff, up to the limit", async () => {
87
+ await withStorage(async (storage) => {
88
+ const expiringAt = (hours: number) => new Date(createdAt.getTime() + hours * hour)
89
+ await storage.create(
90
+ grantRecord({ id: "g1", tokenHash: "1".repeat(64), expiresAt: expiringAt(1) })
91
+ )
92
+ await storage.create(
93
+ grantRecord({ id: "g2", tokenHash: "2".repeat(64), expiresAt: expiringAt(2) })
94
+ )
95
+ await storage.create(
96
+ grantRecord({ id: "g3", tokenHash: "3".repeat(64), expiresAt: expiringAt(3) })
97
+ )
98
+ await storage.create(
99
+ grantRecord({ projectId: "other-project", id: "g1", expiresAt: expiringAt(1) })
100
+ )
101
+ const cutoff = { projectId, expiredBefore: expiringAt(3) }
102
+
103
+ expect(await storage.deleteExpired({ ...cutoff, limit: 1 })).toBe(1)
104
+ expect(await storage.deleteExpired({ ...cutoff, limit: 10 })).toBe(1)
105
+ expect(await storage.deleteExpired({ ...cutoff, limit: 10 })).toBe(0)
106
+
107
+ const remaining = await Promise.all(
108
+ ["1", "2", "3"].map((digit) =>
109
+ storage.findByTokenHash({ projectId, tokenHash: digit.repeat(64) })
110
+ )
111
+ )
112
+ expect(remaining.map((grant) => grant?.id ?? null)).toEqual([null, null, "g3"])
113
+ expect(
114
+ await storage.findByTokenHash({ projectId: "other-project", tokenHash: "a".repeat(64) })
115
+ ).not.toBeNull()
116
+ })
117
+ })
118
+ })
119
+ }
120
+
121
+ function grantRecord(overrides: Partial<FileDownloadGrantRecord> = {}): FileDownloadGrantRecord {
122
+ const digest = "c".repeat(64)
123
+ return {
124
+ id: "filedownload_1",
125
+ projectId,
126
+ tokenHash: "a".repeat(64),
127
+ file: {
128
+ blobId: `blob_${digest}`,
129
+ digest: `sha256:${digest}`,
130
+ sizeBytes: 10,
131
+ fileName: "photo.jpg",
132
+ mediaType: "image/jpeg",
133
+ },
134
+ executionId: "execution-1",
135
+ createdAt,
136
+ expiresAt: new Date(createdAt.getTime() + hour),
137
+ ...overrides,
138
+ }
139
+ }
@@ -59,6 +59,10 @@ export {
59
59
  type ExecutionStorageContractSuiteOptions,
60
60
  runExecutionStorageContractSuite,
61
61
  } from "./execution-storage-contract"
62
+ export {
63
+ type FileDownloadGrantStorageContractSuiteOptions,
64
+ runFileDownloadGrantStorageContractSuite,
65
+ } from "./file-download-grant-storage-contract"
62
66
  export {
63
67
  type FileUploadSessionStorageContractSuiteOptions,
64
68
  runFileUploadSessionStorageContractSuite,
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, test } from "bun:test"
2
2
  import type { FileRef } from "../blob-storage"
3
- import { col, defineDataset } from "../datasets"
3
+ import { col, type DatasetDefinition, defineDataset } from "../datasets"
4
4
  import { LakeStorageError } from "../lake-storage/errors"
5
5
  import type { DatasetRow, LakeStorage } from "../lake-storage/types"
6
6
 
@@ -284,6 +284,92 @@ export function runLakeStorageContractSuite<TStorage extends LakeStorage>(
284
284
  })
285
285
  })
286
286
 
287
+ describe("change feed", () => {
288
+ const commitSnapshot = async (
289
+ storage: TStorage,
290
+ dataset: DatasetDefinition,
291
+ rows: readonly DatasetRow[]
292
+ ) => {
293
+ const write = await storage.beginWrite({ dataset, mode: "snapshot" })
294
+ await write.writeRows(rows)
295
+ return write.commit()
296
+ }
297
+ const byDatasetId = <T extends { readonly datasetId: string }>(versions: readonly T[]) =>
298
+ [...versions].sort((left, right) => left.datasetId.localeCompare(right.datasetId))
299
+
300
+ test("reports the newest data version of each dataset changed after a cursor", async () => {
301
+ await withStorage(async (storage) => {
302
+ await storage.createDataset(writeDataset)
303
+ await storage.createDataset(nullableWriteDataset)
304
+ const start = await storage.listLatestVersionsSince({ cursor: null })
305
+ expect(start?.versions).toEqual([])
306
+
307
+ await commitSnapshot(storage, writeDataset, [{ orderId: "ord_1", customerName: "Ada" }])
308
+ const orders = await commitSnapshot(storage, writeDataset, [
309
+ { orderId: "ord_2", customerName: "Grace" },
310
+ ])
311
+ const notes = await commitSnapshot(storage, nullableWriteDataset, [
312
+ { orderId: "ord_1", note: null },
313
+ ])
314
+
315
+ const changed = await storage.listLatestVersionsSince({ cursor: start!.cursor })
316
+ expect(byDatasetId(changed?.versions ?? [])).toEqual([
317
+ {
318
+ datasetId: nullableWriteDataset.id,
319
+ versionId: notes.versionId,
320
+ mode: "snapshot",
321
+ createdAt: notes.createdAt,
322
+ rowCount: 1,
323
+ },
324
+ {
325
+ datasetId: writeDataset.id,
326
+ versionId: orders.versionId,
327
+ mode: "snapshot",
328
+ createdAt: orders.createdAt,
329
+ rowCount: 1,
330
+ },
331
+ ])
332
+ await expect(
333
+ storage.listLatestVersionsSince({
334
+ cursor: start!.cursor,
335
+ datasetIds: [nullableWriteDataset.id],
336
+ })
337
+ ).resolves.toMatchObject({ versions: [{ versionId: notes.versionId }] })
338
+ await expect(
339
+ storage.listLatestVersionsSince({ cursor: changed!.cursor })
340
+ ).resolves.toEqual({ cursor: changed!.cursor, versions: [] })
341
+ })
342
+ })
343
+
344
+ test("skips unchanged writes and schema-only versions", async () => {
345
+ await withStorage(async (storage) => {
346
+ await storage.createDataset(nullableWriteDataset)
347
+ const rows = [{ orderId: "ord_1", note: null }]
348
+ await commitSnapshot(storage, nullableWriteDataset, rows)
349
+ const start = await storage.listLatestVersionsSince({ cursor: null })
350
+
351
+ const unchanged = await commitSnapshot(storage, nullableWriteDataset, rows)
352
+ expect(unchanged.outcome).toBe("unchanged")
353
+ if (schemaEvolution === "addNullableColumns") {
354
+ await storage.createDataset(
355
+ defineDataset(nullableWriteDataset.id, {
356
+ schema: [
357
+ col("orderId", "string"),
358
+ col("note", "string", { nullable: true }),
359
+ col("added", "string", { nullable: true }),
360
+ ],
361
+ })
362
+ )
363
+ expect((await storage.getLatestVersion(nullableWriteDataset.id))?.mode).toBe("schema")
364
+ }
365
+
366
+ await expect(
367
+ storage.listLatestVersionsSince({ cursor: start!.cursor })
368
+ ).resolves.toMatchObject({ versions: [] })
369
+ })
370
+ })
371
+ })
372
+
287
373
  describe("writes and reads", () => {
288
374
  test("cancels reads before starting and between rows", async () => {
289
375
  // Red check: remove readRows' signal checks in the provider under test.